[media] v4l2-events/fh: merge v4l2_events into v4l2_fh
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 13 Jun 2011 20:44:42 +0000 (17:44 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 27 Jul 2011 20:53:31 +0000 (17:53 -0300)
Drivers that supported events used to be rare, but now that controls can also
raise events this will become much more common since almost all drivers have
controls.

This means that keeping struct v4l2_events as a separate struct make no more
sense. Merging it into struct v4l2_fh simplifies things substantially as it
is now an integral part of the filehandle struct.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/ivtv/ivtv-fileops.c
drivers/media/video/v4l2-ctrls.c
drivers/media/video/v4l2-event.c
drivers/media/video/v4l2-fh.c
drivers/media/video/v4l2-subdev.c
drivers/media/video/vivi.c
drivers/usb/gadget/uvc_v4l2.c
include/media/v4l2-event.h
include/media/v4l2-fh.h

index 353142d014460291e62c37d5f0a546cce42a15cf..d4275d2460cb15ad62076cbc5e31811f5aa77b6c 100644 (file)
@@ -722,8 +722,8 @@ unsigned int ivtv_v4l2_dec_poll(struct file *filp, poll_table *wait)
 
        /* If there are subscribed events, then only use the new event
           API instead of the old video.h based API. */
-       if (!list_empty(&id->fh.events->subscribed)) {
-               poll_wait(filp, &id->fh.events->wait, wait);
+       if (!list_empty(&id->fh.subscribed)) {
+               poll_wait(filp, &id->fh.wait, wait);
                /* Turn off the old-style vsync events */
                clear_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
                if (v4l2_event_pending(&id->fh))
@@ -773,7 +773,7 @@ unsigned int ivtv_v4l2_enc_poll(struct file *filp, poll_table * wait)
        if (v4l2_event_pending(&id->fh))
                res |= POLLPRI;
        else
-               poll_wait(filp, &id->fh.events->wait, wait);
+               poll_wait(filp, &id->fh.wait, wait);
 
        if (s->q_full.length || s->q_io.length)
                return res | POLLIN | POLLRDNORM;
index 1bbaed6a5930c824514856f08596864aff3bd59a..a5325611cb0e59ec389f5f13d76de9a10cec65c8 100644 (file)
@@ -2070,8 +2070,6 @@ int v4l2_ctrl_subscribe_fh(struct v4l2_fh *fh,
        struct v4l2_ctrl_handler *hdl = fh->ctrl_handler;
        int ret = 0;
 
-       if (!fh->events)
-               ret = v4l2_event_init(fh);
        if (!ret) {
                if (hdl->nr_of_refs * 2 > n)
                        n = hdl->nr_of_refs * 2;
index 670f2f834e6a2190c14b185683e47f785a74d86e..70fa82daaca7c6da4b3aa63a99d33f20dcbb8d3e 100644 (file)
 
 static void v4l2_event_unsubscribe_all(struct v4l2_fh *fh);
 
-int v4l2_event_init(struct v4l2_fh *fh)
-{
-       fh->events = kzalloc(sizeof(*fh->events), GFP_KERNEL);
-       if (fh->events == NULL)
-               return -ENOMEM;
-
-       init_waitqueue_head(&fh->events->wait);
-
-       INIT_LIST_HEAD(&fh->events->free);
-       INIT_LIST_HEAD(&fh->events->available);
-       INIT_LIST_HEAD(&fh->events->subscribed);
-
-       fh->events->sequence = -1;
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(v4l2_event_init);
-
 int v4l2_event_alloc(struct v4l2_fh *fh, unsigned int n)
 {
-       struct v4l2_events *events = fh->events;
        unsigned long flags;
 
-       if (!events) {
-               WARN_ON(1);
-               return -ENOMEM;
-       }
-
-       while (events->nallocated < n) {
+       while (fh->nallocated < n) {
                struct v4l2_kevent *kev;
 
                kev = kzalloc(sizeof(*kev), GFP_KERNEL);
@@ -68,8 +44,8 @@ int v4l2_event_alloc(struct v4l2_fh *fh, unsigned int n)
                        return -ENOMEM;
 
                spin_lock_irqsave(&fh->vdev->fh_lock, flags);
-               list_add_tail(&kev->list, &events->free);
-               events->nallocated++;
+               list_add_tail(&kev->list, &fh->free);
+               fh->nallocated++;
                spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
        }
 
@@ -87,40 +63,31 @@ EXPORT_SYMBOL_GPL(v4l2_event_alloc);
 
 void v4l2_event_free(struct v4l2_fh *fh)
 {
-       struct v4l2_events *events = fh->events;
-
-       if (!events)
-               return;
-
-       list_kfree(&events->free, struct v4l2_kevent, list);
-       list_kfree(&events->available, struct v4l2_kevent, list);
+       list_kfree(&fh->free, struct v4l2_kevent, list);
+       list_kfree(&fh->available, struct v4l2_kevent, list);
        v4l2_event_unsubscribe_all(fh);
-
-       kfree(events);
-       fh->events = NULL;
 }
 EXPORT_SYMBOL_GPL(v4l2_event_free);
 
 static int __v4l2_event_dequeue(struct v4l2_fh *fh, struct v4l2_event *event)
 {
-       struct v4l2_events *events = fh->events;
        struct v4l2_kevent *kev;
        unsigned long flags;
 
        spin_lock_irqsave(&fh->vdev->fh_lock, flags);
 
-       if (list_empty(&events->available)) {
+       if (list_empty(&fh->available)) {
                spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
                return -ENOENT;
        }
 
-       WARN_ON(events->navailable == 0);
+       WARN_ON(fh->navailable == 0);
 
-       kev = list_first_entry(&events->available, struct v4l2_kevent, list);
-       list_move(&kev->list, &events->free);
-       events->navailable--;
+       kev = list_first_entry(&fh->available, struct v4l2_kevent, list);
+       list_move(&kev->list, &fh->free);
+       fh->navailable--;
 
-       kev->event.pending = events->navailable;
+       kev->event.pending = fh->navailable;
        *event = kev->event;
 
        spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
@@ -131,7 +98,6 @@ static int __v4l2_event_dequeue(struct v4l2_fh *fh, struct v4l2_event *event)
 int v4l2_event_dequeue(struct v4l2_fh *fh, struct v4l2_event *event,
                       int nonblocking)
 {
-       struct v4l2_events *events = fh->events;
        int ret;
 
        if (nonblocking)
@@ -142,8 +108,8 @@ int v4l2_event_dequeue(struct v4l2_fh *fh, struct v4l2_event *event,
                mutex_unlock(fh->vdev->lock);
 
        do {
-               ret = wait_event_interruptible(events->wait,
-                                              events->navailable != 0);
+               ret = wait_event_interruptible(fh->wait,
+                                              fh->navailable != 0);
                if (ret < 0)
                        break;
 
@@ -161,12 +127,11 @@ EXPORT_SYMBOL_GPL(v4l2_event_dequeue);
 static struct v4l2_subscribed_event *v4l2_event_subscribed(
                struct v4l2_fh *fh, u32 type, u32 id)
 {
-       struct v4l2_events *events = fh->events;
        struct v4l2_subscribed_event *sev;
 
        assert_spin_locked(&fh->vdev->fh_lock);
 
-       list_for_each_entry(sev, &events->subscribed, list) {
+       list_for_each_entry(sev, &fh->subscribed, list) {
                if (sev->type == type && sev->id == id)
                        return sev;
        }
@@ -177,7 +142,6 @@ static struct v4l2_subscribed_event *v4l2_event_subscribed(
 static void __v4l2_event_queue_fh(struct v4l2_fh *fh, const struct v4l2_event *ev,
                const struct timespec *ts)
 {
-       struct v4l2_events *events = fh->events;
        struct v4l2_subscribed_event *sev;
        struct v4l2_kevent *kev;
 
@@ -187,24 +151,24 @@ static void __v4l2_event_queue_fh(struct v4l2_fh *fh, const struct v4l2_event *e
                return;
 
        /* Increase event sequence number on fh. */
-       events->sequence++;
+       fh->sequence++;
 
        /* Do we have any free events? */
-       if (list_empty(&events->free))
+       if (list_empty(&fh->free))
                return;
 
        /* Take one and fill it. */
-       kev = list_first_entry(&events->free, struct v4l2_kevent, list);
+       kev = list_first_entry(&fh->free, struct v4l2_kevent, list);
        kev->event.type = ev->type;
        kev->event.u = ev->u;
        kev->event.id = ev->id;
        kev->event.timestamp = *ts;
-       kev->event.sequence = events->sequence;
-       list_move_tail(&kev->list, &events->available);
+       kev->event.sequence = fh->sequence;
+       list_move_tail(&kev->list, &fh->available);
 
-       events->navailable++;
+       fh->navailable++;
 
-       wake_up_all(&events->wait);
+       wake_up_all(&fh->wait);
 }
 
 void v4l2_event_queue(struct video_device *vdev, const struct v4l2_event *ev)
@@ -240,24 +204,18 @@ EXPORT_SYMBOL_GPL(v4l2_event_queue_fh);
 
 int v4l2_event_pending(struct v4l2_fh *fh)
 {
-       return fh->events->navailable;
+       return fh->navailable;
 }
 EXPORT_SYMBOL_GPL(v4l2_event_pending);
 
 int v4l2_event_subscribe(struct v4l2_fh *fh,
                         struct v4l2_event_subscription *sub)
 {
-       struct v4l2_events *events = fh->events;
        struct v4l2_subscribed_event *sev, *found_ev;
        struct v4l2_ctrl *ctrl = NULL;
        struct v4l2_ctrl_fh *ctrl_fh = NULL;
        unsigned long flags;
 
-       if (fh->events == NULL) {
-               WARN_ON(1);
-               return -ENOMEM;
-       }
-
        if (sub->type == V4L2_EVENT_CTRL) {
                ctrl = v4l2_ctrl_find(fh->ctrl_handler, sub->id);
                if (ctrl == NULL)
@@ -284,7 +242,7 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
                sev->type = sub->type;
                sev->id = sub->id;
 
-               list_add(&sev->list, &events->subscribed);
+               list_add(&sev->list, &fh->subscribed);
                sev = NULL;
        }
 
@@ -306,7 +264,6 @@ EXPORT_SYMBOL_GPL(v4l2_event_subscribe);
 
 static void v4l2_event_unsubscribe_all(struct v4l2_fh *fh)
 {
-       struct v4l2_events *events = fh->events;
        struct v4l2_event_subscription sub;
        struct v4l2_subscribed_event *sev;
        unsigned long flags;
@@ -315,8 +272,8 @@ static void v4l2_event_unsubscribe_all(struct v4l2_fh *fh)
                sev = NULL;
 
                spin_lock_irqsave(&fh->vdev->fh_lock, flags);
-               if (!list_empty(&events->subscribed)) {
-                       sev = list_first_entry(&events->subscribed,
+               if (!list_empty(&fh->subscribed)) {
+                       sev = list_first_entry(&fh->subscribed,
                                        struct v4l2_subscribed_event, list);
                        sub.type = sev->type;
                        sub.id = sev->id;
index c6aef84099a743396b71f2d0de7ed28bfce57643..333b8c8f40d6f17fb1fe4e330f9642dfa0083a5c 100644 (file)
@@ -29,7 +29,7 @@
 #include <media/v4l2-event.h>
 #include <media/v4l2-ioctl.h>
 
-int v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev)
+void v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev)
 {
        fh->vdev = vdev;
        /* Inherit from video_device. May be overridden by the driver. */
@@ -38,16 +38,11 @@ int v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev)
        set_bit(V4L2_FL_USES_V4L2_FH, &fh->vdev->flags);
        fh->prio = V4L2_PRIORITY_UNSET;
 
-       /*
-        * fh->events only needs to be initialized if the driver
-        * supports the VIDIOC_SUBSCRIBE_EVENT ioctl.
-        */
-       if (vdev->ioctl_ops && vdev->ioctl_ops->vidioc_subscribe_event)
-               return v4l2_event_init(fh);
-
-       fh->events = NULL;
-
-       return 0;
+       init_waitqueue_head(&fh->wait);
+       INIT_LIST_HEAD(&fh->free);
+       INIT_LIST_HEAD(&fh->available);
+       INIT_LIST_HEAD(&fh->subscribed);
+       fh->sequence = -1;
 }
 EXPORT_SYMBOL_GPL(v4l2_fh_init);
 
index fd5dccaf3519a989a711e6489bd0976a75a4020c..3b67a8584916a888ea7dac1aec9cedf47736ce51 100644 (file)
@@ -75,15 +75,9 @@ static int subdev_open(struct file *file)
                return ret;
        }
 
-       ret = v4l2_fh_init(&subdev_fh->vfh, vdev);
-       if (ret)
-               goto err;
+       v4l2_fh_init(&subdev_fh->vfh, vdev);
 
        if (sd->flags & V4L2_SUBDEV_FL_HAS_EVENTS) {
-               ret = v4l2_event_init(&subdev_fh->vfh);
-               if (ret)
-                       goto err;
-
                ret = v4l2_event_alloc(&subdev_fh->vfh, sd->nevents);
                if (ret)
                        goto err;
@@ -297,7 +291,7 @@ static unsigned int subdev_poll(struct file *file, poll_table *wait)
        if (!(sd->flags & V4L2_SUBDEV_FL_HAS_EVENTS))
                return POLLERR;
 
-       poll_wait(file, &fh->events->wait, wait);
+       poll_wait(file, &fh->wait, wait);
 
        if (v4l2_event_pending(fh))
                return POLLPRI;
index e81c10607bb2283f28a18c27a4c1f93f175dfc3c..1b90713b44c535c02969f26f5cc072c443057166 100644 (file)
@@ -1046,7 +1046,7 @@ vivi_poll(struct file *file, struct poll_table_struct *wait)
        if (v4l2_event_pending(fh))
                res |= POLLPRI;
        else
-               poll_wait(file, &fh->events->wait, wait);
+               poll_wait(file, &fh->wait, wait);
        return res;
 }
 
index 5e807f083bc820e1251fbb7a08e8c023ed462edd..55828705d8591988f2ff1c6a8c81ca67846afde0 100644 (file)
@@ -130,13 +130,7 @@ uvc_v4l2_open(struct file *file)
        if (handle == NULL)
                return -ENOMEM;
 
-       ret = v4l2_fh_init(&handle->vfh, vdev);
-       if (ret < 0)
-               goto error;
-
-       ret = v4l2_event_init(&handle->vfh);
-       if (ret < 0)
-               goto error;
+       v4l2_fh_init(&handle->vfh, vdev);
 
        ret = v4l2_event_alloc(&handle->vfh, 8);
        if (ret < 0)
@@ -354,7 +348,7 @@ uvc_v4l2_poll(struct file *file, poll_table *wait)
        struct uvc_file_handle *handle = to_uvc_file_handle(file->private_data);
        unsigned int mask = 0;
 
-       poll_wait(file, &handle->vfh.events->wait, wait);
+       poll_wait(file, &handle->vfh.wait, wait);
        if (v4l2_event_pending(&handle->vfh))
                mask |= POLLPRI;
 
index 45e9c1e05513ba8859ac305b41e1f53f56ad6255..042b893035de788abb0dce9c8701a06c7ebeea45 100644 (file)
@@ -43,17 +43,6 @@ struct v4l2_subscribed_event {
        u32                     id;
 };
 
-struct v4l2_events {
-       wait_queue_head_t       wait;
-       struct list_head        subscribed; /* Subscribed events */
-       struct list_head        free; /* Events ready for use */
-       struct list_head        available; /* Dequeueable event */
-       unsigned int            navailable;
-       unsigned int            nallocated; /* Number of allocated events */
-       u32                     sequence;
-};
-
-int v4l2_event_init(struct v4l2_fh *fh);
 int v4l2_event_alloc(struct v4l2_fh *fh, unsigned int n);
 void v4l2_event_free(struct v4l2_fh *fh);
 int v4l2_event_dequeue(struct v4l2_fh *fh, struct v4l2_event *event,
index d2471116ad68a98ec65d29cc1c13bf27c4f9004a..bfc0457ca6ef195982b569d26c870b19f49bfbae 100644 (file)
 #include <linux/list.h>
 
 struct video_device;
-struct v4l2_events;
 struct v4l2_ctrl_handler;
 
 struct v4l2_fh {
        struct list_head        list;
        struct video_device     *vdev;
-       struct v4l2_events      *events; /* events, pending and subscribed */
        struct v4l2_ctrl_handler *ctrl_handler;
        enum v4l2_priority      prio;
+
+       /* Events */
+       wait_queue_head_t       wait;
+       struct list_head        subscribed; /* Subscribed events */
+       struct list_head        free; /* Events ready for use */
+       struct list_head        available; /* Dequeueable event */
+       unsigned int            navailable;
+       unsigned int            nallocated; /* Number of allocated events */
+       u32                     sequence;
 };
 
 /*
@@ -46,7 +53,7 @@ struct v4l2_fh {
  * from driver's v4l2_file_operations->open() handler if the driver
  * uses v4l2_fh.
  */
-int v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev);
+void v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev);
 /*
  * Add the fh to the list of file handles on a video_device. The file
  * handle must be initialised first.