Commit d10ac51e authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

media: mc: entity: Add pad iterator for media_pipeline



Add a media_pipeline_for_each_pad() macro to iterate over pads in a
pipeline. This should be used by driver as a replacement of the
media_graph_walk API, as iterating over the media_pipeline uses the
cached list of pads and is thus more efficient.

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 avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent d7ff6913
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -945,6 +945,24 @@ __must_check int media_pipeline_alloc_start(struct media_pad *pad)
}
EXPORT_SYMBOL_GPL(media_pipeline_alloc_start);

struct media_pad *
__media_pipeline_pad_iter_next(struct media_pipeline *pipe,
			       struct media_pipeline_pad_iter *iter,
			       struct media_pad *pad)
{
	if (!pad)
		iter->cursor = pipe->pads.next;

	if (iter->cursor == &pipe->pads)
		return NULL;

	pad = list_entry(iter->cursor, struct media_pipeline_pad, list)->pad;
	iter->cursor = iter->cursor->next;

	return pad;
}
EXPORT_SYMBOL_GPL(__media_pipeline_pad_iter_next);

/* -----------------------------------------------------------------------------
 * Links management
 */
+29 −0
Original line number Diff line number Diff line
@@ -130,6 +130,15 @@ struct media_pipeline_pad {
	struct media_pad *pad;
};

/**
 * struct media_pipeline_pad_iter - Iterator for media_pipeline_for_each_pad
 *
 * @cursor: The current element
 */
struct media_pipeline_pad_iter {
	struct list_head *cursor;
};

/**
 * struct media_link - A link object part of a media graph.
 *
@@ -1165,6 +1174,26 @@ void media_pipeline_stop(struct media_pad *pad);
 */
void __media_pipeline_stop(struct media_pad *pad);

struct media_pad *
__media_pipeline_pad_iter_next(struct media_pipeline *pipe,
			       struct media_pipeline_pad_iter *iter,
			       struct media_pad *pad);

/**
 * media_pipeline_for_each_pad - Iterate on all pads in a media pipeline
 * @pipe: The pipeline
 * @iter: The iterator (struct media_pipeline_pad_iter)
 * @pad: The iterator pad
 *
 * Iterate on all pads in a media pipeline. This is only valid after the
 * pipeline has been built with media_pipeline_start() and before it gets
 * destroyed with media_pipeline_stop().
 */
#define media_pipeline_for_each_pad(pipe, iter, pad)			\
	for (pad = __media_pipeline_pad_iter_next((pipe), iter, NULL);	\
	     pad != NULL;						\
	     pad = __media_pipeline_pad_iter_next((pipe), iter, pad))

/**
 * media_pipeline_alloc_start - Mark a pipeline as streaming
 * @pad: Starting pad