public inbox for linux-usb@vger.kernel.org
 help / color / mirror / Atom feed
From: "Peter Chen (CIX)" <peter.chen@kernel.org>
To: Arnd Bergmann <arnd@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Pawel Laszczak <pawell@cadence.com>,
	Arnd Bergmann <arnd@arndb.de>, Roger Quadros <rogerq@kernel.org>,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] usb: cdns3: attempt to fix Kconfig dependencies
Date: Fri, 3 Apr 2026 15:50:45 +0800	[thread overview]
Message-ID: <ac9xVUVB/BKfBUmE@nchen-desktop> (raw)
In-Reply-To: <20260402141008.2691819-1-arnd@kernel.org>

On 26-04-02 16:09:55, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> The way that dependencies between host and gadget mode, as well as cdns3
> and cdnsp were handled was rather fragile before commit 6076388ca1ed
> ("usb: cdns3: Add USBSSP platform driver support").
> 
> After those changes, I get randconfig build failures:
> 
> arm-linux-gnueabi-ld: drivers/usb/cdns3/cdnsp-gadget.o: in function `__cdnsp_gadget_init':
> cdnsp-gadget.c:(.text+0x12da): undefined reference to `cdns_drd_gadget_on'
> arm-linux-gnueabi-ld: drivers/usb/cdns3/cdnsp-gadget.o: in function `cdnsp_gadget_pullup':
> cdnsp-gadget.c:(.text+0x3030): undefined reference to `cdns_clear_vbus'
> arm-linux-gnueabi-ld: cdnsp-gadget.c:(.text+0x3138): undefined reference to `cdns_set_vbus'
> arm-linux-gnueabi-ld: drivers/usb/cdns3/cdnsp-gadget.o: in function `cdnsp_gadget_exit':
> cdnsp-gadget.c:(.text+0xe0): undefined reference to `cdns_drd_gadget_off'
> 
> and I see additional configurations that are broken. The main problem
> here is that the 'common' module links against both host and gadget
> support if they are enabled, but there are insufficient protections
> agains it being built-in if only one of them is built-in and the other
> is in a loadable module, causing link failures.
> 
> The use of IS_REACHABLE() in gadget-export.h works around a similar
> problem if one of cdns3 and cdnsp is built-in but the other one is
> =m. This one is worse because instead of a clear link failure, the
> logic just makes it not work at all despite support being enabled.
> 
> To improve this mess, throw out both the Makefile hacks and the
> IS_REACHABLE() hack and replace these with regular Kconfig dependencies
> that ensure each driver is only enabled when its dependencies are there,
> as we do in most other drivers. The main downside here is that there is no
> good way to have built-in gadget support on cdn3 along with USB=m. Fixing
> this part proper would require cleaning up the code to turn the 'common'
> parts into a library module that only gets called by the other drivers
> but does not interact with either host or gadget support itself.
> 
> Another problem that is not solved by this patch is the way that
> platform specific glue logic in this driver relies on having
> a soc specific device as the parent of a generic child, instead of
> the specific driver just calling into a common helper module.
> This may be impossible to fix without breaking the DT bindings.
> 
> Fixes: 6076388ca1ed ("usb: cdns3: Add USBSSP platform driver support")

Hi Arnd,

Thanks for fixing it, I am sorry for taking your effort debug it.

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> TBH, I would be more comfortable with reverting 6076388ca1ed altogether
> and asking for a new version with the proper fixups included along
> with more testing for the next merge window.

It depends on Greg, I am okay for both ways. If Greg reverts the patch,
I will do below improvements and adapts for most of your changes for v3
patch.

cdns-usb-common.ko is a libary, and no USB/GADGET dependency, could builds in.
  ├── core.o  
  └── drd.o

cdns3-host.ko     -> depends on USB/XHCI(it is m when USB = m
cdns3.ko (gadget) -> depends on USB_GADGET
cdnsp.ko (gadget) -> depends on USB_GADGET
cdns3-plat.ko     -> assign host_init/gadget_init function pointer

In that way, below combination could work:
cdns-usb-common=y
cdns3-host=m
cdns3(p)-gadget=y

> @@ -10,12 +11,24 @@ config USB_CDNS_SUPPORT
>  
>  config USB_CDNS_HOST
>  	bool
> +	depends on USB=y || USB=USB_CDNS_SUPPORT
> +
> +config CONFIG_USB_CDNS_PLATFORM

%s/CONFIG_USB_CDNS_PLATFORM/USB_CDNS_PLATFORM

Peter

> +	tristate "Cadence USB3 generic platform support"
> +	depends on USB_CDNSP || USB_CDNS3
> +	depends on USB_CDNSP || !USB_CDNSP
> +	depends on USB_CDNS3 || !USB_CDNS3
> +	help
> +	  The platform driver support is needed on any SoC integrating
> +	  a variant of the Cadence USB3 or USBSSP dual-role controllers,
> +	  e.g. the TI K3 or NXP i.MX series of SoCs.
>  
>  if USB_CDNS_SUPPORT
>  
>  config USB_CDNS3
>  	tristate "Cadence USB3 Dual-Role Controller"
>  	depends on USB_CDNS_SUPPORT
> +	select USB_CDNS_HOST if USB_CDNS3_HOST
>  	help
>  	  Say Y here if your system has a Cadence USB3 dual-role controller.
>  	  It supports: dual-role switch, Host-only, and Peripheral-only.
> @@ -23,8 +36,9 @@ config USB_CDNS3
>  if USB_CDNS3
>  
>  config USB_CDNS3_GADGET
> -	bool "Cadence USB3 device controller"
> +	tristate "Cadence USB3 device controller"
>  	depends on USB_GADGET=y || USB_GADGET=USB_CDNS3
> +	depends on USB_CDNS_SUPPORT
>  	help
>  	  Say Y here to enable device controller functionality of the
>  	  Cadence USBSS-DEV driver.
> @@ -34,8 +48,7 @@ config USB_CDNS3_GADGET
>  
>  config USB_CDNS3_HOST
>  	bool "Cadence USB3 host controller"
> -	depends on USB=y || USB=USB_CDNS3
> -	select USB_CDNS_HOST
> +	depends on USB=y || USB=USB_CDNS_SUPPORT
>  	help
>  	  Say Y here to enable host controller functionality of the
>  	  Cadence driver.
> @@ -57,6 +70,7 @@ config USB_CDNS3_PCI_WRAP
>  config USB_CDNS3_TI
>  	tristate "Cadence USB3 support on TI platforms"
>  	depends on ARCH_K3 || COMPILE_TEST
> +	depends on USB_CDNS_PLATFORM
>  	default USB_CDNS3
>  	help
>  	  Say 'Y' or 'M' here if you are building for Texas Instruments
> @@ -67,6 +81,7 @@ config USB_CDNS3_TI
>  config USB_CDNS3_IMX
>  	tristate "Cadence USB3 support on NXP i.MX platforms"
>  	depends on ARCH_MXC || COMPILE_TEST
> +	depends on USB_CDNS_PLATFORM
>  	default USB_CDNS3
>  	help
>  	  Say 'Y' or 'M' here if you are building for NXP i.MX
> @@ -77,6 +92,7 @@ config USB_CDNS3_IMX
>  config USB_CDNS3_STARFIVE
>  	tristate "Cadence USB3 support on StarFive SoC platforms"
>  	depends on ARCH_STARFIVE || COMPILE_TEST
> +	depends on USB_CDNS_PLATFORM
>  	help
>  	  Say 'Y' or 'M' here if you are building for StarFive SoCs
>  	  platforms that contain Cadence USB3 controller core.
> @@ -91,6 +107,7 @@ endif # USB_CDNS3
>  config USB_CDNSP
>  	tristate "Cadence USBSSP Dual-Role Controller"
>  	depends on USB_CDNS_SUPPORT
> +	select USB_CDNS_HOST if USB_CDNSP_HOST
>  	help
>  	  Say Y here if your system has a Cadence USBSSP dual-role controller.
>  	  It supports: dual-role switch, Host-only, and Peripheral-only.
> @@ -115,8 +132,7 @@ config USB_CDNSP_GADGET
>  
>  config USB_CDNSP_HOST
>  	bool "Cadence USBSSP host controller"
> -	depends on USB=y || USB=USB_CDNSP
> -	select USB_CDNS_HOST
> +	depends on USB=y || USB=USB_CDNS_SUPPORT
>  	help
>  	  Say Y here to enable host controller functionality of the
>  	  Cadence driver.
> diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile
> index 63484f145bb9..f1e00ab3d729 100644
> --- a/drivers/usb/cdns3/Makefile
> +++ b/drivers/usb/cdns3/Makefile
> @@ -5,32 +5,25 @@ CFLAGS_cdnsp-trace.o				:= -I$(src)
>  
>  cdns-usb-common-y				:= core.o drd.o
>  
> -ifeq ($(CONFIG_USB),m)
> -obj-m						+= cdns-usb-common.o
> -obj-m						+= cdns3-plat.o
> -else
>  obj-$(CONFIG_USB_CDNS_SUPPORT)			+= cdns-usb-common.o
> -obj-$(CONFIG_USB_CDNS_SUPPORT)			+= cdns3-plat.o
> -endif
> +
> +obj-$(CONFIG_USB_CDNS_PLATFORM)			+= cdns3-plat.o
>  
>  cdns-usb-common-$(CONFIG_USB_CDNS_HOST) 	+= host.o
>  
>  # For CDNS3 gadget
> -ifneq ($(CONFIG_USB_CDNS3_GADGET),)
>  cdns3-y						:= cdns3-gadget.o cdns3-ep0.o
>  cdns3-$(CONFIG_TRACING)				+= cdns3-trace.o
> -obj-$(CONFIG_USB_CDNS3)				+= cdns3.o
> -endif
> +obj-$(CONFIG_USB_CDNS3_GADGET)			+= cdns3.o
> +
>  obj-$(CONFIG_USB_CDNS3_PCI_WRAP)		+= cdns3-pci-wrap.o
>  obj-$(CONFIG_USB_CDNS3_TI)			+= cdns3-ti.o
>  obj-$(CONFIG_USB_CDNS3_IMX)			+= cdns3-imx.o
>  obj-$(CONFIG_USB_CDNS3_STARFIVE)		+= cdns3-starfive.o
>  
>  # For CDNSP gadget
> -ifneq ($(CONFIG_USB_CDNSP_GADGET),)
>  cdnsp-y						:= cdnsp-ring.o cdnsp-gadget.o \
>  						   cdnsp-mem.o cdnsp-ep0.o
>  cdnsp-$(CONFIG_TRACING)				+= cdnsp-trace.o
> -obj-$(CONFIG_USB_CDNSP)				+= cdnsp.o
> -endif
> +obj-$(CONFIG_USB_CDNSP_GADGET)			+= cdnsp.o
>  obj-$(CONFIG_USB_CDNSP_PCI)			+= cdnsp-pci.o
> diff --git a/drivers/usb/cdns3/gadget-export.h b/drivers/usb/cdns3/gadget-export.h
> index 0cb600e2b5d2..c37b6269b001 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
>  
> -#if defined(CONFIG_USB_CDNSP_GADGET) && IS_REACHABLE(CONFIG_USB_CDNSP)
> +#if IS_ENABLED(CONFIG_USB_CDNSP_GADGET)
>  
>  int cdnsp_gadget_init(struct cdns *cdns);
>  #else
> @@ -22,7 +22,7 @@ static inline int cdnsp_gadget_init(struct cdns *cdns)
>  
>  #endif /* CONFIG_USB_CDNSP_GADGET */
>  
> -#if defined(CONFIG_USB_CDNS3_GADGET) && IS_REACHABLE(CONFIG_USB_CDNS3)
> +#if IS_ENABLED(CONFIG_USB_CDNS3_GADGET)
>  
>  int cdns3_gadget_init(struct cdns *cdns);
>  #else
> -- 
> 2.39.5
> 

-- 

Best regards,
Peter

  parent reply	other threads:[~2026-04-03  7:50 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-02 14:09 [PATCH] usb: cdns3: attempt to fix Kconfig dependencies Arnd Bergmann
2026-04-02 15:21 ` Arnd Bergmann
2026-04-03  7:50 ` Peter Chen (CIX) [this message]
2026-04-03  8:39   ` Arnd Bergmann
2026-04-03  9:26     ` Peter Chen (CIX)
2026-04-03 18:50       ` Arnd Bergmann
2026-04-06  1:30         ` Peter Chen (CIX)
2026-04-03  8:54   ` Greg Kroah-Hartman
2026-04-03  9:40     ` Peter Chen (CIX)
2026-04-03 12:03       ` Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ac9xVUVB/BKfBUmE@nchen-desktop \
    --to=peter.chen@kernel.org \
    --cc=arnd@arndb.de \
    --cc=arnd@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=pawell@cadence.com \
    --cc=rogerq@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox