diff options
author | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-07-21 08:09:58 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-07-23 07:04:21 -0400 |
commit | b7fd6630026786d8bcca54bb9f5d035da1e2547a (patch) | |
tree | ea7ef7e24549d40f31512db916929b0e87573a2c /Documentation/media | |
parent | 21c29de1d090488f595c56be77c088c2ceed394b (diff) |
[media] v4l2-subdev.rst: add cross-references
Enrich the subdevice description by linking it to the
functions and structs from v4l2-subdev.h.
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'Documentation/media')
-rw-r--r-- | Documentation/media/kapi/v4l2-subdev.rst | 162 |
1 files changed, 85 insertions, 77 deletions
diff --git a/Documentation/media/kapi/v4l2-subdev.rst b/Documentation/media/kapi/v4l2-subdev.rst index 3e2b25b47ff4..101902c930b9 100644 --- a/Documentation/media/kapi/v4l2-subdev.rst +++ b/Documentation/media/kapi/v4l2-subdev.rst | |||
@@ -7,35 +7,37 @@ encoding or decoding. For webcams common sub-devices are sensors and camera | |||
7 | controllers. | 7 | controllers. |
8 | 8 | ||
9 | Usually these are I2C devices, but not necessarily. In order to provide the | 9 | Usually these are I2C devices, but not necessarily. In order to provide the |
10 | driver with a consistent interface to these sub-devices the v4l2_subdev struct | 10 | driver with a consistent interface to these sub-devices the |
11 | (v4l2-subdev.h) was created. | 11 | :c:type:`v4l2_subdev` struct (v4l2-subdev.h) was created. |
12 | 12 | ||
13 | Each sub-device driver must have a v4l2_subdev struct. This struct can be | 13 | Each sub-device driver must have a :c:type:`v4l2_subdev` struct. This struct |
14 | stand-alone for simple sub-devices or it might be embedded in a larger struct | 14 | can be stand-alone for simple sub-devices or it might be embedded in a larger |
15 | if more state information needs to be stored. Usually there is a low-level | 15 | struct if more state information needs to be stored. Usually there is a |
16 | device struct (e.g. i2c_client) that contains the device data as setup | 16 | low-level device struct (e.g. ``i2c_client``) that contains the device data as |
17 | by the kernel. It is recommended to store that pointer in the private | 17 | setup by the kernel. It is recommended to store that pointer in the private |
18 | data of v4l2_subdev using v4l2_set_subdevdata(). That makes it easy to go | 18 | data of :c:type:`v4l2_subdev` using :cpp:func:`v4l2_set_subdevdata`. That makes |
19 | from a v4l2_subdev to the actual low-level bus-specific device data. | 19 | it easy to go from a :c:type:`v4l2_subdev` to the actual low-level bus-specific |
20 | 20 | device data. | |
21 | You also need a way to go from the low-level struct to v4l2_subdev. For the | 21 | |
22 | common i2c_client struct the i2c_set_clientdata() call is used to store a | 22 | You also need a way to go from the low-level struct to :c:type:`v4l2_subdev`. |
23 | v4l2_subdev pointer, for other busses you may have to use other methods. | 23 | For the common i2c_client struct the i2c_set_clientdata() call is used to store |
24 | a :c:type:`v4l2_subdev` pointer, for other busses you may have to use other | ||
25 | methods. | ||
24 | 26 | ||
25 | Bridges might also need to store per-subdev private data, such as a pointer to | 27 | Bridges might also need to store per-subdev private data, such as a pointer to |
26 | bridge-specific per-subdev private data. The v4l2_subdev structure provides | 28 | bridge-specific per-subdev private data. The :c:type:`v4l2_subdev` structure |
27 | host private data for that purpose that can be accessed with | 29 | provides host private data for that purpose that can be accessed with |
28 | v4l2_get_subdev_hostdata() and v4l2_set_subdev_hostdata(). | 30 | :cpp:func:`v4l2_get_subdev_hostdata` and :cpp:func:`v4l2_set_subdev_hostdata`. |
29 | 31 | ||
30 | From the bridge driver perspective you load the sub-device module and somehow | 32 | From the bridge driver perspective, you load the sub-device module and somehow |
31 | obtain the v4l2_subdev pointer. For i2c devices this is easy: you call | 33 | obtain the :c:type:`v4l2_subdev` pointer. For i2c devices this is easy: you call |
32 | i2c_get_clientdata(). For other busses something similar needs to be done. | 34 | ``i2c_get_clientdata()``. For other busses something similar needs to be done. |
33 | Helper functions exists for sub-devices on an I2C bus that do most of this | 35 | Helper functions exists for sub-devices on an I2C bus that do most of this |
34 | tricky work for you. | 36 | tricky work for you. |
35 | 37 | ||
36 | Each v4l2_subdev contains function pointers that sub-device drivers can | 38 | Each :c:type:`v4l2_subdev` contains function pointers that sub-device drivers |
37 | implement (or leave NULL if it is not applicable). Since sub-devices can do | 39 | can implement (or leave ``NULL`` if it is not applicable). Since sub-devices can |
38 | so many different things and you do not want to end up with a huge ops struct | 40 | do so many different things and you do not want to end up with a huge ops struct |
39 | of which only a handful of ops are commonly implemented, the function pointers | 41 | of which only a handful of ops are commonly implemented, the function pointers |
40 | are sorted according to category and each category has its own ops struct. | 42 | are sorted according to category and each category has its own ops struct. |
41 | 43 | ||
@@ -44,7 +46,7 @@ may be NULL if the subdev driver does not support anything from that category. | |||
44 | 46 | ||
45 | It looks like this: | 47 | It looks like this: |
46 | 48 | ||
47 | .. code-block:: none | 49 | .. code-block:: c |
48 | 50 | ||
49 | struct v4l2_subdev_core_ops { | 51 | struct v4l2_subdev_core_ops { |
50 | int (*log_status)(struct v4l2_subdev *sd); | 52 | int (*log_status)(struct v4l2_subdev *sd); |
@@ -83,20 +85,22 @@ audio ops and vice versa. | |||
83 | This setup limits the number of function pointers while still making it easy | 85 | This setup limits the number of function pointers while still making it easy |
84 | to add new ops and categories. | 86 | to add new ops and categories. |
85 | 87 | ||
86 | A sub-device driver initializes the v4l2_subdev struct using: | 88 | A sub-device driver initializes the :c:type:`v4l2_subdev` struct using: |
87 | 89 | ||
88 | .. code-block:: none | 90 | :cpp:func:`v4l2_subdev_init <v4l2_subdev_init>` |
91 | (:c:type:`sd <v4l2_subdev>`, &\ :c:type:`ops <v4l2_subdev_ops>`). | ||
89 | 92 | ||
90 | v4l2_subdev_init(sd, &ops); | ||
91 | 93 | ||
92 | Afterwards you need to initialize subdev->name with a unique name and set the | 94 | Afterwards you need to initialize :c:type:`sd <v4l2_subdev>`->name with a |
93 | module owner. This is done for you if you use the i2c helper functions. | 95 | unique name and set the module owner. This is done for you if you use the |
96 | i2c helper functions. | ||
94 | 97 | ||
95 | If integration with the media framework is needed, you must initialize the | 98 | If integration with the media framework is needed, you must initialize the |
96 | media_entity struct embedded in the v4l2_subdev struct (entity field) by | 99 | :c:type:`media_entity` struct embedded in the :c:type:`v4l2_subdev` struct |
97 | calling media_entity_pads_init(), if the entity has pads: | 100 | (entity field) by calling :cpp:func:`media_entity_pads_init`, if the entity has |
101 | pads: | ||
98 | 102 | ||
99 | .. code-block:: none | 103 | .. code-block:: c |
100 | 104 | ||
101 | struct media_pad *pads = &my_sd->pads; | 105 | struct media_pad *pads = &my_sd->pads; |
102 | int err; | 106 | int err; |
@@ -104,7 +108,7 @@ calling media_entity_pads_init(), if the entity has pads: | |||
104 | err = media_entity_pads_init(&sd->entity, npads, pads); | 108 | err = media_entity_pads_init(&sd->entity, npads, pads); |
105 | 109 | ||
106 | The pads array must have been previously initialized. There is no need to | 110 | The pads array must have been previously initialized. There is no need to |
107 | manually set the struct media_entity function and name fields, but the | 111 | manually set the struct :c:type:`media_entity` function and name fields, but the |
108 | revision field must be initialized if needed. | 112 | revision field must be initialized if needed. |
109 | 113 | ||
110 | A reference to the entity will be automatically acquired/released when the | 114 | A reference to the entity will be automatically acquired/released when the |
@@ -112,13 +116,13 @@ subdev device node (if any) is opened/closed. | |||
112 | 116 | ||
113 | Don't forget to cleanup the media entity before the sub-device is destroyed: | 117 | Don't forget to cleanup the media entity before the sub-device is destroyed: |
114 | 118 | ||
115 | .. code-block:: none | 119 | .. code-block:: c |
116 | 120 | ||
117 | media_entity_cleanup(&sd->entity); | 121 | media_entity_cleanup(&sd->entity); |
118 | 122 | ||
119 | If the subdev driver intends to process video and integrate with the media | 123 | If the subdev driver intends to process video and integrate with the media |
120 | framework, it must implement format related functionality using | 124 | framework, it must implement format related functionality using |
121 | v4l2_subdev_pad_ops instead of v4l2_subdev_video_ops. | 125 | :c:type:`v4l2_subdev_pad_ops` instead of :c:type:`v4l2_subdev_video_ops`. |
122 | 126 | ||
123 | In that case, the subdev driver may set the link_validate field to provide | 127 | In that case, the subdev driver may set the link_validate field to provide |
124 | its own link validation function. The link validation function is called for | 128 | its own link validation function. The link validation function is called for |
@@ -127,9 +131,9 @@ sub-devices. The driver is still responsible for validating the correctness | |||
127 | of the format configuration between sub-devices and video nodes. | 131 | of the format configuration between sub-devices and video nodes. |
128 | 132 | ||
129 | If link_validate op is not set, the default function | 133 | If link_validate op is not set, the default function |
130 | v4l2_subdev_link_validate_default() is used instead. This function ensures | 134 | :cpp:func:`v4l2_subdev_link_validate_default` is used instead. This function |
131 | that width, height and the media bus pixel code are equal on both source and | 135 | ensures that width, height and the media bus pixel code are equal on both source |
132 | sink of the link. Subdev drivers are also free to use this function to | 136 | and sink of the link. Subdev drivers are also free to use this function to |
133 | perform the checks mentioned above in addition to their own checks. | 137 | perform the checks mentioned above in addition to their own checks. |
134 | 138 | ||
135 | There are currently two ways to register subdevices with the V4L2 core. The | 139 | There are currently two ways to register subdevices with the V4L2 core. The |
@@ -152,105 +156,109 @@ Using one or the other registration method only affects the probing process, the | |||
152 | run-time bridge-subdevice interaction is in both cases the same. | 156 | run-time bridge-subdevice interaction is in both cases the same. |
153 | 157 | ||
154 | In the synchronous case a device (bridge) driver needs to register the | 158 | In the synchronous case a device (bridge) driver needs to register the |
155 | v4l2_subdev with the v4l2_device: | 159 | :c:type:`v4l2_subdev` with the v4l2_device: |
156 | 160 | ||
157 | .. code-block:: none | 161 | :cpp:func:`v4l2_device_register_subdev <v4l2_device_register_subdev>` |
158 | 162 | (:c:type:`v4l2_dev <v4l2_device>`, :c:type:`sd <v4l2_subdev>`). | |
159 | int err = v4l2_device_register_subdev(v4l2_dev, sd); | ||
160 | 163 | ||
161 | This can fail if the subdev module disappeared before it could be registered. | 164 | This can fail if the subdev module disappeared before it could be registered. |
162 | After this function was called successfully the subdev->dev field points to | 165 | After this function was called successfully the subdev->dev field points to |
163 | the v4l2_device. | 166 | the :c:type:`v4l2_device`. |
164 | 167 | ||
165 | If the v4l2_device parent device has a non-NULL mdev field, the sub-device | 168 | If the v4l2_device parent device has a non-NULL mdev field, the sub-device |
166 | entity will be automatically registered with the media device. | 169 | entity will be automatically registered with the media device. |
167 | 170 | ||
168 | You can unregister a sub-device using: | 171 | You can unregister a sub-device using: |
169 | 172 | ||
170 | .. code-block:: none | 173 | :cpp:func:`v4l2_device_unregister_subdev <v4l2_device_unregister_subdev>` |
174 | (:c:type:`sd <v4l2_subdev>`). | ||
171 | 175 | ||
172 | v4l2_device_unregister_subdev(sd); | ||
173 | 176 | ||
174 | Afterwards the subdev module can be unloaded and sd->dev == NULL. | 177 | Afterwards the subdev module can be unloaded and |
178 | :c:type:`sd <v4l2_subdev>`->dev == ``NULL``. | ||
175 | 179 | ||
176 | You can call an ops function either directly: | 180 | You can call an ops function either directly: |
177 | 181 | ||
178 | .. code-block:: none | 182 | .. code-block:: c |
179 | 183 | ||
180 | err = sd->ops->core->g_std(sd, &norm); | 184 | err = sd->ops->core->g_std(sd, &norm); |
181 | 185 | ||
182 | but it is better and easier to use this macro: | 186 | but it is better and easier to use this macro: |
183 | 187 | ||
184 | .. code-block:: none | 188 | .. code-block:: c |
185 | 189 | ||
186 | err = v4l2_subdev_call(sd, core, g_std, &norm); | 190 | err = v4l2_subdev_call(sd, core, g_std, &norm); |
187 | 191 | ||
188 | The macro will to the right NULL pointer checks and returns -ENODEV if subdev | 192 | The macro will to the right ``NULL`` pointer checks and returns ``-ENODEV`` |
189 | is NULL, -ENOIOCTLCMD if either subdev->core or subdev->core->g_std is | 193 | if :c:type:`sd <v4l2_subdev>` is ``NULL``, ``-ENOIOCTLCMD`` if either |
190 | NULL, or the actual result of the subdev->ops->core->g_std ops. | 194 | :c:type:`sd <v4l2_subdev>`->core or :c:type:`sd <v4l2_subdev>`->core->g_std is ``NULL``, or the actual result of the |
195 | :c:type:`sd <v4l2_subdev>`->ops->core->g_std ops. | ||
191 | 196 | ||
192 | It is also possible to call all or a subset of the sub-devices: | 197 | It is also possible to call all or a subset of the sub-devices: |
193 | 198 | ||
194 | .. code-block:: none | 199 | .. code-block:: c |
195 | 200 | ||
196 | v4l2_device_call_all(v4l2_dev, 0, core, g_std, &norm); | 201 | v4l2_device_call_all(v4l2_dev, 0, core, g_std, &norm); |
197 | 202 | ||
198 | Any subdev that does not support this ops is skipped and error results are | 203 | Any subdev that does not support this ops is skipped and error results are |
199 | ignored. If you want to check for errors use this: | 204 | ignored. If you want to check for errors use this: |
200 | 205 | ||
201 | .. code-block:: none | 206 | .. code-block:: c |
202 | 207 | ||
203 | err = v4l2_device_call_until_err(v4l2_dev, 0, core, g_std, &norm); | 208 | err = v4l2_device_call_until_err(v4l2_dev, 0, core, g_std, &norm); |
204 | 209 | ||
205 | Any error except -ENOIOCTLCMD will exit the loop with that error. If no | 210 | Any error except ``-ENOIOCTLCMD`` will exit the loop with that error. If no |
206 | errors (except -ENOIOCTLCMD) occurred, then 0 is returned. | 211 | errors (except ``-ENOIOCTLCMD``) occurred, then 0 is returned. |
207 | 212 | ||
208 | The second argument to both calls is a group ID. If 0, then all subdevs are | 213 | The second argument to both calls is a group ID. If 0, then all subdevs are |
209 | called. If non-zero, then only those whose group ID match that value will | 214 | called. If non-zero, then only those whose group ID match that value will |
210 | be called. Before a bridge driver registers a subdev it can set sd->grp_id | 215 | be called. Before a bridge driver registers a subdev it can set |
211 | to whatever value it wants (it's 0 by default). This value is owned by the | 216 | :c:type:`sd <v4l2_subdev>`->grp_id to whatever value it wants (it's 0 by |
212 | bridge driver and the sub-device driver will never modify or use it. | 217 | default). This value is owned by the bridge driver and the sub-device driver |
218 | will never modify or use it. | ||
213 | 219 | ||
214 | The group ID gives the bridge driver more control how callbacks are called. | 220 | The group ID gives the bridge driver more control how callbacks are called. |
215 | For example, there may be multiple audio chips on a board, each capable of | 221 | For example, there may be multiple audio chips on a board, each capable of |
216 | changing the volume. But usually only one will actually be used when the | 222 | changing the volume. But usually only one will actually be used when the |
217 | user want to change the volume. You can set the group ID for that subdev to | 223 | user want to change the volume. You can set the group ID for that subdev to |
218 | e.g. AUDIO_CONTROLLER and specify that as the group ID value when calling | 224 | e.g. AUDIO_CONTROLLER and specify that as the group ID value when calling |
219 | v4l2_device_call_all(). That ensures that it will only go to the subdev | 225 | ``v4l2_device_call_all()``. That ensures that it will only go to the subdev |
220 | that needs it. | 226 | that needs it. |
221 | 227 | ||
222 | If the sub-device needs to notify its v4l2_device parent of an event, then | 228 | If the sub-device needs to notify its v4l2_device parent of an event, then |
223 | it can call v4l2_subdev_notify(sd, notification, arg). This macro checks | 229 | it can call ``v4l2_subdev_notify(sd, notification, arg)``. This macro checks |
224 | whether there is a notify() callback defined and returns -ENODEV if not. | 230 | whether there is a ``notify()`` callback defined and returns ``-ENODEV`` if not. |
225 | Otherwise the result of the notify() call is returned. | 231 | Otherwise the result of the ``notify()`` call is returned. |
226 | 232 | ||
227 | The advantage of using v4l2_subdev is that it is a generic struct and does | 233 | The advantage of using :c:type:`v4l2_subdev` is that it is a generic struct and |
228 | not contain any knowledge about the underlying hardware. So a driver might | 234 | does not contain any knowledge about the underlying hardware. So a driver might |
229 | contain several subdevs that use an I2C bus, but also a subdev that is | 235 | contain several subdevs that use an I2C bus, but also a subdev that is |
230 | controlled through GPIO pins. This distinction is only relevant when setting | 236 | controlled through GPIO pins. This distinction is only relevant when setting |
231 | up the device, but once the subdev is registered it is completely transparent. | 237 | up the device, but once the subdev is registered it is completely transparent. |
232 | 238 | ||
233 | |||
234 | In the asynchronous case subdevice probing can be invoked independently of the | 239 | In the asynchronous case subdevice probing can be invoked independently of the |
235 | bridge driver availability. The subdevice driver then has to verify whether all | 240 | bridge driver availability. The subdevice driver then has to verify whether all |
236 | the requirements for a successful probing are satisfied. This can include a | 241 | the requirements for a successful probing are satisfied. This can include a |
237 | check for a master clock availability. If any of the conditions aren't satisfied | 242 | check for a master clock availability. If any of the conditions aren't satisfied |
238 | the driver might decide to return -EPROBE_DEFER to request further reprobing | 243 | the driver might decide to return ``-EPROBE_DEFER`` to request further reprobing |
239 | attempts. Once all conditions are met the subdevice shall be registered using | 244 | attempts. Once all conditions are met the subdevice shall be registered using |
240 | the v4l2_async_register_subdev() function. Unregistration is performed using | 245 | the :cpp:func:`v4l2_async_register_subdev` function. Unregistration is |
241 | the v4l2_async_unregister_subdev() call. Subdevices registered this way are | 246 | performed using the :cpp:func:`v4l2_async_unregister_subdev` call. Subdevices |
242 | stored in a global list of subdevices, ready to be picked up by bridge drivers. | 247 | registered this way are stored in a global list of subdevices, ready to be |
248 | picked up by bridge drivers. | ||
243 | 249 | ||
244 | Bridge drivers in turn have to register a notifier object with an array of | 250 | Bridge drivers in turn have to register a notifier object with an array of |
245 | subdevice descriptors that the bridge device needs for its operation. This is | 251 | subdevice descriptors that the bridge device needs for its operation. This is |
246 | performed using the v4l2_async_notifier_register() call. To unregister the | 252 | performed using the :cpp:func:`v4l2_async_notifier_register` call. To |
247 | notifier the driver has to call v4l2_async_notifier_unregister(). The former of | 253 | unregister the notifier the driver has to call |
248 | the two functions takes two arguments: a pointer to struct v4l2_device and a | 254 | :cpp:func:`v4l2_async_notifier_unregister`. The former of the two functions |
249 | pointer to struct v4l2_async_notifier. The latter contains a pointer to an array | 255 | takes two arguments: a pointer to struct :c:type:`v4l2_device` and a pointer to |
250 | of pointers to subdevice descriptors of type struct v4l2_async_subdev type. The | 256 | struct :c:type:`v4l2_async_notifier`. The latter contains a pointer to an array |
251 | V4L2 core will then use these descriptors to match asynchronously registered | 257 | of pointers to subdevice descriptors of type struct :c:type:`v4l2_async_subdev` |
252 | subdevices to them. If a match is detected the .bound() notifier callback is | 258 | type. The V4L2 core will then use these descriptors to match asynchronously |
253 | called. After all subdevices have been located the .complete() callback is | 259 | registered |
260 | subdevices to them. If a match is detected the ``.bound()`` notifier callback | ||
261 | is called. After all subdevices have been located the .complete() callback is | ||
254 | called. When a subdevice is removed from the system the .unbind() method is | 262 | called. When a subdevice is removed from the system the .unbind() method is |
255 | called. All three callbacks are optional. | 263 | called. All three callbacks are optional. |
256 | 264 | ||