On Thu Nov 27 09:11:57 2025 +0200, Sakari Ailus wrote:
> Collect the IPU streams to the CSI-2 receiver sub-device's context.
> 
> The background is that an IPU stream is bound to a CSI-2 virtual channel
> but in a V4L2 pipeline there's no such assumption. Therefore a pipeline
> may contain multiple virtual channels and so multiple IPU streams, too.
> 
> Signed-off-by: Sakari Ailus <[email protected]>
> Reviewed-by: Antti Laakso <[email protected]>

Patch committed.

Thanks,
Sakari Ailus

 drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c  | 6 ++++++
 drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h  | 1 +
 drivers/media/pci/intel/ipu6/ipu6-isys-video.h | 1 +
 3 files changed, 8 insertions(+)

---

diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c 
b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index 0fd4171b50ac..f92577054d89 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -457,6 +457,8 @@ static int ipu6_isys_csi2_enable_streams(struct v4l2_subdev 
*sd,
                return ret;
        }
 
+       list_add(&av->csi2_entry, &csi2->av_head);
+
        ret = ipu6_isys_start_stream_firmware(av, &bl);
        if (ret) {
                dev_err(sd->dev, "start stream of firmware failed\n");
@@ -493,6 +495,7 @@ err_stop_stream_firmware:
        ipu6_isys_close_streaming_firmware(av);
 
 err_return_buffers:
+       list_del(&av->csi2_entry);
        ipu6_isys_buffer_list_queue(&bl, IPU6_ISYS_BUFFER_LIST_FL_INCOMING, 0);
 
        return ret;
@@ -530,6 +533,8 @@ static int ipu6_isys_csi2_disable_streams(struct 
v4l2_subdev *sd,
 
        ipu6_isys_close_streaming_firmware(av);
 
+       list_del(&av->csi2_entry);
+
        return 0;
 }
 
@@ -675,6 +680,7 @@ int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2,
        if (ret)
                goto fail;
 
+       INIT_LIST_HEAD(&csi2->av_head);
        csi2->asd.source = IPU6_FW_ISYS_STREAM_SRC_CSI2_PORT0 + index;
        csi2->asd.supported_codes = csi2_supported_codes;
        snprintf(csi2->asd.sd.name, sizeof(csi2->asd.sd.name),
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h 
b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
index dbaaf00af623..7c936154691e 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
@@ -41,6 +41,7 @@ struct ipu6_isys_csi2 {
        struct ipu6_isys_subdev asd;
        struct ipu6_isys *isys;
        struct ipu6_isys_video av[NR_OF_CSI2_SRC_PADS];
+       struct list_head av_head;
 
        void __iomem *base;
        u32 receiver_errors;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.h 
b/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
index 4c890c6af8f5..cb4b45f0dae2 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
@@ -78,6 +78,7 @@ struct video_stream_watermark {
 
 struct ipu6_isys_video {
        struct ipu6_isys_queue aq;
+       struct list_head csi2_entry;
        /* Serialise access to other fields in the struct. */
        struct mutex mutex;
        struct media_pad pad;
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to