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 <cohens@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
a2a04712a9
commit
504b10377f
@@ -1559,11 +1559,6 @@ static void _sde_encoder_rc_restart_delayed(struct sde_encoder_virt *sde_enc,
|
|||||||
struct msm_drm_private *priv;
|
struct msm_drm_private *priv;
|
||||||
unsigned int lp, idle_pc_duration;
|
unsigned int lp, idle_pc_duration;
|
||||||
struct msm_drm_thread *disp_thread;
|
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 */
|
/* set idle timeout based on master connector's lp value */
|
||||||
if (sde_enc->cur_master)
|
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,
|
&sde_enc->delayed_off_work,
|
||||||
msecs_to_jiffies(idle_pc_duration));
|
msecs_to_jiffies(idle_pc_duration));
|
||||||
SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state,
|
SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state,
|
||||||
autorefresh_enabled,
|
|
||||||
idle_pc_duration, SDE_EVTLOG_FUNC_CASE2);
|
idle_pc_duration, SDE_EVTLOG_FUNC_CASE2);
|
||||||
SDE_DEBUG_ENC(sde_enc, "sw_event:%d, work scheduled\n",
|
SDE_DEBUG_ENC(sde_enc, "sw_event:%d, work scheduled\n",
|
||||||
sw_event);
|
sw_event);
|
||||||
@@ -1600,6 +1594,15 @@ static void _sde_encoder_rc_cancel_delayed(struct sde_encoder_virt *sde_enc,
|
|||||||
sw_event);
|
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,
|
static int _sde_encoder_rc_kickoff(struct drm_encoder *drm_enc,
|
||||||
u32 sw_event, struct sde_encoder_virt *sde_enc, bool is_vid_mode)
|
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;
|
sde_enc->rc_state = SDE_ENC_RC_STATE_ON;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
/* restart delayed off work, if required */
|
_sde_encoder_rc_kickoff_delayed(sde_enc, sw_event);
|
||||||
_sde_encoder_rc_restart_delayed(sde_enc, sw_event);
|
|
||||||
|
|
||||||
mutex_unlock(&sde_enc->rc_lock);
|
mutex_unlock(&sde_enc->rc_lock);
|
||||||
return ret;
|
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_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state,
|
||||||
sde_crtc_frame_pending(sde_enc->crtc),
|
sde_crtc_frame_pending(sde_enc->crtc),
|
||||||
SDE_EVTLOG_ERROR);
|
SDE_EVTLOG_ERROR);
|
||||||
_sde_encoder_rc_restart_delayed(sde_enc,
|
_sde_encoder_rc_kickoff_delayed(sde_enc, sw_event);
|
||||||
SDE_ENC_RC_EVENT_ENTER_IDLE);
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user