@@ -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;
@@ -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;
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(-)