From 504b10377f894c9cd99b47b0f5343484712f46ad Mon Sep 17 00:00:00 2001 From: Steve Cohen Date: Fri, 1 May 2020 15:51:32 -0400 Subject: [PATCH] disp: msm: sde: cancel delayed work when in auto-refresh Display is entering into mode2 since no new frames are queued, but auto-refresh requires HW to remain active. Make sure to cancel the timer for entering idle power collapse whenever there's a kickoff with auto-refresh feature enabled. Change-Id: I0ac74e514c9893c31506edc3f2d7e069ab9a3ef8 Signed-off-by: Steve Cohen --- msm/sde/sde_encoder.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index eedcf2a5ef..066e18125a 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -1559,11 +1559,6 @@ static void _sde_encoder_rc_restart_delayed(struct sde_encoder_virt *sde_enc, struct msm_drm_private *priv; unsigned int lp, idle_pc_duration; struct msm_drm_thread *disp_thread; - bool autorefresh_enabled = false; - - autorefresh_enabled = _sde_encoder_is_autorefresh_enabled(sde_enc); - if (autorefresh_enabled) - return; /* set idle timeout based on master connector's lp value */ if (sde_enc->cur_master) @@ -1585,7 +1580,6 @@ static void _sde_encoder_rc_restart_delayed(struct sde_encoder_virt *sde_enc, &sde_enc->delayed_off_work, msecs_to_jiffies(idle_pc_duration)); SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, - autorefresh_enabled, idle_pc_duration, SDE_EVTLOG_FUNC_CASE2); SDE_DEBUG_ENC(sde_enc, "sw_event:%d, work scheduled\n", sw_event); @@ -1600,6 +1594,15 @@ static void _sde_encoder_rc_cancel_delayed(struct sde_encoder_virt *sde_enc, sw_event); } +static void _sde_encoder_rc_kickoff_delayed(struct sde_encoder_virt *sde_enc, + u32 sw_event) +{ + if (_sde_encoder_is_autorefresh_enabled(sde_enc)) + _sde_encoder_rc_cancel_delayed(sde_enc, sw_event); + else + _sde_encoder_rc_restart_delayed(sde_enc, sw_event); +} + static int _sde_encoder_rc_kickoff(struct drm_encoder *drm_enc, u32 sw_event, struct sde_encoder_virt *sde_enc, bool is_vid_mode) { @@ -1645,8 +1648,7 @@ static int _sde_encoder_rc_kickoff(struct drm_encoder *drm_enc, sde_enc->rc_state = SDE_ENC_RC_STATE_ON; end: - /* restart delayed off work, if required */ - _sde_encoder_rc_restart_delayed(sde_enc, sw_event); + _sde_encoder_rc_kickoff_delayed(sde_enc, sw_event); mutex_unlock(&sde_enc->rc_lock); return ret; @@ -1861,8 +1863,7 @@ static int _sde_encoder_rc_idle(struct drm_encoder *drm_enc, SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, sde_crtc_frame_pending(sde_enc->crtc), SDE_EVTLOG_ERROR); - _sde_encoder_rc_restart_delayed(sde_enc, - SDE_ENC_RC_EVENT_ENTER_IDLE); + _sde_encoder_rc_kickoff_delayed(sde_enc, sw_event); goto end; }