diff options
author | Inki Dae <inki.dae@samsung.com> | 2011-10-14 13:29:51 +0900 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-10-18 10:01:19 +0100 |
commit | ccf4d883f82e10053fa5806f2cd35401012bec84 (patch) | |
tree | 8d9058f2cd1161d4351db83d961b84e9fe1ebe47 /drivers/gpu/drm/exynos/exynos_drm_fimd.c | |
parent | f6b98252946496de86bd4e89a8b7ef12ec48d97c (diff) |
drm/exynos: fixed page flip bug.
in case of using two drivers such as fimd and hdmi controller that
they have their own hardware interrupt, drm framework doesn't provide
pipe number corresponding to it. so the pipe should be set to event's
from specific crtc.
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_fimd.c')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fimd.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index b0afa8493230..68446b3bd8f0 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -487,21 +487,24 @@ static struct exynos_drm_overlay_ops fimd_overlay_ops = { .disable = fimd_win_disable, }; -/* for pageflip event */ static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc) { struct exynos_drm_private *dev_priv = drm_dev->dev_private; struct drm_pending_vblank_event *e, *t; struct timeval now; unsigned long flags; - - if (!dev_priv->pageflip_event) - return; + bool is_checked = false; spin_lock_irqsave(&drm_dev->event_lock, flags); list_for_each_entry_safe(e, t, &dev_priv->pageflip_event_list, base.link) { + /* if event's pipe isn't same as crtc then ignor it. */ + if (crtc != e->pipe) + continue; + + is_checked = true; + do_gettimeofday(&now); e->event.sequence = 0; e->event.tv_sec = now.tv_sec; @@ -511,8 +514,8 @@ static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc) wake_up_interruptible(&e->base.file_priv->event_wait); } - drm_vblank_put(drm_dev, crtc); - dev_priv->pageflip_event = false; + if (is_checked) + drm_vblank_put(drm_dev, crtc); spin_unlock_irqrestore(&drm_dev->event_lock, flags); } |