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]> --- drivers/usb/host/xhci-dwc3.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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[] = { -- 2.43.7

