]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: v4l2-async: Add v4l2_async_notifier_add_fwnode_remote_subdev
authorSakari Ailus <sakari.ailus@linux.intel.com>
Thu, 28 Feb 2019 13:25:28 +0000 (08:25 -0500)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Thu, 25 Jul 2019 12:03:03 +0000 (08:03 -0400)
v4l2_async_notifier_add_fwnode_remote_subdev is a convenience function for
parsing information on V4L2 fwnode subdevs.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/v4l2-core/v4l2-async.c
include/media/v4l2-async.h

index 7d364c545a40986e7388e76d01b3200654e3f59d..dc4f470ea6a7d30caaa01c4cc9a7cb1b2c0544bb 100644 (file)
@@ -606,6 +606,29 @@ v4l2_async_notifier_add_fwnode_subdev(struct v4l2_async_notifier *notifier,
 }
 EXPORT_SYMBOL_GPL(v4l2_async_notifier_add_fwnode_subdev);
 
+int
+v4l2_async_notifier_add_fwnode_remote_subdev(struct v4l2_async_notifier *notif,
+                                            struct fwnode_handle *endpoint,
+                                            struct v4l2_async_subdev *asd)
+{
+       struct fwnode_handle *remote;
+       int ret;
+
+       remote = fwnode_graph_get_remote_port_parent(endpoint);
+       if (!remote)
+               return -ENOTCONN;
+
+       asd->match_type = V4L2_ASYNC_MATCH_FWNODE;
+       asd->match.fwnode = remote;
+
+       ret = v4l2_async_notifier_add_subdev(notif, asd);
+       if (ret)
+               fwnode_handle_put(remote);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(v4l2_async_notifier_add_fwnode_remote_subdev);
+
 struct v4l2_async_subdev *
 v4l2_async_notifier_add_i2c_subdev(struct v4l2_async_notifier *notifier,
                                   int adapter_id, unsigned short address,
index a95f7fd8969e71aef80609d959d64c2cdf6d041b..8319284c93cb41d047f4bb0b99266457463e52f8 100644 (file)
@@ -181,6 +181,31 @@ v4l2_async_notifier_add_fwnode_subdev(struct v4l2_async_notifier *notifier,
                                      struct fwnode_handle *fwnode,
                                      unsigned int asd_struct_size);
 
+/**
+ * v4l2_async_notifier_add_fwnode_remote_subdev - Allocate and add a fwnode
+ *                                               remote async subdev to the
+ *                                               notifier's master asd_list.
+ *
+ * @notif: pointer to &struct v4l2_async_notifier
+ * @endpoint: local endpoint pointing to the remote sub-device to be matched
+ * @asd: Async sub-device struct allocated by the caller. The &struct
+ *      v4l2_async_subdev shall be the first member of the driver's async
+ *      sub-device struct, i.e. both begin at the same memory address.
+ *
+ * Gets the remote endpoint of a given local endpoint, set it up for fwnode
+ * matching and adds the async sub-device to the notifier's @asd_list. The
+ * function also gets a reference of the fwnode which is released later at
+ * notifier cleanup time.
+ *
+ * This is just like @v4l2_async_notifier_add_fwnode_subdev, but with the
+ * exception that the fwnode refers to a local endpoint, not the remote one, and
+ * the function relies on the caller to allocate the async sub-device struct.
+ */
+int
+v4l2_async_notifier_add_fwnode_remote_subdev(struct v4l2_async_notifier *notif,
+                                            struct fwnode_handle *endpoint,
+                                            struct v4l2_async_subdev *asd);
+
 /**
  * v4l2_async_notifier_add_i2c_subdev - Allocate and add an i2c async
  *                             subdev to the notifier's master asd_list.