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>
This commit is contained in:
Родитель
d761b2df5d
Коммит
5b6804034a
|
@ -110,6 +110,7 @@ struct vop {
|
|||
struct device *dev;
|
||||
struct drm_device *drm_dev;
|
||||
bool is_enabled;
|
||||
bool vblank_active;
|
||||
|
||||
/* mutex vsync_ work */
|
||||
struct mutex vsync_mutex;
|
||||
|
@ -1090,10 +1091,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;
|
||||
}
|
||||
|
@ -1180,12 +1182,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))
|
||||
|
@ -1455,6 +1459,7 @@ static int vop_initial(struct vop *vop)
|
|||
clk_disable(vop->aclk);
|
||||
|
||||
vop->is_enabled = false;
|
||||
vop->vblank_active = false;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче