From 8d57f083f2c20f9dfc28e9515d319d7bcff0fdf5 Mon Sep 17 00:00:00 2001 From: Lei Chen Date: Fri, 22 Oct 2021 12:21:19 +0530 Subject: [PATCH] disp: msm: sde: cancel delayed_off_work before reinitialization Canceling delayed_off_work in encoder pre_modeset might not be executed in all cases, but the following encoder enable might initialize the work. This will lead to list corruption as delayed_off work list node is reinitialized before removing from linked list. Move canceling delayed_off_work to start of encoder mode_set to ensure work is canceled before reinitialization. Change-Id: I38687604f2eedced308ea02019c162022725534e Signed-off-by: Lei Chen Signed-off-by: Jayaprakash Madisetty --- msm/sde/sde_encoder.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 767cc4c00bc5..c78066d282a0 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -1842,9 +1842,6 @@ static int _sde_encoder_rc_pre_modeset(struct drm_encoder *drm_enc, { int ret = 0; - /* cancel delayed off work, if any */ - _sde_encoder_rc_cancel_delayed(sde_enc, sw_event); - mutex_lock(&sde_enc->rc_lock); if (sde_enc->rc_state == SDE_ENC_RC_STATE_OFF) { @@ -2371,6 +2368,9 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, sde_connector_state_get_mode_info(conn->state, &sde_enc->mode_info); sde_encoder_dce_set_bpp(sde_enc->mode_info, sde_enc->crtc); + /* cancel delayed off work, if any */ + kthread_cancel_delayed_work_sync(&sde_enc->delayed_off_work); + /* release resources before seamless mode change */ ret = sde_encoder_virt_modeset_rc(drm_enc, adj_mode, true); if (ret)