Commit | Line | Data |
---|---|---|
e9e31049 GL |
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; | |
e7359f8e | 18 | struct device_node; |
e9e31049 GL |
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 | ||
cfca7644 SN |
26 | enum v4l2_async_match_type { |
27 | V4L2_ASYNC_MATCH_CUSTOM, | |
28 | V4L2_ASYNC_MATCH_DEVNAME, | |
29 | V4L2_ASYNC_MATCH_I2C, | |
e7359f8e | 30 | V4L2_ASYNC_MATCH_OF, |
e9e31049 GL |
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 { | |
cfca7644 | 41 | enum v4l2_async_match_type match_type; |
e9e31049 | 42 | union { |
e7359f8e SN |
43 | struct { |
44 | const struct device_node *node; | |
45 | } of; | |
e9e31049 GL |
46 | struct { |
47 | const char *name; | |
cfca7644 | 48 | } device_name; |
e9e31049 GL |
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 | ||
e9e31049 GL |
64 | /** |
65 | * v4l2_async_notifier - v4l2_device notifier data | |
66 | * @num_subdevs:number of subdevices | |
e8419d08 | 67 | * @subdevs: array of pointers to subdevice descriptors |
e9e31049 GL |
68 | * @v4l2_dev: pointer to struct v4l2_device |
69 | * @waiting: list of struct v4l2_async_subdev, waiting for their drivers | |
b426b3a6 | 70 | * @done: list of struct v4l2_subdev, already probed |
e9e31049 GL |
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; | |
e8419d08 | 78 | struct v4l2_async_subdev **subdevs; |
e9e31049 GL |
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 |