OSDN Git Service

media: rcar-vin: Make use of V4L2_CAP_IO_MC
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tue, 21 Apr 2020 13:57:41 +0000 (15:57 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 6 May 2020 10:09:28 +0000 (12:09 +0200)
Set the V4L2_CAP_IO_MC capability flag and remove the driver specific
vidioc_enum_input, vidioc_g_input and vidioc_s_input callbacks for the
media controller enabled part of the driver. Also add support mbus_code
filtering for format enumeration.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
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 5151a3c..f421e25 100644 (file)
@@ -343,6 +343,29 @@ static int rvin_enum_fmt_vid_cap(struct file *file, void *priv,
        unsigned int i;
        int matched;
 
+       /*
+        * If mbus_code is set only enumerate supported pixel formats for that
+        * bus code. Converting from YCbCr to RGB and RGB to YCbCr is possible
+        * with VIN, so all supported YCbCr and RGB media bus codes can produce
+        * all of the related pixel formats. If mbus_code is not set enumerate
+        * all possible pixelformats.
+        *
+        * TODO: Once raw capture formats are added to the driver this needs
+        * to be extended so raw media bus codes only result in raw pixel
+        * formats.
+        */
+       switch (f->mbus_code) {
+       case 0:
+       case MEDIA_BUS_FMT_YUYV8_1X16:
+       case MEDIA_BUS_FMT_UYVY8_1X16:
+       case MEDIA_BUS_FMT_UYVY8_2X8:
+       case MEDIA_BUS_FMT_UYVY10_2X10:
+       case MEDIA_BUS_FMT_RGB888_1X24:
+               break;
+       default:
+               return -EINVAL;
+       }
+
        matched = -1;
        for (i = 0; i < ARRAY_SIZE(rvin_formats); i++) {
                if (rvin_format_from_pixel(vin, rvin_formats[i].fourcc))
@@ -767,18 +790,6 @@ static int rvin_mc_s_fmt_vid_cap(struct file *file, void *priv,
        return 0;
 }
 
-static int rvin_mc_enum_input(struct file *file, void *priv,
-                             struct v4l2_input *i)
-{
-       if (i->index != 0)
-               return -EINVAL;
-
-       i->type = V4L2_INPUT_TYPE_CAMERA;
-       strscpy(i->name, "Camera", sizeof(i->name));
-
-       return 0;
-}
-
 static const struct v4l2_ioctl_ops rvin_mc_ioctl_ops = {
        .vidioc_querycap                = rvin_querycap,
        .vidioc_try_fmt_vid_cap         = rvin_mc_try_fmt_vid_cap,
@@ -786,10 +797,6 @@ static const struct v4l2_ioctl_ops rvin_mc_ioctl_ops = {
        .vidioc_s_fmt_vid_cap           = rvin_mc_s_fmt_vid_cap,
        .vidioc_enum_fmt_vid_cap        = rvin_enum_fmt_vid_cap,
 
-       .vidioc_enum_input              = rvin_mc_enum_input,
-       .vidioc_g_input                 = rvin_g_input,
-       .vidioc_s_input                 = rvin_s_input,
-
        .vidioc_reqbufs                 = vb2_ioctl_reqbufs,
        .vidioc_create_bufs             = vb2_ioctl_create_bufs,
        .vidioc_querybuf                = vb2_ioctl_querybuf,
@@ -961,6 +968,7 @@ int rvin_v4l2_register(struct rvin_dev *vin)
        vin->format.colorspace = RVIN_DEFAULT_COLORSPACE;
 
        if (vin->info->use_mc) {
+               vdev->device_caps |= V4L2_CAP_IO_MC;
                vdev->ioctl_ops = &rvin_mc_ioctl_ops;
        } else {
                vdev->ioctl_ops = &rvin_ioctl_ops;