video: rockchip: edp: Solve the problem of write grf register failure
authorxubilv <xbl@rock-chips.com>
Thu, 20 Oct 2016 03:38:11 +0000 (11:38 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Fri, 21 Oct 2016 08:07:15 +0000 (16:07 +0800)
Change-Id: Ia5fa679f4cda5e0c62cf40f2079735c01d0817bc
Signed-off-by: xubilv <xbl@rock-chips.com>
arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
drivers/video/rockchip/transmitter/rk32_dp.c
drivers/video/rockchip/transmitter/rk32_dp.h

index 83ed035d4b4111cc1b32d8be99c8acffea6b6115..260427d127c018d052042311ed0914de366a462d 100644 (file)
                reg = <0x0 0xff970000 0x0 0x8000>;
                rockchip,grf = <&grf>;
                interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH 0>;
-               clocks = <&cru PCLK_EDP>, <&cru PCLK_EDP_CTRL>;
-               clock-names = "clk_edp", "pclk_edp";
+               clocks = <&cru PCLK_EDP>, <&cru PCLK_EDP_CTRL>, <&cru PCLK_VIO_GRF>;
+               clock-names = "clk_edp", "pclk_edp", "clk_grf";
                resets = <&cru SRST_P_EDP_CTRL>;
                reset-names = "edp_apb";
                status = "disabled";
index 1f665551bc39eff1a4e1ada342392d13d6401423..6d386bc0e383633b75329d86e3f2eec6bf5b8288 100755 (executable)
@@ -144,7 +144,9 @@ static int rk32_edp_init_edp(struct rk32_edp *edp)
                        val = EDP_SEL_VOP_LIT | (EDP_SEL_VOP_LIT << 16);
                else
                        val = EDP_SEL_VOP_LIT << 16;
+               clk_prepare_enable(edp->grf_clk);
                regmap_write(edp->grf, RK3399_GRF_SOC_CON20, val);
+               clk_disable_unprepare(edp->grf_clk);
        }
 
        rk32_edp_reset(edp);
@@ -1778,6 +1780,14 @@ static int rk32_edp_probe(struct platform_device *pdev)
                return PTR_ERR(edp->grf);
        }
 
+       if (edp->soctype == SOC_RK3399) {
+               edp->grf_clk = devm_clk_get(&pdev->dev, "clk_grf");
+               if (IS_ERR(edp->grf_clk)) {
+                       dev_err(&pdev->dev, "cannot get grf clk\n");
+                       return PTR_ERR(edp->grf_clk);
+               }
+       }
+
        edp->pd = devm_clk_get(&pdev->dev, "pd_edp");
        if (IS_ERR(edp->pd)) {
                dev_err(&pdev->dev, "cannot get pd\n");
index c51bcff0bcc360905a164976dbf750a4a48e6a1b..2dc41c6b2ec5f04c6fa3acb374c2d848a55c9499 100755 (executable)
@@ -556,6 +556,7 @@ struct rk32_edp {
        void __iomem            *regs;
        struct regmap           *grf;
        unsigned int            irq;
+       struct clk              *grf_clk;
        struct clk              *pd;
        struct clk              *clk_edp;  /*clk for edp controller*/
        struct clk              *clk_24m;  /*clk for edp phy*/
@@ -667,4 +668,4 @@ int rk32_edp_wait_hw_lt_done(struct rk32_edp *edp);
 enum dp_irq_type rk32_edp_get_irq_type(struct rk32_edp *edp);
 void rk32_edp_clear_hotplug_interrupts(struct rk32_edp *edp);
 
-#endif
\ No newline at end of file
+#endif