On 6/21/26 4:06 AM, Peng Fan (OSS) wrote:
From: Ye Li <[email protected]>
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 <[email protected]>
Signed-off-by: Peng Fan <[email protected]>
---
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 ?