]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/phy/phy-samsung-usb2.c
Merge remote-tracking branch 'usb/usb-next'
[karo-tx-linux.git] / drivers / phy / phy-samsung-usb2.c
index f278a9c547e199c6228081f3445133dcdd9cda46..1d22d93b552d759df577a26228f0e7c7464c83c9 100644 (file)
@@ -27,6 +27,13 @@ static int samsung_usb2_phy_power_on(struct phy *phy)
 
        dev_dbg(drv->dev, "Request to power_on \"%s\" usb phy\n",
                inst->cfg->label);
+
+       if (drv->vbus) {
+               ret = regulator_enable(drv->vbus);
+               if (ret)
+                       goto err_regulator;
+       }
+
        ret = clk_prepare_enable(drv->clk);
        if (ret)
                goto err_main_clk;
@@ -48,6 +55,9 @@ err_power_on:
 err_instance_clk:
        clk_disable_unprepare(drv->clk);
 err_main_clk:
+       if (drv->vbus)
+               regulator_disable(drv->vbus);
+err_regulator:
        return ret;
 }
 
@@ -55,7 +65,7 @@ static int samsung_usb2_phy_power_off(struct phy *phy)
 {
        struct samsung_usb2_phy_instance *inst = phy_get_drvdata(phy);
        struct samsung_usb2_phy_driver *drv = inst->drv;
-       int ret;
+       int ret = 0;
 
        dev_dbg(drv->dev, "Request to power_off \"%s\" usb phy\n",
                inst->cfg->label);
@@ -68,7 +78,10 @@ static int samsung_usb2_phy_power_off(struct phy *phy)
        }
        clk_disable_unprepare(drv->ref_clk);
        clk_disable_unprepare(drv->clk);
-       return 0;
+       if (drv->vbus)
+               ret = regulator_disable(drv->vbus);
+
+       return ret;
 }
 
 static const struct phy_ops samsung_usb2_phy_ops = {
@@ -203,6 +216,14 @@ static int samsung_usb2_phy_probe(struct platform_device *pdev)
                        return ret;
        }
 
+       drv->vbus = devm_regulator_get(dev, "vbus");
+       if (IS_ERR(drv->vbus)) {
+               ret = PTR_ERR(drv->vbus);
+               if (ret == -EPROBE_DEFER)
+                       return ret;
+               drv->vbus = NULL;
+       }
+
        for (i = 0; i < drv->cfg->num_phys; i++) {
                char *label = drv->cfg->phys[i].label;
                struct samsung_usb2_phy_instance *p = &drv->instances[i];