[8/8] V4L: Events: Support all events
Commit Message
Add support for subscribing all events with a special id V4L2_EVENT_ALL. If
V4L2_EVENT_ALL is subscribed, no other events may be subscribed. Otherwise
V4L2_EVENT_ALL is considered just as any other event.
Signed-off-by: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
---
drivers/media/video/v4l2-event.c | 13 ++++++++++++-
include/linux/videodev2.h | 1 +
2 files changed, 13 insertions(+), 1 deletions(-)
@@ -156,6 +156,14 @@ static struct v4l2_subscribed_event *__v4l2_kevent_subscribed(
struct v4l2_events *events = fh->events;
struct v4l2_subscribed_event *sev;
+ if (list_empty(&events->subscribed))
+ return NULL;
+
+ sev = list_entry(events->subscribed.next,
+ struct v4l2_subscribed_event, list);
+ if (sev->type == V4L2_EVENT_ALL)
+ return sev;
+
list_for_each_entry(sev, &events->subscribed, list) {
if (sev->type == type)
return sev;
@@ -267,6 +275,8 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
/* Allow subscribing to valid events only. */
if (sub->type < V4L2_EVENT_PRIVATE_START)
switch (sub->type) {
+ case V4L2_EVENT_ALL:
+ break;
default:
return -EINVAL;
}
@@ -307,7 +317,8 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
sev = __v4l2_kevent_subscribed(fh, sub->type);
- if (sev == NULL) {
+ if (sev == NULL ||
+ (sub->type != V4L2_EVENT_ALL && sev->type == V4L2_EVENT_ALL)) {
spin_unlock_irqrestore(&fh->lock, flags);
return -EINVAL;
}
@@ -1553,6 +1553,7 @@ struct v4l2_event_subscription {
__u32 reserved[7];
};
+#define V4L2_EVENT_ALL 0
#define V4L2_EVENT_PRIVATE_START 0x08000000
/*