Message ID | 20230414084137.1050487-2-fabrice.gasnier@foss.st.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 236d835302bd4e11697dfe65eb24a219ea5c70eb |
Headers | show |
Series | usb: dwc2: add optional clock used on stm32mp15 | expand |
On 4/14/23 12:41, Fabrice Gasnier wrote: > Add error handling in __dwc2_lowlevel_hw_enable() that may leave the > clocks and regulators enabled upon error. > > Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com> Acked-by: Minas Harutyunyan <hminas@synopsys.com> > --- > drivers/usb/dwc2/platform.c | 19 +++++++++++++++++-- > 1 file changed, 17 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c > index d1589ba7d322..c431ce6c119f 100644 > --- a/drivers/usb/dwc2/platform.c > +++ b/drivers/usb/dwc2/platform.c > @@ -104,7 +104,7 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) > if (hsotg->clk) { > ret = clk_prepare_enable(hsotg->clk); > if (ret) > - return ret; > + goto err_dis_reg; > } > > if (hsotg->uphy) { > @@ -113,10 +113,25 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) > ret = hsotg->plat->phy_init(pdev, hsotg->plat->phy_type); > } else { > ret = phy_init(hsotg->phy); > - if (ret == 0) > + if (ret == 0) { > ret = phy_power_on(hsotg->phy); > + if (ret) > + phy_exit(hsotg->phy); > + } > } > > + if (ret) > + goto err_dis_clk; > + > + return 0; > + > +err_dis_clk: > + if (hsotg->clk) > + clk_disable_unprepare(hsotg->clk); > + > +err_dis_reg: > + regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); > + > return ret; > } >
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index d1589ba7d322..c431ce6c119f 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c @@ -104,7 +104,7 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) if (hsotg->clk) { ret = clk_prepare_enable(hsotg->clk); if (ret) - return ret; + goto err_dis_reg; } if (hsotg->uphy) { @@ -113,10 +113,25 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) ret = hsotg->plat->phy_init(pdev, hsotg->plat->phy_type); } else { ret = phy_init(hsotg->phy); - if (ret == 0) + if (ret == 0) { ret = phy_power_on(hsotg->phy); + if (ret) + phy_exit(hsotg->phy); + } } + if (ret) + goto err_dis_clk; + + return 0; + +err_dis_clk: + if (hsotg->clk) + clk_disable_unprepare(hsotg->clk); + +err_dis_reg: + regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); + return ret; }
Add error handling in __dwc2_lowlevel_hw_enable() that may leave the clocks and regulators enabled upon error. Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com> --- drivers/usb/dwc2/platform.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)