diff options
author | Hans de Goede <hdegoede@redhat.com> | 2012-05-07 07:19:42 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-05-14 08:32:00 -0400 |
commit | a2d887c5fea33f341fd0d2a1487150473cf69014 (patch) | |
tree | 7bda3a1458c4e03041ff42ff38b8a6d7757bd5a2 /drivers/media/video/gspca/gspca.c | |
parent | 9a190c858cacd4b0110fefda5046ade8cd726261 (diff) |
[media] gspca: Use req_events in poll
So that we don't start a read stream when an app is only polling for control
events.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/gspca.c')
-rw-r--r-- | drivers/media/video/gspca/gspca.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index d9df30917374..8b97f777ddf4 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -2030,31 +2030,39 @@ out: | |||
2030 | static unsigned int dev_poll(struct file *file, poll_table *wait) | 2030 | static unsigned int dev_poll(struct file *file, poll_table *wait) |
2031 | { | 2031 | { |
2032 | struct gspca_dev *gspca_dev = video_drvdata(file); | 2032 | struct gspca_dev *gspca_dev = video_drvdata(file); |
2033 | int ret; | 2033 | unsigned long req_events = poll_requested_events(wait); |
2034 | int ret = 0; | ||
2034 | 2035 | ||
2035 | PDEBUG(D_FRAM, "poll"); | 2036 | PDEBUG(D_FRAM, "poll"); |
2036 | 2037 | ||
2037 | poll_wait(file, &gspca_dev->wq, wait); | 2038 | if (req_events & POLLPRI) |
2039 | ret |= v4l2_ctrl_poll(file, wait); | ||
2038 | 2040 | ||
2039 | /* if reqbufs is not done, the user would use read() */ | 2041 | if (req_events & (POLLIN | POLLRDNORM)) { |
2040 | if (gspca_dev->memory == GSPCA_MEMORY_NO) { | 2042 | /* if reqbufs is not done, the user would use read() */ |
2041 | ret = read_alloc(gspca_dev, file); | 2043 | if (gspca_dev->memory == GSPCA_MEMORY_NO) { |
2042 | if (ret != 0) | 2044 | if (read_alloc(gspca_dev, file) != 0) { |
2043 | return POLLERR; | 2045 | ret |= POLLERR; |
2044 | } | 2046 | goto out; |
2047 | } | ||
2048 | } | ||
2045 | 2049 | ||
2046 | if (mutex_lock_interruptible(&gspca_dev->queue_lock) != 0) | 2050 | poll_wait(file, &gspca_dev->wq, wait); |
2047 | return POLLERR; | ||
2048 | 2051 | ||
2049 | /* check if an image has been received */ | 2052 | /* check if an image has been received */ |
2050 | if (gspca_dev->fr_o != atomic_read(&gspca_dev->fr_i)) | 2053 | if (mutex_lock_interruptible(&gspca_dev->queue_lock) != 0) { |
2051 | ret = POLLIN | POLLRDNORM; /* yes */ | 2054 | ret |= POLLERR; |
2052 | else | 2055 | goto out; |
2053 | ret = 0; | 2056 | } |
2054 | ret |= v4l2_ctrl_poll(file, wait); | 2057 | if (gspca_dev->fr_o != atomic_read(&gspca_dev->fr_i)) |
2055 | mutex_unlock(&gspca_dev->queue_lock); | 2058 | ret |= POLLIN | POLLRDNORM; |
2059 | mutex_unlock(&gspca_dev->queue_lock); | ||
2060 | } | ||
2061 | |||
2062 | out: | ||
2056 | if (!gspca_dev->present) | 2063 | if (!gspca_dev->present) |
2057 | return POLLHUP; | 2064 | ret |= POLLHUP; |
2065 | |||
2058 | return ret; | 2066 | return ret; |
2059 | } | 2067 | } |
2060 | 2068 | ||