diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 6e3dc0a049..2b4154b6b6 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -2494,10 +2494,10 @@ static void _sde_connector_report_panel_dead(struct sde_connector *conn, return; SDE_EVT32(SDE_EVTLOG_ERROR); + conn->panel_dead = true; sde_encoder_display_failure_notification(conn->encoder, skip_pre_kickoff); - conn->panel_dead = true; event.type = DRM_EVENT_PANEL_DEAD; event.length = sizeof(bool); msm_mode_object_event_notify(&conn->base.base, diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 2a6fc4f536..9b6a0580c7 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -2074,23 +2074,27 @@ static int _sde_encoder_rc_idle(struct drm_encoder *drm_enc, struct sde_kms *sde_kms; struct drm_crtc *crtc = drm_enc->crtc; struct sde_crtc *sde_crtc = to_sde_crtc(crtc); + struct sde_connector *sde_conn; priv = drm_enc->dev->dev_private; sde_kms = to_sde_kms(priv->kms); + sde_conn = to_sde_connector(sde_enc->cur_master->connector); mutex_lock(&sde_enc->rc_lock); - if (sde_enc->rc_state != SDE_ENC_RC_STATE_ON) { + if (sde_conn->panel_dead) { + SDE_DEBUG_ENC(sde_enc, "skip idle. Panel in dead state\n"); + SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, SDE_EVTLOG_ERROR); + goto end; + } else if (sde_enc->rc_state != SDE_ENC_RC_STATE_ON) { SDE_DEBUG_ENC(sde_enc, "sw_event:%d, rc:%d !ON state\n", sw_event, sde_enc->rc_state); - SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, - SDE_EVTLOG_ERROR); + SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, SDE_EVTLOG_ERROR); goto end; } else if (sde_crtc_frame_pending(sde_enc->crtc)) { SDE_DEBUG_ENC(sde_enc, "skip idle entry"); SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, - sde_crtc_frame_pending(sde_enc->crtc), - SDE_EVTLOG_ERROR); + sde_crtc_frame_pending(sde_enc->crtc), SDE_EVTLOG_ERROR); _sde_encoder_rc_kickoff_delayed(sde_enc, sw_event); goto end; }