diff mbox series

[v2,12/23] media: sunxi: Fix fwnode media link creation

Message ID 20191124190703.12138-13-slongerbeam@gmail.com (mailing list archive)
State New, archived
Headers show
Series media: imx: Create media links in bound notifiers | expand

Commit Message

Steve Longerbeam Nov. 24, 2019, 7:06 p.m. UTC
sun4i_csi_notify_bound() passes the bound subdev's sd->fwnode to
media_entity_get_fwnode_pad(). This is likely not an endpoint
fwnode as required by media_entity_get_fwnode_pad(), for most
subdevices it is the port parent of endpoint fwnode(s). This has only
worked before because no entities have implemented the .get_fwnode_pad()
op yet, and the default behavior of media_entity_get_fwnode_pad()
was to ignore the passed fwnode and return the first pad that matches
the given direction flags.

Fix this by replacing the calls to media_entity_get_fwnode_pad() and
media_create_pad_link() with a call to media_create_fwnode_pad_links().

Fixes: 577bbf23b758 ("media: sunxi: Add A10 CSI driver")
Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com>
---
 .../platform/sunxi/sun4i-csi/sun4i_csi.c      | 27 ++++++++-----------
 .../platform/sunxi/sun4i-csi/sun4i_csi.h      |  1 -
 2 files changed, 11 insertions(+), 17 deletions(-)
diff mbox series

Patch

diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
index f36dc6258900..0f117d41a19b 100644
--- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
+++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
@@ -38,19 +38,21 @@  static int sun4i_csi_notify_bound(struct v4l2_async_notifier *notifier,
 {
 	struct sun4i_csi *csi = container_of(notifier, struct sun4i_csi,
 					     notifier);
+	struct media_pad *sink = &csi->subdev.entity.pads[CSI_SUBDEV_SINK];
+	int ret;
 
 	csi->src_subdev = subdev;
-	csi->src_pad = media_entity_get_fwnode_pad(&subdev->entity,
-						   subdev->fwnode,
-						   MEDIA_PAD_FL_SOURCE);
-	if (csi->src_pad < 0) {
-		dev_err(csi->dev, "Couldn't find output pad for subdev %s\n",
+
+	ret = media_create_fwnode_pad_links(sink, dev_fwnode(csi->dev),
+					    &subdev->entity,
+					    dev_fwnode(subdev->dev),
+					    MEDIA_LNK_FL_ENABLED |
+					    MEDIA_LNK_FL_IMMUTABLE);
+	if (ret)
+		dev_err(csi->dev, "Couldn't create media links to subdev %s\n",
 			subdev->name);
-		return csi->src_pad;
-	}
 
-	dev_dbg(csi->dev, "Bound %s pad: %d\n", subdev->name, csi->src_pad);
-	return 0;
+	return ret;
 }
 
 static int sun4i_csi_notify_complete(struct v4l2_async_notifier *notifier)
@@ -81,13 +83,6 @@  static int sun4i_csi_notify_complete(struct v4l2_async_notifier *notifier)
 	if (ret)
 		goto err_clean_media;
 
-	ret = media_create_pad_link(&csi->src_subdev->entity, csi->src_pad,
-				    &subdev->entity, CSI_SUBDEV_SINK,
-				    MEDIA_LNK_FL_ENABLED |
-				    MEDIA_LNK_FL_IMMUTABLE);
-	if (ret)
-		goto err_clean_media;
-
 	ret = v4l2_device_register_subdev_nodes(&csi->v4l);
 	if (ret < 0)
 		goto err_clean_media;
diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
index 001c8bde006c..1d403f9cef1a 100644
--- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
+++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.h
@@ -140,7 +140,6 @@  struct sun4i_csi {
 	struct v4l2_async_subdev	asd;
 	struct v4l2_async_notifier	notifier;
 	struct v4l2_subdev		*src_subdev;
-	int				src_pad;
 
 	/* V4L2 variables */
 	struct mutex			lock;