OSDN Git Service

usb: dwc2: Add exit partial power down before removing driver
authorArtur Petrosyan <Arthur.Petrosyan@synopsys.com>
Thu, 8 Apr 2021 09:46:14 +0000 (13:46 +0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 Apr 2021 13:16:39 +0000 (15:16 +0200)
When dwc2 core is in partial power down mode
loading driver again causes driver fail. Because in
that mode registers are not accessible.

Added a flow of exiting the partial power down mode
to avoid the driver reload failure.

Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
Signed-off-by: Artur Petrosyan <Arthur.Petrosyan@synopsys.com>
Link: https://lore.kernel.org/r/20210408094615.8AE35A0094@mailhost.synopsys.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc2/platform.c

index 5f18aca..b28b8cd 100644 (file)
@@ -316,6 +316,15 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
 static int dwc2_driver_remove(struct platform_device *dev)
 {
        struct dwc2_hsotg *hsotg = platform_get_drvdata(dev);
+       int ret = 0;
+
+       /* Exit Partial Power Down when driver is removed. */
+       if (hsotg->in_ppd) {
+               ret = dwc2_exit_partial_power_down(hsotg, 0, true);
+               if (ret)
+                       dev_err(hsotg->dev,
+                               "exit partial_power_down failed\n");
+       }
 
        dwc2_debugfs_exit(hsotg);
        if (hsotg->hcd_enabled)
@@ -334,7 +343,7 @@ static int dwc2_driver_remove(struct platform_device *dev)
        reset_control_assert(hsotg->reset);
        reset_control_assert(hsotg->reset_ecc);
 
-       return 0;
+       return ret;
 }
 
 /**