summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/ext
diff options
context:
space:
mode:
authorRobert Morell <rmorell@nvidia.com>2011-03-01 15:33:15 -0800
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:48:12 -0800
commit707fbea6f8769e3d50e3cb32ea4d29329f25bc0d (patch)
tree63f412f6c6a0dcac8ecdd63b3c02198876e728c1 /drivers/video/tegra/dc/ext
parent384b754c2f3c70c15da177c8b11a0a51f23c76fc (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 Original-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> Rebase-Id: Rc8813923838bada46d87d71ef852960316eda2f7
Diffstat (limited to 'drivers/video/tegra/dc/ext')
-rw-r--r--drivers/video/tegra/dc/ext/control.c1
-rw-r--r--drivers/video/tegra/dc/ext/events.c14
-rw-r--r--drivers/video/tegra/dc/ext/tegra_dc_ext_priv.h2
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);