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

drm/msm/dsi: skip the wait for video mode done if not applicable

dsi_wait4video_done() API waits for the DSI video mode engine to
become idle so that we can transmit the DCS commands in the
beginning of BLLP. However, with the current sequence, the MDP
timing engine is turned on after the panel's pre_enable() callback
which can send out the DCS commands needed to power up the panel.

During those cases, this API will always timeout and print out the
error spam leading to long bootup times and log flooding.

Fix this by checking if the DSI video engine was actually busy before
waiting for it to become idle otherwise this is a redundant wait.

changes in v2:
- move the reg read below the video mode check
- minor fixes in commit text

Closes: https://gitlab.freedesktop.org/drm/msm/-/issues/34
Fixes: a689554ba6ed ("drm/msm: Initial add DSI connector support")
Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/557853/
Link: https://lore.kernel.org/r/20230915204426.19011-1-quic_abhinavk@quicinc.com

+12
+12
drivers/gpu/drm/msm/dsi/dsi_host.c
··· 1082 1082 1083 1083 static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host) 1084 1084 { 1085 + u32 data; 1086 + 1085 1087 if (!(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO)) 1088 + return; 1089 + 1090 + data = dsi_read(msm_host, REG_DSI_STATUS0); 1091 + 1092 + /* if video mode engine is not busy, its because 1093 + * either timing engine was not turned on or the 1094 + * DSI controller has finished transmitting the video 1095 + * data already, so no need to wait in those cases 1096 + */ 1097 + if (!(data & DSI_STATUS0_VIDEO_MODE_ENGINE_BUSY)) 1086 1098 return; 1087 1099 1088 1100 if (msm_host->power_on && msm_host->enabled) {