[PATCH 1/3] media: imx-csi: move media_pipeline to video device
Michael Tretter
m.tretter at pengutronix.de
Fri Nov 7 02:16:33 PST 2025
The imx-media driver has a single imx_media_device. Attaching the
media_pipeline to the imx_media_device prevents the execution of
multiple media pipelines on the device. This should be possible as long
as the media_pipelines don't use the same pads or pads that be
configured while the other media pipeline is streaming.
Move the media_pipeline to the imx_media_video_dev to be able to
construct media pipelines per imx capture device.
If different media pipelines in the media device conflict, the
validation will fail. Thus, the pipeline will fail to start and signal
an error to user space.
Signed-off-by: Michael Tretter <m.tretter at pengutronix.de>
---
drivers/staging/media/imx/imx-media-capture.c | 8 ++++----
drivers/staging/media/imx/imx-media-utils.c | 3 ++-
drivers/staging/media/imx/imx-media.h | 7 ++++---
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c
index e9cef7af000a..bfd71d25facc 100644
--- a/drivers/staging/media/imx/imx-media-capture.c
+++ b/drivers/staging/media/imx/imx-media-capture.c
@@ -722,8 +722,8 @@ static int capture_start_streaming(struct vb2_queue *vq, unsigned int count)
goto return_bufs;
}
- ret = imx_media_pipeline_set_stream(priv->md, &priv->src_sd->entity,
- true);
+ ret = imx_media_pipeline_set_stream(priv->md, &priv->vdev,
+ &priv->src_sd->entity, true);
if (ret) {
dev_err(priv->dev, "pipeline start failed with %d\n", ret);
goto return_bufs;
@@ -749,8 +749,8 @@ static void capture_stop_streaming(struct vb2_queue *vq)
unsigned long flags;
int ret;
- ret = imx_media_pipeline_set_stream(priv->md, &priv->src_sd->entity,
- false);
+ ret = imx_media_pipeline_set_stream(priv->md, &priv->vdev,
+ &priv->src_sd->entity, false);
if (ret)
dev_warn(priv->dev, "pipeline stop failed with %d\n", ret);
diff --git a/drivers/staging/media/imx/imx-media-utils.c b/drivers/staging/media/imx/imx-media-utils.c
index 1b5af8945e6b..f520529a7cfe 100644
--- a/drivers/staging/media/imx/imx-media-utils.c
+++ b/drivers/staging/media/imx/imx-media-utils.c
@@ -749,6 +749,7 @@ EXPORT_SYMBOL_GPL(imx_media_pipeline_subdev);
* Turn current pipeline streaming on/off starting from entity.
*/
int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd,
+ struct imx_media_video_dev *vdev,
struct media_entity *entity,
bool on)
{
@@ -762,7 +763,7 @@ int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd,
mutex_lock(&imxmd->md.graph_mutex);
if (on) {
- ret = __media_pipeline_start(entity->pads, &imxmd->pipe);
+ ret = __media_pipeline_start(entity->pads, &vdev->pipe);
if (ret)
goto out;
ret = v4l2_subdev_call(sd, video, s_stream, 1);
diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h
index f095d9134fee..8b65f79b125f 100644
--- a/drivers/staging/media/imx/imx-media.h
+++ b/drivers/staging/media/imx/imx-media.h
@@ -104,6 +104,9 @@ struct imx_media_buffer {
struct imx_media_video_dev {
struct video_device *vfd;
+ /* the pipeline object */
+ struct media_pipeline pipe;
+
/* the user format */
struct v4l2_pix_format fmt;
/* the compose rectangle */
@@ -145,9 +148,6 @@ struct imx_media_dev {
struct media_device md;
struct v4l2_device v4l2_dev;
- /* the pipeline object */
- struct media_pipeline pipe;
-
struct mutex mutex; /* protect elements below */
/* master video device list */
@@ -223,6 +223,7 @@ int imx_media_alloc_dma_buf(struct device *dev,
int size);
int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd,
+ struct imx_media_video_dev *vdev,
struct media_entity *entity,
bool on);
--
2.47.3
More information about the linux-arm-kernel
mailing list