diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index ef29f3524f..d206c5f8a3 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -3814,14 +3814,8 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc, } #endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) -static void sde_crtc_atomic_flush(struct drm_crtc *crtc, +static void sde_crtc_atomic_flush_common(struct drm_crtc *crtc, struct drm_atomic_state *state) -#else -static void sde_crtc_atomic_flush(struct drm_crtc *crtc, - struct drm_crtc_state *old_crtc_state) -#endif { struct drm_encoder *encoder; struct sde_crtc *sde_crtc; @@ -3830,6 +3824,9 @@ static void sde_crtc_atomic_flush(struct drm_crtc *crtc, struct msm_drm_private *priv; struct sde_crtc_state *cstate; struct sde_kms *sde_kms; + struct drm_connector *conn; + struct drm_connector_state *conn_state; + struct sde_connector *sde_conn = NULL; int i; if (!crtc || !crtc->dev || !crtc->dev->dev_private) { @@ -3861,6 +3858,17 @@ static void sde_crtc_atomic_flush(struct drm_crtc *crtc, dev = crtc->dev; priv = dev->dev_private; + for_each_new_connector_in_state(state, conn, conn_state, i) { + if (!conn_state || conn_state->crtc != crtc) + continue; + + sde_conn = to_sde_connector(conn_state->connector); + } + + /* When doze is requested, switch first to normal mode */ + if (sde_conn && sde_conn->lp_mode && sde_crtc_get_property(cstate, CRTC_PROP_CACHE_STATE)) + sde_crtc_static_img_control(crtc, CACHE_STATE_NORMAL, false); + if ((sde_crtc->cache_state == CACHE_STATE_NORMAL) && sde_crtc_get_property(cstate, CRTC_PROP_CACHE_STATE)) sde_crtc_static_img_control(crtc, CACHE_STATE_FRAME_WRITE, @@ -3928,6 +3936,20 @@ static void sde_crtc_atomic_flush(struct drm_crtc *crtc, SDE_ATRACE_END("sde_crtc_atomic_flush"); } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) +static void sde_crtc_atomic_flush(struct drm_crtc *crtc, + struct drm_atomic_state *state) +{ + return sde_crtc_atomic_flush_common(crtc, state); +} +#else +static void sde_crtc_atomic_flush(struct drm_crtc *crtc, + struct drm_crtc_state *old_crtc_state) +{ + return sde_crtc_atomic_flush_common(crtc, old_crtc_state->state); +} +#endif + /** * sde_crtc_destroy_state - state destroy hook * @crtc: drm CRTC