Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/rockchip: analogix_dp: introduce the pclk for grf

For RK3399's GRF module, if we want to operate the graphic related grf
registers, we need to enable the pclk_vio_grf which supply power for VIO
GRF IOs, so it's better to introduce an optional grf clock in driver.

Signed-off-by: Yakir Yang <ykk@rock-chips.com>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Tomasz Figa <tomasz.figa@chromium.com>

+26 -3
+6
Documentation/devicetree/bindings/display/rockchip/analogix_dp-rockchip.txt
··· 28 28 Port 0: contained 2 endpoints, connecting to the output of vop. 29 29 Port 1: contained 1 endpoint, connecting to the input of panel. 30 30 31 + Optional property for different chips: 32 + - clocks: from common clock binding: handle to grf_vio clock. 33 + 34 + - clock-names: from common clock binding: 35 + Required elements: "grf" 36 + 31 37 For the below properties, please refer to Analogix DP binding document: 32 38 * Documentation/devicetree/bindings/drm/bridge/analogix_dp.txt 33 39 - phys (required)
+20 -3
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
··· 64 64 struct drm_display_mode mode; 65 65 66 66 struct clk *pclk; 67 + struct clk *grfclk; 67 68 struct regmap *grf; 68 69 struct reset_control *rst; 69 70 ··· 161 160 162 161 dev_dbg(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG"); 163 162 164 - ret = regmap_write(dp->grf, dp->data->lcdsel_grf_reg, val); 165 - if (ret != 0) { 166 - dev_err(dp->dev, "Could not write to GRF: %d\n", ret); 163 + ret = clk_prepare_enable(dp->grfclk); 164 + if (ret < 0) { 165 + dev_err(dp->dev, "failed to enable grfclk %d\n", ret); 167 166 return; 168 167 } 168 + 169 + ret = regmap_write(dp->grf, dp->data->lcdsel_grf_reg, val); 170 + if (ret != 0) 171 + dev_err(dp->dev, "Could not write to GRF: %d\n", ret); 172 + 173 + clk_disable_unprepare(dp->grfclk); 169 174 } 170 175 171 176 static void rockchip_dp_drm_encoder_nop(struct drm_encoder *encoder) ··· 239 232 if (IS_ERR(dp->grf)) { 240 233 dev_err(dev, "failed to get rockchip,grf property\n"); 241 234 return PTR_ERR(dp->grf); 235 + } 236 + 237 + dp->grfclk = devm_clk_get(dev, "grf"); 238 + if (PTR_ERR(dp->grfclk) == -ENOENT) { 239 + dp->grfclk = NULL; 240 + } else if (PTR_ERR(dp->grfclk) == -EPROBE_DEFER) { 241 + return -EPROBE_DEFER; 242 + } else if (IS_ERR(dp->grfclk)) { 243 + dev_err(dev, "failed to get grf clock\n"); 244 + return PTR_ERR(dp->grfclk); 242 245 } 243 246 244 247 dp->pclk = devm_clk_get(dev, "pclk");