Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/mediatek: handle events when enabling/disabling crtc

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>

authored by

Bibby Hsieh and committed by
CK Hu
411f5c1e 60b874f6

+8
+8
drivers/gpu/drm/mediatek/mtk_drm_crtc.c
··· 328 328 static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc) 329 329 { 330 330 struct drm_device *drm = mtk_crtc->base.dev; 331 + struct drm_crtc *crtc = &mtk_crtc->base; 331 332 int i; 332 333 333 334 DRM_DEBUG_DRIVER("%s\n", __func__); ··· 354 353 mtk_disp_mutex_unprepare(mtk_crtc->mutex); 355 354 356 355 pm_runtime_put(drm->dev); 356 + 357 + if (crtc->state->event && !crtc->state->active) { 358 + spin_lock_irq(&crtc->dev->event_lock); 359 + drm_crtc_send_vblank_event(crtc, crtc->state->event); 360 + crtc->state->event = NULL; 361 + spin_unlock_irq(&crtc->dev->event_lock); 362 + } 357 363 } 358 364 359 365 static void mtk_crtc_ddp_config(struct drm_crtc *crtc)