On Fri, 22 Mar 2019, Tony Lindgren wrote: > If OHCI is runtime suspended, we can currently get an "imprecise > external abort" on reboot with ohci-platform loaded when PM runtime > is implemented for the SoC. > > Let's fix this by implementing ohci_platform_shutdown with PM runtime > calls clocking the hardware before calling hcd->driver->shutdown. > > Fixes: 0aa0b93e7af6 ("usb: host: ohci-platform: Add basic runtime PM support") > Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx> > --- > drivers/usb/host/ohci-platform.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c > --- a/drivers/usb/host/ohci-platform.c > +++ b/drivers/usb/host/ohci-platform.c > @@ -240,6 +240,22 @@ static int ohci_platform_probe(struct platform_device *dev) > return err; > } > > +static void ohci_platform_shutdown(struct platform_device *pdev) > +{ > + struct usb_hcd *hcd = platform_get_drvdata(pdev); > + int err; > + > + err = pm_runtime_get_sync(&pdev->dev); > + if (err < 0) > + pm_runtime_put_noidle(&pdev->dev); > + > + if (hcd->driver->shutdown) > + hcd->driver->shutdown(hcd); > + > + if (!err) > + pm_runtime_put_sync(&pdev->dev); > +} How about putting these runtime PM additions into usb_hcd_platform_shutdown instead, so they will apply to all platform controller drivers? Also, are you certain you want the pm_runtime_put_sync at the end? If the system is shutting down anyway, why waste time doing an extra runtime suspend? Alan Stern > + > static int ohci_platform_remove(struct platform_device *dev) > { > struct usb_hcd *hcd = platform_get_drvdata(dev); > @@ -326,7 +342,7 @@ static struct platform_driver ohci_platform_driver = { > .id_table = ohci_platform_table, > .probe = ohci_platform_probe, > .remove = ohci_platform_remove, > - .shutdown = usb_hcd_platform_shutdown, > + .shutdown = ohci_platform_shutdown, > .driver = { > .name = "ohci-platform", > .pm = &ohci_platform_pm_ops, >