Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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

parent 69d11262
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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);
+45 −0
Original line number Diff line number Diff line
@@ -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;

+1 −0
Original line number Diff line number Diff line
@@ -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 */
};