rk31xx lvds: add power domain control for lvds
authorhjc <hjc@rock-chips.com>
Thu, 19 Mar 2015 09:02:30 +0000 (17:02 +0800)
committerhjc <hjc@rock-chips.com>
Thu, 19 Mar 2015 09:02:59 +0000 (17:02 +0800)
Signed-off-by: hjc <hjc@rock-chips.com>
arch/arm64/boot/dts/rk3368.dtsi
drivers/video/rockchip/transmitter/rk31xx_lvds.c
drivers/video/rockchip/transmitter/rk31xx_lvds.h

index f33094081d1d61bcf2398966d607df1abe37ec04..4d90d636dd9cb25186ec3b1bddf9da5507a02100 100755 (executable)
                rockchip,grf = <&grf>;
                reg = <0x0 0xff968000 0x0 0x4000>, <0x0 0xff9600a0 0x0 0x20>;
                reg-names = "mipi_lvds_phy", "mipi_lvds_ctl";
-               clocks = <&clk_gates22 10>, <&clk_gates17 3>;
-               clock-names = "pclk_lvds", "pclk_lvds_ctl";
+               clocks = <&clk_gates22 10>, <&clk_gates17 3>, <&pd_lvds>;
+               clock-names = "pclk_lvds", "pclk_lvds_ctl", "pd_lvds";
                status = "disabled";
        };
 
index 2ee1216236200d44573096db41233b1d9cf43537..41f00a535a8147ad9870498bf898283cb2b5e192 100755 (executable)
@@ -58,7 +58,13 @@ static int rk31xx_lvds_clk_init(struct rk_lvds_device *lvds)
                        dev_err(lvds->dev, "get ctrl hclk failed\n");
                        return PTR_ERR(lvds->ctrl_hclk);
                }
-       }
+       } else {
+                lvds->pd = devm_clk_get(lvds->dev, "pd_lvds");
+                if (IS_ERR(lvds->pd)) {
+                        dev_err(lvds->dev, "get pd_lvds failed\n");
+                        return PTR_ERR(lvds->pd);
+                }
+        }
 
        return 0;       
 }
@@ -70,6 +76,8 @@ static int rk31xx_lvds_clk_enable(struct rk_lvds_device *lvds)
                clk_prepare_enable(lvds->ctrl_pclk);
                if (lvds->data->soc_type == LVDS_SOC_RK312X)
                        clk_prepare_enable(lvds->ctrl_hclk);
+               else
+                       clk_prepare_enable(lvds->pd);
                lvds->clk_on = true;
        }
 
@@ -82,6 +90,8 @@ static int rk31xx_lvds_clk_disable(struct rk_lvds_device *lvds)
                clk_disable_unprepare(lvds->pclk);
                if (lvds->data->soc_type == LVDS_SOC_RK312X)
                        clk_disable_unprepare(lvds->ctrl_hclk);
+               else
+                       clk_disable_unprepare(lvds->pd);
                clk_disable_unprepare(lvds->ctrl_pclk);
                lvds->clk_on = false;
        }
index 253d8c78da14273166d9c2a8274590454781af6e..dbc094ce3fa68e90968b4b648b53661ac10fe1eb 100755 (executable)
@@ -132,6 +132,7 @@ struct rk_lvds_device {
        void __iomem            *regbase;
        void __iomem            *ctrl_reg;
        struct regmap           *grf_lvds_base;
+       struct clk              *pd;  /*power domain*/
        struct clk              *pclk;  /*phb clk*/
        struct clk              *ctrl_pclk;     /* mipi ctrl pclk*/
        struct clk              *ctrl_hclk;     /* mipi ctrl hclk*/