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 <[email protected]>
> ---
> 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,
>