summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoon Khai Ng <[email protected]>2026-02-24 23:18:28 +0800
committerMarek Vasut <[email protected]>2026-07-21 05:19:06 +0200
commitd8f9c5595a824f08bc712e999eed9cb456b25efe (patch)
treec1ba5a3257cba387bf2922c9e42270cd4da8825d
parent042e45e026c77227319a426940577856ffe62e7b (diff)
usb: xhci-dwc3: Call xhci_deregister() before asserting reset
Reorder the remove path to deregister the controller first (and return early on failure), then shut down PHY/clocks and finally assert reset. This prevents register reads/writes after reset and avoids undefined behavior. Signed-off-by: Boon Khai Ng <[email protected]> Reviewed-by: Marek Vasut <[email protected]>
-rw-r--r--drivers/usb/host/xhci-dwc3.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/usb/host/xhci-dwc3.c b/drivers/usb/host/xhci-dwc3.c
index 8ad07a4b98c..3504a7cf42c 100644
--- a/drivers/usb/host/xhci-dwc3.c
+++ b/drivers/usb/host/xhci-dwc3.c
@@ -226,6 +226,11 @@ static int xhci_dwc3_probe(struct udevice *dev)
static int xhci_dwc3_remove(struct udevice *dev)
{
struct xhci_dwc3_plat *plat = dev_get_plat(dev);
+ int ret;
+
+ ret = xhci_deregister(dev);
+ if (ret)
+ return ret;
dwc3_shutdown_phy(dev, &plat->phys);
@@ -233,7 +238,7 @@ static int xhci_dwc3_remove(struct udevice *dev)
reset_release_bulk(&plat->resets);
- return xhci_deregister(dev);
+ return 0;
}
static const struct udevice_id xhci_dwc3_ids[] = {