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@xxxxxxxxx> --- .../platform/sunxi/sun4i-csi/sun4i_csi.c | 27 ++++++++----------- .../platform/sunxi/sun4i-csi/sun4i_csi.h | 1 - 2 files changed, 11 insertions(+), 17 deletions(-) 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; -- 2.17.1