[PATCH v2 07/10] usb: dwc3: generic: add board_usb_init/cleanup hooks
Marek Vasut
marek.vasut at mailbox.org
Sat Jul 11 22:00:52 CEST 2026
On 6/21/26 4:06 AM, Peng Fan (OSS) wrote:
> From: Ye Li <ye.li at nxp.com>
>
> Call board_usb_init() during dwc3_generic_probe() and
> board_usb_cleanup() during dwc3_generic_remove() to allow
> board-level USB configuration (e.g. Type-C CC role, SS mux,
> VBUS control) before DWC3 core initialization.
>
> Signed-off-by: Ye Li <ye.li at nxp.com>
> Signed-off-by: Peng Fan <peng.fan at nxp.com>
> ---
> drivers/usb/dwc3/dwc3-generic.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
> index 2356b3bc0aa..2c6f8e6d8ba 100644
> --- a/drivers/usb/dwc3/dwc3-generic.c
> +++ b/drivers/usb/dwc3/dwc3-generic.c
> @@ -9,6 +9,7 @@
>
> #include <dm.h>
> #include <reset.h>
> +#include <usb.h>
> #include <asm/gpio.h>
> #include <dm/device_compat.h>
> #include <dm/lists.h>
> @@ -118,6 +119,11 @@ static int dwc3_generic_probe(struct udevice *dev,
> if (device_is_compatible(dev->parent, "rockchip,rk3399-dwc3"))
> reset_deassert_bulk(&glue->resets);
>
> + if (mode == USB_DR_MODE_HOST)
> + board_usb_init(dev_seq(dev), USB_INIT_HOST);
> + else if (mode == USB_DR_MODE_PERIPHERAL)
> + board_usb_init(dev_seq(dev), USB_INIT_DEVICE);
Pass udevice into the callbacks directly, dev_seq() is a backward
compatibility workaround and the board code could always call it if needed.
> +
> priv->base = map_physmem(plat->base, DWC3_OTG_REGS_END, MAP_NOCACHE);
> dwc3->regs = priv->base + DWC3_GLOBALS_REGS_START;
>
> @@ -134,6 +140,7 @@ static int dwc3_generic_remove(struct udevice *dev,
> struct dwc3_generic_priv *priv)
> {
> struct dwc3 *dwc3 = &priv->dwc3;
> + enum usb_dr_mode mode = dwc3->dr_mode;
>
> if (CONFIG_IS_ENABLED(DM_GPIO) &&
> device_is_compatible(dev->parent, "xlnx,zynqmp-dwc3") &&
> @@ -147,6 +154,11 @@ static int dwc3_generic_remove(struct udevice *dev,
> dwc3_shutdown_phy(dev, &priv->phys);
> unmap_physmem(dwc3->regs, MAP_NOCACHE);
>
> + if (mode == USB_DR_MODE_HOST)
> + board_usb_cleanup(dev_seq(dev), USB_INIT_HOST);
> + else if (mode == USB_DR_MODE_PERIPHERAL)
> + board_usb_cleanup(dev_seq(dev), USB_INIT_DEVICE);
> +
This is supposed to be generic DT based glue code, can we avoid the
board-specific callbacks entirely ?
More information about the U-Boot
mailing list