Implement poll for events. POLLPRI is used to notify the user an event is
complete.

Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com>
---
 drivers/media/media-device.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c
index 41ec5ac..a4d3884 100644
--- a/drivers/media/media-device.c
+++ b/drivers/media/media-device.c
@@ -84,6 +84,34 @@ void media_device_request_put(struct media_device_request 
*req)
 }
 EXPORT_SYMBOL_GPL(media_device_request_put);
 
+static unsigned int media_device_request_poll(struct file *filp,
+                                             struct poll_table_struct *wait)
+{
+       struct media_device_request *req = filp->private_data;
+       struct media_device *mdev = req->mdev;
+       unsigned int poll_events = poll_requested_events(wait);
+       int ret = 0;
+
+       if (poll_events & (POLLIN | POLLOUT))
+               return POLLERR;
+
+       if (poll_events & POLLPRI) {
+               unsigned long flags;
+               bool complete;
+
+               spin_lock_irqsave(&mdev->req_lock, flags);
+               complete = req->state == MEDIA_DEVICE_REQUEST_STATE_COMPLETE;
+               spin_unlock_irqrestore(&mdev->req_lock, flags);
+
+               if (complete)
+                       poll_wait(filp, &req->poll_wait, wait);
+               else
+                       ret |= POLLPRI;
+       }
+
+       return ret;
+}
+
 static int media_device_request_close(struct inode *inode, struct file *filp)
 {
        struct media_device_request *req = filp->private_data;
@@ -95,6 +123,7 @@ static int media_device_request_close(struct inode *inode, 
struct file *filp)
 
 static const struct file_operations request_fops = {
        .owner = THIS_MODULE,
+       .poll = media_device_request_poll,
        .release = media_device_request_close,
 };
 
-- 
2.7.4

Reply via email to