OSDN Git Service

phy: samsung_usb2: Fixup samsung_usb2_phy_power_on/off paths
authorAxel Lin <axel.lin@ingics.com>
Tue, 17 Mar 2015 00:42:38 +0000 (08:42 +0800)
committerKishon Vijay Abraham I <kishon@ti.com>
Wed, 25 Mar 2015 23:36:10 +0000 (05:06 +0530)
Ensure we have balanced clk_prepare_enable/clk_disable_unprepare calls if
.power_on or .power_off callbacks return error.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
drivers/phy/phy-samsung-usb2.c

index 4a12f66..55b6994 100644 (file)
@@ -37,10 +37,14 @@ static int samsung_usb2_phy_power_on(struct phy *phy)
                spin_lock(&drv->lock);
                ret = inst->cfg->power_on(inst);
                spin_unlock(&drv->lock);
+               if (ret)
+                       goto err_power_on;
        }
 
        return 0;
 
+err_power_on:
+       clk_disable_unprepare(drv->ref_clk);
 err_instance_clk:
        clk_disable_unprepare(drv->clk);
 err_main_clk:
@@ -51,7 +55,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 = 0;
+       int ret;
 
        dev_dbg(drv->dev, "Request to power_off \"%s\" usb phy\n",
                inst->cfg->label);
@@ -59,10 +63,12 @@ static int samsung_usb2_phy_power_off(struct phy *phy)
                spin_lock(&drv->lock);
                ret = inst->cfg->power_off(inst);
                spin_unlock(&drv->lock);
+               if (ret)
+                       return ret;
        }
        clk_disable_unprepare(drv->ref_clk);
        clk_disable_unprepare(drv->clk);
-       return ret;
+       return 0;
 }
 
 static struct phy_ops samsung_usb2_phy_ops = {