mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 22:51:42 +00:00
drm/imx: use drm_send_vblank_event() helper
Also, slightly changes the behavior to always put the vblank irq, even if userspace did not request a vblank event. As far as I can tell, the previous code would leak a vblank irq refcnt if userspace requested a pageflip without event. Signed-off-by: Rob Clark <rob@ti.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
f7e96d7e28
commit
0eca56f946
@ -311,31 +311,14 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,
|
|||||||
|
|
||||||
static void ipu_crtc_handle_pageflip(struct ipu_crtc *ipu_crtc)
|
static void ipu_crtc_handle_pageflip(struct ipu_crtc *ipu_crtc)
|
||||||
{
|
{
|
||||||
struct drm_pending_vblank_event *e;
|
|
||||||
struct timeval now;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct drm_device *drm = ipu_crtc->base.dev;
|
struct drm_device *drm = ipu_crtc->base.dev;
|
||||||
|
|
||||||
spin_lock_irqsave(&drm->event_lock, flags);
|
spin_lock_irqsave(&drm->event_lock, flags);
|
||||||
|
if (ipu_crtc->page_flip_event)
|
||||||
e = ipu_crtc->page_flip_event;
|
drm_send_vblank_event(drm, -1, ipu_crtc->page_flip_event);
|
||||||
if (!e) {
|
|
||||||
spin_unlock_irqrestore(&drm->event_lock, flags);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
do_gettimeofday(&now);
|
|
||||||
e->event.sequence = 0;
|
|
||||||
e->event.tv_sec = now.tv_sec;
|
|
||||||
e->event.tv_usec = now.tv_usec;
|
|
||||||
ipu_crtc->page_flip_event = NULL;
|
ipu_crtc->page_flip_event = NULL;
|
||||||
|
|
||||||
imx_drm_crtc_vblank_put(ipu_crtc->imx_crtc);
|
imx_drm_crtc_vblank_put(ipu_crtc->imx_crtc);
|
||||||
|
|
||||||
list_add_tail(&e->base.link, &e->base.file_priv->event_list);
|
|
||||||
|
|
||||||
wake_up_interruptible(&e->base.file_priv->event_wait);
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&drm->event_lock, flags);
|
spin_unlock_irqrestore(&drm->event_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user