sun6i_csi_link_entity() 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: 5cc7522d89655 ("media: sun6i: Add support for Allwinner CSI V3s")

Signed-off-by: Steve Longerbeam <slongerb...@gmail.com>
---
 .../platform/sunxi/sun6i-csi/sun6i_csi.c      | 36 +++----------------
 1 file changed, 5 insertions(+), 31 deletions(-)

diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c 
b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
index 6e0e894154f4..9cf726b5c25a 100644
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
@@ -630,37 +630,11 @@ static int sun6i_csi_link_entity(struct sun6i_csi *csi,
                                 struct media_entity *entity,
                                 struct fwnode_handle *fwnode)
 {
-       struct media_entity *sink;
-       struct media_pad *sink_pad;
-       int src_pad_index;
-       int ret;
-
-       ret = media_entity_get_fwnode_pad(entity, fwnode, MEDIA_PAD_FL_SOURCE);
-       if (ret < 0) {
-               dev_err(csi->dev, "%s: no source pad in external entity %s\n",
-                       __func__, entity->name);
-               return -EINVAL;
-       }
-
-       src_pad_index = ret;
-
-       sink = &csi->video.vdev.entity;
-       sink_pad = &csi->video.pad;
-
-       dev_dbg(csi->dev, "creating %s:%u -> %s:%u link\n",
-               entity->name, src_pad_index, sink->name, sink_pad->index);
-       ret = media_create_pad_link(entity, src_pad_index, sink,
-                                   sink_pad->index,
-                                   MEDIA_LNK_FL_ENABLED |
-                                   MEDIA_LNK_FL_IMMUTABLE);
-       if (ret < 0) {
-               dev_err(csi->dev, "failed to create %s:%u -> %s:%u link\n",
-                       entity->name, src_pad_index,
-                       sink->name, sink_pad->index);
-               return ret;
-       }
-
-       return 0;
+       return media_create_fwnode_pad_links(&csi->video.pad,
+                                            dev_fwnode(csi->dev),
+                                            entity, fwnode,
+                                            MEDIA_LNK_FL_ENABLED |
+                                            MEDIA_LNK_FL_IMMUTABLE);
 }
 
 static int sun6i_subdev_notify_complete(struct v4l2_async_notifier *notifier)
-- 
2.17.1

Reply via email to