diff --git a/msm/msm_drv.c b/msm/msm_drv.c index 3b014aa9b1..2bf4bddf00 100644 --- a/msm/msm_drv.c +++ b/msm/msm_drv.c @@ -706,6 +706,7 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv) struct sde_dbg_power_ctrl dbg_power_ctrl = { 0 }; int ret; struct sched_param param = { 0 }; + struct drm_crtc *crtc; ddev = drm_dev_alloc(drv, dev); if (!ddev) { @@ -787,6 +788,9 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv) goto fail; } + drm_for_each_crtc(crtc, ddev) + drm_crtc_vblank_reset(crtc); + if (kms) { pm_runtime_get_sync(dev); ret = drm_irq_install(ddev, platform_get_irq(pdev, 0)); diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index c70efb9c85..95bc0c5252 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -3841,6 +3841,7 @@ static void sde_crtc_reset(struct drm_crtc *crtc) cstate->base.crtc = crtc; crtc->state = &cstate->base; + drm_crtc_vblank_reset(crtc); } static void sde_crtc_handle_power_event(u32 event_type, void *arg) @@ -4001,6 +4002,8 @@ static void sde_crtc_disable(struct drm_crtc *crtc) SDE_DEBUG("crtc%d\n", crtc->base.id); + drm_crtc_vblank_off(crtc); + if (sde_kms_is_suspend_state(crtc->dev)) _sde_crtc_set_suspend(crtc, true); @@ -4139,6 +4142,8 @@ static void sde_crtc_enable(struct drm_crtc *crtc, SDE_EVT32_VERBOSE(DRMID(crtc)); sde_crtc = to_sde_crtc(crtc); + drm_crtc_vblank_on(crtc); + mutex_lock(&sde_crtc->crtc_lock); SDE_EVT32(DRMID(crtc), sde_crtc->enabled, sde_crtc->suspend, sde_crtc->vblank_requested);