| From 7529738318cda5276b89459f3bcf4599e8e67097 Mon Sep 17 00:00:00 2001 |
| From: Bibby Hsieh <bibby.hsieh@mediatek.com> |
| Date: Tue, 10 Dec 2019 13:05:21 +0800 |
| Subject: [PATCH] drm/mediatek: handle events when enabling/disabling crtc |
| |
| commit 411f5c1eacfebb1f6e40b653d29447cdfe7282aa upstream. |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c |
| index a9007210dda1..b64f943af809 100644 |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c |
| @@ -296,6 +296,7 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc) |
| 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__); |
| @@ -317,6 +318,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_crtc_ddp_config(struct drm_crtc *crtc) |
| -- |
| 2.7.4 |
| |