From nobody Thu Apr 16 07:08:33 2026 Received: from TYDPR03CU002.outbound.protection.outlook.com (mail-japaneastazon11023139.outbound.protection.outlook.com [52.101.127.139]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 275C12D8379; Mon, 2 Mar 2026 03:03:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.127.139 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772420631; cv=fail; b=EauXxhoDtZU62w3tP9VMTimopKxuOtI9WGDe39hRChSFe6exsA7KGHgobLhXvO2dkqX/y7L9bmeVIrKXlq04XOj0+657aROYztE0jW/8Dmng01daQ2IlWYED9yyMklKDeLipy/quLaEdUdfUb5ZII2UTAG89FAFdo4DdKKkPjLw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772420631; c=relaxed/simple; bh=88we2ibqnhqtAfoGSnMK+B7xKfRVur9CTYBYRVjSDHc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=nzOCFCBQnOj1y/xC/KhzUJL2pYE6VaD8w9TtlPGLyv2IscL+ZN5fVTaWdCD3ddBid9Mo7JKVoaBS1N+HIuD1lfaKMOpxfil6NnOlXq89wsOOnvAOGVE4eWYaf5+9T2Fec7YOR5ZlggP71KpTvvQMo/7G3HgXnfvPphl03npYOpY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=52.101.127.139 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZipWfWoCauzcWvJckUkEgdZvwR2pRMVSJ5n84O06TghkYXPmA0Y0HkTaHPI6mqVdw+gNSu7vRJYxJOq5bfpdZntS/pDGYrZIguH/nuXkj/1agPc8TjpGlO92i+dJop846wu2cE9Dn9YHIMJ2wkAmmJ84R4Ir76J6cmcac8y0CdatE91VmwLq7CnIb0AjQiDVK2fIA4McW/g+JmOKL6xYQ7XoFmPzQhi8a6ZaDj4v7rC2X4L1rYK5oe3TZnezzTAyKOnmlVNUwDnZBHHn6pas+j/nxpLkLNOw59n3C4VvoNSpR5z1uV6bezl5mn1/tKs8ZdlwsJzoA1nGzGQUGM3XxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qMXdDUTNH+WWICiedWlvDDrKZ9bPDLX0323GeEdTTi8=; b=eYfoAlGCx6C9nS1cxIwYvUUFTGb9bVItaXcUG3hTq0VbfuMM+bzlfKZzrz6k7kKtPIwi8TZBSNbJXmlYshhVf13EekeGq60kV/nVTZMWeQ7iFmq2xdGF/h8J+5X4IKBbm1yXRUlCDm17YlSndJydQiDkNg57WshXfWUgxVxpIzwNZtyalMrxzZyrEiket57OkcWDBfKDmZAP4tm/xrc4yrsQ9feFybTn21NdqPIldZPP4+YLqU3VpASYNY7RezbpZHp9tsj5h8LHkU3j9ABPh3eYZjmRpI/Y4oSwQSpIBNO0x/9sH6r33bsdBrzmHBufhoc6srqvCSc//YcA9FlwZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from SI2PR02CA0037.apcprd02.prod.outlook.com (2603:1096:4:196::8) by TY0PR06MB5234.apcprd06.prod.outlook.com (2603:1096:400:21a::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.20; Mon, 2 Mar 2026 03:03:42 +0000 Received: from OSA0EPF000000C9.apcprd02.prod.outlook.com (2603:1096:4:196:cafe::d6) by SI2PR02CA0037.outlook.office365.com (2603:1096:4:196::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.21 via Frontend Transport; Mon, 2 Mar 2026 03:03:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by OSA0EPF000000C9.mail.protection.outlook.com (10.167.240.55) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.16 via Frontend Transport; Mon, 2 Mar 2026 03:03:40 +0000 Received: from nchen-desktop (unknown [172.16.64.25]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id 7399C435071E; Mon, 2 Mar 2026 11:03:39 +0800 (CST) From: Peter Chen To: robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, gregkh@linuxfoundation.org, pawell@cadence.com, rogerq@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, cix-kernel-upstream@cixtech.com, Peter Chen Subject: [PATCH 1/2] usb: cdns3: Add USBSSP platform driver support Date: Mon, 2 Mar 2026 11:03:33 +0800 Message-ID: <20260302030339.324196-2-peter.chen@cixtech.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260302030339.324196-1-peter.chen@cixtech.com> References: <20260302030339.324196-1-peter.chen@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSA0EPF000000C9:EE_|TY0PR06MB5234:EE_ X-MS-Office365-Filtering-Correlation-Id: 9b90a2b6-ec7d-40a5-0abb-08de78084e8f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700013|376014; X-Microsoft-Antispam-Message-Info: joSvKLlgw2pia6hZ5ZwL4hmVV+F273zdCtbduBgU5B6Mlgq8Y+rBcYBsSm9wR6JSE4Qy1/uTPo5mkbpApTJS+nIJ3Z8fWrr+C5AmuZuqmRpljTPco7ohKq/CNLGWiGJ+GmXmpdK5buEzFYwTs631HE4kvEaHUov//kz91iMOppKmoDDDMI2tPUvircbJKWkEQV3FrBgk7OLaT5JHKDArU4ieWX1zjyLzqpcyeBrXQiv8cvKCCSTVR3FWOXdRX8MbmPa/Mx15inlsTMtBa+WocLVqu4sJnrdLEwwhd4yDQH6TL3ZH8g+reDNiMG00/Y5oetZryl0SIrVxj/iBG4PHFvSM2+uZZ8VxUV1mhlZDYVQNc1kPJPn2CjENVsAdIVGskaxRK0Bkee595w/Ys9JqKH97XDxQSyXz4CUExDgA823TQerwuN1CZI6xggChIwqH1x6pyYST1Q5ZdCUIITJEuQioaYdSvJqhtw+LFaT/xADwi6dkyOpDW+WNm6v2F7V5h7tHS7oHJRIWUmkjO7FKmzDE7CnTAt5hEeOQwB/n15kxIPzRaAjQ+4qVHppQEZ1OzkhRREyX/9N+n6zQNTs2pfch4vYelI5zyGpnOkyxwxi+LF944P63BgbTnD86TRdk2mq2tKg/TUTKZXf/+UiWyVmXF+Qy6XhiODkuzsvbNEJsX6FtNjLS/6dXK2GWJKPMTDZ1S4R3n7ar+E6y1pmzMY5kKLohpNc1226OK9dDbmXlL6VIcyTZEKACn+Chv7eBA1b7UKQFqsADnns2q4gt1JfTmD2SXdgmAeqxT57oVxrpi5yRGAG5LbroUnaLfdPnVJuieIPG2qHr2tPgHgdFNQ== X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(36860700013)(376014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: vZNRoPXlRuQB4FI7Wu7HfwRnH9q3CXTVHzU8gsNfqDIGDigE9E0h8v2BnfX3Qsf7qZIdG/K6e0tJY2K+Mf5jMKXJb+e/B3efCY7iWgJkewdjdkHUUdwiD88fl0rUGiR8Mfe0pdPpZoX8vRGs0WbrssfZR5ITzB0mgpXYGN4sLLKyZ+NDRMrC3wwtekS/qY1tDj3osKWEsLK9d4jpY3JRcA+7QhG1yllEd9uPCErd4JcTiEAYf9nauvuclHlKF9mqT3M5j1TXVnrQ9DWpXtyva+s6frmSzZWxkCjIXKTe2tk9I9LVTBosP2KOB6wttauQ2+1bryE+Z+7fWKGXdaaa03ZHNaxzm65bN061+uRe48xQUqaYRj24EcLRzLIfRK2NEdaUuR2dMqwaf56p9n30l/BuzEHqe8gu90steHvjG5u5hsvARLXqi1jSGC4dPZ91 X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Mar 2026 03:03:40.1551 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9b90a2b6-ec7d-40a5-0abb-08de78084e8f X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: OSA0EPF000000C9.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY0PR06MB5234 Content-Type: text/plain; charset="utf-8" The Cadence USBSSP (CDNSP) controller was previously only accessible through PCI, coupling the gadget driver with the PCI glue layer into a single monolithic module (cdnsp-udc-pci). This prevented using the CDNSP IP on SoC/platform designs that expose the controller through device tree. Restructure the driver to decouple the CDNSP gadget from PCI: - Introduce CONFIG_USB_CDNSP as a standalone tristate (analogous to CONFIG_USB_CDNS3), with USB_CDNSP_GADGET and USB_CDNSP_HOST as bool sub-options. The gadget code builds as a separate cdnsp.ko module. - Refactor cdnsp-pci.c into a thin PCI-to-platform wrapper (similar to cdns3-pci-wrap.c) that registers a platform device and passes PCI resources and platform data to the common platform driver. - Add "cdns,usbssp" compatible string to the shared platform driver (cdns3-plat.c). The probe function uses of_device_id match data to select cdnsp_gadget_init vs cdns3_gadget_init. - Move cdns3-plat.o into cdns-usb-common, since it now serves as the shared platform driver entry point for both CDNS3 and CDNSP. - Fix gadget-export.h to use IS_REACHABLE() keyed on the tristate module config (CONFIG_USB_CDNS3/CONFIG_USB_CDNSP) instead of IS_ENABLED() on the bool gadget config. The bool configs are always 'y' when enabled, causing IS_ENABLED/IS_REACHABLE to always return true and resulting in link errors when cdns-usb-common is built-in but the gadget module is loadable. - Add missing MODULE_LICENSE()/MODULE_DESCRIPTION() and EXPORT_SYMBOL_GPL() to the cdns3 and cdnsp gadget modules, required by modpost. - Pass override_apb_timeout through cdns3_platform_data so the PCI wrapper can communicate PCI-specific APB timeout values to the common driver. This patch was developed with assistance from Anthropic Claude Opus 4.6. Signed-off-by: Peter Chen --- drivers/usb/cdns3/Kconfig | 44 +++--- drivers/usb/cdns3/Makefile | 30 ++-- drivers/usb/cdns3/cdns3-gadget.c | 4 + drivers/usb/cdns3/cdns3-plat.c | 14 +- drivers/usb/cdns3/cdnsp-gadget.c | 4 + drivers/usb/cdns3/cdnsp-pci.c | 221 +++++++++++++----------------- drivers/usb/cdns3/core.h | 1 + drivers/usb/cdns3/gadget-export.h | 4 +- 8 files changed, 151 insertions(+), 171 deletions(-) diff --git a/drivers/usb/cdns3/Kconfig b/drivers/usb/cdns3/Kconfig index 0a514b591527..80c740f5c755 100644 --- a/drivers/usb/cdns3/Kconfig +++ b/drivers/usb/cdns3/Kconfig @@ -20,8 +20,13 @@ config USB_CDNS3 Say Y here if your system has a Cadence USB3 dual-role controller. It supports: dual-role switch, Host-only, and Peripheral-only. =20 - If you choose to build this driver is a dynamically linked - as module, the module will be called cdns3.ko. +config USB_CDNSP + tristate "Cadence USBSSP Dual-Role Controller" + depends on USB_CDNS_SUPPORT + help + Say Y here if your system has a Cadence USBSSP dual-role controller. + It supports: dual-role switch, Host-only, and Peripheral-only. + endif =20 if USB_CDNS3 @@ -91,27 +96,14 @@ config USB_CDNS3_STARFIVE be dynamically linked and module will be called cdns3-starfive.ko endif =20 -if USB_CDNS_SUPPORT - -config USB_CDNSP_PCI - tristate "Cadence CDNSP Dual-Role Controller" - depends on USB_CDNS_SUPPORT && USB_PCI && ACPI - help - Say Y here if your system has a Cadence CDNSP dual-role controller. - It supports: dual-role switch Host-only, and Peripheral-only. - - If you choose to build this driver is a dynamically linked - module, the module will be called cdnsp.ko. -endif - -if USB_CDNSP_PCI +if USB_CDNSP =20 config USB_CDNSP_GADGET - bool "Cadence CDNSP device controller" - depends on USB_GADGET=3Dy || USB_GADGET=3DUSB_CDNSP_PCI + bool "Cadence USBSSP device controller" + depends on USB_GADGET=3Dy || USB_GADGET=3DUSB_CDNSP help Say Y here to enable device controller functionality of the - Cadence CDNSP-DEV driver. + Cadence USBSSP-DEV driver. =20 Cadence CDNSP Device Controller in device mode is very similar to XHCI controller. Therefore some algorithms @@ -120,8 +112,8 @@ config USB_CDNSP_GADGET It doesn't support LS. =20 config USB_CDNSP_HOST - bool "Cadence CDNSP host controller" - depends on USB=3Dy || USB=3DUSB_CDNSP_PCI + bool "Cadence USBSSP host controller" + depends on USB=3Dy || USB=3DUSB_CDNSP select USB_CDNS_HOST help Say Y here to enable host controller functionality of the @@ -130,4 +122,14 @@ config USB_CDNSP_HOST Host controller is compliant with XHCI so it uses standard XHCI driver. =20 +config USB_CDNSP_PCI + tristate "Cadence USBSSP support on PCIe-based platforms" + depends on USB_PCI && ACPI + help + If you're using the USBSSP Core IP with a PCIe, please say + 'Y' or 'M' here. + + If you choose to build this driver as module it will + be dynamically linked and module will be called cdnsp-pci.ko + endif diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile index 48dfae75b5aa..0e9b20e799d0 100644 --- a/drivers/usb/cdns3/Makefile +++ b/drivers/usb/cdns3/Makefile @@ -3,42 +3,32 @@ CFLAGS_cdns3-trace.o :=3D -I$(src) CFLAGS_cdnsp-trace.o :=3D -I$(src) =20 -cdns-usb-common-y :=3D core.o drd.o -cdns3-y :=3D cdns3-plat.o +cdns-usb-common-y :=3D core.o drd.o cdns3-plat.o =20 ifeq ($(CONFIG_USB),m) obj-m +=3D cdns-usb-common.o -obj-m +=3D cdns3.o else obj-$(CONFIG_USB_CDNS_SUPPORT) +=3D cdns-usb-common.o -obj-$(CONFIG_USB_CDNS3) +=3D cdns3.o endif =20 cdns-usb-common-$(CONFIG_USB_CDNS_HOST) +=3D host.o -cdns3-$(CONFIG_USB_CDNS3_GADGET) +=3D cdns3-gadget.o cdns3-ep0.o =20 +# For CDNS3 gadget ifneq ($(CONFIG_USB_CDNS3_GADGET),) +cdns3-y :=3D cdns3-gadget.o cdns3-ep0.o cdns3-$(CONFIG_TRACING) +=3D cdns3-trace.o +obj-$(CONFIG_USB_CDNS3) +=3D cdns3.o endif - obj-$(CONFIG_USB_CDNS3_PCI_WRAP) +=3D cdns3-pci-wrap.o obj-$(CONFIG_USB_CDNS3_TI) +=3D cdns3-ti.o obj-$(CONFIG_USB_CDNS3_IMX) +=3D cdns3-imx.o obj-$(CONFIG_USB_CDNS3_STARFIVE) +=3D cdns3-starfive.o =20 -cdnsp-udc-pci-y :=3D cdnsp-pci.o - -ifdef CONFIG_USB_CDNSP_PCI -ifeq ($(CONFIG_USB),m) -obj-m +=3D cdnsp-udc-pci.o -else -obj-$(CONFIG_USB_CDNSP_PCI) +=3D cdnsp-udc-pci.o -endif -endif - -cdnsp-udc-pci-$(CONFIG_USB_CDNSP_GADGET) +=3D cdnsp-ring.o cdnsp-gadget.o \ - cdnsp-mem.o cdnsp-ep0.o - +# For CDNSP gadget ifneq ($(CONFIG_USB_CDNSP_GADGET),) -cdnsp-udc-pci-$(CONFIG_TRACING) +=3D cdnsp-trace.o +cdnsp-y :=3D cdnsp-ring.o cdnsp-gadget.o \ + cdnsp-mem.o cdnsp-ep0.o +cdnsp-$(CONFIG_TRACING) +=3D cdnsp-trace.o +obj-$(CONFIG_USB_CDNSP) +=3D cdnsp.o endif +obj-$(CONFIG_USB_CDNSP_PCI) +=3D cdnsp-pci.o diff --git a/drivers/usb/cdns3/cdns3-gadget.c b/drivers/usb/cdns3/cdns3-gad= get.c index d59a60a16ec7..b800bd1bedd4 100644 --- a/drivers/usb/cdns3/cdns3-gadget.c +++ b/drivers/usb/cdns3/cdns3-gadget.c @@ -3508,3 +3508,7 @@ int cdns3_gadget_init(struct cdns *cdns) =20 return 0; } +EXPORT_SYMBOL_GPL(cdns3_gadget_init); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Cadence USBSS DRD Driver - gadget"); diff --git a/drivers/usb/cdns3/cdns3-plat.c b/drivers/usb/cdns3/cdns3-plat.c index 735df88774e4..156404bd6a43 100644 --- a/drivers/usb/cdns3/cdns3-plat.c +++ b/drivers/usb/cdns3/cdns3-plat.c @@ -23,6 +23,9 @@ #include "gadget-export.h" #include "drd.h" =20 +static const unsigned long cdns3_plat; +static const unsigned long cdnsp_plat; + static int set_phy_power_on(struct cdns *cdns) { int ret; @@ -64,6 +67,8 @@ static int cdns3_plat_probe(struct platform_device *pdev) =20 cdns->dev =3D dev; cdns->pdata =3D dev_get_platdata(dev); + if (cdns->pdata && cdns->pdata->override_apb_timeout) + cdns->override_apb_timeout =3D cdns->pdata->override_apb_timeout; =20 platform_set_drvdata(pdev, cdns); =20 @@ -143,7 +148,10 @@ static int cdns3_plat_probe(struct platform_device *pd= ev) if (ret) goto err_phy_power_on; =20 - cdns->gadget_init =3D cdns3_gadget_init; + if (device_get_match_data(dev) =3D=3D &cdnsp_plat) + cdns->gadget_init =3D cdnsp_gadget_init; + else + cdns->gadget_init =3D cdns3_gadget_init; =20 ret =3D cdns_init(cdns); if (ret) @@ -317,7 +325,8 @@ static const struct dev_pm_ops cdns3_pm_ops =3D { =20 #ifdef CONFIG_OF static const struct of_device_id of_cdns3_match[] =3D { - { .compatible =3D "cdns,usb3" }, + { .compatible =3D "cdns,usb3", .data =3D &cdns3_plat }, + { .compatible =3D "cdns,usbssp", .data =3D &cdnsp_plat }, { }, }; MODULE_DEVICE_TABLE(of, of_cdns3_match); @@ -336,6 +345,7 @@ static struct platform_driver cdns3_driver =3D { module_platform_driver(cdns3_driver); =20 MODULE_ALIAS("platform:cdns3"); +MODULE_ALIAS("platform:cdnsp"); MODULE_AUTHOR("Pawel Laszczak "); MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("Cadence USB3 DRD Controller Driver"); diff --git a/drivers/usb/cdns3/cdnsp-gadget.c b/drivers/usb/cdns3/cdnsp-gad= get.c index 6b3815f8a6e5..8db7eee528a1 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.c +++ b/drivers/usb/cdns3/cdnsp-gadget.c @@ -2075,3 +2075,7 @@ int cdnsp_gadget_init(struct cdns *cdns) =20 return 0; } +EXPORT_SYMBOL_GPL(cdnsp_gadget_init); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Cadence CDNSP DRD Driver - gadget"); diff --git a/drivers/usb/cdns3/cdnsp-pci.c b/drivers/usb/cdns3/cdnsp-pci.c index 566d94e49102..7deb25816548 100644 --- a/drivers/usb/cdns3/cdnsp-pci.c +++ b/drivers/usb/cdns3/cdnsp-pci.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* - * Cadence PCI Glue driver. + * Cadence USBSSP PCI Glue driver. * * Copyright (C) 2019 Cadence. * @@ -8,15 +8,27 @@ * */ =20 -#include -#include #include #include -#include #include +#include +#include +#include =20 #include "core.h" -#include "gadget-export.h" + +struct cdnsp_wrap { + struct platform_device *plat_dev; + struct resource dev_res[6]; + int devfn; +}; + +#define RES_IRQ_HOST_ID 0 +#define RES_IRQ_PERIPHERAL_ID 1 +#define RES_IRQ_OTG_ID 2 +#define RES_HOST_ID 3 +#define RES_DEV_ID 4 +#define RES_DRD_ID 5 =20 #define PCI_BAR_HOST 0 #define PCI_BAR_OTG 0 @@ -28,14 +40,14 @@ #define PCI_DRIVER_NAME "cdns-pci-usbssp" #define PLAT_DRIVER_NAME "cdns-usbssp" =20 -#define CHICKEN_APB_TIMEOUT_VALUE 0x1C20 +#define CHICKEN_APB_TIMEOUT_VALUE 0x1C20 =20 static struct pci_dev *cdnsp_get_second_fun(struct pci_dev *pdev) { /* * Gets the second function. - * Platform has two function. The fist keeps resources for - * Host/Device while the secon keeps resources for DRD/OTG. + * Platform has two function. The first keeps resources for + * Host/Device while the second keeps resources for DRD/OTG. */ if (pdev->device =3D=3D PCI_DEVICE_ID_CDNS_USBSSP) return pci_get_device(pdev->vendor, PCI_DEVICE_ID_CDNS_USBSS, NULL); @@ -48,11 +60,12 @@ static struct pci_dev *cdnsp_get_second_fun(struct pci_= dev *pdev) static int cdnsp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { - struct device *dev =3D &pdev->dev; - struct pci_dev *func; + struct platform_device_info plat_info; + static struct cdns3_platform_data pdata; + struct cdnsp_wrap *wrap; struct resource *res; - struct cdns *cdnsp; - int ret; + struct pci_dev *func; + int ret =3D 0; =20 /* * For GADGET/HOST PCI (devfn) function number is 0, @@ -79,146 +92,105 @@ static int cdnsp_pci_probe(struct pci_dev *pdev, } =20 pci_set_master(pdev); + if (pci_is_enabled(func)) { - cdnsp =3D pci_get_drvdata(func); + wrap =3D pci_get_drvdata(func); } else { - cdnsp =3D kzalloc_obj(*cdnsp); - if (!cdnsp) { + wrap =3D kzalloc_obj(*wrap); + if (!wrap) { ret =3D -ENOMEM; goto put_pci; } } =20 - /* For GADGET device function number is 0. */ - if (pdev->devfn =3D=3D 0) { - resource_size_t rsrc_start, rsrc_len; - - /* Function 0: host(BAR_0) + device(BAR_1).*/ - dev_dbg(dev, "Initialize resources\n"); - rsrc_start =3D pci_resource_start(pdev, PCI_BAR_DEV); - rsrc_len =3D pci_resource_len(pdev, PCI_BAR_DEV); - res =3D devm_request_mem_region(dev, rsrc_start, rsrc_len, "dev"); - if (!res) { - dev_dbg(dev, "controller already in use\n"); - ret =3D -EBUSY; - goto free_cdnsp; - } - - cdnsp->dev_regs =3D devm_ioremap(dev, rsrc_start, rsrc_len); - if (!cdnsp->dev_regs) { - dev_dbg(dev, "error mapping memory\n"); - ret =3D -EFAULT; - goto free_cdnsp; - } - - cdnsp->dev_irq =3D pdev->irq; - dev_dbg(dev, "USBSS-DEV physical base addr: %pa\n", - &rsrc_start); - - res =3D &cdnsp->xhci_res[0]; - res->start =3D pci_resource_start(pdev, PCI_BAR_HOST); - res->end =3D pci_resource_end(pdev, PCI_BAR_HOST); - res->name =3D "xhci"; - res->flags =3D IORESOURCE_MEM; - dev_dbg(dev, "USBSS-XHCI physical base addr: %pa\n", - &res->start); - - /* Interrupt for XHCI, */ - res =3D &cdnsp->xhci_res[1]; - res->start =3D pdev->irq; - res->name =3D "host"; - res->flags =3D IORESOURCE_IRQ; + res =3D wrap->dev_res; + + if (pdev->devfn =3D=3D PCI_DEV_FN_HOST_DEVICE) { + /* Function 0: host(BAR_0) + device(BAR_2). */ + dev_dbg(&pdev->dev, "Initialize Device resources\n"); + res[RES_DEV_ID].start =3D pci_resource_start(pdev, PCI_BAR_DEV); + res[RES_DEV_ID].end =3D pci_resource_end(pdev, PCI_BAR_DEV); + res[RES_DEV_ID].name =3D "dev"; + res[RES_DEV_ID].flags =3D IORESOURCE_MEM; + dev_dbg(&pdev->dev, "USBSSP-DEV physical base addr: %pa\n", + &res[RES_DEV_ID].start); + + res[RES_HOST_ID].start =3D pci_resource_start(pdev, PCI_BAR_HOST); + res[RES_HOST_ID].end =3D pci_resource_end(pdev, PCI_BAR_HOST); + res[RES_HOST_ID].name =3D "xhci"; + res[RES_HOST_ID].flags =3D IORESOURCE_MEM; + dev_dbg(&pdev->dev, "USBSSP-XHCI physical base addr: %pa\n", + &res[RES_HOST_ID].start); + + /* Interrupt for XHCI */ + wrap->dev_res[RES_IRQ_HOST_ID].start =3D pdev->irq; + wrap->dev_res[RES_IRQ_HOST_ID].name =3D "host"; + wrap->dev_res[RES_IRQ_HOST_ID].flags =3D IORESOURCE_IRQ; + + /* Interrupt for device. It's the same as for HOST. */ + wrap->dev_res[RES_IRQ_PERIPHERAL_ID].start =3D pdev->irq; + wrap->dev_res[RES_IRQ_PERIPHERAL_ID].name =3D "peripheral"; + wrap->dev_res[RES_IRQ_PERIPHERAL_ID].flags =3D IORESOURCE_IRQ; } else { - res =3D &cdnsp->otg_res; - res->start =3D pci_resource_start(pdev, PCI_BAR_OTG); - res->end =3D pci_resource_end(pdev, PCI_BAR_OTG); - res->name =3D "otg"; - res->flags =3D IORESOURCE_MEM; - dev_dbg(dev, "CDNSP-DRD physical base addr: %pa\n", - &res->start); + res[RES_DRD_ID].start =3D pci_resource_start(pdev, PCI_BAR_OTG); + res[RES_DRD_ID].end =3D pci_resource_end(pdev, PCI_BAR_OTG); + res[RES_DRD_ID].name =3D "otg"; + res[RES_DRD_ID].flags =3D IORESOURCE_MEM; + dev_dbg(&pdev->dev, "CDNSP-DRD physical base addr: %pa\n", + &res[RES_DRD_ID].start); =20 /* Interrupt for OTG/DRD. */ - cdnsp->otg_irq =3D pdev->irq; + wrap->dev_res[RES_IRQ_OTG_ID].start =3D pdev->irq; + wrap->dev_res[RES_IRQ_OTG_ID].name =3D "otg"; + wrap->dev_res[RES_IRQ_OTG_ID].flags =3D IORESOURCE_IRQ; } =20 - /* - * Cadence PCI based platform require some longer timeout for APB - * to fixes domain clock synchronization issue after resuming - * controller from L1 state. - */ - cdnsp->override_apb_timeout =3D CHICKEN_APB_TIMEOUT_VALUE; - pci_set_drvdata(pdev, cdnsp); - if (pci_is_enabled(func)) { - cdnsp->dev =3D dev; - cdnsp->gadget_init =3D cdnsp_gadget_init; - - ret =3D cdns_init(cdnsp); - if (ret) - goto free_cdnsp; + /* set up platform device info */ + pdata.override_apb_timeout =3D CHICKEN_APB_TIMEOUT_VALUE; + memset(&plat_info, 0, sizeof(plat_info)); + plat_info.parent =3D &pdev->dev; + plat_info.fwnode =3D pdev->dev.fwnode; + plat_info.name =3D PLAT_DRIVER_NAME; + plat_info.id =3D pdev->devfn; + plat_info.res =3D wrap->dev_res; + plat_info.num_res =3D ARRAY_SIZE(wrap->dev_res); + plat_info.dma_mask =3D pdev->dma_mask; + plat_info.data =3D &pdata; + plat_info.size_data =3D sizeof(pdata); + wrap->devfn =3D pdev->devfn; + /* register platform device */ + wrap->plat_dev =3D platform_device_register_full(&plat_info); + if (IS_ERR(wrap->plat_dev)) { + ret =3D PTR_ERR(wrap->plat_dev); + kfree(wrap); + goto put_pci; + } } =20 - device_wakeup_enable(&pdev->dev); - if (pci_dev_run_wake(pdev)) - pm_runtime_put_noidle(&pdev->dev); - - return 0; - -free_cdnsp: - if (!pci_is_enabled(func)) - kfree(cdnsp); - + pci_set_drvdata(pdev, wrap); put_pci: pci_dev_put(func); - return ret; } =20 static void cdnsp_pci_remove(struct pci_dev *pdev) { - struct cdns *cdnsp; + struct cdnsp_wrap *wrap; struct pci_dev *func; =20 func =3D cdnsp_get_second_fun(pdev); - cdnsp =3D (struct cdns *)pci_get_drvdata(pdev); + wrap =3D pci_get_drvdata(pdev); =20 - if (pci_dev_run_wake(pdev)) - pm_runtime_get_noresume(&pdev->dev); + if (wrap->devfn =3D=3D pdev->devfn) + platform_device_unregister(wrap->plat_dev); =20 - if (pci_is_enabled(func)) { - cdns_remove(cdnsp); - } else { - kfree(cdnsp); - } + if (!pci_is_enabled(func)) + kfree(wrap); =20 pci_dev_put(func); } =20 -static int __maybe_unused cdnsp_pci_suspend(struct device *dev) -{ - struct cdns *cdns =3D dev_get_drvdata(dev); - - return cdns_suspend(cdns); -} - -static int __maybe_unused cdnsp_pci_resume(struct device *dev) -{ - struct cdns *cdns =3D dev_get_drvdata(dev); - unsigned long flags; - int ret; - - spin_lock_irqsave(&cdns->lock, flags); - ret =3D cdns_resume(cdns); - spin_unlock_irqrestore(&cdns->lock, flags); - cdns_set_active(cdns, 1); - - return ret; -} - -static const struct dev_pm_ops cdnsp_pci_pm_ops =3D { - SET_SYSTEM_SLEEP_PM_OPS(cdnsp_pci_suspend, cdnsp_pci_resume) -}; - static const struct pci_device_id cdnsp_pci_ids[] =3D { { PCI_DEVICE(PCI_VENDOR_ID_CDNS, PCI_DEVICE_ID_CDNS_USBSSP), .class =3D PCI_CLASS_SERIAL_USB_DEVICE }, @@ -230,13 +202,10 @@ static const struct pci_device_id cdnsp_pci_ids[] =3D= { }; =20 static struct pci_driver cdnsp_pci_driver =3D { - .name =3D "cdnsp-pci", + .name =3D PCI_DRIVER_NAME, .id_table =3D cdnsp_pci_ids, .probe =3D cdnsp_pci_probe, .remove =3D cdnsp_pci_remove, - .driver =3D { - .pm =3D &cdnsp_pci_pm_ops, - } }; =20 module_pci_driver(cdnsp_pci_driver); @@ -245,4 +214,4 @@ MODULE_DEVICE_TABLE(pci, cdnsp_pci_ids); MODULE_ALIAS("pci:cdnsp"); MODULE_AUTHOR("Pawel Laszczak "); MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Cadence CDNSP PCI driver"); +MODULE_DESCRIPTION("Cadence CDNSP PCI wrapper"); diff --git a/drivers/usb/cdns3/core.h b/drivers/usb/cdns3/core.h index 801be9e61340..9149612bb2a8 100644 --- a/drivers/usb/cdns3/core.h +++ b/drivers/usb/cdns3/core.h @@ -45,6 +45,7 @@ struct cdns3_platform_data { unsigned long quirks; #define CDNS3_DEFAULT_PM_RUNTIME_ALLOW BIT(0) #define CDNS3_DRD_SUSPEND_RESIDENCY_ENABLE BIT(1) + u32 override_apb_timeout; /* 0 =3D use default (e.g. for PCI) */ }; =20 /** diff --git a/drivers/usb/cdns3/gadget-export.h b/drivers/usb/cdns3/gadget-e= xport.h index c37b6269b001..0cb600e2b5d2 100644 --- a/drivers/usb/cdns3/gadget-export.h +++ b/drivers/usb/cdns3/gadget-export.h @@ -10,7 +10,7 @@ #ifndef __LINUX_CDNS3_GADGET_EXPORT #define __LINUX_CDNS3_GADGET_EXPORT =20 -#if IS_ENABLED(CONFIG_USB_CDNSP_GADGET) +#if defined(CONFIG_USB_CDNSP_GADGET) && IS_REACHABLE(CONFIG_USB_CDNSP) =20 int cdnsp_gadget_init(struct cdns *cdns); #else @@ -22,7 +22,7 @@ static inline int cdnsp_gadget_init(struct cdns *cdns) =20 #endif /* CONFIG_USB_CDNSP_GADGET */ =20 -#if IS_ENABLED(CONFIG_USB_CDNS3_GADGET) +#if defined(CONFIG_USB_CDNS3_GADGET) && IS_REACHABLE(CONFIG_USB_CDNS3) =20 int cdns3_gadget_init(struct cdns *cdns); #else --=20 2.50.1 From nobody Thu Apr 16 07:08:33 2026 Received: from TYPPR03CU001.outbound.protection.outlook.com (mail-japaneastazon11022111.outbound.protection.outlook.com [52.101.126.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36C17250C06; Mon, 2 Mar 2026 03:03:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.126.111 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772420628; cv=fail; b=ZYmPygJlP4EU87qVlX0U62rQuq7t123XWoiRi1D0M1oIW83a4RcyWhRaluvb/sJ52LpJbb27F9raWS7U+l0NFLQWfEJW7G9d47omXTw1CzFPh9175nkS1HI5XGB9sNPFlG5nsP1fWOJ1PrY4a6nO7y9eYAcrM7Np9M1m/1QGjKU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772420628; c=relaxed/simple; bh=RNk/godFhQlXSGrSvE1nfORSJhCAwTIPnA392tY19ks=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XE+2Xz0258V9la1wAYI+t4iOhUC7MRz4ajzi2PYjevph+ewb5FrgPs4tNK+t6A9A3zj+wSQy11eIv+JWtk7s6OhefLW++56o5FSJQWVuj/gGy3bb+08Yn+EYVH+YLPbvywDwHN1lEI3dTJMKuRn5swRKjp+D5/f+c/YEsB1FrpE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com; spf=pass smtp.mailfrom=cixtech.com; arc=fail smtp.client-ip=52.101.126.111 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cixtech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cixtech.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PBwfyAdN+6EqxODxl6hrTyO6zy8NZeCQe1CbkQmGZa5PexZNHblhJ96oFCOSqLo9Pdpu8FJfIAWyf40R48xJMbTCruDu1Gc/ns80i5P2tToAXNatQ++NH/bmR68assRT79mHRz0L0tV/7Lr02kyKbXonP3fH0ViiO3dCzKDds7ts7XDJfz2XO6bWc9JWbFVRVSTQCg7ZoThRVECKK0djk5PYPEG+RkN5vxirg+JdzVyRE7+ysskqEs6R89584CdZceRhHCkYoNu5rKbISjrdejBGNdi6ds7QBz1navQVOFwATf6hRpf3z37k5ngsii2B//rzm5klOf3QgN9vlgoXeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=k2HfCtX+1ohWJFmOZVTNZoH0ZUVXvGN0TzDW2OgyhyQ=; b=cMUoUnz9mPPyJRLrEXz3Ib/SXX+nqtOAKUuIQ8MY4zOTWHcDXDJobaAjSJaGudlkGM9QxVQAboAEGTVEsHgzhKnZLQJ0b+i06c8tlASVTspR2FfmGDOUwdrMVpEMK4DV12EirIaA8MoCFAOBBa5dJYCpAZjmkg1hQEa7puj4jrdzkyehd+sZrbxU8RqqI+cWZoKszZgjgp1FewBqzGrU6+H79BHV9wDdetSLXghs1un1Tiho5uBUrtbJ0/CeVILox5gVtz+Ct/6fRvpvkg8xVJ+ZMRU+hqvP38gQEF6rqFKtONRobhhYRb5JUGk9IBnt3i7NevEtv0BlAJ+hoce4Ew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 222.71.101.198) smtp.rcpttodomain=cadence.com smtp.mailfrom=cixtech.com; dmarc=bestguesspass action=none header.from=cixtech.com; dkim=none (message not signed); arc=none (0) Received: from SI2PR01CA0030.apcprd01.prod.exchangelabs.com (2603:1096:4:192::15) by TYZPR06MB5784.apcprd06.prod.outlook.com (2603:1096:400:268::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.18; Mon, 2 Mar 2026 03:03:41 +0000 Received: from SG2PEPF000B66CE.apcprd03.prod.outlook.com (2603:1096:4:192:cafe::f2) by SI2PR01CA0030.outlook.office365.com (2603:1096:4:192::15) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.20 via Frontend Transport; Mon, 2 Mar 2026 03:03:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 222.71.101.198) smtp.mailfrom=cixtech.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=cixtech.com; Received-SPF: Pass (protection.outlook.com: domain of cixtech.com designates 222.71.101.198 as permitted sender) receiver=protection.outlook.com; client-ip=222.71.101.198; helo=smtprelay.cixcomputing.com; pr=C Received: from smtprelay.cixcomputing.com (222.71.101.198) by SG2PEPF000B66CE.mail.protection.outlook.com (10.167.240.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.16 via Frontend Transport; Mon, 2 Mar 2026 03:03:40 +0000 Received: from nchen-desktop (unknown [172.16.64.25]) by smtprelay.cixcomputing.com (Postfix) with ESMTPSA id 76C73435071F; Mon, 2 Mar 2026 11:03:39 +0800 (CST) From: Peter Chen To: robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, gregkh@linuxfoundation.org, pawell@cadence.com, rogerq@kernel.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, cix-kernel-upstream@cixtech.com, Peter Chen Subject: [PATCH 2/2] dt-bindings: usb: cdns,usb3: Add support for USBSSP Date: Mon, 2 Mar 2026 11:03:34 +0800 Message-ID: <20260302030339.324196-3-peter.chen@cixtech.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260302030339.324196-1-peter.chen@cixtech.com> References: <20260302030339.324196-1-peter.chen@cixtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SG2PEPF000B66CE:EE_|TYZPR06MB5784:EE_ X-MS-Office365-Filtering-Correlation-Id: 12737f35-8966-4484-afd9-08de78084e52 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|376014|1800799024|7053199007; X-Microsoft-Antispam-Message-Info: 3TCT5hYaZXLLfLlCRg9KZXgnO1HyU+1dtBB5wlPPbf02IZUPdwrkDhveBxcz/tzwMV8pnu2YcdhmudLv6llS9W92rRzvo8kFeI+Z417VJdWcycLpsth5mD1B4c4UFGufalAmCFn03kRfDWGwtwj2Id8/ND0sbHNDgwPotS7l61I3MtEIeEjg+tiWQaiMbZJsJaMd0DJqAPouxB0mYhZ64bBT5nFrOkksw9tL4Zo0XL7JKO2/CSCj81uoI30qRymWmsu9e8GrZzlmzZIZvsgI5iuEpYycCdjBbIaJlc3YqZ1FohaM0Zq+BY6WIWZS9SW0GV9Pkn3/mmyYNbMx4icUcuAS3TfuTsbN/lsaCw5SqFZ2ypENVYx2i+YXSgT4lUlSho7aoOJh5l5bwXcCIIjC8TYbkQQNDRCk8CnDBMOzifLj+yIrqK3c0zpjhAtXqh+2+NZT2HY2rPnGlRkKhc+qM5JBpqgggoivMnJys1UWNosPq8pvh6Ojmd1loLQy0NvXx4QPl54Yqb/TiR3cCj+vjuMfbZOMKYCFcGtZ0/90SrELr5pQGkxsLiq6oJO7JYsUi/C4OKztJ5fKOJ+XPc/xyKpfHFJv1hrD+iw3yETSS6iQtnkYKznky+xQneBNJw1JyuDU3tROrCDiHHY/d73J8xtvwlC8U/dqcc++AhxTcV8fFMbwh2bJNHQdgeCH5le+yiu+/Z8D52HqLtLwwR6vFxWhbFDC/y1O+AHmcggM/WLUyPnvwYJPj0v1QHjPl4imtczxk8mXZqb0mept3ZcLhV6seB5ReTVDKhQZEJ0LAtU= X-Forefront-Antispam-Report: CIP:222.71.101.198;CTRY:CN;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtprelay.cixcomputing.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(376014)(1800799024)(7053199007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: VAE5fscWEz5+rMw6cunpoKqc3waLfbg6zccdt9mlSP+XpvhWOdzkGJ+4TuQMmEJwgpxxBRN4CJ94fSSn7KqiPQmsMiv8D+6tfw9PLi4UTPYsYglYZtfW4lPv+RQFKaHMaKVYDiBtNdBl8mijXI3BVrJv+zBPHUjDbOE40mEv0NofIXp6naRDjE62USjZiSbFJkW53XDNg9eseiwOnvYkTaEqW7JYV+r+E8S7GkJVALvryoF+nrXSIAFspcbeVo49NqjlrzezhlZG5oPTYfzKFKtFFRVT9KjxXfAt820Na/Yi9rZb71KRsqoZhuXxgkn5oo83k9BaSZguAlkcXv71iR9E/SC6zQhMURyaNwHlQnUTDlsTk/GDLAE1IWqQGRE+oDnJy7qa7ICZPcIPdkb0Dg2qQN/eNsCn8ZP8C1hNp9xba6bSCN0GW6+0qo9ZjRjz X-OriginatorOrg: cixtech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Mar 2026 03:03:40.0459 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 12737f35-8966-4484-afd9-08de78084e52 X-MS-Exchange-CrossTenant-Id: 0409f77a-e53d-4d23-943e-ccade7cb4811 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0409f77a-e53d-4d23-943e-ccade7cb4811;Ip=[222.71.101.198];Helo=[smtprelay.cixcomputing.com] X-MS-Exchange-CrossTenant-AuthSource: SG2PEPF000B66CE.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR06MB5784 Content-Type: text/plain; charset="utf-8" Extend the Cadence USBSS DRD binding to also cover the USBSSP controller by adding "cdns,usbssp" to the compatible enum. The USBSSP is the next-generation Cadence USB controller IP. It adds SuperSpeed Plus (USB 3.1 gen2x1, 10 Gbps) support and uses an XHCI-based device controller. The register layout and resource model (otg/xhci/dev memory regions; host/peripheral/otg interrupts) are identical to the USBSS, so both controllers share the same binding and the same platform driver (cdns3-plat.c). Changes to the binding: - compatible: const -> enum with cdns,usb3 and cdns,usbssp - maximum-speed: add super-speed-plus - Add USBSSP example This patch was developed with assistance from Anthropic Claude Opus 4.6. Signed-off-by: Peter Chen --- .../devicetree/bindings/usb/cdns,usb3.yaml | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/usb/cdns,usb3.yaml b/Documen= tation/devicetree/bindings/usb/cdns,usb3.yaml index f454ddd9bbaa..f79333e7fc1f 100644 --- a/Documentation/devicetree/bindings/usb/cdns,usb3.yaml +++ b/Documentation/devicetree/bindings/usb/cdns,usb3.yaml @@ -4,14 +4,22 @@ $id: http://devicetree.org/schemas/usb/cdns,usb3.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# =20 -title: Cadence USBSS-DRD controller +title: Cadence USBSS/USBSSP DRD controller =20 maintainers: - Pawel Laszczak =20 +description: + Cadence USB dual-role controllers. USBSS (cdns,usb3) supports up to + SuperSpeed (USB 3.0). USBSSP (cdns,usbssp) is the next generation with + SuperSpeed Plus (USB 3.1 gen2x1) and XHCI-based device controller. Both + share the same register layout and resource model. + properties: compatible: - const: cdns,usb3 + enum: + - cdns,usb3 + - cdns,usbssp =20 reg: items: @@ -49,7 +57,7 @@ properties: cdns3 to type C connector. =20 maximum-speed: - enum: [super-speed, high-speed, full-speed] + enum: [super-speed-plus, super-speed, high-speed, full-speed] =20 phys: minItems: 1 @@ -90,6 +98,7 @@ unevaluatedProperties: false =20 examples: - | + // USBSS example (SuperSpeed) #include bus { #address-cells =3D <2>; @@ -109,3 +118,24 @@ examples: dr_mode =3D "otg"; }; }; + - | + // USBSSP example (SuperSpeed Plus) + #include + bus { + #address-cells =3D <2>; + #size-cells =3D <2>; + + usb@a0000000 { + compatible =3D "cdns,usbssp"; + reg =3D <0x00 0xa0000000 0x00 0x10000>, + <0x00 0xa0010000 0x00 0x10000>, + <0x00 0xa0020000 0x00 0x10000>; + reg-names =3D "otg", "xhci", "dev"; + interrupts =3D , + , + ; + interrupt-names =3D "host", "peripheral", "otg"; + maximum-speed =3D "super-speed-plus"; + dr_mode =3D "otg"; + }; + }; --=20 2.50.1