Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 504b1037 authored by Steve Cohen's avatar Steve Cohen Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarSteve Cohen <cohens@codeaurora.org>
parent a2a04712
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -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;
	}