[media] v4l2-event: Add v4l2_subscribed_event_ops
Just like with ctrl events, drivers may want to get called back on listener add / remove for other event types too. Rather then special casing all of this in subscribe / unsubscribe event it is better to use ops for this. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:

committed by
Mauro Carvalho Chehab

parent
a22d85fea8
commit
c53c254933
@@ -78,6 +78,19 @@ struct v4l2_kevent {
|
||||
struct v4l2_event event;
|
||||
};
|
||||
|
||||
/** struct v4l2_subscribed_event_ops - Subscribed event operations.
|
||||
* @add: Optional callback, called when a new listener is added
|
||||
* @del: Optional callback, called when a listener stops listening
|
||||
* @replace: Optional callback that can replace event 'old' with event 'new'.
|
||||
* @merge: Optional callback that can merge event 'old' into event 'new'.
|
||||
*/
|
||||
struct v4l2_subscribed_event_ops {
|
||||
int (*add)(struct v4l2_subscribed_event *sev);
|
||||
void (*del)(struct v4l2_subscribed_event *sev);
|
||||
void (*replace)(struct v4l2_event *old, const struct v4l2_event *new);
|
||||
void (*merge)(const struct v4l2_event *old, struct v4l2_event *new);
|
||||
};
|
||||
|
||||
/** struct v4l2_subscribed_event - Internal struct representing a subscribed event.
|
||||
* @list: List node for the v4l2_fh->subscribed list.
|
||||
* @type: Event type.
|
||||
@@ -85,8 +98,7 @@ struct v4l2_kevent {
|
||||
* @flags: Copy of v4l2_event_subscription->flags.
|
||||
* @fh: Filehandle that subscribed to this event.
|
||||
* @node: List node that hooks into the object's event list (if there is one).
|
||||
* @replace: Optional callback that can replace event 'old' with event 'new'.
|
||||
* @merge: Optional callback that can merge event 'old' into event 'new'.
|
||||
* @ops: v4l2_subscribed_event_ops
|
||||
* @elems: The number of elements in the events array.
|
||||
* @first: The index of the events containing the oldest available event.
|
||||
* @in_use: The number of queued events.
|
||||
@@ -99,10 +111,7 @@ struct v4l2_subscribed_event {
|
||||
u32 flags;
|
||||
struct v4l2_fh *fh;
|
||||
struct list_head node;
|
||||
void (*replace)(struct v4l2_event *old,
|
||||
const struct v4l2_event *new);
|
||||
void (*merge)(const struct v4l2_event *old,
|
||||
struct v4l2_event *new);
|
||||
const struct v4l2_subscribed_event_ops *ops;
|
||||
unsigned elems;
|
||||
unsigned first;
|
||||
unsigned in_use;
|
||||
@@ -115,7 +124,8 @@ 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, unsigned elems);
|
||||
struct v4l2_event_subscription *sub, unsigned elems,
|
||||
const struct v4l2_subscribed_event_ops *ops);
|
||||
int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
||||
struct v4l2_event_subscription *sub);
|
||||
void v4l2_event_unsubscribe_all(struct v4l2_fh *fh);
|
||||
|
Reference in New Issue
Block a user