Problem: The first "run fastboot" works and enumerates on the host.
Subsequent runs fail, with no USB enumeration observed.

With flat DTS configurations, the peripheral device inherits
power-domains from its parent (glue) node, as both reference the
same DT node. During teardown after "fastboot continue",
device_remove() of peripheral device invokes dev_power_domain_off(),
which powers off the shared USB GDSC.

As a result, the next "run fastboot" fails because the power
domain is left in an uninitialized state.

Add DM_FLAG_LEAVE_PD_ON to dwc3_generic_peripheral to prevent
power domain shutdown during peripheral removal.

This aligns with hierarchical DTS behavior, where the peripheral
child does not own power-domains. Power management remains with
the glue device, which persists across probe/remove cycles,
allowing repeated fastboot runs to succeed.

Signed-off-by: Balaji Selvanathan <[email protected]>
---
 drivers/usb/dwc3/dwc3-generic.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 22b9ef0b24e..788fe6fc819 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -220,6 +220,7 @@ U_BOOT_DRIVER(dwc3_generic_peripheral) = {
        .remove = dwc3_generic_peripheral_remove,
        .priv_auto      = sizeof(struct dwc3_generic_priv),
        .plat_auto      = sizeof(struct dwc3_generic_plat),
+       .flags  = DM_FLAG_LEAVE_PD_ON,
 };
 #endif
 

---
base-commit: 987907ae4bcc5d6055bdf7d318a3edf53e14d5fa
change-id: 20260529-usb-3b6b44559cc5

Best regards,
-- 
Balaji Selvanathan <[email protected]>

Reply via email to