Message ID | 20210408094615.8AE35A0094@mailhost.synopsys.com (mailing list archive) |
---|---|
State | Accepted |
Commit | b46b1ef7b0da5c9257b98a0d1d658422e7851783 |
Headers | show |
Series | usb: dwc2: Fix Partial Power down issues. | expand |
On 4/8/2021 1:46 PM, Artur Petrosyan wrote: > 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. > > Signed-off-by: Artur Petrosyan <Arthur.Petrosyan@synopsys.com> Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com> > --- > Changes in v3: > - None > Changes in v2: > - None > > drivers/usb/dwc2/platform.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c > index 5f18acac7406..b28b8cd45799 100644 > --- a/drivers/usb/dwc2/platform.c > +++ b/drivers/usb/dwc2/platform.c > @@ -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; > } > > /** >
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index 5f18acac7406..b28b8cd45799 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c @@ -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; } /**
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. Signed-off-by: Artur Petrosyan <Arthur.Petrosyan@synopsys.com> --- Changes in v3: - None Changes in v2: - None drivers/usb/dwc2/platform.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)