UPSTREAM: phy: rockchip-usb: fix clock get-put mismatch
authorHeiko Stuebner <heiko@sntech.de>
Thu, 19 Nov 2015 21:22:22 +0000 (22:22 +0100)
committerHuang, Tao <huangtao@rock-chips.com>
Thu, 25 Feb 2016 08:10:00 +0000 (16:10 +0800)
Currently the phy driver only gets the optional clock reference but
never puts it again, neither during error handling nor on remove.
Fix that by moving the clk_put to a devm-action that gets called at
the right time when all other devm actions are done.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
(cherry picked from commit 75d390fecf9e69eebca7f15de40d761e33fcfd7b)

Change-Id: I976d5a49448febdb7da5b5c35455c708bfc83899

drivers/phy/phy-rockchip-usb.c

index 62c43c435194313e7d5ea7049d568cb673857da9..e941444072bad19ccbc0dfce9ac35d16c4945e8a 100644 (file)
@@ -90,6 +90,14 @@ static const struct phy_ops ops = {
        .owner          = THIS_MODULE,
 };
 
+static void rockchip_usb_phy_action(void *data)
+{
+       struct rockchip_usb_phy *rk_phy = data;
+
+       if (rk_phy->clk)
+               clk_put(rk_phy->clk);
+}
+
 static int rockchip_usb_phy_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -123,6 +131,10 @@ static int rockchip_usb_phy_probe(struct platform_device *pdev)
                rk_phy->reg_offset = reg_offset;
                rk_phy->reg_base = grf;
 
+               err = devm_add_action(dev, rockchip_usb_phy_action, rk_phy);
+               if (err)
+                       return err;
+
                rk_phy->clk = of_clk_get_by_name(child, "phyclk");
                if (IS_ERR(rk_phy->clk))
                        rk_phy->clk = NULL;