Mauro Carvalho Chehab | f2ac8ce | 2018-08-30 10:20:04 -0400 | [diff] [blame] | 1 | .. SPDX-License-Identifier: GPL-2.0 |
| 2 | |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 3 | V4L2 sub-devices |
| 4 | ---------------- |
| 5 | |
| 6 | Many drivers need to communicate with sub-devices. These devices can do all |
| 7 | sort of tasks, but most commonly they handle audio and/or video muxing, |
| 8 | encoding or decoding. For webcams common sub-devices are sensors and camera |
| 9 | controllers. |
| 10 | |
| 11 | Usually these are I2C devices, but not necessarily. In order to provide the |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 12 | driver with a consistent interface to these sub-devices the |
| 13 | :c:type:`v4l2_subdev` struct (v4l2-subdev.h) was created. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 14 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 15 | Each sub-device driver must have a :c:type:`v4l2_subdev` struct. This struct |
| 16 | can be stand-alone for simple sub-devices or it might be embedded in a larger |
| 17 | struct if more state information needs to be stored. Usually there is a |
| 18 | low-level device struct (e.g. ``i2c_client``) that contains the device data as |
| 19 | setup by the kernel. It is recommended to store that pointer in the private |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 20 | data of :c:type:`v4l2_subdev` using :c:func:`v4l2_set_subdevdata`. That makes |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 21 | it easy to go from a :c:type:`v4l2_subdev` to the actual low-level bus-specific |
| 22 | device data. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 23 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 24 | You also need a way to go from the low-level struct to :c:type:`v4l2_subdev`. |
| 25 | For the common i2c_client struct the i2c_set_clientdata() call is used to store |
Mauro Carvalho Chehab | adf48e3 | 2019-02-18 14:29:07 -0500 | [diff] [blame] | 26 | a :c:type:`v4l2_subdev` pointer, for other buses you may have to use other |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 27 | methods. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 28 | |
| 29 | Bridges might also need to store per-subdev private data, such as a pointer to |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 30 | bridge-specific per-subdev private data. The :c:type:`v4l2_subdev` structure |
| 31 | provides host private data for that purpose that can be accessed with |
Mauro Carvalho Chehab | 1b81f01 | 2016-08-19 12:00:43 -0300 | [diff] [blame] | 32 | :c:func:`v4l2_get_subdev_hostdata` and :c:func:`v4l2_set_subdev_hostdata`. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 33 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 34 | From the bridge driver perspective, you load the sub-device module and somehow |
| 35 | obtain the :c:type:`v4l2_subdev` pointer. For i2c devices this is easy: you call |
Mauro Carvalho Chehab | adf48e3 | 2019-02-18 14:29:07 -0500 | [diff] [blame] | 36 | ``i2c_get_clientdata()``. For other buses something similar needs to be done. |
Luca Ceresoli | c1ebbe5 | 2020-09-21 22:21:32 +0200 | [diff] [blame] | 37 | Helper functions exist for sub-devices on an I2C bus that do most of this |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 38 | tricky work for you. |
| 39 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 40 | Each :c:type:`v4l2_subdev` contains function pointers that sub-device drivers |
| 41 | can implement (or leave ``NULL`` if it is not applicable). Since sub-devices can |
| 42 | do so many different things and you do not want to end up with a huge ops struct |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 43 | of which only a handful of ops are commonly implemented, the function pointers |
| 44 | are sorted according to category and each category has its own ops struct. |
| 45 | |
| 46 | The top-level ops struct contains pointers to the category ops structs, which |
| 47 | may be NULL if the subdev driver does not support anything from that category. |
| 48 | |
| 49 | It looks like this: |
| 50 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 51 | .. code-block:: c |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 52 | |
| 53 | struct v4l2_subdev_core_ops { |
| 54 | int (*log_status)(struct v4l2_subdev *sd); |
| 55 | int (*init)(struct v4l2_subdev *sd, u32 val); |
| 56 | ... |
| 57 | }; |
| 58 | |
| 59 | struct v4l2_subdev_tuner_ops { |
| 60 | ... |
| 61 | }; |
| 62 | |
| 63 | struct v4l2_subdev_audio_ops { |
| 64 | ... |
| 65 | }; |
| 66 | |
| 67 | struct v4l2_subdev_video_ops { |
| 68 | ... |
| 69 | }; |
| 70 | |
| 71 | struct v4l2_subdev_pad_ops { |
| 72 | ... |
| 73 | }; |
| 74 | |
| 75 | struct v4l2_subdev_ops { |
| 76 | const struct v4l2_subdev_core_ops *core; |
| 77 | const struct v4l2_subdev_tuner_ops *tuner; |
| 78 | const struct v4l2_subdev_audio_ops *audio; |
| 79 | const struct v4l2_subdev_video_ops *video; |
| 80 | const struct v4l2_subdev_pad_ops *video; |
| 81 | }; |
| 82 | |
| 83 | The core ops are common to all subdevs, the other categories are implemented |
| 84 | depending on the sub-device. E.g. a video device is unlikely to support the |
| 85 | audio ops and vice versa. |
| 86 | |
| 87 | This setup limits the number of function pointers while still making it easy |
| 88 | to add new ops and categories. |
| 89 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 90 | A sub-device driver initializes the :c:type:`v4l2_subdev` struct using: |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 91 | |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 92 | :c:func:`v4l2_subdev_init <v4l2_subdev_init>` |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 93 | (:c:type:`sd <v4l2_subdev>`, &\ :c:type:`ops <v4l2_subdev_ops>`). |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 94 | |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 95 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 96 | Afterwards you need to initialize :c:type:`sd <v4l2_subdev>`->name with a |
| 97 | unique name and set the module owner. This is done for you if you use the |
| 98 | i2c helper functions. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 99 | |
| 100 | If integration with the media framework is needed, you must initialize the |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 101 | :c:type:`media_entity` struct embedded in the :c:type:`v4l2_subdev` struct |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 102 | (entity field) by calling :c:func:`media_entity_pads_init`, if the entity has |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 103 | pads: |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 104 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 105 | .. code-block:: c |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 106 | |
| 107 | struct media_pad *pads = &my_sd->pads; |
| 108 | int err; |
| 109 | |
| 110 | err = media_entity_pads_init(&sd->entity, npads, pads); |
| 111 | |
| 112 | The pads array must have been previously initialized. There is no need to |
Mauro Carvalho Chehab | 9303c9d | 2020-09-25 12:01:25 +0200 | [diff] [blame] | 113 | manually set the struct media_entity function and name fields, but the |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 114 | revision field must be initialized if needed. |
| 115 | |
| 116 | A reference to the entity will be automatically acquired/released when the |
| 117 | subdev device node (if any) is opened/closed. |
| 118 | |
| 119 | Don't forget to cleanup the media entity before the sub-device is destroyed: |
| 120 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 121 | .. code-block:: c |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 122 | |
| 123 | media_entity_cleanup(&sd->entity); |
| 124 | |
| 125 | If the subdev driver intends to process video and integrate with the media |
| 126 | framework, it must implement format related functionality using |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 127 | :c:type:`v4l2_subdev_pad_ops` instead of :c:type:`v4l2_subdev_video_ops`. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 128 | |
| 129 | In that case, the subdev driver may set the link_validate field to provide |
| 130 | its own link validation function. The link validation function is called for |
| 131 | every link in the pipeline where both of the ends of the links are V4L2 |
| 132 | sub-devices. The driver is still responsible for validating the correctness |
| 133 | of the format configuration between sub-devices and video nodes. |
| 134 | |
| 135 | If link_validate op is not set, the default function |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 136 | :c:func:`v4l2_subdev_link_validate_default` is used instead. This function |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 137 | ensures that width, height and the media bus pixel code are equal on both source |
| 138 | and sink of the link. Subdev drivers are also free to use this function to |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 139 | perform the checks mentioned above in addition to their own checks. |
| 140 | |
Luca Ceresoli | 976ed67 | 2020-09-21 22:21:33 +0200 | [diff] [blame] | 141 | Subdev registration |
| 142 | ~~~~~~~~~~~~~~~~~~~ |
| 143 | |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 144 | There are currently two ways to register subdevices with the V4L2 core. The |
| 145 | first (traditional) possibility is to have subdevices registered by bridge |
| 146 | drivers. This can be done when the bridge driver has the complete information |
| 147 | about subdevices connected to it and knows exactly when to register them. This |
| 148 | is typically the case for internal subdevices, like video data processing units |
| 149 | within SoCs or complex PCI(e) boards, camera sensors in USB cameras or connected |
| 150 | to SoCs, which pass information about them to bridge drivers, usually in their |
| 151 | platform data. |
| 152 | |
| 153 | There are however also situations where subdevices have to be registered |
| 154 | asynchronously to bridge devices. An example of such a configuration is a Device |
| 155 | Tree based system where information about subdevices is made available to the |
| 156 | system independently from the bridge devices, e.g. when subdevices are defined |
| 157 | in DT as I2C device nodes. The API used in this second case is described further |
| 158 | below. |
| 159 | |
| 160 | Using one or the other registration method only affects the probing process, the |
| 161 | run-time bridge-subdevice interaction is in both cases the same. |
| 162 | |
Luca Ceresoli | 976ed67 | 2020-09-21 22:21:33 +0200 | [diff] [blame] | 163 | In the **synchronous** case a device (bridge) driver needs to register the |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 164 | :c:type:`v4l2_subdev` with the v4l2_device: |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 165 | |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 166 | :c:func:`v4l2_device_register_subdev <v4l2_device_register_subdev>` |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 167 | (:c:type:`v4l2_dev <v4l2_device>`, :c:type:`sd <v4l2_subdev>`). |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 168 | |
| 169 | This can fail if the subdev module disappeared before it could be registered. |
| 170 | After this function was called successfully the subdev->dev field points to |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 171 | the :c:type:`v4l2_device`. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 172 | |
| 173 | If the v4l2_device parent device has a non-NULL mdev field, the sub-device |
| 174 | entity will be automatically registered with the media device. |
| 175 | |
| 176 | You can unregister a sub-device using: |
| 177 | |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 178 | :c:func:`v4l2_device_unregister_subdev <v4l2_device_unregister_subdev>` |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 179 | (:c:type:`sd <v4l2_subdev>`). |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 180 | |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 181 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 182 | Afterwards the subdev module can be unloaded and |
| 183 | :c:type:`sd <v4l2_subdev>`->dev == ``NULL``. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 184 | |
Luca Ceresoli | f6f7d89 | 2020-09-21 22:21:34 +0200 | [diff] [blame] | 185 | In the **asynchronous** case subdevice probing can be invoked independently of |
| 186 | the bridge driver availability. The subdevice driver then has to verify whether |
| 187 | all the requirements for a successful probing are satisfied. This can include a |
| 188 | check for a master clock availability. If any of the conditions aren't satisfied |
| 189 | the driver might decide to return ``-EPROBE_DEFER`` to request further reprobing |
| 190 | attempts. Once all conditions are met the subdevice shall be registered using |
| 191 | the :c:func:`v4l2_async_register_subdev` function. Unregistration is |
| 192 | performed using the :c:func:`v4l2_async_unregister_subdev` call. Subdevices |
| 193 | registered this way are stored in a global list of subdevices, ready to be |
| 194 | picked up by bridge drivers. |
| 195 | |
| 196 | Bridge drivers in turn have to register a notifier object. This is |
| 197 | performed using the :c:func:`v4l2_async_notifier_register` call. To |
| 198 | unregister the notifier the driver has to call |
| 199 | :c:func:`v4l2_async_notifier_unregister`. The former of the two functions |
| 200 | takes two arguments: a pointer to struct :c:type:`v4l2_device` and a |
| 201 | pointer to struct :c:type:`v4l2_async_notifier`. |
| 202 | |
| 203 | Before registering the notifier, bridge drivers must do two things: |
| 204 | first, the notifier must be initialized using the |
| 205 | :c:func:`v4l2_async_notifier_init`. Second, bridge drivers can then |
| 206 | begin to form a list of subdevice descriptors that the bridge device |
| 207 | needs for its operation. Subdevice descriptors are added to the notifier |
| 208 | using the :c:func:`v4l2_async_notifier_add_subdev` call. This function |
| 209 | takes two arguments: a pointer to struct :c:type:`v4l2_async_notifier`, |
| 210 | and a pointer to the subdevice descripter, which is of type struct |
| 211 | :c:type:`v4l2_async_subdev`. |
| 212 | |
| 213 | The V4L2 core will then use these descriptors to match asynchronously |
| 214 | registered subdevices to them. If a match is detected the ``.bound()`` |
| 215 | notifier callback is called. After all subdevices have been located the |
| 216 | .complete() callback is called. When a subdevice is removed from the |
| 217 | system the .unbind() method is called. All three callbacks are optional. |
| 218 | |
| 219 | Calling subdev operations |
| 220 | ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 221 | |
| 222 | The advantage of using :c:type:`v4l2_subdev` is that it is a generic struct and |
| 223 | does not contain any knowledge about the underlying hardware. So a driver might |
| 224 | contain several subdevs that use an I2C bus, but also a subdev that is |
| 225 | controlled through GPIO pins. This distinction is only relevant when setting |
| 226 | up the device, but once the subdev is registered it is completely transparent. |
| 227 | |
| 228 | Once te subdev has been registered you can call an ops function either |
| 229 | directly: |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 230 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 231 | .. code-block:: c |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 232 | |
| 233 | err = sd->ops->core->g_std(sd, &norm); |
| 234 | |
| 235 | but it is better and easier to use this macro: |
| 236 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 237 | .. code-block:: c |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 238 | |
| 239 | err = v4l2_subdev_call(sd, core, g_std, &norm); |
| 240 | |
Luca Ceresoli | 6cab05c | 2020-09-21 22:21:31 +0200 | [diff] [blame] | 241 | The macro will do the right ``NULL`` pointer checks and returns ``-ENODEV`` |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 242 | if :c:type:`sd <v4l2_subdev>` is ``NULL``, ``-ENOIOCTLCMD`` if either |
| 243 | :c:type:`sd <v4l2_subdev>`->core or :c:type:`sd <v4l2_subdev>`->core->g_std is ``NULL``, or the actual result of the |
| 244 | :c:type:`sd <v4l2_subdev>`->ops->core->g_std ops. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 245 | |
| 246 | It is also possible to call all or a subset of the sub-devices: |
| 247 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 248 | .. code-block:: c |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 249 | |
| 250 | v4l2_device_call_all(v4l2_dev, 0, core, g_std, &norm); |
| 251 | |
| 252 | Any subdev that does not support this ops is skipped and error results are |
| 253 | ignored. If you want to check for errors use this: |
| 254 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 255 | .. code-block:: c |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 256 | |
| 257 | err = v4l2_device_call_until_err(v4l2_dev, 0, core, g_std, &norm); |
| 258 | |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 259 | Any error except ``-ENOIOCTLCMD`` will exit the loop with that error. If no |
| 260 | errors (except ``-ENOIOCTLCMD``) occurred, then 0 is returned. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 261 | |
| 262 | The second argument to both calls is a group ID. If 0, then all subdevs are |
| 263 | called. If non-zero, then only those whose group ID match that value will |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 264 | be called. Before a bridge driver registers a subdev it can set |
| 265 | :c:type:`sd <v4l2_subdev>`->grp_id to whatever value it wants (it's 0 by |
| 266 | default). This value is owned by the bridge driver and the sub-device driver |
| 267 | will never modify or use it. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 268 | |
| 269 | The group ID gives the bridge driver more control how callbacks are called. |
| 270 | For example, there may be multiple audio chips on a board, each capable of |
| 271 | changing the volume. But usually only one will actually be used when the |
| 272 | user want to change the volume. You can set the group ID for that subdev to |
| 273 | e.g. AUDIO_CONTROLLER and specify that as the group ID value when calling |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 274 | ``v4l2_device_call_all()``. That ensures that it will only go to the subdev |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 275 | that needs it. |
| 276 | |
| 277 | If the sub-device needs to notify its v4l2_device parent of an event, then |
Mauro Carvalho Chehab | b7fd663 | 2016-07-21 09:09:58 -0300 | [diff] [blame] | 278 | it can call ``v4l2_subdev_notify(sd, notification, arg)``. This macro checks |
| 279 | whether there is a ``notify()`` callback defined and returns ``-ENODEV`` if not. |
| 280 | Otherwise the result of the ``notify()`` call is returned. |
Mauro Carvalho Chehab | 840b14d | 2016-07-20 15:27:04 -0300 | [diff] [blame] | 281 | |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 282 | V4L2 sub-device userspace API |
| 283 | ----------------------------- |
| 284 | |
Jacopo Mondi | 18200e9 | 2020-05-07 17:12:48 +0200 | [diff] [blame] | 285 | Bridge drivers traditionally expose one or multiple video nodes to userspace, |
| 286 | and control subdevices through the :c:type:`v4l2_subdev_ops` operations in |
| 287 | response to video node operations. This hides the complexity of the underlying |
| 288 | hardware from applications. For complex devices, finer-grained control of the |
| 289 | device than what the video nodes offer may be required. In those cases, bridge |
| 290 | drivers that implement :ref:`the media controller API <media_controller>` may |
| 291 | opt for making the subdevice operations directly accessible from userpace. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 292 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 293 | Device nodes named ``v4l-subdev``\ *X* can be created in ``/dev`` to access |
| 294 | sub-devices directly. If a sub-device supports direct userspace configuration |
| 295 | it must set the ``V4L2_SUBDEV_FL_HAS_DEVNODE`` flag before being registered. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 296 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 297 | After registering sub-devices, the :c:type:`v4l2_device` driver can create |
| 298 | device nodes for all registered sub-devices marked with |
| 299 | ``V4L2_SUBDEV_FL_HAS_DEVNODE`` by calling |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 300 | :c:func:`v4l2_device_register_subdev_nodes`. Those device nodes will be |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 301 | automatically removed when sub-devices are unregistered. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 302 | |
| 303 | The device node handles a subset of the V4L2 API. |
| 304 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 305 | ``VIDIOC_QUERYCTRL``, |
| 306 | ``VIDIOC_QUERYMENU``, |
| 307 | ``VIDIOC_G_CTRL``, |
| 308 | ``VIDIOC_S_CTRL``, |
| 309 | ``VIDIOC_G_EXT_CTRLS``, |
| 310 | ``VIDIOC_S_EXT_CTRLS`` and |
| 311 | ``VIDIOC_TRY_EXT_CTRLS``: |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 312 | |
| 313 | The controls ioctls are identical to the ones defined in V4L2. They |
| 314 | behave identically, with the only exception that they deal only with |
| 315 | controls implemented in the sub-device. Depending on the driver, those |
| 316 | controls can be also be accessed through one (or several) V4L2 device |
| 317 | nodes. |
| 318 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 319 | ``VIDIOC_DQEVENT``, |
| 320 | ``VIDIOC_SUBSCRIBE_EVENT`` and |
| 321 | ``VIDIOC_UNSUBSCRIBE_EVENT`` |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 322 | |
| 323 | The events ioctls are identical to the ones defined in V4L2. They |
| 324 | behave identically, with the only exception that they deal only with |
| 325 | events generated by the sub-device. Depending on the driver, those |
| 326 | events can also be reported by one (or several) V4L2 device nodes. |
| 327 | |
| 328 | Sub-device drivers that want to use events need to set the |
Michael Rodin | 5be5f41 | 2020-05-27 18:21:32 +0200 | [diff] [blame] | 329 | ``V4L2_SUBDEV_FL_HAS_EVENTS`` :c:type:`v4l2_subdev`.flags before registering |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 330 | the sub-device. After registration events can be queued as usual on the |
| 331 | :c:type:`v4l2_subdev`.devnode device node. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 332 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 333 | To properly support events, the ``poll()`` file operation is also |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 334 | implemented. |
| 335 | |
| 336 | Private ioctls |
| 337 | |
| 338 | All ioctls not in the above list are passed directly to the sub-device |
| 339 | driver through the core::ioctl operation. |
| 340 | |
Jacopo Mondi | 3fb0ee8 | 2020-05-07 17:12:49 +0200 | [diff] [blame] | 341 | Read-only sub-device userspace API |
| 342 | ---------------------------------- |
| 343 | |
| 344 | Bridge drivers that control their connected subdevices through direct calls to |
| 345 | the kernel API realized by :c:type:`v4l2_subdev_ops` structure do not usually |
| 346 | want userspace to be able to change the same parameters through the subdevice |
| 347 | device node and thus do not usually register any. |
| 348 | |
| 349 | It is sometimes useful to report to userspace the current subdevice |
| 350 | configuration through a read-only API, that does not permit applications to |
| 351 | change to the device parameters but allows interfacing to the subdevice device |
| 352 | node to inspect them. |
| 353 | |
| 354 | For instance, to implement cameras based on computational photography, userspace |
| 355 | needs to know the detailed camera sensor configuration (in terms of skipping, |
| 356 | binning, cropping and scaling) for each supported output resolution. To support |
| 357 | such use cases, bridge drivers may expose the subdevice operations to userspace |
| 358 | through a read-only API. |
| 359 | |
| 360 | To create a read-only device node for all the subdevices registered with the |
| 361 | ``V4L2_SUBDEV_FL_HAS_DEVNODE`` set, the :c:type:`v4l2_device` driver should call |
| 362 | :c:func:`v4l2_device_register_ro_subdev_nodes`. |
| 363 | |
| 364 | Access to the following ioctls for userspace applications is restricted on |
| 365 | sub-device device nodes registered with |
| 366 | :c:func:`v4l2_device_register_ro_subdev_nodes`. |
| 367 | |
| 368 | ``VIDIOC_SUBDEV_S_FMT``, |
| 369 | ``VIDIOC_SUBDEV_S_CROP``, |
| 370 | ``VIDIOC_SUBDEV_S_SELECTION``: |
| 371 | |
| 372 | These ioctls are only allowed on a read-only subdevice device node |
| 373 | for the :ref:`V4L2_SUBDEV_FORMAT_TRY <v4l2-subdev-format-whence>` |
| 374 | formats and selection rectangles. |
| 375 | |
| 376 | ``VIDIOC_SUBDEV_S_FRAME_INTERVAL``, |
| 377 | ``VIDIOC_SUBDEV_S_DV_TIMINGS``, |
| 378 | ``VIDIOC_SUBDEV_S_STD``: |
| 379 | |
| 380 | These ioctls are not allowed on a read-only subdevice node. |
| 381 | |
| 382 | In case the ioctl is not allowed, or the format to modify is set to |
| 383 | ``V4L2_SUBDEV_FORMAT_ACTIVE``, the core returns a negative error code and |
| 384 | the errno variable is set to ``-EPERM``. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 385 | |
| 386 | I2C sub-device drivers |
| 387 | ---------------------- |
| 388 | |
| 389 | Since these drivers are so common, special helper functions are available to |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 390 | ease the use of these drivers (``v4l2-common.h``). |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 391 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 392 | The recommended method of adding :c:type:`v4l2_subdev` support to an I2C driver |
| 393 | is to embed the :c:type:`v4l2_subdev` struct into the state struct that is |
| 394 | created for each I2C device instance. Very simple devices have no state |
| 395 | struct and in that case you can just create a :c:type:`v4l2_subdev` directly. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 396 | |
| 397 | A typical state struct would look like this (where 'chipname' is replaced by |
| 398 | the name of the chip): |
| 399 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 400 | .. code-block:: c |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 401 | |
| 402 | struct chipname_state { |
| 403 | struct v4l2_subdev sd; |
| 404 | ... /* additional state fields */ |
| 405 | }; |
| 406 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 407 | Initialize the :c:type:`v4l2_subdev` struct as follows: |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 408 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 409 | .. code-block:: c |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 410 | |
| 411 | v4l2_i2c_subdev_init(&state->sd, client, subdev_ops); |
| 412 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 413 | This function will fill in all the fields of :c:type:`v4l2_subdev` ensure that |
| 414 | the :c:type:`v4l2_subdev` and i2c_client both point to one another. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 415 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 416 | You should also add a helper inline function to go from a :c:type:`v4l2_subdev` |
| 417 | pointer to a chipname_state struct: |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 418 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 419 | .. code-block:: c |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 420 | |
| 421 | static inline struct chipname_state *to_state(struct v4l2_subdev *sd) |
| 422 | { |
| 423 | return container_of(sd, struct chipname_state, sd); |
| 424 | } |
| 425 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 426 | Use this to go from the :c:type:`v4l2_subdev` struct to the ``i2c_client`` |
| 427 | struct: |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 428 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 429 | .. code-block:: c |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 430 | |
| 431 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
| 432 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 433 | And this to go from an ``i2c_client`` to a :c:type:`v4l2_subdev` struct: |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 434 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 435 | .. code-block:: c |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 436 | |
| 437 | struct v4l2_subdev *sd = i2c_get_clientdata(client); |
| 438 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 439 | Make sure to call |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 440 | :c:func:`v4l2_device_unregister_subdev`\ (:c:type:`sd <v4l2_subdev>`) |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 441 | when the ``remove()`` callback is called. This will unregister the sub-device |
| 442 | from the bridge driver. It is safe to call this even if the sub-device was |
| 443 | never registered. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 444 | |
| 445 | You need to do this because when the bridge driver destroys the i2c adapter |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 446 | the ``remove()`` callbacks are called of the i2c devices on that adapter. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 447 | After that the corresponding v4l2_subdev structures are invalid, so they |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 448 | have to be unregistered first. Calling |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 449 | :c:func:`v4l2_device_unregister_subdev`\ (:c:type:`sd <v4l2_subdev>`) |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 450 | from the ``remove()`` callback ensures that this is always done correctly. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 451 | |
| 452 | |
| 453 | The bridge driver also has some helper functions it can use: |
| 454 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 455 | .. code-block:: c |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 456 | |
| 457 | struct v4l2_subdev *sd = v4l2_i2c_new_subdev(v4l2_dev, adapter, |
| 458 | "module_foo", "chipid", 0x36, NULL); |
| 459 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 460 | This loads the given module (can be ``NULL`` if no module needs to be loaded) |
Wolfram Sang | bc5a3e4 | 2020-06-15 09:58:14 +0200 | [diff] [blame] | 461 | and calls :c:func:`i2c_new_client_device` with the given ``i2c_adapter`` and |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 462 | chip/address arguments. If all goes well, then it registers the subdev with |
| 463 | the v4l2_device. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 464 | |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 465 | You can also use the last argument of :c:func:`v4l2_i2c_new_subdev` to pass |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 466 | an array of possible I2C addresses that it should probe. These probe addresses |
| 467 | are only used if the previous argument is 0. A non-zero argument means that you |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 468 | know the exact i2c address so in that case no probing will take place. |
| 469 | |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 470 | Both functions return ``NULL`` if something went wrong. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 471 | |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 472 | Note that the chipid you pass to :c:func:`v4l2_i2c_new_subdev` is usually |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 473 | the same as the module name. It allows you to specify a chip variant, e.g. |
| 474 | "saa7114" or "saa7115". In general though the i2c driver autodetects this. |
| 475 | The use of chipid is something that needs to be looked at more closely at a |
| 476 | later date. It differs between i2c drivers and as such can be confusing. |
| 477 | To see which chip variants are supported you can look in the i2c driver code |
| 478 | for the i2c_device_id table. This lists all the possibilities. |
| 479 | |
Mauro Carvalho Chehab | a8e58f2 | 2016-08-30 21:01:57 -0300 | [diff] [blame] | 480 | There are one more helper function: |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 481 | |
Mauro Carvalho Chehab | 7b998ba | 2016-07-23 07:21:06 -0300 | [diff] [blame] | 482 | :c:func:`v4l2_i2c_new_subdev_board` uses an :c:type:`i2c_board_info` struct |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 483 | which is passed to the i2c driver and replaces the irq, platform_data and addr |
| 484 | arguments. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 485 | |
| 486 | If the subdev supports the s_config core ops, then that op is called with |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 487 | the irq and platform_data arguments after the subdev was setup. |
Mauro Carvalho Chehab | 2873f4d | 2016-07-21 09:27:37 -0300 | [diff] [blame] | 488 | |
Mauro Carvalho Chehab | a8e58f2 | 2016-08-30 21:01:57 -0300 | [diff] [blame] | 489 | The :c:func:`v4l2_i2c_new_subdev` function will call |
| 490 | :c:func:`v4l2_i2c_new_subdev_board`, internally filling a |
| 491 | :c:type:`i2c_board_info` structure using the ``client_type`` and the |
| 492 | ``addr`` to fill it. |
Mauro Carvalho Chehab | 55aeed7 | 2016-07-21 09:49:32 -0300 | [diff] [blame] | 493 | |
| 494 | V4L2 sub-device functions and data structures |
| 495 | --------------------------------------------- |
| 496 | |
Mauro Carvalho Chehab | 5875987 | 2016-07-20 14:14:37 -0300 | [diff] [blame] | 497 | .. kernel-doc:: include/media/v4l2-subdev.h |