1 /* 2 * V4L2 asynchronous subdevice registration API 3 * 4 * Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11 #ifndef V4L2_ASYNC_H 12 #define V4L2_ASYNC_H 13 14 #include <linux/list.h> 15 #include <linux/mutex.h> 16 17 struct device; 18 struct device_node; 19 struct v4l2_device; 20 struct v4l2_subdev; 21 struct v4l2_async_notifier; 22 23 /* A random max subdevice number, used to allocate an array on stack */ 24 #define V4L2_MAX_SUBDEVS 128U 25 26 enum v4l2_async_match_type { 27 V4L2_ASYNC_MATCH_CUSTOM, 28 V4L2_ASYNC_MATCH_DEVNAME, 29 V4L2_ASYNC_MATCH_I2C, 30 V4L2_ASYNC_MATCH_OF, 31 }; 32 33 /** 34 * struct v4l2_async_subdev - sub-device descriptor, as known to a bridge 35 * @bus_type: subdevice bus type to select the appropriate matching method 36 * @match: union of per-bus type matching data sets 37 * @list: used to link struct v4l2_async_subdev objects, waiting to be 38 * probed, to a notifier->waiting list 39 */ 40 struct v4l2_async_subdev { 41 enum v4l2_async_match_type match_type; 42 union { 43 struct { 44 const struct device_node *node; 45 } of; 46 struct { 47 const char *name; 48 } device_name; 49 struct { 50 int adapter_id; 51 unsigned short address; 52 } i2c; 53 struct { 54 bool (*match)(struct device *, 55 struct v4l2_async_subdev *); 56 void *priv; 57 } custom; 58 } match; 59 60 /* v4l2-async core private: not to be used by drivers */ 61 struct list_head list; 62 }; 63 64 /** 65 * v4l2_async_notifier - v4l2_device notifier data 66 * @num_subdevs:number of subdevices 67 * @subdevs: array of pointers to subdevice descriptors 68 * @v4l2_dev: pointer to struct v4l2_device 69 * @waiting: list of struct v4l2_async_subdev, waiting for their drivers 70 * @done: list of struct v4l2_subdev, already probed 71 * @list: member in a global list of notifiers 72 * @bound: a subdevice driver has successfully probed one of subdevices 73 * @complete: all subdevices have been probed successfully 74 * @unbind: a subdevice is leaving 75 */ 76 struct v4l2_async_notifier { 77 unsigned int num_subdevs; 78 struct v4l2_async_subdev **subdevs; 79 struct v4l2_device *v4l2_dev; 80 struct list_head waiting; 81 struct list_head done; 82 struct list_head list; 83 int (*bound)(struct v4l2_async_notifier *notifier, 84 struct v4l2_subdev *subdev, 85 struct v4l2_async_subdev *asd); 86 int (*complete)(struct v4l2_async_notifier *notifier); 87 void (*unbind)(struct v4l2_async_notifier *notifier, 88 struct v4l2_subdev *subdev, 89 struct v4l2_async_subdev *asd); 90 }; 91 92 int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev, 93 struct v4l2_async_notifier *notifier); 94 void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier); 95 int v4l2_async_register_subdev(struct v4l2_subdev *sd); 96 void v4l2_async_unregister_subdev(struct v4l2_subdev *sd); 97 #endif 98