> > diff --git a/drivers/usb/host/xhci-plat.c > > b/drivers/usb/host/xhci-plat.c index 1d4f6f85f0fe..f38d53528c96 100644 > > --- a/drivers/usb/host/xhci-plat.c > > +++ b/drivers/usb/host/xhci-plat.c > > @@ -362,6 +362,7 @@ static int xhci_plat_remove(struct platform_device *dev) > > struct clk *reg_clk = xhci->reg_clk; > > struct usb_hcd *shared_hcd = xhci->shared_hcd; > > > > + pm_runtime_get_sync(&dev->dev); > > xhci->xhc_state |= XHCI_STATE_REMOVING; > > > > usb_remove_hcd(shared_hcd); > > You mustn't add a pm_runtime_get call without a corresponding pm_runtime_put > call. > > With just this one call, if the role switched from host to device and then back to host, > then the host would never be able to go into runtime suspend. > I may not consider carefully for other cases, for my case, the xhci-plat device will be removed, and re-created. But if we remove the driver using modprobe, it may have issues. > In this case the correspondence between the get's and the put's will probably be > obscure; some comments would help. > I explained at the reply for Mathias's, but I am not 100% it is the root cause. Peter