diff options
author | Sean Paul <seanpaul@chromium.org> | 2016-08-10 16:24:39 -0400 |
---|---|---|
committer | Sean Paul <seanpaul@chromium.org> | 2016-08-23 11:44:37 -0400 |
commit | 5b6804034ae9a7e792298786f70b95405730ea90 (patch) | |
tree | 6660410cc2a134661e00c1a6043dd55d8a1bef33 | |
parent | d761b2df5d30b8a0dc5369390eeb32b7a88bbed5 (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.c | 15 |
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 | ||