return 0;
 }
 
+static void __dwc2_disable_regulators(void *data)
+{
+       struct dwc2_hsotg *hsotg = data;
+
+       regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies);
+}
+
 static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg)
 {
        struct platform_device *pdev = to_platform_device(hsotg->dev);
        if (ret)
                return ret;
 
+       ret = devm_add_action_or_reset(&pdev->dev,
+                                      __dwc2_disable_regulators, hsotg);
+       if (ret)
+               return ret;
+
        if (hsotg->clk) {
                ret = clk_prepare_enable(hsotg->clk);
                if (ret)
        if (hsotg->clk)
                clk_disable_unprepare(hsotg->clk);
 
-       ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
-                                    hsotg->supplies);
-
-       return ret;
+       return 0;
 }
 
 /**