]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/exynos/exynos_drm_crtc.c
drm/exynos: use drm core to handle page-flip event
[karo-tx-linux.git] / drivers / gpu / drm / exynos / exynos_drm_crtc.c
index 5b6845bc18fc7fc7f65528879e751e974fc57c61..2530bf57716a93a800fca4b1a1608052cfe7db39 100644 (file)
@@ -69,8 +69,6 @@ static void exynos_crtc_atomic_begin(struct drm_crtc *crtc,
 {
        struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
 
-       exynos_crtc->event = crtc->state->event;
-
        if (exynos_crtc->ops->atomic_begin)
                exynos_crtc->ops->atomic_begin(exynos_crtc);
 }
@@ -79,9 +77,24 @@ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc,
                                     struct drm_crtc_state *old_crtc_state)
 {
        struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+       struct drm_pending_vblank_event *event;
+       unsigned long flags;
 
        if (exynos_crtc->ops->atomic_flush)
                exynos_crtc->ops->atomic_flush(exynos_crtc);
+
+       event = crtc->state->event;
+       if (event) {
+               crtc->state->event = NULL;
+
+               spin_lock_irqsave(&crtc->dev->event_lock, flags);
+               if (drm_crtc_vblank_get(crtc) == 0)
+                       drm_crtc_arm_vblank_event(crtc, event);
+               else
+                       drm_crtc_send_vblank_event(crtc, event);
+               spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
+       }
+
 }
 
 static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
@@ -173,22 +186,6 @@ void exynos_drm_crtc_disable_vblank(struct drm_device *dev, unsigned int pipe)
                exynos_crtc->ops->disable_vblank(exynos_crtc);
 }
 
-void exynos_drm_crtc_finish_update(struct exynos_drm_crtc *exynos_crtc,
-                               struct exynos_drm_plane *exynos_plane)
-{
-       struct drm_crtc *crtc = &exynos_crtc->base;
-       unsigned long flags;
-
-       exynos_plane->pending_fb = NULL;
-
-       spin_lock_irqsave(&crtc->dev->event_lock, flags);
-       if (exynos_crtc->event)
-               drm_crtc_send_vblank_event(crtc, exynos_crtc->event);
-
-       exynos_crtc->event = NULL;
-       spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
-}
-
 int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev,
                                       enum exynos_drm_output_type out_type)
 {
@@ -216,18 +213,19 @@ void exynos_drm_crtc_te_handler(struct drm_crtc *crtc)
 void exynos_drm_crtc_cancel_page_flip(struct drm_crtc *crtc,
                                        struct drm_file *file)
 {
-       struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
        struct drm_pending_vblank_event *e;
        unsigned long flags;
 
        spin_lock_irqsave(&crtc->dev->event_lock, flags);
 
-       e = exynos_crtc->event;
+       e = crtc->state->event;
        if (e && e->base.file_priv == file)
-               exynos_crtc->event = NULL;
+               crtc->state->event = NULL;
+       else
+               e = NULL;
 
        spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 
-       if (e && e->base.file_priv == file)
+       if (e)
                drm_event_cancel_free(crtc->dev, &e->base);
 }