summaryrefslogtreecommitdiffstats
path: root/drivers/media/video/pwc/pwc-v4l.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2011-06-26 12:13:44 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-07-27 17:53:44 -0300
commit4fba471e405f8f983085fd9f2fd9637bfc275f8f (patch)
tree0110147ec02ad39b74da40841ac84c6ea2cf1599 /drivers/media/video/pwc/pwc-v4l.c
parent6eba93573d2dda3f627006101c0652faeeaffde6 (diff)
[media] pwc: Allow multiple opens
Allow multiple opens of the /dev/video node so that control panel apps can be open to-gether with streaming apps. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/pwc/pwc-v4l.c')
-rw-r--r--drivers/media/video/pwc/pwc-v4l.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/drivers/media/video/pwc/pwc-v4l.c b/drivers/media/video/pwc/pwc-v4l.c
index 8bd0a681990..834055b71e0 100644
--- a/drivers/media/video/pwc/pwc-v4l.c
+++ b/drivers/media/video/pwc/pwc-v4l.c
@@ -284,13 +284,21 @@ static int pwc_vidioc_try_fmt(struct pwc_device *pdev, struct v4l2_format *f)
}
/* ioctl(VIDIOC_SET_FMT) */
-static int pwc_vidioc_set_fmt(struct pwc_device *pdev, struct v4l2_format *f)
+
+static int pwc_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f)
{
+ struct pwc_device *pdev = video_drvdata(file);
int ret, fps, snapshot, compression, pixelformat;
if (!pdev->udev)
return -ENODEV;
+ if (pdev->capt_file != NULL &&
+ pdev->capt_file != file)
+ return -EBUSY;
+
+ pdev->capt_file = file;
+
ret = pwc_vidioc_try_fmt(pdev, f);
if (ret<0)
return ret;
@@ -678,18 +686,17 @@ static int pwc_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *
return pwc_vidioc_try_fmt(pdev, f);
}
-static int pwc_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f)
-{
- struct pwc_device *pdev = video_drvdata(file);
-
- return pwc_vidioc_set_fmt(pdev, f);
-}
-
static int pwc_reqbufs(struct file *file, void *fh,
struct v4l2_requestbuffers *rb)
{
struct pwc_device *pdev = video_drvdata(file);
+ if (pdev->capt_file != NULL &&
+ pdev->capt_file != file)
+ return -EBUSY;
+
+ pdev->capt_file = file;
+
return vb2_reqbufs(&pdev->vb_queue, rb);
}
@@ -707,6 +714,9 @@ static int pwc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
if (!pdev->udev)
return -ENODEV;
+ if (pdev->capt_file != file)
+ return -EBUSY;
+
return vb2_qbuf(&pdev->vb_queue, buf);
}
@@ -717,6 +727,9 @@ static int pwc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
if (!pdev->udev)
return -ENODEV;
+ if (pdev->capt_file != file)
+ return -EBUSY;
+
return vb2_dqbuf(&pdev->vb_queue, buf, file->f_flags & O_NONBLOCK);
}
@@ -727,6 +740,9 @@ static int pwc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
if (!pdev->udev)
return -ENODEV;
+ if (pdev->capt_file != file)
+ return -EBUSY;
+
return vb2_streamon(&pdev->vb_queue, i);
}
@@ -737,6 +753,9 @@ static int pwc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
if (!pdev->udev)
return -ENODEV;
+ if (pdev->capt_file != file)
+ return -EBUSY;
+
return vb2_streamoff(&pdev->vb_queue, i);
}