On Thu, Aug 04, 2022 at 05:09:53PM +0200, Johan Hovold wrote: > Generic PHYs must be powered-off before they can be tore down. > > Similarly, suspending legacy PHYs after having powered them off makes no > sense. > > Fix the dwc3_core_exit() (e.g. called during suspend) and open-coded > dwc3_probe() error-path sequences that got this wrong. > > Note that this makes dwc3_core_exit() match the dwc3_core_init() error > path with respect to powering off the PHYs. > > Fixes: 03c1fd622f72 ("usb: dwc3: core: add phy cleanup for probe error handling") > Fixes: c499ff71ff2a ("usb: dwc3: core: re-factor init and exit paths") > Cc: stable@xxxxxxxxxxxxxxx # 4.8 > Reviewed-by: Andrew Halaney <ahalaney@xxxxxxxxxx> > Reviewed-by: Matthias Kaehlcke <mka@xxxxxxxxxxxx> > Signed-off-by: Johan Hovold <johan+linaro@xxxxxxxxxx> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> Thanks, Mani > --- > drivers/usb/dwc3/core.c | 19 ++++++++++--------- > 1 file changed, 10 insertions(+), 9 deletions(-) > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index c5c238ab3083..16d1f328775f 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c > @@ -833,15 +833,16 @@ static void dwc3_core_exit(struct dwc3 *dwc) > { > dwc3_event_buffers_cleanup(dwc); > > + usb_phy_set_suspend(dwc->usb2_phy, 1); > + usb_phy_set_suspend(dwc->usb3_phy, 1); > + phy_power_off(dwc->usb2_generic_phy); > + phy_power_off(dwc->usb3_generic_phy); > + > usb_phy_shutdown(dwc->usb2_phy); > usb_phy_shutdown(dwc->usb3_phy); > phy_exit(dwc->usb2_generic_phy); > phy_exit(dwc->usb3_generic_phy); > > - usb_phy_set_suspend(dwc->usb2_phy, 1); > - usb_phy_set_suspend(dwc->usb3_phy, 1); > - phy_power_off(dwc->usb2_generic_phy); > - phy_power_off(dwc->usb3_generic_phy); > dwc3_clk_disable(dwc); > reset_control_assert(dwc->reset); > } > @@ -1879,16 +1880,16 @@ static int dwc3_probe(struct platform_device *pdev) > dwc3_debugfs_exit(dwc); > dwc3_event_buffers_cleanup(dwc); > > - usb_phy_shutdown(dwc->usb2_phy); > - usb_phy_shutdown(dwc->usb3_phy); > - phy_exit(dwc->usb2_generic_phy); > - phy_exit(dwc->usb3_generic_phy); > - > usb_phy_set_suspend(dwc->usb2_phy, 1); > usb_phy_set_suspend(dwc->usb3_phy, 1); > phy_power_off(dwc->usb2_generic_phy); > phy_power_off(dwc->usb3_generic_phy); > > + usb_phy_shutdown(dwc->usb2_phy); > + usb_phy_shutdown(dwc->usb3_phy); > + phy_exit(dwc->usb2_generic_phy); > + phy_exit(dwc->usb3_generic_phy); > + > dwc3_ulpi_exit(dwc); > > err4: > -- > 2.35.1 > -- மணிவண்ணன் சதாசிவம்