[media] hdpvr: add prio and control event support
authorHans Verkuil <hans.verkuil@cisco.com>
Tue, 12 Feb 2013 11:26:59 +0000 (08:26 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 14 Apr 2013 22:57:51 +0000 (19:57 -0300)
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/usb/hdpvr/hdpvr-video.c

index 4bbcf480d5e785f30a32db877e6525ac8b8e3dfb..e30ece215c871abb94dd9eeba267b1bc233f3194 100644 (file)
@@ -24,6 +24,7 @@
 #include <media/v4l2-dev.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-ioctl.h>
+#include <media/v4l2-event.h>
 #include "hdpvr.h"
 
 #define BULK_URB_TIMEOUT   90 /* 0.09 seconds */
@@ -479,16 +480,15 @@ err:
 
 static unsigned int hdpvr_poll(struct file *filp, poll_table *wait)
 {
+       unsigned long req_events = poll_requested_events(wait);
        struct hdpvr_buffer *buf = NULL;
        struct hdpvr_device *dev = video_drvdata(filp);
-       unsigned int mask = 0;
+       unsigned int mask = v4l2_ctrl_poll(filp, wait);
 
-       mutex_lock(&dev->io_mutex);
+       if (!(req_events & (POLLIN | POLLRDNORM)))
+               return mask;
 
-       if (!video_is_registered(dev->video_dev)) {
-               mutex_unlock(&dev->io_mutex);
-               return -EIO;
-       }
+       mutex_lock(&dev->io_mutex);
 
        if (dev->status == STATUS_IDLE) {
                if (hdpvr_start_streaming(dev)) {
@@ -880,10 +880,13 @@ static const struct v4l2_ioctl_ops hdpvr_ioctl_ops = {
        .vidioc_enumaudio       = vidioc_enumaudio,
        .vidioc_g_audio         = vidioc_g_audio,
        .vidioc_s_audio         = vidioc_s_audio,
-       .vidioc_enum_fmt_vid_cap        = vidioc_enum_fmt_vid_cap,
-       .vidioc_g_fmt_vid_cap           = vidioc_g_fmt_vid_cap,
+       .vidioc_enum_fmt_vid_cap= vidioc_enum_fmt_vid_cap,
+       .vidioc_g_fmt_vid_cap   = vidioc_g_fmt_vid_cap,
        .vidioc_encoder_cmd     = vidioc_encoder_cmd,
        .vidioc_try_encoder_cmd = vidioc_try_encoder_cmd,
+       .vidioc_log_status      = v4l2_ctrl_log_status,
+       .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
+       .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
 };
 
 static void hdpvr_device_release(struct video_device *vdev)
@@ -1008,6 +1011,7 @@ int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
        strcpy(dev->video_dev->name, "Hauppauge HD PVR");
        dev->video_dev->v4l2_dev = &dev->v4l2_dev;
        video_set_drvdata(dev->video_dev, dev);
+       set_bit(V4L2_FL_USE_FH_PRIO, &dev->video_dev->flags);
 
        res = video_register_device(dev->video_dev, VFL_TYPE_GRABBER, devnum);
        if (res < 0) {