Hi Steve, On Sun, Apr 19, 2020 at 05:39:10PM -0700, Steve Longerbeam wrote: > Add a convenience function that can be used as the .get_fwnode_pad > operation for subdevices that map port numbers and pad indexes 1:1. > The function verifies the endpoint is owned by the subdevice, and if > so returns the endpoint port number. > > Signed-off-by: Steve Longerbeam <slongerbeam@xxxxxxxxx> > --- > drivers/media/v4l2-core/v4l2-subdev.c | 25 +++++++++++++++++++++++++ > include/media/v4l2-subdev.h | 17 +++++++++++++++++ > 2 files changed, 42 insertions(+) > > diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c > index a376b351135f..d5b5cd7a6049 100644 > --- a/drivers/media/v4l2-core/v4l2-subdev.c > +++ b/drivers/media/v4l2-core/v4l2-subdev.c > @@ -696,6 +696,31 @@ const struct v4l2_file_operations v4l2_subdev_fops = { > }; > > #ifdef CONFIG_MEDIA_CONTROLLER > + > +int v4l2_subdev_get_fwnode_pad_default(struct media_entity *entity, > + struct fwnode_endpoint *endpoint) > +{ > + struct fwnode_handle *ep; > + struct v4l2_subdev *sd; > + > + if (!is_media_entity_v4l2_subdev(entity)) > + return -EINVAL; > + > + sd = media_entity_to_v4l2_subdev(entity); > + > + fwnode_graph_for_each_endpoint(dev_fwnode(sd->dev), ep) { > + if (ep != endpoint->local_fwnode) > + continue; If the purpose is just to check a given endpoint belongs to a device, could it be done in a more simple way? E.g.: fwnode = fwnode_graph_get_port_parent(endpoint->local_fwnode); fwnode_handle_put(fwnode); if (dev_fwnode(sd->dev) == fwnode) return endpoint->port; return -ENXIO; > + > + fwnode_handle_put(ep); > + > + return endpoint->port; > + } > + > + return -ENXIO; > +} > +EXPORT_SYMBOL_GPL(v4l2_subdev_get_fwnode_pad_default); > + > int v4l2_subdev_link_validate_default(struct v4l2_subdev *sd, > struct media_link *link, > struct v4l2_subdev_format *source_fmt, > diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h > index a4848de59852..940181323427 100644 > --- a/include/media/v4l2-subdev.h > +++ b/include/media/v4l2-subdev.h > @@ -1027,6 +1027,23 @@ static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd) > > #ifdef CONFIG_MEDIA_CONTROLLER > > +/** > + * v4l2_subdev_get_fwnode_pad_default - Get pad number from a subdev fwnode > + * endpoint, assuming 1:1 port:pad > + * > + * @entity - Pointer to the subdev entity > + * @endpoint - Pointer to a parsed fwnode endpoint > + * > + * This function can be used as the .get_fwnode_pad operation for > + * subdevices that map port numbers and pad indexes 1:1. If the endpoint > + * is owned by the subdevice, the function returns the endpoint port > + * number. > + * > + * Returns the endpoint port number on success or a negative error code. > + */ > +int v4l2_subdev_get_fwnode_pad_default(struct media_entity *entity, > + struct fwnode_endpoint *endpoint); > + > /** > * v4l2_subdev_link_validate_default - validates a media link > * -- Kind regards, Sakari Ailus