Browse Source

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>
Sean Paul 9 years ago
parent
commit
5b6804034a
1 changed files with 10 additions and 5 deletions
  1. 10 5
      drivers/gpu/drm/rockchip/rockchip_drm_vop.c

+ 10 - 5
drivers/gpu/drm/rockchip/rockchip_drm_vop.c

@@ -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,
 	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) {
-		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;
 		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)
 
 
 	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)
 	clk_disable(vop->aclk);
 	clk_disable(vop->aclk);
 
 
 	vop->is_enabled = false;
 	vop->is_enabled = false;
+	vop->vblank_active = false;
 
 
 	return 0;
 	return 0;