drm/imx: ipuv3-plane: merge ipu_plane_atomic_set_base into atomic_update
authorPhilipp Zabel <p.zabel@pengutronix.de>
Tue, 18 Oct 2016 09:40:25 +0000 (11:40 +0200)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Thu, 20 Oct 2016 12:39:53 +0000 (14:39 +0200)
ipu_plane_atomic_set_base is called from ipu_plane_atomic_update in two
different places, depending on whether drm_atomic_crtc_needs_modeset is
true. Also depending on the same condition, this function does two
different things.
This patch removes the indirection by merging the relevant parts into
ipu_plane_atomic_update, making the actual code flow more obvious as a
result. Also remove the duplicate planar format comment, which is
already found in ipu_plane_atomic_check.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Acked-by: Liu Ying <gnuiyl@gmail.com>
drivers/gpu/drm/imx/ipuv3-plane.c

index 737f085eafac5b158c8f021a3726a1633239f0da..32871bed5dcc311ef1f483338c042e00b24c1248 100644 (file)
@@ -103,62 +103,6 @@ drm_plane_state_to_vbo(struct drm_plane_state *state)
               (state->src_x >> 16) / 2 - eba;
 }
 
-static void ipu_plane_atomic_set_base(struct ipu_plane *ipu_plane)
-{
-       struct drm_plane *plane = &ipu_plane->base;
-       struct drm_plane_state *state = plane->state;
-       struct drm_crtc_state *crtc_state = state->crtc->state;
-       struct drm_framebuffer *fb = state->fb;
-       unsigned long eba, ubo, vbo;
-       int active;
-
-       eba = drm_plane_state_to_eba(state);
-
-       switch (fb->pixel_format) {
-       case DRM_FORMAT_YUV420:
-       case DRM_FORMAT_YVU420:
-               if (!drm_atomic_crtc_needs_modeset(crtc_state))
-                       break;
-
-               /*
-                * Multiplanar formats have to meet the following restrictions:
-                * - The (up to) three plane addresses are EBA, EBA+UBO, EBA+VBO
-                * - EBA, UBO and VBO are a multiple of 8
-                * - UBO and VBO are unsigned and not larger than 0xfffff8
-                * - Only EBA may be changed while scanout is active
-                * - The strides of U and V planes must be identical.
-                */
-               ubo = drm_plane_state_to_ubo(state);
-               vbo = drm_plane_state_to_vbo(state);
-
-               if (fb->pixel_format == DRM_FORMAT_YUV420)
-                       ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
-                                                     fb->pitches[1], ubo, vbo);
-               else
-                       ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
-                                                     fb->pitches[1], vbo, ubo);
-
-               dev_dbg(ipu_plane->base.dev->dev,
-                       "phy = %lu %lu %lu, x = %d, y = %d", eba, ubo, vbo,
-                       state->src_x >> 16, state->src_y >> 16);
-               break;
-       default:
-               dev_dbg(ipu_plane->base.dev->dev, "phys = %lu, x = %d, y = %d",
-                       eba, state->src_x >> 16, state->src_y >> 16);
-
-               break;
-       }
-
-       if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
-               active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
-               ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
-               ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
-       } else {
-               ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 0, eba);
-               ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba);
-       }
-}
-
 void ipu_plane_put_resources(struct ipu_plane *ipu_plane)
 {
        if (!IS_ERR_OR_NULL(ipu_plane->dp))
@@ -397,15 +341,19 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
 {
        struct ipu_plane *ipu_plane = to_ipu_plane(plane);
        struct drm_plane_state *state = plane->state;
+       struct drm_crtc_state *crtc_state = state->crtc->state;
+       struct drm_framebuffer *fb = state->fb;
+       unsigned long eba, ubo, vbo;
        enum ipu_color_space ics;
+       int active;
 
-       if (old_state->fb) {
-               struct drm_crtc_state *crtc_state = state->crtc->state;
+       eba = drm_plane_state_to_eba(state);
 
-               if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
-                       ipu_plane_atomic_set_base(ipu_plane);
-                       return;
-               }
+       if (old_state->fb && !drm_atomic_crtc_needs_modeset(crtc_state)) {
+               active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
+               ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
+               ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
+               return;
        }
 
        switch (ipu_plane->dp_flow) {
@@ -449,7 +397,30 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
        ipu_cpmem_set_high_priority(ipu_plane->ipu_ch);
        ipu_idmac_set_double_buffer(ipu_plane->ipu_ch, 1);
        ipu_cpmem_set_stride(ipu_plane->ipu_ch, state->fb->pitches[0]);
-       ipu_plane_atomic_set_base(ipu_plane);
+       switch (fb->pixel_format) {
+       case DRM_FORMAT_YUV420:
+       case DRM_FORMAT_YVU420:
+               ubo = drm_plane_state_to_ubo(state);
+               vbo = drm_plane_state_to_vbo(state);
+
+               if (fb->pixel_format == DRM_FORMAT_YUV420)
+                       ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
+                                                     fb->pitches[1], ubo, vbo);
+               else
+                       ipu_cpmem_set_yuv_planar_full(ipu_plane->ipu_ch,
+                                                     fb->pitches[1], vbo, ubo);
+
+               dev_dbg(ipu_plane->base.dev->dev,
+                       "phy = %lu %lu %lu, x = %d, y = %d", eba, ubo, vbo,
+                       state->src_x >> 16, state->src_y >> 16);
+               break;
+       default:
+               dev_dbg(ipu_plane->base.dev->dev, "phys = %lu, x = %d, y = %d",
+                       eba, state->src_x >> 16, state->src_y >> 16);
+               break;
+       }
+       ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 0, eba);
+       ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba);
        ipu_plane_enable(ipu_plane);
 }