vblank should be enabled regardless of whether an event
is expected back. This is especially important for a cursor
plane.

Signed-off-by: Sean Paul <seanpaul at chromium.org>
---

Changes in v2:
        - Rebased on 
https://cgit.freedesktop.org/~seanpaul/dogwood/log/?h=for-next

 drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++-----
 1 file 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 d1e0e06..1787084 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -112,6 +112,7 @@ struct vop {
        struct device *dev;
        struct drm_device *drm_dev;
        bool is_enabled;
+       bool vblank_active;

        /* mutex vsync_ work */
        struct mutex vsync_mutex;
@@ -1107,10 +1108,11 @@ static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
        struct vop *vop = to_vop(crtc);

        spin_lock_irq(&crtc->dev->event_lock);
-       if (crtc->state->event) {
-               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
-               WARN_ON(vop->event);
+       vop->vblank_active = true;
+       WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+       WARN_ON(vop->event);

+       if (crtc->state->event) {
                vop->event = crtc->state->event;
                crtc->state->event = NULL;
        }
@@ -1197,12 +1199,14 @@ static void vop_handle_vblank(struct vop *vop)

        spin_lock_irqsave(&drm->event_lock, flags);
        if (vop->event) {
-
                drm_crtc_send_vblank_event(crtc, vop->event);
-               drm_crtc_vblank_put(crtc);
                vop->event = NULL;

        }
+       if (vop->vblank_active) {
+               vop->vblank_active = false;
+               drm_crtc_vblank_put(crtc);
+       }
        spin_unlock_irqrestore(&drm->event_lock, flags);

        if (!completion_done(&vop->wait_update_complete))
@@ -1472,6 +1476,7 @@ static int vop_initial(struct vop *vop)
        clk_disable(vop->aclk);

        vop->is_enabled = false;
+       vop->vblank_active = false;

        return 0;

-- 
2.8.0.rc3.226.g39d4020

Reply via email to