Commit 5b680403 authored by Sean Paul's avatar Sean Paul

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: default avatarYakir Yang <ykk@rock-chips.com>
Tested-by: default avatarYakir Yang <ykk@rock-chip.com>
Signed-off-by: default avatarSean Paul <seanpaul@chromium.org>
parent d761b2df
...@@ -110,6 +110,7 @@ struct vop { ...@@ -110,6 +110,7 @@ struct vop {
struct device *dev; struct device *dev;
struct drm_device *drm_dev; struct drm_device *drm_dev;
bool is_enabled; bool is_enabled;
bool vblank_active;
/* mutex vsync_ work */ /* mutex vsync_ work */
struct mutex vsync_mutex; struct mutex vsync_mutex;
...@@ -1090,10 +1091,11 @@ static void vop_crtc_atomic_begin(struct drm_crtc *crtc, ...@@ -1090,10 +1091,11 @@ static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
struct vop *vop = to_vop(crtc); struct vop *vop = to_vop(crtc);
spin_lock_irq(&crtc->dev->event_lock); spin_lock_irq(&crtc->dev->event_lock);
if (crtc->state->event) { vop->vblank_active = true;
WARN_ON(drm_crtc_vblank_get(crtc) != 0); WARN_ON(drm_crtc_vblank_get(crtc) != 0);
WARN_ON(vop->event); WARN_ON(vop->event);
if (crtc->state->event) {
vop->event = crtc->state->event; vop->event = crtc->state->event;
crtc->state->event = NULL; crtc->state->event = NULL;
} }
...@@ -1180,12 +1182,14 @@ static void vop_handle_vblank(struct vop *vop) ...@@ -1180,12 +1182,14 @@ static void vop_handle_vblank(struct vop *vop)
spin_lock_irqsave(&drm->event_lock, flags); spin_lock_irqsave(&drm->event_lock, flags);
if (vop->event) { if (vop->event) {
drm_crtc_send_vblank_event(crtc, vop->event); drm_crtc_send_vblank_event(crtc, vop->event);
drm_crtc_vblank_put(crtc);
vop->event = NULL; vop->event = NULL;
} }
if (vop->vblank_active) {
vop->vblank_active = false;
drm_crtc_vblank_put(crtc);
}
spin_unlock_irqrestore(&drm->event_lock, flags); spin_unlock_irqrestore(&drm->event_lock, flags);
if (!completion_done(&vop->wait_update_complete)) if (!completion_done(&vop->wait_update_complete))
...@@ -1455,6 +1459,7 @@ static int vop_initial(struct vop *vop) ...@@ -1455,6 +1459,7 @@ static int vop_initial(struct vop *vop)
clk_disable(vop->aclk); clk_disable(vop->aclk);
vop->is_enabled = false; vop->is_enabled = false;
vop->vblank_active = false;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment