diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0771-media-v4l2-async-Create-links-during-v4l2_async_matc.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.15/950-0771-media-v4l2-async-Create-links-during-v4l2_async_matc.patch | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0771-media-v4l2-async-Create-links-during-v4l2_async_matc.patch b/target/linux/bcm27xx/patches-5.15/950-0771-media-v4l2-async-Create-links-during-v4l2_async_matc.patch new file mode 100644 index 0000000000..b18188c2d9 --- /dev/null +++ b/target/linux/bcm27xx/patches-5.15/950-0771-media-v4l2-async-Create-links-during-v4l2_async_matc.patch @@ -0,0 +1,67 @@ +From 3f32e8b803061cf04a1fe31a3070e46fd0d379e8 Mon Sep 17 00:00:00 2001 +From: Daniel Scally <djrscally@gmail.com> +Date: Wed, 2 Mar 2022 22:03:04 +0000 +Subject: [PATCH] media: v4l2-async: Create links during + v4l2_async_match_notify() + +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@gmail.com> +--- + drivers/media/v4l2-core/v4l2-async.c | 31 ++++++++++++++++++++++++++++ + 1 file changed, 31 insertions(+) + +--- a/drivers/media/v4l2-core/v4l2-async.c ++++ b/drivers/media/v4l2-core/v4l2-async.c +@@ -275,6 +275,24 @@ v4l2_async_notifier_try_complete(struct + static int + v4l2_async_notifier_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, +@@ -292,6 +310,19 @@ static int v4l2_async_match_notify(struc + v4l2_device_unregister_subdev(sd); + 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_notifier_call_unbind(notifier, sd, asd); ++ v4l2_device_unregister_subdev(sd); ++ return ret; ++ } + + /* Remove from the waiting list */ + list_del(&asd->list); |