usb: dwc2: improve error handling in __dwc2_lowlevel_hw_enable
Add error handling in __dwc2_lowlevel_hw_enable() that may leave the clocks and regulators enabled upon error. Acked-by: Minas Harutyunyan <hminas@synopsys.com> Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com> Link: https://lore.kernel.org/r/20230414084137.1050487-2-fabrice.gasnier@foss.st.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6a14ffc05c
commit
236d835302
|
@ -104,7 +104,7 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg)
|
||||||
if (hsotg->clk) {
|
if (hsotg->clk) {
|
||||||
ret = clk_prepare_enable(hsotg->clk);
|
ret = clk_prepare_enable(hsotg->clk);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_dis_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hsotg->uphy) {
|
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);
|
ret = hsotg->plat->phy_init(pdev, hsotg->plat->phy_type);
|
||||||
} else {
|
} else {
|
||||||
ret = phy_init(hsotg->phy);
|
ret = phy_init(hsotg->phy);
|
||||||
if (ret == 0)
|
if (ret == 0) {
|
||||||
ret = phy_power_on(hsotg->phy);
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue