| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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; | 
					
						
							| 
									
										
										
										
											2013-07-19 12:21:29 -03:00
										 |  |  | struct device_node; | 
					
						
							| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  | 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-19 12:14:46 -03:00
										 |  |  | enum v4l2_async_match_type { | 
					
						
							|  |  |  | 	V4L2_ASYNC_MATCH_CUSTOM, | 
					
						
							|  |  |  | 	V4L2_ASYNC_MATCH_DEVNAME, | 
					
						
							|  |  |  | 	V4L2_ASYNC_MATCH_I2C, | 
					
						
							| 
									
										
										
										
											2013-07-19 12:21:29 -03:00
										 |  |  | 	V4L2_ASYNC_MATCH_OF, | 
					
						
							| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * 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 { | 
					
						
							| 
									
										
										
										
											2013-07-19 12:14:46 -03:00
										 |  |  | 	enum v4l2_async_match_type match_type; | 
					
						
							| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  | 	union { | 
					
						
							| 
									
										
										
										
											2013-07-19 12:21:29 -03:00
										 |  |  | 		struct { | 
					
						
							|  |  |  | 			const struct device_node *node; | 
					
						
							|  |  |  | 		} of; | 
					
						
							| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  | 		struct { | 
					
						
							|  |  |  | 			const char *name; | 
					
						
							| 
									
										
										
										
											2013-07-19 12:14:46 -03:00
										 |  |  | 		} device_name; | 
					
						
							| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  | 		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 | 
					
						
							| 
									
										
										
										
											2013-07-19 12:31:10 -03:00
										 |  |  |  * @subdevs:	array of pointers to subdevice descriptors | 
					
						
							| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  |  * @v4l2_dev:	pointer to struct v4l2_device | 
					
						
							|  |  |  |  * @waiting:	list of struct v4l2_async_subdev, waiting for their drivers | 
					
						
							| 
									
										
										
										
											2013-07-22 08:01:33 -03:00
										 |  |  |  * @done:	list of struct v4l2_subdev, already probed | 
					
						
							| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  |  * @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; | 
					
						
							| 
									
										
										
										
											2013-07-19 12:31:10 -03:00
										 |  |  | 	struct v4l2_async_subdev **subdevs; | 
					
						
							| 
									
										
										
										
											2013-01-08 07:06:31 -03:00
										 |  |  | 	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
 |