imx-drm: ipuv3-plane: fix plane updates for active planes
authorPhilipp Zabel <p.zabel@pengutronix.de>
Wed, 8 Oct 2014 15:19:15 +0000 (17:19 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 4 Nov 2014 00:19:58 +0000 (16:19 -0800)
While the DMA channel is running, it is not allowed to change anything
but the inactive (double) buffer base address, so resizing a plane or
changing to a frame buffer with different pixel format is not possible.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/imx-drm/ipuv3-plane.c
drivers/staging/imx-drm/ipuv3-plane.h

index 16134d9..6987e16 100644 (file)
@@ -143,6 +143,18 @@ int ipu_plane_mode_set(struct ipu_plane *ipu_plane, struct drm_crtc *crtc,
        if (crtc_h < 2)
                return -EINVAL;
 
+       /*
+        * since we cannot touch active IDMAC channels, we do not support
+        * resizing the enabled plane or changing its format
+        */
+       if (ipu_plane->enabled) {
+               if (src_w != ipu_plane->w || src_h != ipu_plane->h ||
+                   fb->pixel_format != ipu_plane->base.fb->pixel_format)
+                       return -EINVAL;
+
+               return ipu_plane_set_base(ipu_plane, fb, src_x, src_y);
+       }
+
        switch (ipu_plane->dp_flow) {
        case IPU_DP_FLOW_SYNC_BG:
                ret = ipu_dp_setup_channel(ipu_plane->dp,
@@ -202,6 +214,9 @@ int ipu_plane_mode_set(struct ipu_plane *ipu_plane, struct drm_crtc *crtc,
        if (ret < 0)
                return ret;
 
+       ipu_plane->w = src_w;
+       ipu_plane->h = src_h;
+
        return 0;
 }
 
index c0aae5b..af125fb 100644 (file)
@@ -26,6 +26,8 @@ struct ipu_plane {
 
        int                     x;
        int                     y;
+       int                     w;
+       int                     h;
 
        bool                    enabled;
 };