diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 8e9c9f29..17762486 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -3271,6 +3271,10 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc) return; } + if (sde_encoder_is_built_in_display(drm_enc) && + msm_is_mode_seamless_poms(&c_state->msm_mode)) + drm_crtc_vblank_put(sde_enc->crtc); + memset(&sde_enc->cur_master->intf_cfg_v1, 0, sizeof(sde_enc->cur_master->intf_cfg_v1)); @@ -3359,6 +3363,7 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) struct sde_encoder_virt *sde_enc = NULL; struct sde_connector *sde_conn; struct sde_kms *sde_kms; + struct sde_connector_state *c_state = NULL; enum sde_intf_mode intf_mode; int ret, i = 0; @@ -3390,6 +3395,12 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) if (!sde_kms) return; + c_state = to_sde_connector_state(sde_enc->cur_master->connector->state); + if (!c_state) { + SDE_ERROR("invalid connector state\n"); + return; + } + intf_mode = sde_encoder_get_intf_mode(drm_enc); SDE_EVT32(DRMID(drm_enc)); @@ -3412,6 +3423,10 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) _sde_encoder_input_handler_unregister(drm_enc); flush_delayed_work(&sde_conn->status_work); + + if (sde_encoder_is_built_in_display(drm_enc) && + msm_is_mode_seamless_poms(&c_state->msm_mode)) + drm_crtc_vblank_get(sde_enc->crtc); /* * For primary command mode and video mode encoders, execute the * resource control pre-stop operations before the physical encoders @@ -3447,7 +3462,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) * wait for any pending vsync timestamp event to sf * to ensure vbalnk irq is disabled. */ - if (sde_enc->vblank_enabled) + if (sde_enc->vblank_enabled && + !msm_is_mode_seamless_poms(&c_state->msm_mode)) sde_encoder_wait_for_vsync_event_complete(sde_enc); /*