diff options
| author | Boon Khai Ng <[email protected]> | 2026-02-24 23:18:28 +0800 |
|---|---|---|
| committer | Marek Vasut <[email protected]> | 2026-07-21 05:19:06 +0200 |
| commit | d8f9c5595a824f08bc712e999eed9cb456b25efe (patch) | |
| tree | c1ba5a3257cba387bf2922c9e42270cd4da8825d | |
| parent | 042e45e026c77227319a426940577856ffe62e7b (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.c | 7 |
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[] = { |
