aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0771-media-v4l2-async-Create-links-during-v4l2_async_matc.patch
diff options
context:
space:
mode:
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.patch67
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);