diff options
Diffstat (limited to 'include/media/v4l2-async.h')
| -rw-r--r-- | include/media/v4l2-async.h | 97 | 
1 files changed, 97 insertions, 0 deletions
diff --git a/include/media/v4l2-async.h b/include/media/v4l2-async.h new file mode 100644 index 00000000000..768356917be --- /dev/null +++ b/include/media/v4l2-async.h @@ -0,0 +1,97 @@ +/* + * V4L2 asynchronous subdevice registration API + * + * Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef V4L2_ASYNC_H +#define V4L2_ASYNC_H + +#include <linux/list.h> +#include <linux/mutex.h> + +struct device; +struct device_node; +struct v4l2_device; +struct v4l2_subdev; +struct v4l2_async_notifier; + +/* A random max subdevice number, used to allocate an array on stack */ +#define V4L2_MAX_SUBDEVS 128U + +enum v4l2_async_match_type { +	V4L2_ASYNC_MATCH_CUSTOM, +	V4L2_ASYNC_MATCH_DEVNAME, +	V4L2_ASYNC_MATCH_I2C, +	V4L2_ASYNC_MATCH_OF, +}; + +/** + * struct v4l2_async_subdev - sub-device descriptor, as known to a bridge + * @bus_type:	subdevice bus type to select the appropriate matching method + * @match:	union of per-bus type matching data sets + * @list:	used to link struct v4l2_async_subdev objects, waiting to be + *		probed, to a notifier->waiting list + */ +struct v4l2_async_subdev { +	enum v4l2_async_match_type match_type; +	union { +		struct { +			const struct device_node *node; +		} of; +		struct { +			const char *name; +		} device_name; +		struct { +			int adapter_id; +			unsigned short address; +		} i2c; +		struct { +			bool (*match)(struct device *, +				      struct v4l2_async_subdev *); +			void *priv; +		} custom; +	} match; + +	/* v4l2-async core private: not to be used by drivers */ +	struct list_head list; +}; + +/** + * v4l2_async_notifier - v4l2_device notifier data + * @num_subdevs:number of subdevices + * @subdevs:	array of pointers to subdevice descriptors + * @v4l2_dev:	pointer to struct v4l2_device + * @waiting:	list of struct v4l2_async_subdev, waiting for their drivers + * @done:	list of struct v4l2_subdev, already probed + * @list:	member in a global list of notifiers + * @bound:	a subdevice driver has successfully probed one of subdevices + * @complete:	all subdevices have been probed successfully + * @unbind:	a subdevice is leaving + */ +struct v4l2_async_notifier { +	unsigned int num_subdevs; +	struct v4l2_async_subdev **subdevs; +	struct v4l2_device *v4l2_dev; +	struct list_head waiting; +	struct list_head done; +	struct list_head list; +	int (*bound)(struct v4l2_async_notifier *notifier, +		     struct v4l2_subdev *subdev, +		     struct v4l2_async_subdev *asd); +	int (*complete)(struct v4l2_async_notifier *notifier); +	void (*unbind)(struct v4l2_async_notifier *notifier, +		       struct v4l2_subdev *subdev, +		       struct v4l2_async_subdev *asd); +}; + +int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev, +				 struct v4l2_async_notifier *notifier); +void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier); +int v4l2_async_register_subdev(struct v4l2_subdev *sd); +void v4l2_async_unregister_subdev(struct v4l2_subdev *sd); +#endif  | 
