diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 0eb2845534..4417021ab0 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -4133,25 +4133,23 @@ static int _sde_crtc_vblank_enable( return ret; mutex_lock(&sde_crtc->crtc_lock); - drm_for_each_encoder_mask(enc, crtc->dev, - sde_crtc->cached_encoder_mask) { - SDE_EVT32(DRMID(crtc), DRMID(enc)); + drm_for_each_encoder_mask(enc, crtc->dev, sde_crtc->cached_encoder_mask) { + if (sde_encoder_in_clone_mode(enc)) + continue; - sde_encoder_register_vblank_callback(enc, - sde_crtc_vblank_cb, (void *)crtc); + sde_encoder_register_vblank_callback(enc, sde_crtc_vblank_cb, (void *)crtc); } - mutex_unlock(&sde_crtc->crtc_lock); } else { mutex_lock(&sde_crtc->crtc_lock); - drm_for_each_encoder_mask(enc, crtc->dev, - sde_crtc->cached_encoder_mask) { - SDE_EVT32(DRMID(crtc), DRMID(enc)); + drm_for_each_encoder_mask(enc, crtc->dev, sde_crtc->cached_encoder_mask) { + if (sde_encoder_in_clone_mode(enc)) + continue; sde_encoder_register_vblank_callback(enc, NULL, NULL); } - mutex_unlock(&sde_crtc->crtc_lock); + pm_runtime_put_sync(crtc->dev->dev); } @@ -4478,6 +4476,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc) u32 power_on; bool in_cont_splash = false; int ret, i; + enum sde_intf_mode intf_mode; if (!crtc || !crtc->dev || !crtc->dev->dev_private || !crtc->state) { SDE_ERROR("invalid crtc\n"); @@ -4501,7 +4500,10 @@ static void sde_crtc_disable(struct drm_crtc *crtc) SDE_DEBUG("crtc%d\n", crtc->base.id); - drm_crtc_vblank_off(crtc); + /* avoid vblank on/off for virtual display */ + intf_mode = sde_crtc_get_intf_mode(crtc, crtc->state); + if ((intf_mode != INTF_MODE_WB_BLOCK) && (intf_mode != INTF_MODE_WB_LINE)) + drm_crtc_vblank_off(crtc); mutex_lock(&sde_crtc->crtc_lock); SDE_EVT32_VERBOSE(DRMID(crtc)); @@ -4609,6 +4611,7 @@ static void sde_crtc_enable(struct drm_crtc *crtc, int ret, i; struct sde_crtc_state *cstate; struct msm_display_mode *msm_mode; + enum sde_intf_mode intf_mode; if (!crtc || !crtc->dev || !crtc->dev->dev_private) { SDE_ERROR("invalid crtc\n"); @@ -4633,9 +4636,14 @@ static void sde_crtc_enable(struct drm_crtc *crtc, if (!sde_crtc->enabled) { /* cache the encoder mask now for vblank work */ sde_crtc->cached_encoder_mask = crtc->state->encoder_mask; - /* max possible vsync_cnt(atomic_t) soft counter */ - drm_crtc_set_max_vblank_count(crtc, INT_MAX); - drm_crtc_vblank_on(crtc); + + /* avoid vblank on/off for virtual display */ + intf_mode = sde_crtc_get_intf_mode(crtc, crtc->state); + if ((intf_mode != INTF_MODE_WB_BLOCK) && (intf_mode != INTF_MODE_WB_LINE)) { + /* max possible vsync_cnt(atomic_t) soft counter */ + drm_crtc_set_max_vblank_count(crtc, INT_MAX); + drm_crtc_vblank_on(crtc); + } } mutex_lock(&sde_crtc->crtc_lock); diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 981dffdeb3..450f762f0d 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -3417,13 +3417,9 @@ void sde_encoder_register_vblank_callback(struct drm_encoder *drm_enc, SDE_ERROR("invalid encoder\n"); return; } - SDE_DEBUG_ENC(sde_enc, "\n"); - SDE_EVT32(DRMID(drm_enc), enable); - if (sde_encoder_in_clone_mode(drm_enc)) { - SDE_EVT32(DRMID(drm_enc), SDE_EVTLOG_ERROR); - return; - } + SDE_DEBUG_ENC(sde_enc, "enable:%d\n", enable); + SDE_EVT32(DRMID(drm_enc), enable); spin_lock_irqsave(&sde_enc->enc_spinlock, lock_flags); sde_enc->crtc_vblank_cb = vbl_cb; diff --git a/msm/sde/sde_encoder_phys_wb.c b/msm/sde/sde_encoder_phys_wb.c index 0f04bb2166..02f9d5d5f6 100644 --- a/msm/sde/sde_encoder_phys_wb.c +++ b/msm/sde/sde_encoder_phys_wb.c @@ -2049,7 +2049,6 @@ struct sde_encoder_phys *sde_encoder_phys_wb_init( phys_enc->intf_mode = INTF_MODE_WB_LINE; phys_enc->intf_idx = p->intf_idx; phys_enc->enc_spinlock = p->enc_spinlock; - phys_enc->vblank_ctl_lock = p->vblank_ctl_lock; atomic_set(&phys_enc->pending_retire_fence_cnt, 0); init_waitqueue_head(&phys_enc->pending_kickoff_wq); wb_cfg = wb_enc->hw_wb->caps;