Pārlūkot izejas kodu

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 <[email protected]>
Signed-off-by: Lakshmi Narayana Kalavala <[email protected]>
Lakshmi Narayana Kalavala 6 gadi atpakaļ
vecāks
revīzija
16bfab7ddf
2 mainītis faili ar 9 papildinājumiem un 0 dzēšanām
  1. 4 0
      msm/msm_drv.c
  2. 5 0
      msm/sde/sde_crtc.c

+ 4 - 0
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));

+ 5 - 0
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);