aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Paul <seanpaul@chromium.org>2016-08-10 16:24:39 -0400
committerSean Paul <seanpaul@chromium.org>2016-08-23 11:44:37 -0400
commit5b6804034ae9a7e792298786f70b95405730ea90 (patch)
tree6660410cc2a134661e00c1a6043dd55d8a1bef33
parentd761b2df5d30b8a0dc5369390eeb32b7a88bbed5 (diff)
drm/rockchip: Enable vblank without event
vblank should be enabled regardless of whether an event is expected back. This is especially important for a cursor plane. Reviewed-by: Yakir Yang <ykk@rock-chips.com> Tested-by: Yakir Yang <ykk@rock-chip.com> Signed-off-by: Sean Paul <seanpaul@chromium.org>
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_vop.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 5eb2b9998d40..790ba917e12d 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -110,6 +110,7 @@ struct vop {
110 struct device *dev; 110 struct device *dev;
111 struct drm_device *drm_dev; 111 struct drm_device *drm_dev;
112 bool is_enabled; 112 bool is_enabled;
113 bool vblank_active;
113 114
114 /* mutex vsync_ work */ 115 /* mutex vsync_ work */
115 struct mutex vsync_mutex; 116 struct mutex vsync_mutex;
@@ -1090,10 +1091,11 @@ static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
1090 struct vop *vop = to_vop(crtc); 1091 struct vop *vop = to_vop(crtc);
1091 1092
1092 spin_lock_irq(&crtc->dev->event_lock); 1093 spin_lock_irq(&crtc->dev->event_lock);
1093 if (crtc->state->event) { 1094 vop->vblank_active = true;
1094 WARN_ON(drm_crtc_vblank_get(crtc) != 0); 1095 WARN_ON(drm_crtc_vblank_get(crtc) != 0);
1095 WARN_ON(vop->event); 1096 WARN_ON(vop->event);
1096 1097
1098 if (crtc->state->event) {
1097 vop->event = crtc->state->event; 1099 vop->event = crtc->state->event;
1098 crtc->state->event = NULL; 1100 crtc->state->event = NULL;
1099 } 1101 }
@@ -1180,12 +1182,14 @@ static void vop_handle_vblank(struct vop *vop)
1180 1182
1181 spin_lock_irqsave(&drm->event_lock, flags); 1183 spin_lock_irqsave(&drm->event_lock, flags);
1182 if (vop->event) { 1184 if (vop->event) {
1183
1184 drm_crtc_send_vblank_event(crtc, vop->event); 1185 drm_crtc_send_vblank_event(crtc, vop->event);
1185 drm_crtc_vblank_put(crtc);
1186 vop->event = NULL; 1186 vop->event = NULL;
1187 1187
1188 } 1188 }
1189 if (vop->vblank_active) {
1190 vop->vblank_active = false;
1191 drm_crtc_vblank_put(crtc);
1192 }
1189 spin_unlock_irqrestore(&drm->event_lock, flags); 1193 spin_unlock_irqrestore(&drm->event_lock, flags);
1190 1194
1191 if (!completion_done(&vop->wait_update_complete)) 1195 if (!completion_done(&vop->wait_update_complete))
@@ -1455,6 +1459,7 @@ static int vop_initial(struct vop *vop)
1455 clk_disable(vop->aclk); 1459 clk_disable(vop->aclk);
1456 1460
1457 vop->is_enabled = false; 1461 vop->is_enabled = false;
1462 vop->vblank_active = false;
1458 1463
1459 return 0; 1464 return 0;
1460 1465