|
@@ -2785,6 +2785,33 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
|
|
_sde_encoder_virt_enable_helper(drm_enc);
|
|
_sde_encoder_virt_enable_helper(drm_enc);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void sde_encoder_virt_reset(struct drm_encoder *drm_enc)
|
|
|
|
+{
|
|
|
|
+ struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
|
|
|
|
+ struct sde_kms *sde_kms = sde_encoder_get_kms(drm_enc);
|
|
|
|
+ int i = 0;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
|
|
|
+ if (sde_enc->phys_encs[i]) {
|
|
|
|
+ sde_enc->phys_encs[i]->cont_splash_enabled = false;
|
|
|
|
+ sde_enc->phys_encs[i]->connector = NULL;
|
|
|
|
+ }
|
|
|
|
+ atomic_set(&sde_enc->frame_done_cnt[i], 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ sde_enc->cur_master = NULL;
|
|
|
|
+ /*
|
|
|
|
+ * clear the cached crtc in sde_enc on use case finish, after all the
|
|
|
|
+ * outstanding events and timers have been completed
|
|
|
|
+ */
|
|
|
|
+ sde_enc->crtc = NULL;
|
|
|
|
+ memset(&sde_enc->mode_info, 0, sizeof(sde_enc->mode_info));
|
|
|
|
+
|
|
|
|
+ SDE_DEBUG_ENC(sde_enc, "encoder disabled\n");
|
|
|
|
+
|
|
|
|
+ sde_rm_release(&sde_kms->rm, drm_enc, false);
|
|
|
|
+}
|
|
|
|
+
|
|
static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|
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;
|
|
@@ -2820,7 +2847,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|
SDE_EVT32(DRMID(drm_enc));
|
|
SDE_EVT32(DRMID(drm_enc));
|
|
|
|
|
|
/* wait for idle */
|
|
/* wait for idle */
|
|
- sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);
|
|
|
|
|
|
+ if (!sde_encoder_in_clone_mode(drm_enc))
|
|
|
|
+ sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);
|
|
|
|
|
|
_sde_encoder_input_handler_unregister(drm_enc);
|
|
_sde_encoder_input_handler_unregister(drm_enc);
|
|
|
|
|
|
@@ -2864,25 +2892,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
|
|
|
|
|
|
sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_STOP);
|
|
sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_STOP);
|
|
|
|
|
|
- for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
|
|
|
- if (sde_enc->phys_encs[i]) {
|
|
|
|
- sde_enc->phys_encs[i]->cont_splash_enabled = false;
|
|
|
|
- sde_enc->phys_encs[i]->connector = NULL;
|
|
|
|
- }
|
|
|
|
- atomic_set(&sde_enc->frame_done_cnt[i], 0);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- sde_enc->cur_master = NULL;
|
|
|
|
- /*
|
|
|
|
- * clear the cached crtc in sde_enc on use case finish, after all the
|
|
|
|
- * outstanding events and timers have been completed
|
|
|
|
- */
|
|
|
|
- sde_enc->crtc = NULL;
|
|
|
|
- memset(&sde_enc->mode_info, 0, sizeof(sde_enc->mode_info));
|
|
|
|
-
|
|
|
|
- SDE_DEBUG_ENC(sde_enc, "encoder disabled\n");
|
|
|
|
-
|
|
|
|
- sde_rm_release(&sde_kms->rm, drm_enc, false);
|
|
|
|
|
|
+ if (!sde_encoder_in_clone_mode(drm_enc))
|
|
|
|
+ sde_encoder_virt_reset(drm_enc);
|
|
}
|
|
}
|
|
|
|
|
|
void sde_encoder_helper_phys_disable(struct sde_encoder_phys *phys_enc,
|
|
void sde_encoder_helper_phys_disable(struct sde_encoder_phys *phys_enc,
|