[media] v4l2-event/ctrls/fh: allocate events per fh and per type instead of just...
[pandora-kernel.git] / include / media / v4l2-event.h
index 3b86177..8d681e5 100644 (file)
 #include <linux/wait.h>
 
 struct v4l2_fh;
+struct v4l2_subscribed_event;
 struct video_device;
 
 struct v4l2_kevent {
+       /* list node for the v4l2_fh->available list */
        struct list_head        list;
+       /* pointer to parent v4l2_subscribed_event */
+       struct v4l2_subscribed_event *sev;
+       /* event itself */
        struct v4l2_event       event;
 };
 
 struct v4l2_subscribed_event {
+       /* list node for the v4l2_fh->subscribed list */
        struct list_head        list;
+       /* event type */
        u32                     type;
+       /* associated object ID (e.g. control ID) */
+       u32                     id;
+       /* copy of v4l2_event_subscription->flags */
+       u32                     flags;
+       /* filehandle that subscribed to this event */
+       struct v4l2_fh          *fh;
+       /* list node that hooks into the object's event list (if there is one) */
+       struct list_head        node;
+       /* the number of elements in the events array */
+       unsigned                elems;
+       /* the index of the events containing the oldest available event */
+       unsigned                first;
+       /* the number of queued events */
+       unsigned                in_use;
+       /* an array of elems events */
+       struct v4l2_kevent      events[];
 };
 
-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,
                       int nonblocking);
 void v4l2_event_queue(struct video_device *vdev, const struct v4l2_event *ev);
+void v4l2_event_queue_fh(struct v4l2_fh *fh, const struct v4l2_event *ev);
 int v4l2_event_pending(struct v4l2_fh *fh);
 int v4l2_event_subscribe(struct v4l2_fh *fh,
-                        struct v4l2_event_subscription *sub);
+                        struct v4l2_event_subscription *sub, unsigned elems);
 int v4l2_event_unsubscribe(struct v4l2_fh *fh,
                           struct v4l2_event_subscription *sub);
+void v4l2_event_unsubscribe_all(struct v4l2_fh *fh);
 
 #endif /* V4L2_EVENT_H */