usb: dwc2: improve error handling in __dwc2_lowlevel_hw_enable
authorFabrice Gasnier <fabrice.gasnier@foss.st.com>
Fri, 14 Apr 2023 08:41:34 +0000 (10:41 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Apr 2023 08:17:06 +0000 (10:17 +0200)
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>
drivers/usb/dwc2/platform.c

index d1589ba..c431ce6 100644 (file)
@@ -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;
 }