drm/mediatek: handle events when enabling/disabling crtc
authorBibby Hsieh <bibby.hsieh@mediatek.com>
Tue, 10 Dec 2019 05:05:21 +0000 (13:05 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 28 Feb 2020 14:42:27 +0000 (15:42 +0100)
[ Upstream commit 411f5c1eacfebb1f6e40b653d29447cdfe7282aa ]

The driver currently handles vblank events only when updating planes on
an already enabled CRTC. The atomic update API however allows requesting
an event when enabling or disabling a CRTC. This currently leads to
event objects being leaked in the kernel and to events not being sent
out. Fix it.

Signed-off-by: Bibby Hsieh <bibby.hsieh@mediatek.com>
Signed-off-by: CK Hu <ck.hu@mediatek.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/mediatek/mtk_drm_crtc.c

index 01a21dd..1ed60da 100644 (file)
@@ -306,6 +306,7 @@ err_pm_runtime_put:
 static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc)
 {
        struct drm_device *drm = mtk_crtc->base.dev;
+       struct drm_crtc *crtc = &mtk_crtc->base;
        int i;
 
        DRM_DEBUG_DRIVER("%s\n", __func__);
@@ -327,6 +328,13 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc)
        mtk_disp_mutex_unprepare(mtk_crtc->mutex);
 
        pm_runtime_put(drm->dev);
+
+       if (crtc->state->event && !crtc->state->active) {
+               spin_lock_irq(&crtc->dev->event_lock);
+               drm_crtc_send_vblank_event(crtc, crtc->state->event);
+               crtc->state->event = NULL;
+               spin_unlock_irq(&crtc->dev->event_lock);
+       }
 }
 
 static void mtk_drm_crtc_enable(struct drm_crtc *crtc)