From 9e17babe6aaaaa3efd5d8d2897097284d363c9d3 Mon Sep 17 00:00:00 2001 From: Lakshmi Narayana Kalavala Date: Fri, 26 Apr 2019 17:03:21 -0700 Subject: [PATCH] disp: msm: sde: turn off/on vblank callbacks as per crtc Current sde driver allows vblank enable and wait requests even after crtc is disabled which would eventually lead to enable of irq and timeouts in caller context. This change fixes it by updating vblank callback status as 'on' during crtc enable and shutdowns vblank callbacks before crtc disable is complete. Change-Id: I52b74f685107f4dc8c83305c28f23cdcb4747730 Signed-off-by: Prabhanjan Kandula Signed-off-by: Lakshmi Narayana Kalavala --- msm/msm_drv.c | 4 ++++ msm/sde/sde_crtc.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/msm/msm_drv.c b/msm/msm_drv.c index d73c84cf75..5cb20c03a3 100644 --- a/msm/msm_drv.c +++ b/msm/msm_drv.c @@ -699,6 +699,7 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv) struct msm_kms *kms = NULL; int ret; struct sched_param param = { 0 }; + struct drm_crtc *crtc; ddev = drm_dev_alloc(drv, dev); if (!ddev) { @@ -770,6 +771,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 df40f2e738..04c9408186 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -3978,6 +3978,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); @@ -4116,6 +4118,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);