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

drm/msm/dsi: correct byte intf clock rate for 14nm DSI PHY

According to the vendor kernel, byte intf clock rate should be a half of
the byte clock only when DSI PHY version is above 2.0 (in other words,
10nm PHYs and later) and only if PHY is used in D-PHY mode. Currently
MSM DSI code handles only the second part of the clause (C-PHY vs
D-PHY), skipping DSI PHY version check, which causes issues on some of
14nm DSI PHY platforms (e.g. qcm2290).

Move divisor selection to DSI PHY code, pass selected divisor through
shared timings and set byte intf clock rate accordingly.

Cc: Loic Poulain <loic.poulain@linaro.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Tested-by: Konrad Dybcio <konrad.dybcio@linaro.org> # SM6115P J606F
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/519006/
Link: https://lore.kernel.org/r/20230118130027.2345719-1-dmitry.baryshkov@linaro.org
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

+11 -8
+1
drivers/gpu/drm/msm/dsi/dsi.h
··· 141 141 u32 clk_post; 142 142 u32 clk_pre; 143 143 bool clk_pre_inc_by_2; 144 + bool byte_intf_clk_div_2; 144 145 }; 145 146 146 147 struct msm_dsi_phy_clk_request {
+6 -8
drivers/gpu/drm/msm/dsi/dsi_host.c
··· 122 122 struct clk *byte_intf_clk; 123 123 124 124 unsigned long byte_clk_rate; 125 + unsigned long byte_intf_clk_rate; 125 126 unsigned long pixel_clk_rate; 126 127 unsigned long esc_clk_rate; 127 128 ··· 399 398 400 399 int dsi_link_clk_set_rate_6g(struct msm_dsi_host *msm_host) 401 400 { 402 - unsigned long byte_intf_rate; 403 401 int ret; 404 402 405 403 DBG("Set clk rates: pclk=%d, byteclk=%lu", ··· 418 418 } 419 419 420 420 if (msm_host->byte_intf_clk) { 421 - /* For CPHY, byte_intf_clk is same as byte_clk */ 422 - if (msm_host->cphy_mode) 423 - byte_intf_rate = msm_host->byte_clk_rate; 424 - else 425 - byte_intf_rate = msm_host->byte_clk_rate / 2; 426 - 427 - ret = clk_set_rate(msm_host->byte_intf_clk, byte_intf_rate); 421 + ret = clk_set_rate(msm_host->byte_intf_clk, msm_host->byte_intf_clk_rate); 428 422 if (ret) { 429 423 pr_err("%s: Failed to set rate byte intf clk, %d\n", 430 424 __func__, ret); ··· 2386 2392 DBG("dsi host already on"); 2387 2393 goto unlock_ret; 2388 2394 } 2395 + 2396 + msm_host->byte_intf_clk_rate = msm_host->byte_clk_rate; 2397 + if (phy_shared_timings->byte_intf_clk_div_2) 2398 + msm_host->byte_intf_clk_rate /= 2; 2389 2399 2390 2400 msm_dsi_sfpb_config(msm_host, true); 2391 2401
+4
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
··· 350 350 timing->shared_timings.clk_pre_inc_by_2 = 0; 351 351 } 352 352 353 + timing->shared_timings.byte_intf_clk_div_2 = true; 354 + 353 355 timing->ta_go = 3; 354 356 timing->ta_sure = 0; 355 357 timing->ta_get = 4; ··· 455 453 tmin = DIV_ROUND_UP(temp, 16 * ui) - 1; 456 454 tmax = 255; 457 455 timing->shared_timings.clk_pre = DIV_ROUND_UP((tmax - tmin) * 125, 10000) + tmin; 456 + 457 + timing->shared_timings.byte_intf_clk_div_2 = true; 458 458 459 459 DBG("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d", 460 460 timing->shared_timings.clk_pre, timing->shared_timings.clk_post,