aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2012-11-02 07:30:48 -0400
committerInki Dae <daeinki@gmail.com>2012-11-29 06:30:33 -0500
commite1f48ee58a90ddf84f514334b5d395a358596492 (patch)
treefe122bc62387c70c075a8a7e53a384878edfe4a6
parent85473328bac6170aabb5e13d2542d11d1fc4cc76 (diff)
drm/exynos: call drm_vblank_put for each queued flip event
It's guaranteed that for each event on pageflip_event_list we have called drm_vblank_get() - see exynos_drm_crtc_page_flip() - so checking for this is redundant. Also we need to call drm_vblank_put() for each event on the list, not only once, otherwise we'd leak vblank references if there are multiple events on the list. Signed-off-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fimd.c8
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_vidi.c8
-rw-r--r--drivers/gpu/drm/exynos/exynos_mixer.c11
3 files changed, 3 insertions, 24 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index e08478f19f1a..23a57f4da478 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -642,17 +642,11 @@ static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc)
642 642
643 list_move_tail(&e->base.link, &e->base.file_priv->event_list); 643 list_move_tail(&e->base.link, &e->base.file_priv->event_list);
644 wake_up_interruptible(&e->base.file_priv->event_wait); 644 wake_up_interruptible(&e->base.file_priv->event_wait);
645 drm_vblank_put(drm_dev, crtc);
645 } 646 }
646 647
647 if (is_checked) { 648 if (is_checked) {
648 /* 649 /*
649 * call drm_vblank_put only in case that drm_vblank_get was
650 * called.
651 */
652 if (atomic_read(&drm_dev->vblank_refcount[crtc]) > 0)
653 drm_vblank_put(drm_dev, crtc);
654
655 /*
656 * don't off vblank if vblank_disable_allowed is 1, 650 * don't off vblank if vblank_disable_allowed is 1,
657 * because vblank would be off by timer handler. 651 * because vblank would be off by timer handler.
658 */ 652 */
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index e4b8a8f741f7..e26d45577551 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -401,17 +401,11 @@ static void vidi_finish_pageflip(struct drm_device *drm_dev, int crtc)
401 401
402 list_move_tail(&e->base.link, &e->base.file_priv->event_list); 402 list_move_tail(&e->base.link, &e->base.file_priv->event_list);
403 wake_up_interruptible(&e->base.file_priv->event_wait); 403 wake_up_interruptible(&e->base.file_priv->event_wait);
404 drm_vblank_put(drm_dev, crtc);
404 } 405 }
405 406
406 if (is_checked) { 407 if (is_checked) {
407 /* 408 /*
408 * call drm_vblank_put only in case that drm_vblank_get was
409 * called.
410 */
411 if (atomic_read(&drm_dev->vblank_refcount[crtc]) > 0)
412 drm_vblank_put(drm_dev, crtc);
413
414 /*
415 * don't off vblank if vblank_disable_allowed is 1, 409 * don't off vblank if vblank_disable_allowed is 1,
416 * because vblank would be off by timer handler. 410 * because vblank would be off by timer handler.
417 */ 411 */
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index e7fbb823fd8e..0d3ed282376c 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -884,7 +884,6 @@ static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc)
884 struct drm_pending_vblank_event *e, *t; 884 struct drm_pending_vblank_event *e, *t;
885 struct timeval now; 885 struct timeval now;
886 unsigned long flags; 886 unsigned long flags;
887 bool is_checked = false;
888 887
889 spin_lock_irqsave(&drm_dev->event_lock, flags); 888 spin_lock_irqsave(&drm_dev->event_lock, flags);
890 889
@@ -894,7 +893,6 @@ static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc)
894 if (crtc != e->pipe) 893 if (crtc != e->pipe)
895 continue; 894 continue;
896 895
897 is_checked = true;
898 do_gettimeofday(&now); 896 do_gettimeofday(&now);
899 e->event.sequence = 0; 897 e->event.sequence = 0;
900 e->event.tv_sec = now.tv_sec; 898 e->event.tv_sec = now.tv_sec;
@@ -902,16 +900,9 @@ static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc)
902 900
903 list_move_tail(&e->base.link, &e->base.file_priv->event_list); 901 list_move_tail(&e->base.link, &e->base.file_priv->event_list);
904 wake_up_interruptible(&e->base.file_priv->event_wait); 902 wake_up_interruptible(&e->base.file_priv->event_wait);
903 drm_vblank_put(drm_dev, crtc);
905 } 904 }
906 905
907 if (is_checked)
908 /*
909 * call drm_vblank_put only in case that drm_vblank_get was
910 * called.
911 */
912 if (atomic_read(&drm_dev->vblank_refcount[crtc]) > 0)
913 drm_vblank_put(drm_dev, crtc);
914
915 spin_unlock_irqrestore(&drm_dev->event_lock, flags); 906 spin_unlock_irqrestore(&drm_dev->event_lock, flags);
916} 907}
917 908