These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / phy / phy-samsung-usb2.c
index 55b6994..1d22d93 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,10 +78,13 @@ 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 struct phy_ops samsung_usb2_phy_ops = {
+static const struct phy_ops samsung_usb2_phy_ops = {
        .power_on       = samsung_usb2_phy_power_on,
        .power_off      = samsung_usb2_phy_power_off,
        .owner          = THIS_MODULE,
@@ -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];