diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-event.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-event.c | 36 | 
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/v4l2-event.c b/drivers/media/v4l2-core/v4l2-event.c index 86dcb5483c4..8761aab99de 100644 --- a/drivers/media/v4l2-core/v4l2-event.c +++ b/drivers/media/v4l2-core/v4l2-event.c @@ -318,3 +318,39 @@ int v4l2_event_subdev_unsubscribe(struct v4l2_subdev *sd, struct v4l2_fh *fh,  	return v4l2_event_unsubscribe(fh, sub);  }  EXPORT_SYMBOL_GPL(v4l2_event_subdev_unsubscribe); + +static void v4l2_event_src_replace(struct v4l2_event *old, +				const struct v4l2_event *new) +{ +	u32 old_changes = old->u.src_change.changes; + +	old->u.src_change = new->u.src_change; +	old->u.src_change.changes |= old_changes; +} + +static void v4l2_event_src_merge(const struct v4l2_event *old, +				struct v4l2_event *new) +{ +	new->u.src_change.changes |= old->u.src_change.changes; +} + +static const struct v4l2_subscribed_event_ops v4l2_event_src_ch_ops = { +	.replace = v4l2_event_src_replace, +	.merge = v4l2_event_src_merge, +}; + +int v4l2_src_change_event_subscribe(struct v4l2_fh *fh, +				const struct v4l2_event_subscription *sub) +{ +	if (sub->type == V4L2_EVENT_SOURCE_CHANGE) +		return v4l2_event_subscribe(fh, sub, 0, &v4l2_event_src_ch_ops); +	return -EINVAL; +} +EXPORT_SYMBOL_GPL(v4l2_src_change_event_subscribe); + +int v4l2_src_change_event_subdev_subscribe(struct v4l2_subdev *sd, +		struct v4l2_fh *fh, struct v4l2_event_subscription *sub) +{ +	return v4l2_src_change_event_subscribe(fh, sub); +} +EXPORT_SYMBOL_GPL(v4l2_src_change_event_subdev_subscribe);  | 
