aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_vop.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index c01a380e3bb9..12854ac9d542 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -499,10 +499,25 @@ err_disable_hclk:
499static void vop_crtc_disable(struct drm_crtc *crtc) 499static void vop_crtc_disable(struct drm_crtc *crtc)
500{ 500{
501 struct vop *vop = to_vop(crtc); 501 struct vop *vop = to_vop(crtc);
502 int i;
502 503
503 if (!vop->is_enabled) 504 if (!vop->is_enabled)
504 return; 505 return;
505 506
507 /*
508 * We need to make sure that all windows are disabled before we
509 * disable that crtc. Otherwise we might try to scan from a destroyed
510 * buffer later.
511 */
512 for (i = 0; i < vop->data->win_size; i++) {
513 struct vop_win *vop_win = &vop->win[i];
514 const struct vop_win_data *win = vop_win->data;
515
516 spin_lock(&vop->reg_lock);
517 VOP_WIN_SET(vop, win, enable, 0);
518 spin_unlock(&vop->reg_lock);
519 }
520
506 drm_crtc_vblank_off(crtc); 521 drm_crtc_vblank_off(crtc);
507 522
508 /* 523 /*