diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 5327b13606..46552dac0f 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -3313,7 +3313,7 @@ static void sde_crtc_destroy_state(struct drm_crtc *crtc, SDE_DEBUG("crtc%d\n", crtc->base.id); - if (sde_kms && enc && !sde_encoder_in_cont_splash(enc)) + if (sde_kms && enc) sde_rm_release(&sde_kms->rm, enc, true); __drm_atomic_helper_crtc_destroy_state(state); diff --git a/msm/sde/sde_rm.c b/msm/sde/sde_rm.c index 8a29c00b02..3dc38648a5 100644 --- a/msm/sde/sde_rm.c +++ b/msm/sde/sde_rm.c @@ -1699,6 +1699,8 @@ void sde_rm_release(struct sde_rm *rm, struct drm_encoder *enc, bool nxt) { struct sde_rm_rsvp *rsvp; struct drm_connector *conn; + struct msm_drm_private *priv; + struct sde_kms *sde_kms; uint64_t top_ctrl; if (!rm || !enc) { @@ -1706,6 +1708,13 @@ void sde_rm_release(struct sde_rm *rm, struct drm_encoder *enc, bool nxt) return; } + priv = enc->dev->dev_private; + if (!priv->kms) { + SDE_ERROR("invalid kms\n"); + return; + } + sde_kms = to_sde_kms(priv->kms); + mutex_lock(&rm->rm_lock); if (nxt) @@ -1718,6 +1727,11 @@ void sde_rm_release(struct sde_rm *rm, struct drm_encoder *enc, bool nxt) goto end; } + if (_sde_rm_is_display_in_cont_splash(sde_kms, enc)) { + _sde_rm_release_rsvp(rm, rsvp, conn); + goto end; + } + conn = _sde_rm_get_connector(enc); if (!conn) { SDE_ERROR("failed to get connector for enc %d, nxt %d",