Commit 0550513c authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

[media] uvcvideo: Add VIDIOC_[GS]_PRIORITY support

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 69d11262
...@@ -1562,6 +1562,7 @@ static int uvc_scan_device(struct uvc_device *dev) ...@@ -1562,6 +1562,7 @@ static int uvc_scan_device(struct uvc_device *dev)
INIT_LIST_HEAD(&chain->entities); INIT_LIST_HEAD(&chain->entities);
mutex_init(&chain->ctrl_mutex); mutex_init(&chain->ctrl_mutex);
chain->dev = dev; chain->dev = dev;
v4l2_prio_init(&chain->prio);
if (uvc_scan_chain(chain, term) < 0) { if (uvc_scan_chain(chain, term) < 0) {
kfree(chain); kfree(chain);
...@@ -1722,6 +1723,8 @@ static int uvc_register_video(struct uvc_device *dev, ...@@ -1722,6 +1723,8 @@ static int uvc_register_video(struct uvc_device *dev,
vdev->v4l2_dev = &dev->vdev; vdev->v4l2_dev = &dev->vdev;
vdev->fops = &uvc_fops; vdev->fops = &uvc_fops;
vdev->release = uvc_release; 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) if (stream->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
vdev->vfl_dir = VFL_DIR_TX; vdev->vfl_dir = VFL_DIR_TX;
strlcpy(vdev->name, dev->name, sizeof vdev->name); 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) ...@@ -576,6 +576,19 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
break; 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 */ /* Get, Set & Query control */
case VIDIOC_QUERYCTRL: case VIDIOC_QUERYCTRL:
return uvc_query_v4l2_ctrl(chain, arg); 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) ...@@ -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_control *ctrl = arg;
struct v4l2_ext_control xctrl; struct v4l2_ext_control xctrl;
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
if (ret < 0)
return ret;
memset(&xctrl, 0, sizeof xctrl); memset(&xctrl, 0, sizeof xctrl);
xctrl.id = ctrl->id; xctrl.id = ctrl->id;
xctrl.value = ctrl->value; xctrl.value = ctrl->value;
...@@ -653,6 +670,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -653,6 +670,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
} }
case VIDIOC_S_EXT_CTRLS: 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: case VIDIOC_TRY_EXT_CTRLS:
{ {
struct v4l2_ext_controls *ctrls = arg; struct v4l2_ext_controls *ctrls = arg;
...@@ -747,6 +768,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -747,6 +768,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
{ {
u32 input = *(u32 *)arg + 1; 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) if ((ret = uvc_acquire_privileges(handle)) < 0)
return ret; return ret;
...@@ -800,6 +825,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -800,6 +825,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
} }
case VIDIOC_S_FMT: 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) if ((ret = uvc_acquire_privileges(handle)) < 0)
return ret; return ret;
...@@ -902,6 +931,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -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); return uvc_v4l2_get_streamparm(stream, arg);
case VIDIOC_S_PARM: 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) if ((ret = uvc_acquire_privileges(handle)) < 0)
return ret; return ret;
...@@ -936,6 +969,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -936,6 +969,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
/* Buffers & streaming */ /* Buffers & streaming */
case VIDIOC_REQBUFS: case VIDIOC_REQBUFS:
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
if (ret < 0)
return ret;
if ((ret = uvc_acquire_privileges(handle)) < 0) if ((ret = uvc_acquire_privileges(handle)) < 0)
return ret; return ret;
...@@ -981,6 +1018,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -981,6 +1018,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
if (*type != stream->type) if (*type != stream->type)
return -EINVAL; return -EINVAL;
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
if (ret < 0)
return ret;
if (!uvc_has_privileges(handle)) if (!uvc_has_privileges(handle))
return -EBUSY; return -EBUSY;
...@@ -999,6 +1040,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) ...@@ -999,6 +1040,10 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
if (*type != stream->type) if (*type != stream->type)
return -EINVAL; return -EINVAL;
ret = v4l2_prio_check(vdev->prio, handle->vfh.prio);
if (ret < 0)
return ret;
if (!uvc_has_privileges(handle)) if (!uvc_has_privileges(handle))
return -EBUSY; return -EBUSY;
......
...@@ -372,6 +372,7 @@ struct uvc_video_chain { ...@@ -372,6 +372,7 @@ struct uvc_video_chain {
struct mutex ctrl_mutex; /* Protects ctrl.info */ struct mutex ctrl_mutex; /* Protects ctrl.info */
struct v4l2_prio_state prio; /* V4L2 priority state */
u32 caps; /* V4L2 chain-wide caps */ u32 caps; /* V4L2 chain-wide caps */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment