rcar_du_crtc_start(rcrtc);
 }
 
-static void rcar_du_crtc_update_base(struct rcar_du_crtc *rcrtc)
-{
-       struct drm_crtc *crtc = &rcrtc->crtc;
-
-       rcar_du_plane_compute_base(rcrtc->plane, crtc->primary->fb);
-       rcar_du_plane_update_base(rcrtc->plane);
-}
-
 /* -----------------------------------------------------------------------------
  * CRTC Functions
  */
 
 static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc)
 {
+       struct drm_pending_vblank_event *event = crtc->state->event;
        struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
+       struct drm_device *dev = rcrtc->crtc.dev;
+       unsigned long flags;
 
        /* We need to access the hardware during atomic update, acquire a
         * reference to the CRTC.
         */
        rcar_du_crtc_get(rcrtc);
+
+       if (event) {
+               event->pipe = rcrtc->index;
+
+               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+
+               spin_lock_irqsave(&dev->event_lock, flags);
+               rcrtc->event = event;
+               spin_unlock_irqrestore(&dev->event_lock, flags);
+       }
 }
 
 static void rcar_du_crtc_atomic_flush(struct drm_crtc *crtc)
        .atomic_flush = rcar_du_crtc_atomic_flush,
 };
 
-static int rcar_du_crtc_page_flip(struct drm_crtc *crtc,
-                                 struct drm_framebuffer *fb,
-                                 struct drm_pending_vblank_event *event,
-                                 uint32_t page_flip_flags)
-{
-       struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
-       struct drm_device *dev = rcrtc->crtc.dev;
-       unsigned long flags;
-
-       spin_lock_irqsave(&dev->event_lock, flags);
-       if (rcrtc->event != NULL) {
-               spin_unlock_irqrestore(&dev->event_lock, flags);
-               return -EBUSY;
-       }
-       spin_unlock_irqrestore(&dev->event_lock, flags);
-
-       drm_atomic_set_fb_for_plane(crtc->primary->state, fb);
-
-       crtc->primary->fb = fb;
-       rcar_du_crtc_update_base(rcrtc);
-
-       if (event) {
-               event->pipe = rcrtc->index;
-               drm_crtc_vblank_get(crtc);
-               spin_lock_irqsave(&dev->event_lock, flags);
-               rcrtc->event = event;
-               spin_unlock_irqrestore(&dev->event_lock, flags);
-       }
-
-       return 0;
-}
-
 static const struct drm_crtc_funcs crtc_funcs = {
        .reset = drm_atomic_helper_crtc_reset,
        .destroy = drm_crtc_cleanup,
        .set_config = drm_atomic_helper_set_config,
-       .page_flip = rcar_du_crtc_page_flip,
+       .page_flip = drm_atomic_helper_page_flip,
        .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
 };
 
        plane->hwindex = -1;
 }
 
-void rcar_du_plane_update_base(struct rcar_du_plane *plane)
+static void rcar_du_plane_update_base(struct rcar_du_plane *plane)
 {
        struct rcar_du_group *rgrp = plane->group;
        unsigned int src_x = plane->plane.state->src_x >> 16;
        }
 }
 
-void rcar_du_plane_compute_base(struct rcar_du_plane *plane,
-                               struct drm_framebuffer *fb)
+static void rcar_du_plane_compute_base(struct rcar_du_plane *plane,
+                                      struct drm_framebuffer *fb)
 {
        struct drm_gem_cma_object *gem;