|
@@ -3619,6 +3619,10 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
|
|
return;
|
|
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,
|
|
memset(&sde_enc->cur_master->intf_cfg_v1, 0,
|
|
sizeof(sde_enc->cur_master->intf_cfg_v1));
|
|
sizeof(sde_enc->cur_master->intf_cfg_v1));
|
|
|
|
|
|
@@ -3712,6 +3716,7 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|
struct sde_encoder_virt *sde_enc = NULL;
|
|
struct sde_encoder_virt *sde_enc = NULL;
|
|
struct sde_connector *sde_conn;
|
|
struct sde_connector *sde_conn;
|
|
struct sde_kms *sde_kms;
|
|
struct sde_kms *sde_kms;
|
|
|
|
+ struct sde_connector_state *c_state = NULL;
|
|
enum sde_intf_mode intf_mode;
|
|
enum sde_intf_mode intf_mode;
|
|
int ret, i = 0;
|
|
int ret, i = 0;
|
|
|
|
|
|
@@ -3743,6 +3748,12 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|
if (!sde_kms)
|
|
if (!sde_kms)
|
|
return;
|
|
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);
|
|
intf_mode = sde_encoder_get_intf_mode(drm_enc);
|
|
|
|
|
|
SDE_EVT32(DRMID(drm_enc));
|
|
SDE_EVT32(DRMID(drm_enc));
|
|
@@ -3752,6 +3763,10 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|
_sde_encoder_input_handler_unregister(drm_enc);
|
|
_sde_encoder_input_handler_unregister(drm_enc);
|
|
|
|
|
|
flush_delayed_work(&sde_conn->status_work);
|
|
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
|
|
* For primary command mode and video mode encoders, execute the
|
|
* resource control pre-stop operations before the physical encoders
|
|
* resource control pre-stop operations before the physical encoders
|
|
@@ -3787,7 +3802,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|
* wait for any pending vsync timestamp event to sf
|
|
* wait for any pending vsync timestamp event to sf
|
|
* to ensure vbalnk irq is disabled.
|
|
* 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);
|
|
sde_encoder_wait_for_vsync_event_complete(sde_enc);
|
|
|
|
|
|
/*
|
|
/*
|