diff options
author | Robert Morell <rmorell@nvidia.com> | 2011-03-01 15:33:15 -0800 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-08-11 11:52:52 -0700 |
commit | 1668bc60bed550fed9f0e275e47514c10c3f32d4 (patch) | |
tree | c46845fb3638c9b3ce7ddf36bb00ab44229bbbca | |
parent | 7995af83a9c18c83a885ddd4eba53ab6ae3424a0 (diff) |
video: tegra: Implement fops->poll() for control device
This is necessary for select() and poll() to work properly when clients
are waiting for events.
bug 818525
Change-Id: If98b3e0706495884834813c9a352b946352cc2f5
Signed-off-by: Robert Morell <rmorell@nvidia.com>
Reviewed-on: http://git-master/r/40521
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>
-rw-r--r-- | drivers/video/tegra/dc/ext/control.c | 1 | ||||
-rw-r--r-- | drivers/video/tegra/dc/ext/events.c | 14 | ||||
-rw-r--r-- | drivers/video/tegra/dc/ext/tegra_dc_ext_priv.h | 2 |
3 files changed, 17 insertions, 0 deletions
diff --git a/drivers/video/tegra/dc/ext/control.c b/drivers/video/tegra/dc/ext/control.c index 6cc2f9a7d54a..65d302f7af58 100644 --- a/drivers/video/tegra/dc/ext/control.c +++ b/drivers/video/tegra/dc/ext/control.c @@ -188,6 +188,7 @@ static const struct file_operations tegra_dc_ext_event_devops = { .open = tegra_dc_ext_control_open, .release = tegra_dc_ext_control_release, .read = tegra_dc_ext_event_read, + .poll = tegra_dc_ext_event_poll, .unlocked_ioctl = tegra_dc_ext_control_ioctl, }; diff --git a/drivers/video/tegra/dc/ext/events.c b/drivers/video/tegra/dc/ext/events.c index 226571e98fd7..150a1501fced 100644 --- a/drivers/video/tegra/dc/ext/events.c +++ b/drivers/video/tegra/dc/ext/events.c @@ -19,6 +19,7 @@ #include <linux/err.h> #include <linux/fs.h> #include <linux/list.h> +#include <linux/poll.h> #include <linux/sched.h> #include <linux/slab.h> #include <linux/uaccess.h> @@ -27,6 +28,19 @@ static DECLARE_WAIT_QUEUE_HEAD(event_wait); +unsigned int tegra_dc_ext_event_poll(struct file *filp, poll_table *wait) +{ + struct tegra_dc_ext_control_user *user = filp->private_data; + unsigned int mask = 0; + + poll_wait(filp, &event_wait, wait); + + if (atomic_read(&user->num_events)) + mask |= POLLIN; + + return mask; +} + static int get_next_event(struct tegra_dc_ext_control_user *user, struct tegra_dc_ext_event_list *event, bool block) diff --git a/drivers/video/tegra/dc/ext/tegra_dc_ext_priv.h b/drivers/video/tegra/dc/ext/tegra_dc_ext_priv.h index a1cd88325896..6f0d0e4e732b 100644 --- a/drivers/video/tegra/dc/ext/tegra_dc_ext_priv.h +++ b/drivers/video/tegra/dc/ext/tegra_dc_ext_priv.h @@ -22,6 +22,7 @@ #include <linux/cdev.h> #include <linux/list.h> #include <linux/mutex.h> +#include <linux/poll.h> #include <mach/dc.h> #include <mach/nvmap.h> @@ -126,6 +127,7 @@ extern int tegra_dc_ext_queue_hotplug(struct tegra_dc_ext_control *, int output); extern ssize_t tegra_dc_ext_event_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos); +extern unsigned int tegra_dc_ext_event_poll(struct file *, poll_table *); extern int tegra_dc_ext_get_num_outputs(void); |