Re: [PATCH v8 10/18] media: cadence: csi2rx: add get_frame_desc wrapper

From: Rishikesh Donadkar

Date: Tue Dec 02 2025 - 04:04:24 EST



On 20/11/25 18:10, Tomi Valkeinen wrote:

On 12/11/2025 13:54, Rishikesh Donadkar wrote:
From: Pratyush Yadav <p.yadav@xxxxxx>

J721E wrapper CSI2RX driver needs to get the frame descriptor from the
source to find out info about virtual channel. This driver itself does
not touch the routing or virtual channels in any way. So simply pass the
descriptor through from the source.


Hi Tomi,

Unfortunately I think that doesn't work.

E.g. we have a fpdllink deser and the cdns csi2rx.

Deser's routing table (pad/stream):

0/0 -> 4/15
0/1 -> 4/33

So we have two streams coming into the deser's pad 0, with stream IDs 0
and 1. They are routed by the user to output pad 4, with stream IDs 15
and 33.

cdns csi2rx routing table:

0/15 -> 1/0
0/33 -> 1/1

So cdns csi2rx routes the streams through, as stream IDs 0 and 1 on the
output side.

With this patch, if the j2 csi2rx asks frame desc from cdns csi2rx, it
gets a frame desc with two streams, stream IDs 15 and 33.


Thank you for pointing out, I will change the body of get_frame_desc() in this subdev driver set the stream field of the fd to the sink_stream of the corresponding route.


Rishikesh


I made this series for the issue above, but it hasn't been merged:

https://lore.kernel.org/all/20250324-frame-desc-passthrough-v4-0-dbe2412297cc%40ideasonboard.com/

Tomi

Signed-off-by: Pratyush Yadav <p.yadav@xxxxxx>
Signed-off-by: Jai Luthra <j-luthra@xxxxxx>
Reviewed-by: Jacopo Mondi <jacopo.mondi@xxxxxxxxxxxxxxxx>
Reviewed-by: Changhuang Liang <changhuang.liang@xxxxxxxxxxxxxxxx>
Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
Reviewed-by: Yemike Abhilash Chandra <y-abhilashchandra@xxxxxx>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@xxxxxxxxxxxxxxxx>
Signed-off-by: Rishikesh Donadkar <r-donadkar@xxxxxx>
---
drivers/media/platform/cadence/cdns-csi2rx.c | 24 ++++++++++++++++++++
1 file changed, 24 insertions(+)

diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
index 34da81893308b..3688077fa8347 100644
--- a/drivers/media/platform/cadence/cdns-csi2rx.c
+++ b/drivers/media/platform/cadence/cdns-csi2rx.c
@@ -229,6 +229,21 @@ static const struct csi2rx_fmt *csi2rx_get_fmt_by_code(u32 code)
return NULL;
}
+static int csi2rx_get_frame_desc_from_source(struct csi2rx_priv *csi2rx,
+ struct v4l2_mbus_frame_desc *fd)
+{
+ struct media_pad *remote_pad;
+
+ remote_pad = media_entity_remote_source_pad_unique(&csi2rx->subdev.entity);
+ if (!remote_pad) {
+ dev_err(csi2rx->dev, "No remote pad found for sink\n");
+ return -ENODEV;
+ }
+
+ return v4l2_subdev_call(csi2rx->source_subdev, pad, get_frame_desc,
+ remote_pad->index, fd);
+}
+
static inline
struct csi2rx_priv *v4l2_subdev_to_csi2rx(struct v4l2_subdev *subdev)
{
@@ -611,12 +626,21 @@ int cdns_csi2rx_negotiate_ppc(struct v4l2_subdev *subdev, unsigned int pad,
}
EXPORT_SYMBOL_FOR_MODULES(cdns_csi2rx_negotiate_ppc, "j721e-csi2rx");
+static int csi2rx_get_frame_desc(struct v4l2_subdev *subdev, unsigned int pad,
+ struct v4l2_mbus_frame_desc *fd)
+{
+ struct csi2rx_priv *csi2rx = v4l2_subdev_to_csi2rx(subdev);
+
+ return csi2rx_get_frame_desc_from_source(csi2rx, fd);
+}
+
static const struct v4l2_subdev_pad_ops csi2rx_pad_ops = {
.enum_mbus_code = csi2rx_enum_mbus_code,
.get_fmt = v4l2_subdev_get_fmt,
.set_fmt = csi2rx_set_fmt,
.enable_streams = csi2rx_enable_streams,
.disable_streams = csi2rx_disable_streams,
+ .get_frame_desc = csi2rx_get_frame_desc,
};
static const struct v4l2_subdev_core_ops csi2rx_core_ops = {