drm/exynos: use wait_event_timeout() for safety usage
There could be the case that the page flip operation isn't finished correctly with some abnormal condition such as panel reset. So this patch replaces wait_event() with wait_event_timeout() to avoid waiting for page flip completion infinitely. And clears exynos_crtc->pending_flip in exynos_drm_crtc_page_flip() when exynos_drm_crtc_mode_set_commit() is failed. Signed-off-by: YoungJun Cho <yj44.cho@samsung.com> Acked-by: Inki Dae <inki.dae@samsung.com> Acked-by: Kyungmin Park <kyungmin.park@samsung.com> Reviewed-by: Andrzej Hajda <a.hajda@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
parent
2f36e33aef
commit
e35d7223de
|
@ -69,8 +69,10 @@ static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode)
|
|||
|
||||
if (mode > DRM_MODE_DPMS_ON) {
|
||||
/* wait for the completion of page flip. */
|
||||
wait_event(exynos_crtc->pending_flip_queue,
|
||||
atomic_read(&exynos_crtc->pending_flip) == 0);
|
||||
if (!wait_event_timeout(exynos_crtc->pending_flip_queue,
|
||||
!atomic_read(&exynos_crtc->pending_flip),
|
||||
HZ/20))
|
||||
atomic_set(&exynos_crtc->pending_flip, 0);
|
||||
drm_vblank_off(crtc->dev, exynos_crtc->pipe);
|
||||
}
|
||||
|
||||
|
@ -259,6 +261,7 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc,
|
|||
spin_lock_irq(&dev->event_lock);
|
||||
drm_vblank_put(dev, exynos_crtc->pipe);
|
||||
list_del(&event->base.link);
|
||||
atomic_set(&exynos_crtc->pending_flip, 0);
|
||||
spin_unlock_irq(&dev->event_lock);
|
||||
|
||||
goto out;
|
||||
|
|
Loading…
Reference in New Issue