From 16bfab7ddfd05b5c48f817d8bc8ec47775301cee 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: I9085103ced06e5fad51219f26bd8dd655fa36fea Signed-off-by: Prabhanjan Kandula Signed-off-by: Lakshmi Narayana Kalavala --- msm/msm_drv.c | 4 ++++ msm/sde/sde_crtc.c | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/msm/msm_drv.c b/msm/msm_drv.c index 3b014aa9b1c1..2bf4bddf001a 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 c70efb9c85c1..95bc0c5252d0 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);