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 | |
f8b27377 MCC |
35 | * |
36 | * @match_type: type of match that will be used | |
e9e31049 GL |
37 | * @match: union of per-bus type matching data sets |
38 | * @list: used to link struct v4l2_async_subdev objects, waiting to be | |
39 | * probed, to a notifier->waiting list | |
40 | */ | |
41 | struct v4l2_async_subdev { | |
cfca7644 | 42 | enum v4l2_async_match_type match_type; |
e9e31049 | 43 | union { |
e7359f8e SN |
44 | struct { |
45 | const struct device_node *node; | |
46 | } of; | |
e9e31049 GL |
47 | struct { |
48 | const char *name; | |
cfca7644 | 49 | } device_name; |
e9e31049 GL |
50 | struct { |
51 | int adapter_id; | |
52 | unsigned short address; | |
53 | } i2c; | |
54 | struct { | |
55 | bool (*match)(struct device *, | |
56 | struct v4l2_async_subdev *); | |
57 | void *priv; | |
58 | } custom; | |
59 | } match; | |
60 | ||
61 | /* v4l2-async core private: not to be used by drivers */ | |
62 | struct list_head list; | |
63 | }; | |
64 | ||
e9e31049 | 65 | /** |
f8b27377 MCC |
66 | * struct v4l2_async_notifier - v4l2_device notifier data |
67 | * | |
68 | * @num_subdevs: number of subdevices | |
e8419d08 | 69 | * @subdevs: array of pointers to subdevice descriptors |
e9e31049 GL |
70 | * @v4l2_dev: pointer to struct v4l2_device |
71 | * @waiting: list of struct v4l2_async_subdev, waiting for their drivers | |
b426b3a6 | 72 | * @done: list of struct v4l2_subdev, already probed |
e9e31049 GL |
73 | * @list: member in a global list of notifiers |
74 | * @bound: a subdevice driver has successfully probed one of subdevices | |
75 | * @complete: all subdevices have been probed successfully | |
76 | * @unbind: a subdevice is leaving | |
77 | */ | |
78 | struct v4l2_async_notifier { | |
79 | unsigned int num_subdevs; | |
e8419d08 | 80 | struct v4l2_async_subdev **subdevs; |
e9e31049 GL |
81 | struct v4l2_device *v4l2_dev; |
82 | struct list_head waiting; | |
83 | struct list_head done; | |
84 | struct list_head list; | |
85 | int (*bound)(struct v4l2_async_notifier *notifier, | |
86 | struct v4l2_subdev *subdev, | |
87 | struct v4l2_async_subdev *asd); | |
88 | int (*complete)(struct v4l2_async_notifier *notifier); | |
89 | void (*unbind)(struct v4l2_async_notifier *notifier, | |
90 | struct v4l2_subdev *subdev, | |
91 | struct v4l2_async_subdev *asd); | |
92 | }; | |
93 | ||
94 | int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev, | |
95 | struct v4l2_async_notifier *notifier); | |
96 | void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier); | |
97 | int v4l2_async_register_subdev(struct v4l2_subdev *sd); | |
98 | void v4l2_async_unregister_subdev(struct v4l2_subdev *sd); | |
99 | #endif |