[libcamera-devel] [PATCH v3 5/5] media: v4l2-async: Create links during v4l2_async_match_notify()
Jean-Michel Hautbois
jeanmichel.hautbois at gmail.com
Wed Mar 9 16:46:28 CET 2022
Hi !
Thanks for the patch !
On 02/03/2022 23:03, Daniel Scally wrote:
> Upon an async fwnode match, there's some typical behaviour that the
> notifier and matching subdev will want to do. For example, a notifier
> representing a sensor matching to an async subdev representing its
> VCM will want to create an ancillary link to expose that relationship
> to userspace.
>
> To avoid lots of code in individual drivers, try to build these links
> within v4l2 core.
>
> Signed-off-by: Daniel Scally <djrscally at gmail.com>
Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
>
> Changes since v2:
>
> - Stopped checking the notifier entity's function when creating the new
> links, and just create them whenever the subdev entity's function is either
> a lens controller or a flash. (Sakari)
>
> Changes since v1:
>
> - Added #ifdef guards for CONFIG_MEDIA_CONTROLLER
> - Some spelling and nomenclature cleanup (Laurent)
>
> Changes since the rfc:
>
> - None
>
> drivers/media/v4l2-core/v4l2-async.c | 31 ++++++++++++++++++++++++++++
> 1 file changed, 31 insertions(+)
>
> diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c
> index 0404267f1ae4..436bd6900fd8 100644
> --- a/drivers/media/v4l2-core/v4l2-async.c
> +++ b/drivers/media/v4l2-core/v4l2-async.c
> @@ -275,6 +275,24 @@ v4l2_async_nf_try_complete(struct v4l2_async_notifier *notifier)
> static int
> v4l2_async_nf_try_all_subdevs(struct v4l2_async_notifier *notifier);
>
> +static int v4l2_async_create_ancillary_links(struct v4l2_async_notifier *n,
> + struct v4l2_subdev *sd)
> +{
> + struct media_link *link = NULL;
> +
> +#if IS_ENABLED(CONFIG_MEDIA_CONTROLLER)
> +
> + if (sd->entity.function != MEDIA_ENT_F_LENS &&
> + sd->entity.function != MEDIA_ENT_F_FLASH)
> + return 0;
> +
> + link = media_create_ancillary_link(&n->sd->entity, &sd->entity);
> +
> +#endif
> +
> + return IS_ERR(link) ? PTR_ERR(link) : 0;
> +}
> +
> static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
> struct v4l2_device *v4l2_dev,
> struct v4l2_subdev *sd,
> @@ -293,6 +311,19 @@ static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
> return ret;
> }
>
> + /*
> + * Depending of the function of the entities involved, we may want to
> + * create links between them (for example between a sensor and its lens
> + * or between a sensor's source pad and the connected device's sink
> + * pad).
> + */
> + ret = v4l2_async_create_ancillary_links(notifier, sd);
> + if (ret) {
> + v4l2_async_nf_call_unbind(notifier, sd, asd);
> + v4l2_device_unregister_subdev(sd);
> + return ret;
> + }
> +
> /* Remove from the waiting list */
> list_del(&asd->list);
> sd->asd = asd;
More information about the libcamera-devel
mailing list