@@ -380,6 +380,15 @@ static int v4l2_open(struct inode *inode, struct file *filp)
/* and increase the device refcount */
video_get(vdev);
mutex_unlock(&videodev_lock);
+
+ if (test_bit(V4L2_FL_USES_V4L2_PRIO, &vdev->flags)) {
+ enum v4l2_priority prio =
+ (enum v4l2_priority)filp->private_data;
+
+ v4l2_prio_open(vdev->prio, &prio);
+ filp->private_data = (void *)prio;
+ }
+
if (vdev->fops->open) {
if (vdev->lock && mutex_lock_interruptible(vdev->lock)) {
ret = -ERESTARTSYS;
@@ -404,8 +413,13 @@ err:
static int v4l2_release(struct inode *inode, struct file *filp)
{
struct video_device *vdev = video_devdata(filp);
- int ret = 0;
+ if (test_bit(V4L2_FL_USES_V4L2_PRIO, &vdev->flags)) {
+ enum v4l2_priority prio =
+ (enum v4l2_priority)filp->private_data;
+
+ v4l2_prio_close(vdev->prio, prio);
+ }
if (vdev->fops->release) {
if (vdev->lock)
mutex_lock(vdev->lock);
@@ -417,7 +431,7 @@ static int v4l2_release(struct inode *inode, struct file *filp)
/* decrease the refcount unconditionally since the release()
return value is ignored. */
video_put(vdev);
- return ret;
+ return 0;
}
static const struct file_operations v4l2_fops = {
@@ -612,6 +626,11 @@ static int __video_register_device(struct video_device *vdev, int type, int nr,
vdev->index = get_index(vdev);
mutex_unlock(&videodev_lock);
+ /* Determine if we can store v4l2_priority in file->private_data */
+ if (vdev->fops->open == NULL && vdev->fops->release == NULL &&
+ vdev->prio != NULL)
+ set_bit(V4L2_FL_USES_V4L2_PRIO, &vdev->flags);
+
/* Part 3: Initialize the character device */
vdev->cdev = cdev_alloc();
if (vdev->cdev == NULL) {
@@ -32,7 +32,13 @@ struct v4l2_ctrl_handler;
Drivers can clear this flag if they want to block all future
device access. It is cleared by video_unregister_device. */
#define V4L2_FL_REGISTERED (0)
+/* Flag to mark that the driver stores a pointer to struct v4l2_fh in
+ file->private_data. Is automatically detected. */
#define V4L2_FL_USES_V4L2_FH (1)
+/* Flag to mark that the driver stores the local v4l2_priority in
+ file->private_data. Will be set if open and release are both NULL.
+ Drivers can also set it manually. */
+#define V4L2_FL_USES_V4L2_PRIO (2)
/* Priority helper functions */