media: vivid: use vb2_queue_change_type
Use the new vb2_queue_change_type() function in .vidioc_reqbufs and .vidioc_create_bufs instead of changing the queue type manually in vidioc_s_fmt_vbi_cap() and vidioc_s_fmt_sliced_vbi_cap(). This allows for a more consistent behavior, as .vidioc_reqbufs and .vidioc_create_bufs are when the queue will become "busy". Signed-off-by: Tomi Valkeinen <tomi.valkeinen@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
2d8b2a6431
commit
c9cbf021c8
@ -656,6 +656,46 @@ static const struct v4l2_file_operations vivid_radio_fops = {
|
|||||||
.unlocked_ioctl = video_ioctl2,
|
.unlocked_ioctl = video_ioctl2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int vidioc_reqbufs(struct file *file, void *priv,
|
||||||
|
struct v4l2_requestbuffers *p)
|
||||||
|
{
|
||||||
|
struct video_device *vdev = video_devdata(file);
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sliced and raw VBI capture share the same queue so we must
|
||||||
|
* change the type.
|
||||||
|
*/
|
||||||
|
if (p->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE ||
|
||||||
|
p->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
|
||||||
|
r = vb2_queue_change_type(vdev->queue, p->type);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vb2_ioctl_reqbufs(file, priv, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int vidioc_create_bufs(struct file *file, void *priv,
|
||||||
|
struct v4l2_create_buffers *p)
|
||||||
|
{
|
||||||
|
struct video_device *vdev = video_devdata(file);
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sliced and raw VBI capture share the same queue so we must
|
||||||
|
* change the type.
|
||||||
|
*/
|
||||||
|
if (p->format.type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE ||
|
||||||
|
p->format.type == V4L2_BUF_TYPE_VBI_CAPTURE) {
|
||||||
|
r = vb2_queue_change_type(vdev->queue, p->format.type);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vb2_ioctl_create_bufs(file, priv, p);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct v4l2_ioctl_ops vivid_ioctl_ops = {
|
static const struct v4l2_ioctl_ops vivid_ioctl_ops = {
|
||||||
.vidioc_querycap = vidioc_querycap,
|
.vidioc_querycap = vidioc_querycap,
|
||||||
|
|
||||||
@ -717,8 +757,8 @@ static const struct v4l2_ioctl_ops vivid_ioctl_ops = {
|
|||||||
.vidioc_g_fbuf = vidioc_g_fbuf,
|
.vidioc_g_fbuf = vidioc_g_fbuf,
|
||||||
.vidioc_s_fbuf = vidioc_s_fbuf,
|
.vidioc_s_fbuf = vidioc_s_fbuf,
|
||||||
|
|
||||||
.vidioc_reqbufs = vb2_ioctl_reqbufs,
|
.vidioc_reqbufs = vidioc_reqbufs,
|
||||||
.vidioc_create_bufs = vb2_ioctl_create_bufs,
|
.vidioc_create_bufs = vidioc_create_bufs,
|
||||||
.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
|
.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
|
||||||
.vidioc_querybuf = vb2_ioctl_querybuf,
|
.vidioc_querybuf = vb2_ioctl_querybuf,
|
||||||
.vidioc_qbuf = vb2_ioctl_qbuf,
|
.vidioc_qbuf = vb2_ioctl_qbuf,
|
||||||
|
@ -257,7 +257,6 @@ int vidioc_s_fmt_vbi_cap(struct file *file, void *priv,
|
|||||||
return ret;
|
return ret;
|
||||||
if (f->type != V4L2_BUF_TYPE_VBI_CAPTURE && vb2_is_busy(&dev->vb_vbi_cap_q))
|
if (f->type != V4L2_BUF_TYPE_VBI_CAPTURE && vb2_is_busy(&dev->vb_vbi_cap_q))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
dev->vbi_cap_dev.queue->type = V4L2_BUF_TYPE_VBI_CAPTURE;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,7 +323,6 @@ int vidioc_s_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format
|
|||||||
if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE && vb2_is_busy(&dev->vb_vbi_cap_q))
|
if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE && vb2_is_busy(&dev->vb_vbi_cap_q))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
dev->service_set_cap = vbi->service_set;
|
dev->service_set_cap = vbi->service_set;
|
||||||
dev->vbi_cap_dev.queue->type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user