@@ -139,6 +139,14 @@ static struct v4l2_subscribed_event *__v4l2_event_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;
@@ -222,6 +230,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;
}
@@ -262,7 +272,8 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
sev = __v4l2_event_subscribed(fh, sub->type);
- if (sev == NULL) {
+ if (sev == NULL ||
+ (sub->type != V4L2_EVENT_ALL && sev->type == V4L2_EVENT_ALL)) {
spin_unlock_irqrestore(&fh->vdev->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
/*