media: Clarify v4l2-async subdevice addition API
Now that most users of v4l2_async_notifier_add_subdev have been converted, let's fix the documentation so it's more clear how the v4l2-async API should be used. Document functions that drivers should use, and their purpose. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Reviewed-by: Helen Koike <helen.koike@collabora.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
b01edcbd40
commit
3e90e5ad94
|
@ -197,15 +197,45 @@ unregister the notifier the driver has to call
|
||||||
takes two arguments: a pointer to struct :c:type:`v4l2_device` and a
|
takes two arguments: a pointer to struct :c:type:`v4l2_device` and a
|
||||||
pointer to struct :c:type:`v4l2_async_notifier`.
|
pointer to struct :c:type:`v4l2_async_notifier`.
|
||||||
|
|
||||||
Before registering the notifier, bridge drivers must do two things:
|
Before registering the notifier, bridge drivers must do two things: first, the
|
||||||
first, the notifier must be initialized using the
|
notifier must be initialized using the :c:func:`v4l2_async_notifier_init`.
|
||||||
:c:func:`v4l2_async_notifier_init`. Second, bridge drivers can then
|
Second, bridge drivers can then begin to form a list of subdevice descriptors
|
||||||
begin to form a list of subdevice descriptors that the bridge device
|
that the bridge device needs for its operation. Several functions are available
|
||||||
needs for its operation. Subdevice descriptors are added to the notifier
|
to add subdevice descriptors to a notifier, depending on the type of device and
|
||||||
using the :c:func:`v4l2_async_notifier_add_subdev` call. This function
|
the needs of the driver.
|
||||||
takes two arguments: a pointer to struct :c:type:`v4l2_async_notifier`,
|
|
||||||
and a pointer to the subdevice descripter, which is of type struct
|
:c:func:`v4l2_async_notifier_add_fwnode_remote_subdev` and
|
||||||
:c:type:`v4l2_async_subdev`.
|
:c:func:`v4l2_async_notifier_add_i2c_subdev` are for bridge and ISP drivers for
|
||||||
|
registering their async sub-devices with the notifier.
|
||||||
|
|
||||||
|
:c:func:`v4l2_async_register_subdev_sensor_common` is a helper function for
|
||||||
|
sensor drivers registering their own async sub-device, but it also registers a
|
||||||
|
notifier and further registers async sub-devices for lens and flash devices
|
||||||
|
found in firmware. The notifier for the sub-device is unregistered with the
|
||||||
|
async sub-device.
|
||||||
|
|
||||||
|
These functions allocate an async sub-device descriptor which is of type struct
|
||||||
|
:c:type:`v4l2_async_subdev` embedded in a driver-specific struct. The &struct
|
||||||
|
:c:type:`v4l2_async_subdev` shall be the first member of this struct:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
struct my_async_subdev {
|
||||||
|
struct v4l2_async_subdev asd;
|
||||||
|
...
|
||||||
|
};
|
||||||
|
|
||||||
|
struct my_async_subdev *my_asd;
|
||||||
|
struct fwnode_handle *ep;
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
my_asd = v4l2_async_notifier_add_fwnode_remote_subdev(¬ifier, ep,
|
||||||
|
struct my_async_subdev);
|
||||||
|
fwnode_handle_put(ep);
|
||||||
|
|
||||||
|
if (IS_ERR(asd))
|
||||||
|
return PTR_ERR(asd);
|
||||||
|
|
||||||
The V4L2 core will then use these descriptors to match asynchronously
|
The V4L2 core will then use these descriptors to match asynchronously
|
||||||
registered subdevices to them. If a match is detected the ``.bound()``
|
registered subdevices to them. If a match is detected the ``.bound()``
|
||||||
|
|
|
@ -128,7 +128,12 @@ void v4l2_async_debug_init(struct dentry *debugfs_dir);
|
||||||
* @notifier: pointer to &struct v4l2_async_notifier
|
* @notifier: pointer to &struct v4l2_async_notifier
|
||||||
*
|
*
|
||||||
* This function initializes the notifier @asd_list. It must be called
|
* This function initializes the notifier @asd_list. It must be called
|
||||||
* before the first call to @v4l2_async_notifier_add_subdev.
|
* before adding a subdevice to a notifier, using one of:
|
||||||
|
* @v4l2_async_notifier_add_fwnode_remote_subdev,
|
||||||
|
* @v4l2_async_notifier_add_fwnode_subdev,
|
||||||
|
* @v4l2_async_notifier_add_i2c_subdev,
|
||||||
|
* @__v4l2_async_notifier_add_subdev or
|
||||||
|
* @v4l2_async_notifier_parse_fwnode_endpoints.
|
||||||
*/
|
*/
|
||||||
void v4l2_async_notifier_init(struct v4l2_async_notifier *notifier);
|
void v4l2_async_notifier_init(struct v4l2_async_notifier *notifier);
|
||||||
|
|
||||||
|
@ -262,9 +267,11 @@ void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier);
|
||||||
* sub-devices allocated for the purposes of the notifier but not the notifier
|
* sub-devices allocated for the purposes of the notifier but not the notifier
|
||||||
* itself. The user is responsible for calling this function to clean up the
|
* itself. The user is responsible for calling this function to clean up the
|
||||||
* notifier after calling
|
* notifier after calling
|
||||||
* @v4l2_async_notifier_add_subdev,
|
* @v4l2_async_notifier_add_fwnode_remote_subdev,
|
||||||
* @v4l2_async_notifier_parse_fwnode_endpoints or
|
* @v4l2_async_notifier_add_fwnode_subdev,
|
||||||
* @v4l2_fwnode_reference_parse_sensor_common.
|
* @v4l2_async_notifier_add_i2c_subdev,
|
||||||
|
* @__v4l2_async_notifier_add_subdev or
|
||||||
|
* @v4l2_async_notifier_parse_fwnode_endpoints.
|
||||||
*
|
*
|
||||||
* There is no harm from calling v4l2_async_notifier_cleanup in other
|
* There is no harm from calling v4l2_async_notifier_cleanup in other
|
||||||
* cases as long as its memory has been zeroed after it has been
|
* cases as long as its memory has been zeroed after it has been
|
||||||
|
|
Loading…
Reference in New Issue