media: media-entity: Add media_pad_is_streaming() helper function
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 13 Jan 2022 15:00:41 +0000 (17:00 +0200)
committerSakari Ailus <sakari.ailus@linux.intel.com>
Thu, 3 Mar 2022 22:27:06 +0000 (00:27 +0200)
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: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
drivers/media/mc/mc-entity.c
drivers/media/platform/exynos4-is/common.c
drivers/media/platform/exynos4-is/fimc-isp.c
drivers/media/platform/exynos4-is/fimc-lite.c
drivers/media/platform/rcar-vin/rcar-core.c
include/media/media-entity.h

index b411f97..f83e043 100644 (file)
@@ -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;
index 944b224..023f624 100644 (file)
 #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];
index 855235b..b85986e 100644 (file)
@@ -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;
 
index 9b7cc95..2e8f476 100644 (file)
@@ -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);
 
index 0186ae2..5117a7a 100644 (file)
@@ -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);
index fea489f..8546f13 100644 (file)
@@ -859,6 +859,18 @@ struct media_link *media_entity_find_link(struct media_pad *source,
 struct media_pad *media_entity_remote_pad(const struct media_pad *pad);
 
 /**
+ * media_entity_is_streaming - Test if an entity is part of a streaming pipeline
+ * @entity: The entity
+ *
+ * Return: True if the entity is part of a pipeline started with the
+ * media_pipeline_start() function, false otherwise.
+ */
+static inline bool media_entity_is_streaming(const struct media_entity *entity)
+{
+       return entity->stream_count > 0;
+}
+
+/**
  * media_entity_get_fwnode_pad - Get pad number from fwnode
  *
  * @entity: The entity