summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2011-10-09 10:28:27 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-03-27 11:42:04 -0300
commit296da3cd14db9eb5606924962b2956c9c656dbb0 (patch)
treeba0e1014a0aca90e7a0b1e58047fd610ad84db7a /drivers
parent0bf0f713d6e6b9f1c510d598c29ac17812a4eea5 (diff)
[media] pwc: poll(): Check that the device has not beem claimed for streaming already
Some apps which use read() start the streaming through a call to poll(), this means that if another app has already claimed the device for streaming (through for example a s_fmt, or a reqbufs), that the poll should fail instead of getting passed through to vb2_poll. We only check for this when the app is polling for reads, so that ctrl events still work. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/pwc/pwc-if.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/media/video/pwc/pwc-if.c b/drivers/media/video/pwc/pwc-if.c
index 122fbd0081eb..f3370a87cbc0 100644
--- a/drivers/media/video/pwc/pwc-if.c
+++ b/drivers/media/video/pwc/pwc-if.c
@@ -625,10 +625,19 @@ static ssize_t pwc_video_read(struct file *file, char __user *buf,
static unsigned int pwc_video_poll(struct file *file, poll_table *wait)
{
struct pwc_device *pdev = video_drvdata(file);
+ unsigned long req_events = poll_requested_events(wait);
if (!pdev->udev)
return POLL_ERR;
+ if ((req_events & (POLLIN | POLLRDNORM)) &&
+ pdev->vb_queue.num_buffers == 0 &&
+ !pdev->iso_init) {
+ /* This poll will start a read stream, check capt_file */
+ if (pwc_test_n_set_capt_file(pdev, file))
+ return POLL_ERR;
+ }
+
return vb2_poll(&pdev->vb_queue, file, wait);
}