mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
[media] uvcvideo: Add VIDIOC_[GS]_PRIORITY support
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
69d11262a3
commit
0550513c7a
@ -1562,6 +1562,7 @@ static int uvc_scan_device(struct uvc_device *dev)
|
||||
INIT_LIST_HEAD(&chain->entities);
|
||||
mutex_init(&chain->ctrl_mutex);
|
||||
chain->dev = dev;
|
||||
v4l2_prio_init(&chain->prio);
|
||||
|
||||
if (uvc_scan_chain(chain, term) < 0) {
|
||||
kfree(chain);
|
||||
@ -1722,6 +1723,8 @@ static int uvc_register_video(struct uvc_device *dev,
|
||||
vdev->v4l2_dev = &dev->vdev;
|
||||
vdev->fops = &uvc_fops;
|
||||
vdev->release = uvc_release;
|
||||
vdev->prio = &stream->chain->prio;
|
||||
set_bit(V4L2_FL_USE_FH_PRIO, &vdev->flags);
|
||||
if (stream->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
|
||||
vdev->vfl_dir = VFL_DIR_TX;
|
||||
strlcpy(vdev->name, dev->name, sizeof vdev->name);
|
||||
|
@ -576,6 +576,19 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Priority */
|
||||
case VIDIOC_G_PRIORITY:
|
||||
*(u32 *)arg = v4l2_prio_max(vdev->prio);
|
||||
break;
|
||||
|
||||
case VIDIOC_S_PRIORITY:
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return v4l2_prio_change(vdev->prio, &handle->vfh.prio,
|
||||
*(u32 *)arg);
|
||||
|
||||
/* Get, Set & Query control */
|
||||
case VIDIOC_QUERYCTRL:
|
||||
return uvc_query_v4l2_ctrl(chain, arg);
|
||||
@ -606,6 +619,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
struct v4l2_control *ctrl = arg;
|
||||
struct v4l2_ext_control xctrl;
|
||||
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
memset(&xctrl, 0, sizeof xctrl);
|
||||
xctrl.id = ctrl->id;
|
||||
xctrl.value = ctrl->value;
|
||||
@ -653,6 +670,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
}
|
||||
|
||||
case VIDIOC_S_EXT_CTRLS:
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
/* Fall through */
|
||||
case VIDIOC_TRY_EXT_CTRLS:
|
||||
{
|
||||
struct v4l2_ext_controls *ctrls = arg;
|
||||
@ -747,6 +768,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
{
|
||||
u32 input = *(u32 *)arg + 1;
|
||||
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = uvc_acquire_privileges(handle)) < 0)
|
||||
return ret;
|
||||
|
||||
@ -800,6 +825,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
}
|
||||
|
||||
case VIDIOC_S_FMT:
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = uvc_acquire_privileges(handle)) < 0)
|
||||
return ret;
|
||||
|
||||
@ -902,6 +931,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
return uvc_v4l2_get_streamparm(stream, arg);
|
||||
|
||||
case VIDIOC_S_PARM:
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = uvc_acquire_privileges(handle)) < 0)
|
||||
return ret;
|
||||
|
||||
@ -936,6 +969,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
|
||||
/* Buffers & streaming */
|
||||
case VIDIOC_REQBUFS:
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = uvc_acquire_privileges(handle)) < 0)
|
||||
return ret;
|
||||
|
||||
@ -981,6 +1018,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
if (*type != stream->type)
|
||||
return -EINVAL;
|
||||
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!uvc_has_privileges(handle))
|
||||
return -EBUSY;
|
||||
|
||||
@ -999,6 +1040,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
if (*type != stream->type)
|
||||
return -EINVAL;
|
||||
|
||||
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!uvc_has_privileges(handle))
|
||||
return -EBUSY;
|
||||
|
||||
|
@ -372,6 +372,7 @@ struct uvc_video_chain {
|
||||
|
||||
struct mutex ctrl_mutex; /* Protects ctrl.info */
|
||||
|
||||
struct v4l2_prio_state prio; /* V4L2 priority state */
|
||||
u32 caps; /* V4L2 chain-wide caps */
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user