On Thu Mar 5 00:16:10 2026 +0200, Sakari Ailus wrote:
> In general drivers get their firmware graph endpoints from system
> firmware, but on some systems this information is conveyed to drivers via
> software nodes. The software nodes may be instantiated only after the
> drivers are first probed, requiring drivers to explicitly issue
> -EPROBE_DEFER when endpoints aren't found.
> 
> Instead of doing this in all (or at least most) drivers, make v4l2-fwnode
> endpoint parsing functions v4l2_fwnode_endpoint_parse() and
> v4l2_fwnode_endpoint_alloc_parse() return -EPROBE_DEFER when an endpoint
> is NULL.
> 
> Signed-off-by: Sakari Ailus <[email protected]>
> Reviewed-by: Frank Li <[email protected]>
> Reviewed-by: Laurent Pinchart <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/v4l2-core/v4l2-fwnode.c | 9 ++++++++-
 include/media/v4l2-fwnode.h           | 6 ++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

---

diff --git a/drivers/media/v4l2-core/v4l2-fwnode.c 
b/drivers/media/v4l2-core/v4l2-fwnode.c
index 03daa8c4ff7a..77f3298821b5 100644
--- a/drivers/media/v4l2-core/v4l2-fwnode.c
+++ b/drivers/media/v4l2-core/v4l2-fwnode.c
@@ -465,8 +465,15 @@ static int __v4l2_fwnode_endpoint_parse(struct 
fwnode_handle *fwnode,
        enum v4l2_mbus_type mbus_type;
        int rval;
 
+       /*
+        * Return -EPROBE_DEFER if there's no endpoint -- in case the endpoint's
+        * origin is a software node, it may be that the endpoint has not been
+        * instantiated yet, but will be with probing of another driver. This is
+        * the case with the IPU bridge; once we have no such cases left, return
+        * another error such as -EINVAL.
+        */
        if (!fwnode)
-               return -EINVAL;
+               return -EPROBE_DEFER;
 
        pr_debug("===== begin parsing endpoint %pfw\n", fwnode);
 
diff --git a/include/media/v4l2-fwnode.h b/include/media/v4l2-fwnode.h
index cd82e70ccbaa..d7abbd76a421 100644
--- a/include/media/v4l2-fwnode.h
+++ b/include/media/v4l2-fwnode.h
@@ -218,8 +218,9 @@ enum v4l2_fwnode_bus_type {
  *
  * Return: %0 on success or a negative error code on failure:
  *        %-ENOMEM on memory allocation failure
- *        %-EINVAL on parsing failure, including @fwnode == NULL
+ *        %-EINVAL on parsing failure
  *        %-ENXIO on mismatching bus types
+ *        %-EPROBE_DEFER on NULL @fwnode
  */
 int v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode,
                               struct v4l2_fwnode_endpoint *vep);
@@ -276,8 +277,9 @@ void v4l2_fwnode_endpoint_free(struct v4l2_fwnode_endpoint 
*vep);
  *
  * Return: %0 on success or a negative error code on failure:
  *        %-ENOMEM on memory allocation failure
- *        %-EINVAL on parsing failure, including @fwnode == NULL
+ *        %-EINVAL on parsing failure
  *        %-ENXIO on mismatching bus types
+ *        %-EPROBE_DEFER on NULL @fwnode
  */
 int v4l2_fwnode_endpoint_alloc_parse(struct fwnode_handle *fwnode,
                                     struct v4l2_fwnode_endpoint *vep);
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to