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@xxxxxxxxxxxxxxxxxxxxxxxxxx> --- drivers/media/video/v4l2-event.c | 13 ++++++++++++- include/linux/videodev2.h | 1 + 2 files changed, 13 insertions(+), 1 deletions(-) diff --git a/drivers/media/video/v4l2-event.c b/drivers/media/video/v4l2-event.c index cd744d0..131bab7 100644 --- a/drivers/media/video/v4l2-event.c +++ b/drivers/media/video/v4l2-event.c @@ -133,6 +133,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; @@ -212,6 +220,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; } @@ -252,7 +262,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->fhs.lock, flags); return -EINVAL; } diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index a19ae89..9ae9a1c 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -1553,6 +1553,7 @@ struct v4l2_event_subscription { __u32 reserved[7]; }; +#define V4L2_EVENT_ALL 0 #define V4L2_EVENT_PRIVATE_START 0x08000000 /* -- 1.5.6.5 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html