media: rcar-vin: Make use of V4L2_CAP_IO_MC
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>
This commit is contained in:
parent
e5b6b07a1b
commit
d5f74a1eff
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue