From 4c759b0426caf5a412b46eb705a71a084c6100a2 Mon Sep 17 00:00:00 2001 From: Andy Yan Date: Thu, 11 Nov 2021 11:29:26 +0800 Subject: [PATCH] drm/rockchip: vvop: send last vblank when vblank disable Fix the warning: [ 32.660604] virtual-vop virtual-vop: [drm:vvop_vblank_simulate] [ 32.677230] virtual-vop virtual-vop: [drm:vvop_vblank_simulate] [ 32.693872] virtual-vop virtual-vop: [drm:vvop_vblank_simulate] [ 32.710535] virtual-vop virtual-vop: [drm:vvop_vblank_simulate] [ 32.716379] rockchip-drm display-subsystem:[drm:vvop_crtc_atomic_disable] [ 32.716412] rockchip-drm display-subsystem: [drm:vvop_disable_vblank] [ 32.716446] drm_atomic_helper_commit_hw_done start [ 32.716458] ------------[ cut here ]------------ [ 32.716515] WARNING: CPU: 2 PID: 243 drivers/gpu/drm/drm_atomic_helper.c:2214 drm_atomic_helper_commit_hw_done+0xe0/0x138 [ 32.716539] Modules linked in: bcmdhd [ 32.716571] CPU: 2 PID: 243 Comm: HwBinder:231_1 Not tainted 4.19.193 [ 32.716595] Hardware name: Rockchip RK3568 EVB1 DDR4 V10 Board (DT) [ 32.716624] pstate: 40400009 (nZcv daif +PAN -UAO) [ 32.716653] pc : drm_atomic_helper_commit_hw_done+0xe0/0x138 [ 32.716679] lr : drm_atomic_helper_commit_hw_done+0xe0/0x138 Change-Id: Ia2ff790f685d4c5421a21f958a9f466179cd64a8 Signed-off-by: Andy Yan --- drivers/gpu/drm/rockchip/rockchip_drm_vvop.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c index 7f54a6823b57..2b0dbdbe7379 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c @@ -186,7 +186,17 @@ static void vvop_crtc_atomic_enable(struct drm_crtc *crtc, static void vvop_crtc_atomic_disable(struct drm_crtc *crtc, struct drm_crtc_state *old_state) { + unsigned long flags; + drm_crtc_vblank_off(crtc); + if (crtc->state->event && !crtc->state->active) { + spin_lock_irqsave(&crtc->dev->event_lock, flags); + drm_crtc_send_vblank_event(crtc, crtc->state->event); + spin_unlock_irqrestore(&crtc->dev->event_lock, flags); + + crtc->state->event = NULL; + } + } static void vvop_crtc_atomic_flush(struct drm_crtc *crtc,