Commit f17bc788 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Sakari Ailus
Browse files

media: media-entity: Add media_pad_is_streaming() helper function



Add a function to test if a pad is part of a pipeline currently
streaming, and use it through drivers to replace direct access to the
stream_count field. This will help reworking pipeline start/stop without
disturbing drivers.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
parent 472377fe
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -834,7 +834,8 @@ int __media_entity_setup_link(struct media_link *link, u32 flags)
	sink = link->sink->entity;

	if (!(link->flags & MEDIA_LNK_FL_DYNAMIC) &&
	    (source->stream_count || sink->stream_count))
	    (media_entity_is_streaming(source) ||
	     media_entity_is_streaming(sink)))
		return -EBUSY;

	mdev = source->graph_obj.mdev;
+4 −1
Original line number Diff line number Diff line
@@ -10,7 +10,10 @@
#include <media/drv-intf/exynos-fimc.h>
#include "common.h"

/* Called with the media graph mutex held or entity->stream_count > 0. */
/*
 * Called with the media graph mutex held or media_entity_is_streaming(entity)
 * true.
 */
struct v4l2_subdev *fimc_find_remote_sensor(struct media_entity *entity)
{
	struct media_pad *pad = &entity->pads[0];
+1 −1
Original line number Diff line number Diff line
@@ -226,7 +226,7 @@ static int fimc_isp_subdev_set_fmt(struct v4l2_subdev *sd,
			}
		}
	} else {
		if (sd->entity.stream_count == 0) {
		if (!media_entity_is_streaming(&sd->entity)) {
			if (fmt->pad == FIMC_ISP_SD_PAD_SINK) {
				struct v4l2_subdev_format format = *fmt;

+3 −3
Original line number Diff line number Diff line
@@ -1073,7 +1073,7 @@ static int fimc_lite_subdev_set_fmt(struct v4l2_subdev *sd,
	mutex_lock(&fimc->lock);

	if ((atomic_read(&fimc->out_path) == FIMC_IO_ISP &&
	    sd->entity.stream_count > 0) ||
	    media_entity_is_streaming(&sd->entity)) ||
	    (atomic_read(&fimc->out_path) == FIMC_IO_DMA &&
	    vb2_is_busy(&fimc->vb_queue))) {
		mutex_unlock(&fimc->lock);
@@ -1197,8 +1197,8 @@ static int fimc_lite_subdev_s_stream(struct v4l2_subdev *sd, int on)
	 * Find sensor subdev linked to FIMC-LITE directly or through
	 * MIPI-CSIS. This is required for configuration where FIMC-LITE
	 * is used as a subdev only and feeds data internally to FIMC-IS.
	 * The pipeline links are protected through entity.stream_count
	 * so there is no need to take the media graph mutex here.
	 * The pipeline links are protected through entity.pipe so there is no
	 * need to take the media graph mutex here.
	 */
	fimc->sensor = fimc_find_remote_sensor(&sd->entity);

+1 −1
Original line number Diff line number Diff line
@@ -816,7 +816,7 @@ static int rvin_csi2_link_notify(struct media_link *link, u32 flags,
	 * running streams.
	 */
	media_device_for_each_entity(entity, &group->mdev)
		if (entity->stream_count)
		if (media_entity_is_streaming(entity))
			return -EBUSY;

	mutex_lock(&group->lock);
Loading