Commit bd5a03bc authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Hans Verkuil
Browse files

media: Accept non-subdev sinks in v4l2_create_fwnode_links_to_pad()



The v4l2_create_fwnode_links_to_pad() helper requires the sink pad
passed to it to belong to a subdev. This requirement can be lifted
easily. Make the function usable for non-subdev sinks, which allows
using it with video_device sinks.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent 68a9ca45
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -313,14 +313,11 @@ int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd,
				    struct media_pad *sink, u32 flags)
{
	struct fwnode_handle *endpoint;
	struct v4l2_subdev *sink_sd;

	if (!(sink->flags & MEDIA_PAD_FL_SINK) ||
	    !is_media_entity_v4l2_subdev(sink->entity))
		return -EINVAL;

	sink_sd = media_entity_to_v4l2_subdev(sink->entity);

	fwnode_graph_for_each_endpoint(dev_fwnode(src_sd->dev), endpoint) {
		struct fwnode_handle *remote_ep;
		int src_idx, sink_idx, ret;
@@ -340,7 +337,7 @@ int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd,
		 * ask the sink to verify it owns the remote endpoint,
		 * and translate to a sink pad.
		 */
		sink_idx = media_entity_get_fwnode_pad(&sink_sd->entity,
		sink_idx = media_entity_get_fwnode_pad(sink->entity,
						       remote_ep,
						       MEDIA_PAD_FL_SINK);
		fwnode_handle_put(remote_ep);
@@ -362,17 +359,17 @@ int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd,
		if (media_entity_find_link(src, sink))
			continue;

		dev_dbg(sink_sd->dev, "creating link %s:%d -> %s:%d\n",
		dev_dbg(src_sd->dev, "creating link %s:%d -> %s:%d\n",
			src_sd->entity.name, src_idx,
			sink_sd->entity.name, sink_idx);
			sink->entity->name, sink_idx);

		ret = media_create_pad_link(&src_sd->entity, src_idx,
					    &sink_sd->entity, sink_idx, flags);
					    sink->entity, sink_idx, flags);
		if (ret) {
			dev_err(sink_sd->dev,
			dev_err(src_sd->dev,
				"link %s:%d -> %s:%d failed with %d\n",
				src_sd->entity.name, src_idx,
				sink_sd->entity.name, sink_idx, ret);
				sink->entity->name, sink_idx, ret);

			fwnode_handle_put(endpoint);
			return ret;
+4 −4
Original line number Diff line number Diff line
@@ -87,17 +87,17 @@ int v4l_vb2q_enable_media_source(struct vb2_queue *q);

/**
 * v4l2_create_fwnode_links_to_pad - Create fwnode-based links from a
 *                                   source subdev to a sink subdev pad.
 *                                   source subdev to a sink pad.
 *
 * @src_sd: pointer to a source subdev
 * @sink:  pointer to a subdev sink pad
 * @sink:  pointer to a sink pad
 * @flags: the link flags
 *
 * This function searches for fwnode endpoint connections from a source
 * subdevice to a single sink pad, and if suitable connections are found,
 * translates them into media links to that pad. The function can be
 * called by the sink subdevice, in its v4l2-async notifier subdev bound
 * callback, to create links from a bound source subdevice.
 * called by the sink, in its v4l2-async notifier bound callback, to create
 * links from a bound source subdevice.
 *
 * The @flags argument specifies the link flags. The caller shall ensure that
 * the flags are valid regardless of the number of links that may be created.