media: rcar-vin: Update format alignment constraints
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Thu, 25 Nov 2021 23:02:57 +0000 (00:02 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 7 Dec 2021 10:29:55 +0000 (11:29 +0100)
This change fixes two issues with the size constraints for buffers.

- There is no width alignment constraint for RGB formats. Prior to this
  change they were treated as YUV and as a result were more restricted
  than needed. Add a new check to differentiate between the two.

- The minimum width and height supported is 5x2, not 2x4, this is an
  artifact from the driver's soc-camera days. Fix this incorrect
  assumption.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/rcar-vin/rcar-v4l2.c

index a5bfa76..2e60b9f 100644 (file)
@@ -179,20 +179,27 @@ static void rvin_format_align(struct rvin_dev *vin, struct v4l2_pix_format *pix)
                break;
        }
 
-       /* HW limit width to a multiple of 32 (2^5) for NV12/16 else 2 (2^1) */
+       /* Hardware limits width alignment based on format. */
        switch (pix->pixelformat) {
+       /* Multiple of 32 (2^5) for NV12/16. */
        case V4L2_PIX_FMT_NV12:
        case V4L2_PIX_FMT_NV16:
                walign = 5;
                break;
-       default:
+       /* Multiple of 2 (2^1) for YUV. */
+       case V4L2_PIX_FMT_YUYV:
+       case V4L2_PIX_FMT_UYVY:
                walign = 1;
                break;
+       /* No multiple for RGB. */
+       default:
+               walign = 0;
+               break;
        }
 
        /* Limit to VIN capabilities */
-       v4l_bound_align_image(&pix->width, 2, vin->info->max_width, walign,
-                             &pix->height, 4, vin->info->max_height, 2, 0);
+       v4l_bound_align_image(&pix->width, 5, vin->info->max_width, walign,
+                             &pix->height, 2, vin->info->max_height, 0, 0);
 
        pix->bytesperline = rvin_format_bytesperline(vin, pix);
        pix->sizeimage = rvin_format_sizeimage(pix);