* [PATCH 00/18] media: rcar: Streams support
@ 2025-02-19 13:48 Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 01/18] media: rcar-vin: Add RCAR_GEN4 model value Tomi Valkeinen
` (18 more replies)
0 siblings, 19 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:48 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Add streams support to Renesas rcar platform driver.
The series attempts to keep compatibility with the current upstream.
However, in upstream there's some kind of custom multi-stream support
implemented to the rcar driver, which breaks at patch "media: rcar-csi2:
Simplify rcsi2_calc_mbps()".
The behavior should not change when using a single stream.
A problem with the series currently is that it has a lot of
dependencies that are not in upstream yet.
Testing is even more problematic, as the only way currently for me to
get multiple streams is by using the GMSL2 deserializer add-on board
with GMSL2 serializers. These are not supported in upstream. If someone
has the hardware and wants to test, I can share the very-WIP branch that
contains the missing pieces.
Tomi
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
Tomi Valkeinen (18):
media: rcar-vin: Add RCAR_GEN4 model value
media: rcar-vin: Fix RAW8
media: rcar-vin: Fix RAW10
media: rcar-isp: Improve ISPPROCMODE_DT_PROC_MODE_VC
media: rcar-isp: Move {enable|disable}_streams() calls
media: rcar-csi2: Move {enable|disable}_streams() calls
media: rcar-csi2: Fix typo
media: rcar-csi2: Move rcar2_calc_mbps()
media: rcar-csi2: Simplify rcsi2_calc_mbps()
media: rcar-csi2: Optimize rcsi2_calc_mbps()
media: rcar-csi2: Switch to Streams API
media: rcar-isp: Switch to Streams API
media: rcar-csi2: Add .get_frame_desc op
media: rcar-isp: Call get_frame_desc to find out VC & DT
media: rcar-csi2: Add more stream support to rcsi2_calc_mbps()
media: rcar-csi2: Call get_frame_desc to find out VC & DT (Gen3)
media: rcar-csi2: Add full streams support
media: rcar-isp: Add full streams support
drivers/media/platform/renesas/rcar-csi2.c | 430 ++++++++++++++-------
drivers/media/platform/renesas/rcar-isp.c | 228 ++++++++---
.../media/platform/renesas/rcar-vin/rcar-core.c | 2 +-
drivers/media/platform/renesas/rcar-vin/rcar-dma.c | 20 +-
.../media/platform/renesas/rcar-vin/rcar-v4l2.c | 8 +-
drivers/media/platform/renesas/rcar-vin/rcar-vin.h | 1 +
6 files changed, 499 insertions(+), 190 deletions(-)
---
base-commit: c4b7779abc6633677e6edb79e2809f4f61fde157
change-id: 20250219-rcar-streams-1fdea8860e5e
prerequisite-message-id: <20240129202254.1126012-1-niklas.soderlund+renesas@ragnatech.se>
prerequisite-patch-id: 23c9dfd64dd6176312d50191e60b0a92937c0051
prerequisite-patch-id: c49831184e0a6ff063cadbc79381c0f68d5b0f63
prerequisite-patch-id: 47104e797dfef692022a72cb62d7fad2fc44f0f5
prerequisite-patch-id: c89cf1fd9e528e6685ba8ce1e93e94f019f43913
prerequisite-patch-id: e096565500ed748974824328adf14905ae40bcaa
prerequisite-patch-id: 87a61e2c15f59928a96e9213c338cc2a65344c58
prerequisite-message-id: <20240129195954.1110643-1-niklas.soderlund+renesas@ragnatech.se>
prerequisite-patch-id: 748963119debbf990374b9eb06659381a3924824
prerequisite-change-id: 20250120-rcar-media-impro-2c37c1036e19:v1
prerequisite-patch-id: 3741e9cc665b78b56d18eee0041626d3c739dad5
prerequisite-patch-id: 99a13857e0de3c1cadc7a971f6c3fb4449599313
prerequisite-patch-id: a034cd446e21ba28273607f1d928c13739fb83f9
prerequisite-patch-id: cdf480b4562e749c4190ceec50e78a8dac155bd5
prerequisite-patch-id: 94c99ecd291d3d3f86b148406bbc383405016f2a
prerequisite-patch-id: 690790ff01515aa452e73581c3ee4312246bfbc2
prerequisite-patch-id: 74c5bed5396ef54ded950b9c449ea23b8f67636b
prerequisite-patch-id: 3a6b197715760886ab383fefe1d5f95f40d8b063
prerequisite-patch-id: e9f04f626ae08c981faa66de72663e8940a4f92e
prerequisite-patch-id: 58b5dc8fd9026dcfede60b005294692964def2a1
prerequisite-message-id: <20250210175615.1686529-1-niklas.soderlund+renesas@ragnatech.se>
prerequisite-patch-id: a4aa6a184c6a21fc4536c11e14d9b5cc61f13346
prerequisite-patch-id: 1b0091875529d392b142814005baa38b2ef77f98
prerequisite-patch-id: 4c960ae93b1e663b11194903ed1810e0ed1e4f59
prerequisite-patch-id: a5641e1dcad0f39baef8996b6731a471046f18f9
prerequisite-patch-id: 481317ba4b987cbb069c31f3372686a59c0fcb67
prerequisite-change-id: 20250218-frame-desc-passthrough-66805e413974:v2
prerequisite-patch-id: da0097f1a6c5b58f87210acd974d7eba0b721dc3
prerequisite-patch-id: 7cc5997549353a7e300f4778fd883e900d2251b2
prerequisite-patch-id: 57d4622505842a9c9b8cbedb49745a155826c464
Best regards,
--
Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 01/18] media: rcar-vin: Add RCAR_GEN4 model value
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
@ 2025-02-19 13:48 ` Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 02/18] media: rcar-vin: Fix RAW8 Tomi Valkeinen
` (17 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:48 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Currently Gen4 VINs are marked as RCAN_GEN3 models. Add a new enum
value, RCAR_GEN4, and use it for Gen4 VINs. No functional changes in
this patch.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-vin/rcar-core.c | 2 +-
drivers/media/platform/renesas/rcar-vin/rcar-dma.c | 8 ++++----
drivers/media/platform/renesas/rcar-vin/rcar-vin.h | 1 +
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-core.c b/drivers/media/platform/renesas/rcar-vin/rcar-core.c
index c3cf02b94a2b..68c0acc7fc2c 100644
--- a/drivers/media/platform/renesas/rcar-vin/rcar-core.c
+++ b/drivers/media/platform/renesas/rcar-vin/rcar-core.c
@@ -1089,7 +1089,7 @@ static const struct rvin_info rcar_info_r8a77995 = {
};
static const struct rvin_info rcar_info_gen4 = {
- .model = RCAR_GEN3,
+ .model = RCAR_GEN4,
.use_mc = true,
.use_isp = true,
.nv12 = true,
diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-dma.c b/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
index 976a4e218cd9..f0a77199cead 100644
--- a/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
+++ b/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
@@ -821,7 +821,7 @@ static int rvin_setup(struct rvin_dev *vin)
}
/* Make sure input interface and input format is valid. */
- if (vin->info->model == RCAR_GEN3) {
+ if (vin->info->model == RCAR_GEN3 || vin->info->model == RCAR_GEN4) {
switch (vnmc & VNMC_INF_MASK) {
case VNMC_INF_YUV8_BT656:
case VNMC_INF_YUV10_BT656:
@@ -844,7 +844,7 @@ static int rvin_setup(struct rvin_dev *vin)
}
/* Enable VSYNC Field Toggle mode after one VSYNC input */
- if (vin->info->model == RCAR_GEN3)
+ if (vin->info->model == RCAR_GEN3 || vin->info->model == RCAR_GEN4)
dmr2 = VNDMR2_FTEV;
else
dmr2 = VNDMR2_FTEV | VNDMR2_VLV(1);
@@ -944,7 +944,7 @@ static int rvin_setup(struct rvin_dev *vin)
if (input_is_yuv == output_is_yuv)
vnmc |= VNMC_BPS;
- if (vin->info->model == RCAR_GEN3) {
+ if (vin->info->model == RCAR_GEN3 || vin->info->model == RCAR_GEN4) {
/* Select between CSI-2 and parallel input */
if (rvin_remote_is_parallel(vin))
vnmc |= VNMC_DPINE;
@@ -1325,7 +1325,7 @@ static int rvin_mc_validate_format(struct rvin_dev *vin, struct v4l2_subdev *sd,
if (rvin_scaler_needed(vin)) {
/* Gen3 can't scale NV12 */
- if (vin->info->model == RCAR_GEN3 &&
+ if ((vin->info->model == RCAR_GEN3 || vin->info->model == RCAR_GEN4) &&
vin->format.pixelformat == V4L2_PIX_FMT_NV12)
return -EPIPE;
diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-vin.h b/drivers/media/platform/renesas/rcar-vin/rcar-vin.h
index 62fed93e4438..90534df84ccd 100644
--- a/drivers/media/platform/renesas/rcar-vin/rcar-vin.h
+++ b/drivers/media/platform/renesas/rcar-vin/rcar-vin.h
@@ -39,6 +39,7 @@ enum model_id {
RCAR_M1,
RCAR_GEN2,
RCAR_GEN3,
+ RCAR_GEN4,
};
enum rvin_csi_id {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 02/18] media: rcar-vin: Fix RAW8
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 01/18] media: rcar-vin: Add RCAR_GEN4 model value Tomi Valkeinen
@ 2025-02-19 13:48 ` Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 03/18] media: rcar-vin: Fix RAW10 Tomi Valkeinen
` (16 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:48 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
On Gen4 we need to set VNMC's EXINF to a different value (1) than in
Gen3 (0). Add a define for this, and set the bit for Gen4.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-vin/rcar-dma.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-dma.c b/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
index f0a77199cead..bbdff7aed9e2 100644
--- a/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
+++ b/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
@@ -94,6 +94,7 @@
#define VNMC_INF_YUV16 (5 << 16)
#define VNMC_INF_RGB888 (6 << 16)
#define VNMC_INF_RGB666 (7 << 16)
+#define VNMC_EXINF_RAW8 (1 << 12) /* Gen4 specific */
#define VNMC_VUP (1 << 10)
#define VNMC_IM_ODD (0 << 3)
#define VNMC_IM_ODD_EVEN (1 << 3)
@@ -809,6 +810,8 @@ static int rvin_setup(struct rvin_dev *vin)
case MEDIA_BUS_FMT_SRGGB8_1X8:
case MEDIA_BUS_FMT_Y8_1X8:
vnmc |= VNMC_INF_RAW8;
+ if (vin->info->model == RCAR_GEN4)
+ vnmc |= VNMC_EXINF_RAW8;
break;
case MEDIA_BUS_FMT_SBGGR10_1X10:
case MEDIA_BUS_FMT_SGBRG10_1X10:
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 03/18] media: rcar-vin: Fix RAW10
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 01/18] media: rcar-vin: Add RCAR_GEN4 model value Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 02/18] media: rcar-vin: Fix RAW8 Tomi Valkeinen
@ 2025-02-19 13:48 ` Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 04/18] media: rcar-isp: Improve ISPPROCMODE_DT_PROC_MODE_VC Tomi Valkeinen
` (15 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:48 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Fix the following to get RAW10 formats working:
In rvin_formats, the bpp is set to 4 for RAW10. As VIN unpacks RAW10 to
16-bit containers, the bpp should be 2.
Don't set VNDMR_YC_THR to the VNDMR register. The YC_THR is "YC Data
Through Mode", used for YUV formats and should not be set for RAW10.
Fix the check related to the RGB666 format and CSI-2 mode. The
VNMC_INF_RGB666 define is the same as used for RAW10 on Gen4, and RAW10
is allowed on CSI-2 (whereas RGB666 is not allowed on Gen3 on CSI-2).
This feels a bit hacky, though, and the formats should really have been
verified already earlier.
Fixes: 1b7e7240eaf3 ("media: rcar-vin: Add support for RAW10")
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-vin/rcar-dma.c | 9 +++++++--
drivers/media/platform/renesas/rcar-vin/rcar-v4l2.c | 8 ++++----
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-dma.c b/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
index bbdff7aed9e2..00629acc6404 100644
--- a/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
+++ b/drivers/media/platform/renesas/rcar-vin/rcar-dma.c
@@ -829,12 +829,17 @@ static int rvin_setup(struct rvin_dev *vin)
case VNMC_INF_YUV8_BT656:
case VNMC_INF_YUV10_BT656:
case VNMC_INF_YUV16:
- case VNMC_INF_RGB666:
if (!rvin_remote_is_parallel(vin)) {
vin_err(vin, "Invalid setting in MIPI CSI2\n");
return -EINVAL;
}
break;
+ case VNMC_INF_RGB666:
+ if (vin->info->model == RCAR_GEN3 && !rvin_remote_is_parallel(vin)) {
+ vin_err(vin, "Invalid setting in MIPI CSI2\n");
+ return -EINVAL;
+ }
+ break;
case VNMC_INF_RAW8:
if (rvin_remote_is_parallel(vin)) {
vin_err(vin, "Invalid setting in Digital Pins\n");
@@ -931,7 +936,7 @@ static int rvin_setup(struct rvin_dev *vin)
case V4L2_PIX_FMT_SGBRG10:
case V4L2_PIX_FMT_SGRBG10:
case V4L2_PIX_FMT_SRGGB10:
- dmr = VNDMR_RMODE_RAW10 | VNDMR_YC_THR;
+ dmr = VNDMR_RMODE_RAW10;
break;
default:
vin_err(vin, "Invalid pixelformat (0x%x)\n",
diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-v4l2.c b/drivers/media/platform/renesas/rcar-vin/rcar-v4l2.c
index a1b74be33ab2..591f1a4d3595 100644
--- a/drivers/media/platform/renesas/rcar-vin/rcar-v4l2.c
+++ b/drivers/media/platform/renesas/rcar-vin/rcar-v4l2.c
@@ -88,19 +88,19 @@ static const struct rvin_video_format rvin_formats[] = {
},
{
.fourcc = V4L2_PIX_FMT_SBGGR10,
- .bpp = 4,
+ .bpp = 2,
},
{
.fourcc = V4L2_PIX_FMT_SGBRG10,
- .bpp = 4,
+ .bpp = 2,
},
{
.fourcc = V4L2_PIX_FMT_SGRBG10,
- .bpp = 4,
+ .bpp = 2,
},
{
.fourcc = V4L2_PIX_FMT_SRGGB10,
- .bpp = 4,
+ .bpp = 2,
},
};
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 04/18] media: rcar-isp: Improve ISPPROCMODE_DT_PROC_MODE_VC
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (2 preceding siblings ...)
2025-02-19 13:48 ` [PATCH 03/18] media: rcar-vin: Fix RAW10 Tomi Valkeinen
@ 2025-02-19 13:48 ` Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 05/18] media: rcar-isp: Move {enable|disable}_streams() calls Tomi Valkeinen
` (14 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:48 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Instead of having four macros for ISPPROCMODE_DT_PROC_MODE_VC[0123](pm),
have just one ISPPROCMODE_DT_PROC_MODE_VCn(vc, pm).
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-isp.c | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-isp.c b/drivers/media/platform/renesas/rcar-isp.c
index 4bc89d4757fa..46534a479201 100644
--- a/drivers/media/platform/renesas/rcar-isp.c
+++ b/drivers/media/platform/renesas/rcar-isp.c
@@ -28,10 +28,7 @@
#define ISPSTART_STOP 0x0000
#define ISPPROCMODE_DT_REG(n) (0x1100 + (0x4 * (n)))
-#define ISPPROCMODE_DT_PROC_MODE_VC3(pm) (((pm) & 0x3f) << 24)
-#define ISPPROCMODE_DT_PROC_MODE_VC2(pm) (((pm) & 0x3f) << 16)
-#define ISPPROCMODE_DT_PROC_MODE_VC1(pm) (((pm) & 0x3f) << 8)
-#define ISPPROCMODE_DT_PROC_MODE_VC0(pm) ((pm) & 0x3f)
+#define ISPPROCMODE_DT_PROC_MODE_VCn(vc, pm) (((pm) & 0x3f) << (8 * (vc)))
#define ISPCS_FILTER_ID_CH_REG(n) (0x3000 + (0x0100 * (n)))
@@ -263,10 +260,10 @@ static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *state)
/* Setup processing method. */
risp_write(isp, ISPPROCMODE_DT_REG(format->datatype),
- ISPPROCMODE_DT_PROC_MODE_VC3(format->procmode) |
- ISPPROCMODE_DT_PROC_MODE_VC2(format->procmode) |
- ISPPROCMODE_DT_PROC_MODE_VC1(format->procmode) |
- ISPPROCMODE_DT_PROC_MODE_VC0(format->procmode));
+ ISPPROCMODE_DT_PROC_MODE_VCn(3, format->procmode) |
+ ISPPROCMODE_DT_PROC_MODE_VCn(2, format->procmode) |
+ ISPPROCMODE_DT_PROC_MODE_VCn(1, format->procmode) |
+ ISPPROCMODE_DT_PROC_MODE_VCn(0, format->procmode));
/* Start ISP. */
risp_write(isp, ISPSTART_REG, ISPSTART_START);
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 05/18] media: rcar-isp: Move {enable|disable}_streams() calls
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (3 preceding siblings ...)
2025-02-19 13:48 ` [PATCH 04/18] media: rcar-isp: Improve ISPPROCMODE_DT_PROC_MODE_VC Tomi Valkeinen
@ 2025-02-19 13:48 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 06/18] media: rcar-csi2: " Tomi Valkeinen
` (13 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:48 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
With multiple streams the operation to enable the ISP hardware and to
call {enable|disable}_streams() on upstream subdev will need to be
handled separately.
Prepare for that by moving {enable|disable}_streams() calls out from
risp_start() and risp_stop().
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-isp.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-isp.c b/drivers/media/platform/renesas/rcar-isp.c
index 46534a479201..8e222c9ec604 100644
--- a/drivers/media/platform/renesas/rcar-isp.c
+++ b/drivers/media/platform/renesas/rcar-isp.c
@@ -268,18 +268,11 @@ static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *state)
/* Start ISP. */
risp_write(isp, ISPSTART_REG, ISPSTART_START);
- ret = v4l2_subdev_enable_streams(isp->remote, isp->remote_pad,
- BIT_ULL(0));
- if (ret)
- risp_power_off(isp);
-
- return ret;
+ return 0;
}
static void risp_stop(struct rcar_isp *isp)
{
- v4l2_subdev_disable_streams(isp->remote, isp->remote_pad, BIT_ULL(0));
-
/* Stop ISP. */
risp_write(isp, ISPSTART_REG, ISPSTART_STOP);
@@ -305,6 +298,13 @@ static int risp_enable_streams(struct v4l2_subdev *sd,
return ret;
}
+ ret = v4l2_subdev_enable_streams(isp->remote, isp->remote_pad,
+ BIT_ULL(0));
+ if (ret) {
+ risp_stop(isp);
+ return ret;
+ }
+
isp->stream_count += 1;
return ret;
@@ -322,6 +322,8 @@ static int risp_disable_streams(struct v4l2_subdev *sd,
if (!isp->remote)
return -ENODEV;
+ v4l2_subdev_disable_streams(isp->remote, isp->remote_pad, BIT_ULL(0));
+
if (isp->stream_count == 1)
risp_stop(isp);
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 06/18] media: rcar-csi2: Move {enable|disable}_streams() calls
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (4 preceding siblings ...)
2025-02-19 13:48 ` [PATCH 05/18] media: rcar-isp: Move {enable|disable}_streams() calls Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 07/18] media: rcar-csi2: Fix typo Tomi Valkeinen
` (12 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
With multiple streams the operation to enable the CSI-2 hardware and to
call {enable|disable}_streams() on upstream subdev will need to be
handled separately.
Prepare for that by moving {enable|disable}_streams() calls out from
rcsi2_start() and rcsi2_stop().
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index 9979de4f6ef1..845fb3e155f1 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -1571,20 +1571,12 @@ static int rcsi2_start(struct rcar_csi2 *priv, struct v4l2_subdev_state *state)
return ret;
}
- ret = v4l2_subdev_enable_streams(priv->remote, priv->remote_pad,
- BIT_ULL(0));
- if (ret) {
- rcsi2_enter_standby(priv);
- return ret;
- }
-
return 0;
}
static void rcsi2_stop(struct rcar_csi2 *priv)
{
rcsi2_enter_standby(priv);
- v4l2_subdev_disable_streams(priv->remote, priv->remote_pad, BIT_ULL(0));
}
static int rcsi2_enable_streams(struct v4l2_subdev *sd,
@@ -1606,6 +1598,13 @@ static int rcsi2_enable_streams(struct v4l2_subdev *sd,
return ret;
}
+ ret = v4l2_subdev_enable_streams(priv->remote, priv->remote_pad,
+ BIT_ULL(0));
+ if (ret) {
+ rcsi2_stop(priv);
+ return ret;
+ }
+
priv->stream_count += 1;
return ret;
@@ -1627,6 +1626,8 @@ static int rcsi2_disable_streams(struct v4l2_subdev *sd,
if (priv->stream_count == 1)
rcsi2_stop(priv);
+ v4l2_subdev_disable_streams(priv->remote, priv->remote_pad, BIT_ULL(0));
+
priv->stream_count -= 1;
return ret;
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 07/18] media: rcar-csi2: Fix typo
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (5 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 06/18] media: rcar-csi2: " Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 14:24 ` Niklas Söderlund
2025-02-19 13:49 ` [PATCH 08/18] media: rcar-csi2: Move rcar2_calc_mbps() Tomi Valkeinen
` (11 subsequent siblings)
18 siblings, 1 reply; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Fix typo with variable name 'msps'.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index 845fb3e155f1..92697ea3df01 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -1301,7 +1301,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
const struct rcar_csi2_format *format;
const struct v4l2_mbus_framefmt *fmt;
unsigned int lanes;
- int msps;
+ int mbps;
int ret;
/* Use the format on the sink pad to compute the receiver config. */
@@ -1314,9 +1314,9 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
if (ret)
return ret;
- msps = rcsi2_calc_mbps(priv, format->bpp, lanes);
- if (msps < 0)
- return msps;
+ mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
+ if (mbps < 0)
+ return mbps;
/* Reset LINK and PHY*/
rcsi2_write(priv, V4H_CSI2_RESETN_REG, 0);
@@ -1352,7 +1352,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
rcsi2_write16(priv, V4H_PPI_RW_COMMON_CFG_REG, 0x0003);
/* C-PHY settings */
- ret = rcsi2_c_phy_setting_v4h(priv, msps);
+ ret = rcsi2_c_phy_setting_v4h(priv, mbps);
if (ret)
return ret;
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 08/18] media: rcar-csi2: Move rcar2_calc_mbps()
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (6 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 07/18] media: rcar-csi2: Fix typo Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 09/18] media: rcar-csi2: Simplify rcsi2_calc_mbps() Tomi Valkeinen
` (10 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Move the function so that it can call rcsi2_get_active_lanes() in the
following patch.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 62 +++++++++++++++---------------
1 file changed, 31 insertions(+), 31 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index 92697ea3df01..8de0f88aca61 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -951,37 +951,6 @@ static int rcsi2_set_phypll(struct rcar_csi2 *priv, unsigned int mbps)
return 0;
}
-static int rcsi2_calc_mbps(struct rcar_csi2 *priv, unsigned int bpp,
- unsigned int lanes)
-{
- struct v4l2_subdev *source;
- s64 freq;
- u64 mbps;
-
- if (!priv->remote)
- return -ENODEV;
-
- source = priv->remote;
-
- freq = v4l2_get_link_freq(source->ctrl_handler, bpp, 2 * lanes);
- if (freq < 0) {
- int ret = (int)freq;
-
- dev_err(priv->dev, "failed to get link freq for %s: %d\n",
- source->name, ret);
-
- return ret;
- }
-
- mbps = div_u64(freq * 2, MEGA);
-
- /* Adjust for C-PHY, divide by 2.8. */
- if (priv->cphy)
- mbps = div_u64(mbps * 5, 14);
-
- return mbps;
-}
-
static int rcsi2_get_active_lanes(struct rcar_csi2 *priv,
unsigned int *lanes)
{
@@ -1029,6 +998,37 @@ static int rcsi2_get_active_lanes(struct rcar_csi2 *priv,
return 0;
}
+static int rcsi2_calc_mbps(struct rcar_csi2 *priv, unsigned int bpp,
+ unsigned int lanes)
+{
+ struct v4l2_subdev *source;
+ s64 freq;
+ u64 mbps;
+
+ if (!priv->remote)
+ return -ENODEV;
+
+ source = priv->remote;
+
+ freq = v4l2_get_link_freq(source->ctrl_handler, bpp, 2 * lanes);
+ if (freq < 0) {
+ int ret = (int)freq;
+
+ dev_err(priv->dev, "failed to get link freq for %s: %d\n",
+ source->name, ret);
+
+ return ret;
+ }
+
+ mbps = div_u64(freq * 2, MEGA);
+
+ /* Adjust for C-PHY, divide by 2.8. */
+ if (priv->cphy)
+ mbps = div_u64(mbps * 5, 14);
+
+ return mbps;
+}
+
static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv,
struct v4l2_subdev_state *state)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 09/18] media: rcar-csi2: Simplify rcsi2_calc_mbps()
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (7 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 08/18] media: rcar-csi2: Move rcar2_calc_mbps() Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 10/18] media: rcar-csi2: Optimize rcsi2_calc_mbps() Tomi Valkeinen
` (9 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Instead of taking the bpp and the number of lanes as parameters to
rcsi2_calc_mbps(), change the function to get those parameters inside
the function. This centralizes the code a bit and makes it easier to add
streams support.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 45 ++++++++++++++++--------------
1 file changed, 24 insertions(+), 21 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index 8de0f88aca61..f8b581e10886 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -998,18 +998,37 @@ static int rcsi2_get_active_lanes(struct rcar_csi2 *priv,
return 0;
}
-static int rcsi2_calc_mbps(struct rcar_csi2 *priv, unsigned int bpp,
- unsigned int lanes)
+static int rcsi2_calc_mbps(struct rcar_csi2 *priv,
+ struct v4l2_subdev_state *state)
{
+ const struct rcar_csi2_format *format;
+ struct v4l2_mbus_framefmt *fmt;
struct v4l2_subdev *source;
+ unsigned int lanes;
+ unsigned int bpp;
s64 freq;
u64 mbps;
+ int ret;
if (!priv->remote)
return -ENODEV;
source = priv->remote;
+ ret = rcsi2_get_active_lanes(priv, &lanes);
+ if (ret)
+ return ret;
+
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
+ if (!fmt)
+ return -EINVAL;
+
+ format = rcsi2_code_to_fmt(fmt->code);
+ if (!format)
+ return -EINVAL;
+
+ bpp = format->bpp;
+
freq = v4l2_get_link_freq(source->ctrl_handler, bpp, 2 * lanes);
if (freq < 0) {
int ret = (int)freq;
@@ -1090,7 +1109,7 @@ static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv,
phycnt = PHYCNT_ENABLECLK;
phycnt |= (1 << lanes) - 1;
- mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
+ mbps = rcsi2_calc_mbps(priv, state);
if (mbps < 0)
return mbps;
@@ -1298,23 +1317,15 @@ static int rcsi2_c_phy_setting_v4h(struct rcar_csi2 *priv, int msps)
static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
struct v4l2_subdev_state *state)
{
- const struct rcar_csi2_format *format;
- const struct v4l2_mbus_framefmt *fmt;
unsigned int lanes;
int mbps;
int ret;
- /* Use the format on the sink pad to compute the receiver config. */
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
- format = rcsi2_code_to_fmt(fmt->code);
- if (!format)
- return -EINVAL;
-
ret = rcsi2_get_active_lanes(priv, &lanes);
if (ret)
return ret;
- mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
+ mbps = rcsi2_calc_mbps(priv, state);
if (mbps < 0)
return mbps;
@@ -1492,23 +1503,15 @@ static int rcsi2_init_common_v4m(struct rcar_csi2 *priv, unsigned int mbps)
static int rcsi2_start_receiver_v4m(struct rcar_csi2 *priv,
struct v4l2_subdev_state *state)
{
- const struct rcar_csi2_format *format;
- const struct v4l2_mbus_framefmt *fmt;
unsigned int lanes;
int mbps;
int ret;
- /* Calculate parameters */
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
- format = rcsi2_code_to_fmt(fmt->code);
- if (!format)
- return -EINVAL;
-
ret = rcsi2_get_active_lanes(priv, &lanes);
if (ret)
return ret;
- mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
+ mbps = rcsi2_calc_mbps(priv, state);
if (mbps < 0)
return mbps;
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 10/18] media: rcar-csi2: Optimize rcsi2_calc_mbps()
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (8 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 09/18] media: rcar-csi2: Simplify rcsi2_calc_mbps() Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 11/18] media: rcar-csi2: Switch to Streams API Tomi Valkeinen
` (8 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
With modern drivers supporting V4L2_CID_LINK_FREQ, we don't need to do
any calculations based on the bpp and number of lanes when figuring out
the link frequency. However, the code currently always runs code to get
the bpp and number of lanes.
Optimize the rcsi2_calc_mbps() so that we only do that when needed, i.e.
when V4L2_CID_LINK_FREQ is not supported by the upstream subdevice.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 32 ++++++++++++++++++------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index f8b581e10886..d6d5c18b0b4c 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -1001,33 +1001,39 @@ static int rcsi2_get_active_lanes(struct rcar_csi2 *priv,
static int rcsi2_calc_mbps(struct rcar_csi2 *priv,
struct v4l2_subdev_state *state)
{
- const struct rcar_csi2_format *format;
- struct v4l2_mbus_framefmt *fmt;
struct v4l2_subdev *source;
unsigned int lanes;
unsigned int bpp;
s64 freq;
u64 mbps;
- int ret;
if (!priv->remote)
return -ENODEV;
source = priv->remote;
- ret = rcsi2_get_active_lanes(priv, &lanes);
- if (ret)
- return ret;
+ if (v4l2_ctrl_find(source->ctrl_handler, V4L2_CID_LINK_FREQ)) {
+ bpp = 0;
+ lanes = 0;
+ } else {
+ const struct rcar_csi2_format *format;
+ struct v4l2_mbus_framefmt *fmt;
+ int ret;
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
- if (!fmt)
- return -EINVAL;
+ ret = rcsi2_get_active_lanes(priv, &lanes);
+ if (ret)
+ return ret;
- format = rcsi2_code_to_fmt(fmt->code);
- if (!format)
- return -EINVAL;
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
+ if (!fmt)
+ return -EINVAL;
+
+ format = rcsi2_code_to_fmt(fmt->code);
+ if (!format)
+ return -EINVAL;
- bpp = format->bpp;
+ bpp = format->bpp;
+ }
freq = v4l2_get_link_freq(source->ctrl_handler, bpp, 2 * lanes);
if (freq < 0) {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 11/18] media: rcar-csi2: Switch to Streams API
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (9 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 10/18] media: rcar-csi2: Optimize rcsi2_calc_mbps() Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 12/18] media: rcar-isp: " Tomi Valkeinen
` (7 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Switch to Streams API with a single hardcoded route. This breaks any
existing userspace which depended on the custom rcar streams
implementation, but a single camera use case should continue to work.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 47 +++++++++++++++++++++---------
1 file changed, 33 insertions(+), 14 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index d6d5c18b0b4c..71836a9e063b 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -1024,7 +1024,7 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv,
if (ret)
return ret;
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0);
if (!fmt)
return -EINVAL;
@@ -1065,7 +1065,7 @@ static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv,
int mbps, ret;
/* Use the format on the sink pad to compute the receiver config. */
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK);
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0);
dev_dbg(priv->dev, "Input size (%ux%u%c)\n",
fmt->width, fmt->height,
@@ -1646,8 +1646,7 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_format *format)
{
- struct rcar_csi2 *priv = sd_to_csi2(sd);
- unsigned int num_pads = rcsi2_num_pads(priv);
+ struct v4l2_mbus_framefmt *fmt;
if (format->pad > RCAR_CSI2_SINK)
return v4l2_subdev_get_fmt(sd, state, format);
@@ -1655,11 +1654,20 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *sd,
if (!rcsi2_code_to_fmt(format->format.code))
format->format.code = rcar_csi2_formats[0].code;
- *v4l2_subdev_state_get_format(state, format->pad) = format->format;
+ /* Set sink format */
+ fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
+ if (!fmt)
+ return -EINVAL;
+
+ *fmt = format->format;
+
+ /* Propagate to source format */
+ fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
+ format->stream);
+ if (!fmt)
+ return -EINVAL;
- /* Propagate the format to the source pads. */
- for (unsigned int i = RCAR_CSI2_SOURCE_VC0; i < num_pads; i++)
- *v4l2_subdev_state_get_format(state, i) = format->format;
+ *fmt = format->format;
return 0;
}
@@ -1679,8 +1687,15 @@ static const struct v4l2_subdev_ops rcar_csi2_subdev_ops = {
static int rcsi2_init_state(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state)
{
- struct rcar_csi2 *priv = sd_to_csi2(sd);
- unsigned int num_pads = rcsi2_num_pads(priv);
+ static struct v4l2_subdev_route routes[] = {
+ {
+ .sink_pad = RCAR_CSI2_SINK,
+ .sink_stream = 0,
+ .source_pad = RCAR_CSI2_SOURCE_VC0,
+ .source_stream = 0,
+ .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
+ },
+ };
static const struct v4l2_mbus_framefmt rcar_csi2_default_fmt = {
.width = 1920,
@@ -1693,10 +1708,13 @@ static int rcsi2_init_state(struct v4l2_subdev *sd,
.xfer_func = V4L2_XFER_FUNC_DEFAULT,
};
- for (unsigned int i = RCAR_CSI2_SINK; i < num_pads; i++)
- *v4l2_subdev_state_get_format(state, i) = rcar_csi2_default_fmt;
+ static const struct v4l2_subdev_krouting routing = {
+ .num_routes = ARRAY_SIZE(routes),
+ .routes = routes,
+ };
- return 0;
+ return v4l2_subdev_set_routing_with_fmt(sd, state, &routing,
+ &rcar_csi2_default_fmt);
}
static const struct v4l2_subdev_internal_ops rcar_csi2_internal_ops = {
@@ -2352,7 +2370,8 @@ static int rcsi2_probe(struct platform_device *pdev)
v4l2_set_subdevdata(&priv->subdev, &pdev->dev);
snprintf(priv->subdev.name, sizeof(priv->subdev.name), "%s %s",
KBUILD_MODNAME, dev_name(&pdev->dev));
- priv->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
+ priv->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE |
+ V4L2_SUBDEV_FL_STREAMS;
priv->subdev.entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
priv->subdev.entity.ops = &rcar_csi2_entity_ops;
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 12/18] media: rcar-isp: Switch to Streams API
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (10 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 11/18] media: rcar-csi2: Switch to Streams API Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 13/18] media: rcar-csi2: Add .get_frame_desc op Tomi Valkeinen
` (6 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Switch to Streams API with a single hardcoded route. This breaks any
existing userspace which depended on the custom rcar streams
implementation, but a single camera use case should continue to work.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-isp.c | 62 +++++++++++++++++++++++++++----
1 file changed, 55 insertions(+), 7 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-isp.c b/drivers/media/platform/renesas/rcar-isp.c
index 8e222c9ec604..5f3fcdb7e37e 100644
--- a/drivers/media/platform/renesas/rcar-isp.c
+++ b/drivers/media/platform/renesas/rcar-isp.c
@@ -124,6 +124,17 @@ static const struct rcar_isp_format rcar_isp_formats[] = {
},
};
+static const struct v4l2_mbus_framefmt risp_default_fmt = {
+ .width = 1920,
+ .height = 1080,
+ .code = MEDIA_BUS_FMT_RGB888_1X24,
+ .colorspace = V4L2_COLORSPACE_SRGB,
+ .field = V4L2_FIELD_NONE,
+ .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT,
+ .quantization = V4L2_QUANTIZATION_DEFAULT,
+ .xfer_func = V4L2_XFER_FUNC_DEFAULT,
+};
+
static const struct rcar_isp_format *risp_code_to_fmt(unsigned int code)
{
unsigned int i;
@@ -222,7 +233,7 @@ static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *state)
u32 sel_csi = 0;
int ret;
- fmt = v4l2_subdev_state_get_format(state, RCAR_ISP_SINK);
+ fmt = v4l2_subdev_state_get_format(state, RCAR_ISP_SINK, 0);
if (!fmt)
return -EINVAL;
@@ -336,7 +347,7 @@ static int risp_set_pad_format(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
struct v4l2_subdev_format *format)
{
- struct v4l2_mbus_framefmt *framefmt;
+ struct v4l2_mbus_framefmt *fmt;
if (format->pad > RCAR_ISP_SINK)
return v4l2_subdev_get_fmt(sd, state, format);
@@ -344,10 +355,20 @@ static int risp_set_pad_format(struct v4l2_subdev *sd,
if (!risp_code_to_fmt(format->format.code))
format->format.code = rcar_isp_formats[0].code;
- for (unsigned int i = 0; i < RCAR_ISP_NUM_PADS; i++) {
- framefmt = v4l2_subdev_state_get_format(state, i);
- *framefmt = format->format;
- }
+ /* Set sink format */
+ fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
+ if (!fmt)
+ return -EINVAL;
+
+ *fmt = format->format;
+
+ /* Propagate to source format */
+ fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
+ format->stream);
+ if (!fmt)
+ return -EINVAL;
+
+ *fmt = format->format;
return 0;
}
@@ -364,6 +385,32 @@ static const struct v4l2_subdev_ops rcar_isp_subdev_ops = {
.pad = &risp_pad_ops,
};
+static int risp_init_state(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state)
+{
+ static struct v4l2_subdev_route routes[] = {
+ {
+ .sink_pad = RCAR_ISP_SINK,
+ .sink_stream = 0,
+ .source_pad = RCAR_ISP_PORT0,
+ .source_stream = 0,
+ .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
+ },
+ };
+
+ static const struct v4l2_subdev_krouting routing = {
+ .num_routes = ARRAY_SIZE(routes),
+ .routes = routes,
+ };
+
+ return v4l2_subdev_set_routing_with_fmt(sd, state, &routing,
+ &risp_default_fmt);
+}
+
+static const struct v4l2_subdev_internal_ops risp_internal_ops = {
+ .init_state = risp_init_state,
+};
+
/* -----------------------------------------------------------------------------
* Async handling and registration of subdevices and links
*/
@@ -510,11 +557,12 @@ static int risp_probe(struct platform_device *pdev)
isp->subdev.owner = THIS_MODULE;
isp->subdev.dev = &pdev->dev;
+ isp->subdev.internal_ops = &risp_internal_ops;
v4l2_subdev_init(&isp->subdev, &rcar_isp_subdev_ops);
v4l2_set_subdevdata(&isp->subdev, &pdev->dev);
snprintf(isp->subdev.name, sizeof(isp->subdev.name), "%s %s",
KBUILD_MODNAME, dev_name(&pdev->dev));
- isp->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
+ isp->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
isp->subdev.entity.function = MEDIA_ENT_F_VID_MUX;
isp->subdev.entity.ops = &risp_entity_ops;
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 13/18] media: rcar-csi2: Add .get_frame_desc op
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (11 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 12/18] media: rcar-isp: " Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 14/18] media: rcar-isp: Call get_frame_desc to find out VC & DT Tomi Valkeinen
` (5 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Add v4l2_subdev_pad_ops.get_frame_desc() implementation.
We also implement a fallback for the case where the upstream subdevice
does not implement .get_frame_desc. It assumes a single stream with VC =
0 and DT based on the configured stream mbus format.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 56 ++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index 71836a9e063b..17ded37d5ca7 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -1672,12 +1672,68 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *sd,
return 0;
}
+static int rcsi2_get_frame_desc_fallback(struct v4l2_subdev *sd,
+ unsigned int pad,
+ struct v4l2_mbus_frame_desc *fd)
+{
+ const struct rcar_csi2_format *format;
+ struct v4l2_subdev_state *state;
+ struct v4l2_mbus_framefmt *fmt;
+ int ret = 0;
+
+ state = v4l2_subdev_lock_and_get_active_state(sd);
+
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0);
+ if (!fmt) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ format = rcsi2_code_to_fmt(fmt->code);
+ if (!format) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ fd->num_entries = 1;
+ fd->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2;
+ fd->entry[0].stream = 0;
+ fd->entry[0].pixelcode = fmt->code;
+ fd->entry[0].bus.csi2.vc = 0;
+ fd->entry[0].bus.csi2.dt = format->datatype;
+
+out:
+ v4l2_subdev_unlock_state(state);
+
+ return ret;
+}
+
+static int rcsi2_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
+ struct v4l2_mbus_frame_desc *fd)
+{
+ struct rcar_csi2 *priv = sd_to_csi2(sd);
+ int ret;
+
+ if (WARN_ON(!priv->info->use_isp))
+ return -ENOTTY;
+
+ if (WARN_ON(pad != RCAR_CSI2_SOURCE_VC0))
+ return -EINVAL;
+
+ ret = v4l2_get_frame_desc_passthrough(sd, pad, fd);
+ if (ret == -ENOIOCTLCMD)
+ ret = rcsi2_get_frame_desc_fallback(sd, pad, fd);
+ return ret;
+}
+
static const struct v4l2_subdev_pad_ops rcar_csi2_pad_ops = {
.enable_streams = rcsi2_enable_streams,
.disable_streams = rcsi2_disable_streams,
.set_fmt = rcsi2_set_pad_format,
.get_fmt = v4l2_subdev_get_fmt,
+
+ .get_frame_desc = rcsi2_get_frame_desc,
};
static const struct v4l2_subdev_ops rcar_csi2_subdev_ops = {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 14/18] media: rcar-isp: Call get_frame_desc to find out VC & DT
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (12 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 13/18] media: rcar-csi2: Add .get_frame_desc op Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 15/18] media: rcar-csi2: Add more stream support to rcsi2_calc_mbps() Tomi Valkeinen
` (4 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Call get_frame_desc to find out VC & DT, instead of hardcoding the VC
routing and deducing the DT based on the mbus format.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-isp.c | 108 +++++++++++++++++++++---------
1 file changed, 77 insertions(+), 31 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-isp.c b/drivers/media/platform/renesas/rcar-isp.c
index 5f3fcdb7e37e..53927954ba73 100644
--- a/drivers/media/platform/renesas/rcar-isp.c
+++ b/drivers/media/platform/renesas/rcar-isp.c
@@ -225,24 +225,86 @@ static void risp_power_off(struct rcar_isp *isp)
pm_runtime_put(isp->dev);
}
-static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *state)
+static int risp_configure_routing(struct rcar_isp *isp,
+ struct v4l2_subdev_state *state)
{
- const struct v4l2_mbus_framefmt *fmt;
- const struct rcar_isp_format *format;
- unsigned int vc;
- u32 sel_csi = 0;
+ struct v4l2_mbus_frame_desc source_fd;
+ struct v4l2_subdev_route *route;
int ret;
- fmt = v4l2_subdev_state_get_format(state, RCAR_ISP_SINK, 0);
- if (!fmt)
- return -EINVAL;
+ ret = v4l2_subdev_call(isp->remote, pad, get_frame_desc,
+ isp->remote_pad, &source_fd);
+ if (ret)
+ return ret;
- format = risp_code_to_fmt(fmt->code);
- if (!format) {
- dev_err(isp->dev, "Unsupported bus format\n");
- return -EINVAL;
+ /* Clear the channel registers */
+ for (unsigned int ch = 0; ch < 12; ++ch) {
+ risp_write(isp, ISPCS_FILTER_ID_CH_REG(ch), 0);
+ risp_write(isp, ISPCS_DT_CODE03_CH_REG(ch), 0);
}
+ /* Clear the proc mode registers */
+ for (unsigned int dt = 0; dt < 64; ++dt)
+ risp_write(isp, ISPPROCMODE_DT_REG(dt), 0);
+
+ for_each_active_route(&state->routing, route) {
+ struct v4l2_mbus_frame_desc_entry *source_entry = NULL;
+ const struct rcar_isp_format *format;
+ const struct v4l2_mbus_framefmt *fmt;
+ unsigned int i;
+ u8 vc, dt, ch;
+ u32 v;
+
+ for (i = 0; i < source_fd.num_entries; i++) {
+ if (source_fd.entry[i].stream == route->sink_stream) {
+ source_entry = &source_fd.entry[i];
+ break;
+ }
+ }
+
+ if (!source_entry) {
+ dev_err(isp->dev,
+ "Failed to find stream from source frame desc\n");
+ return -EPIPE;
+ }
+
+ vc = source_entry->bus.csi2.vc;
+ dt = source_entry->bus.csi2.dt;
+ /* Channels 4 - 11 go to VIN */
+ ch = route->source_pad - 1 + 4;
+
+ fmt = v4l2_subdev_state_get_format(state, route->sink_pad,
+ route->sink_stream);
+ if (!fmt)
+ return -EINVAL;
+
+ format = risp_code_to_fmt(fmt->code);
+ if (!format) {
+ dev_err(isp->dev, "Unsupported bus format\n");
+ return -EINVAL;
+ }
+
+ /* VC Filtering */
+ risp_write(isp, ISPCS_FILTER_ID_CH_REG(ch), BIT(vc));
+
+ /* DT Filtering */
+ risp_write(isp, ISPCS_DT_CODE03_CH_REG(ch),
+ ISPCS_DT_CODE03_EN0 | ISPCS_DT_CODE03_DT0(dt));
+
+ /* Proc mode */
+ v = risp_read(isp, ISPPROCMODE_DT_REG(dt));
+ v |= ISPPROCMODE_DT_PROC_MODE_VCn(vc, format->procmode);
+ risp_write(isp, ISPPROCMODE_DT_REG(dt), v);
+ }
+
+ return 0;
+}
+
+static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *state)
+{
+ u32 sel_csi = 0;
+ int ret;
+
ret = risp_power_on(isp);
if (ret) {
dev_err(isp->dev, "Failed to power on ISP\n");
@@ -256,25 +318,9 @@ static int risp_start(struct rcar_isp *isp, struct v4l2_subdev_state *state)
risp_write(isp, ISPINPUTSEL0_REG,
risp_read(isp, ISPINPUTSEL0_REG) | sel_csi);
- /* Configure Channel Selector. */
- for (vc = 0; vc < 4; vc++) {
- u8 ch = vc + 4;
- u8 dt = format->datatype;
-
- risp_write(isp, ISPCS_FILTER_ID_CH_REG(ch), BIT(vc));
- risp_write(isp, ISPCS_DT_CODE03_CH_REG(ch),
- ISPCS_DT_CODE03_EN3 | ISPCS_DT_CODE03_DT3(dt) |
- ISPCS_DT_CODE03_EN2 | ISPCS_DT_CODE03_DT2(dt) |
- ISPCS_DT_CODE03_EN1 | ISPCS_DT_CODE03_DT1(dt) |
- ISPCS_DT_CODE03_EN0 | ISPCS_DT_CODE03_DT0(dt));
- }
-
- /* Setup processing method. */
- risp_write(isp, ISPPROCMODE_DT_REG(format->datatype),
- ISPPROCMODE_DT_PROC_MODE_VCn(3, format->procmode) |
- ISPPROCMODE_DT_PROC_MODE_VCn(2, format->procmode) |
- ISPPROCMODE_DT_PROC_MODE_VCn(1, format->procmode) |
- ISPPROCMODE_DT_PROC_MODE_VCn(0, format->procmode));
+ ret = risp_configure_routing(isp, state);
+ if (ret)
+ return ret;
/* Start ISP. */
risp_write(isp, ISPSTART_REG, ISPSTART_START);
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 15/18] media: rcar-csi2: Add more stream support to rcsi2_calc_mbps()
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (13 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 14/18] media: rcar-isp: Call get_frame_desc to find out VC & DT Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 16/18] media: rcar-csi2: Call get_frame_desc to find out VC & DT (Gen3) Tomi Valkeinen
` (3 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
In the case where V4L2_CID_LINK_FREQ is not available, make sure we fail
if there are more than one stream configured, and also use the correct
stream number for that single stream.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index 17ded37d5ca7..3608437b72cd 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -1016,15 +1016,20 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv,
bpp = 0;
lanes = 0;
} else {
+ struct v4l2_subdev_route *route = &state->routing.routes[0];
const struct rcar_csi2_format *format;
struct v4l2_mbus_framefmt *fmt;
int ret;
+ if (state->routing.num_routes > 1)
+ return -EINVAL;
+
ret = rcsi2_get_active_lanes(priv, &lanes);
if (ret)
return ret;
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0);
+ fmt = v4l2_subdev_state_get_format(state, route->sink_pad,
+ route->sink_stream);
if (!fmt)
return -EINVAL;
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 16/18] media: rcar-csi2: Call get_frame_desc to find out VC & DT (Gen3)
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (14 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 15/18] media: rcar-csi2: Add more stream support to rcsi2_calc_mbps() Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 17/18] media: rcar-csi2: Add full streams support Tomi Valkeinen
` (2 subsequent siblings)
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Call get_frame_desc to find out VC & DT, for Gen3 platforms, instead of
hardcoding the VC routing and deducing the DT based on the mbus format.
If the source subdevice doesn't implement .get_frame_desc, we use a
fallback case where we assume there's a single stream with VC = 0 and DT
based on the mbus format.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 113 +++++++++++++++++++----------
1 file changed, 76 insertions(+), 37 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index 3608437b72cd..627b116a96c4 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -71,10 +71,7 @@ struct rcar_csi2;
#define FLD_REG 0x1c
#define FLD_FLD_NUM(n) (((n) & 0xff) << 16)
#define FLD_DET_SEL(n) (((n) & 0x3) << 4)
-#define FLD_FLD_EN4 BIT(3)
-#define FLD_FLD_EN3 BIT(2)
-#define FLD_FLD_EN2 BIT(1)
-#define FLD_FLD_EN BIT(0)
+#define FLD_FLD_EN(ch) BIT(ch)
/* Automatic Standby Control */
#define ASTBY_REG 0x20
@@ -1062,52 +1059,94 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv,
static int rcsi2_start_receiver_gen3(struct rcar_csi2 *priv,
struct v4l2_subdev_state *state)
{
- const struct rcar_csi2_format *format;
- u32 phycnt, vcdt = 0, vcdt2 = 0, fld = 0;
- const struct v4l2_mbus_framefmt *fmt;
+ u32 phycnt, vcdt = 0, vcdt2 = 0;
+ u32 fld = FLD_DET_SEL(1);
+ struct v4l2_mbus_frame_desc source_fd;
+ struct v4l2_subdev_route *route;
unsigned int lanes;
- unsigned int i;
int mbps, ret;
+ u8 ch = 0;
- /* Use the format on the sink pad to compute the receiver config. */
- fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0);
+ ret = v4l2_subdev_call(priv->remote, pad, get_frame_desc,
+ priv->remote_pad, &source_fd);
+ if (ret && ret != -ENOIOCTLCMD) {
+ return ret;
+ } else if (ret == -ENOIOCTLCMD) {
+ /* Create a fallback source_fd */
+ struct v4l2_mbus_frame_desc *fd = &source_fd;
+ const struct rcar_csi2_format *format;
+ struct v4l2_mbus_framefmt *fmt;
- dev_dbg(priv->dev, "Input size (%ux%u%c)\n",
- fmt->width, fmt->height,
- fmt->field == V4L2_FIELD_NONE ? 'p' : 'i');
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0);
+ if (!fmt)
+ return -EINVAL;
- /* Code is validated in set_fmt. */
- format = rcsi2_code_to_fmt(fmt->code);
- if (!format)
- return -EINVAL;
+ format = rcsi2_code_to_fmt(fmt->code);
+ if (!format)
+ return -EINVAL;
- /*
- * Enable all supported CSI-2 channels with virtual channel and
- * data type matching.
- *
- * NOTE: It's not possible to get individual datatype for each
- * source virtual channel. Once this is possible in V4L2
- * it should be used here.
- */
- for (i = 0; i < priv->info->num_channels; i++) {
+ memset(fd, 0, sizeof(*fd));
+
+ fd->num_entries = 1;
+ fd->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2;
+ fd->entry[0].stream = 0;
+ fd->entry[0].pixelcode = fmt->code;
+ fd->entry[0].bus.csi2.vc = 0;
+ fd->entry[0].bus.csi2.dt = format->datatype;
+ }
+
+ for_each_active_route(&state->routing, route) {
+ struct v4l2_mbus_frame_desc_entry *source_entry = NULL;
+ const struct v4l2_mbus_framefmt *fmt;
+ const struct rcar_csi2_format *format;
+ unsigned int i;
+ u8 vc, dt;
u32 vcdt_part;
- if (priv->channel_vc[i] < 0)
- continue;
+ for (i = 0; i < source_fd.num_entries; i++) {
+ if (source_fd.entry[i].stream == route->sink_stream) {
+ source_entry = &source_fd.entry[i];
+ break;
+ }
+ }
+
+ if (!source_entry) {
+ dev_err(priv->dev,
+ "Failed to find stream from source frame desc\n");
+ return -EPIPE;
+ }
- vcdt_part = VCDT_SEL_VC(priv->channel_vc[i]) | VCDT_VCDTN_EN |
- VCDT_SEL_DTN_ON | VCDT_SEL_DT(format->datatype);
+ vc = source_entry->bus.csi2.vc;
+ dt = source_entry->bus.csi2.dt;
+
+ vcdt_part = VCDT_SEL_VC(vc) | VCDT_VCDTN_EN |
+ VCDT_SEL_DTN_ON | VCDT_SEL_DT(dt);
/* Store in correct reg and offset. */
- if (i < 2)
- vcdt |= vcdt_part << ((i % 2) * 16);
+ if (ch < 2)
+ vcdt |= vcdt_part << ((ch % 2) * 16);
else
- vcdt2 |= vcdt_part << ((i % 2) * 16);
- }
+ vcdt2 |= vcdt_part << ((ch % 2) * 16);
+
+ fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK,
+ route->sink_stream);
+ if (!fmt)
+ return -EINVAL;
+
+ dev_dbg(priv->dev, "Input size (%ux%u%c)\n",
+ fmt->width, fmt->height,
+ fmt->field == V4L2_FIELD_NONE ? 'p' : 'i');
- if (fmt->field == V4L2_FIELD_ALTERNATE)
- fld = FLD_DET_SEL(1) | FLD_FLD_EN4 | FLD_FLD_EN3 | FLD_FLD_EN2
- | FLD_FLD_EN;
+ /* Code is validated in set_fmt. */
+ format = rcsi2_code_to_fmt(fmt->code);
+ if (!format)
+ return -EINVAL;
+
+ if (fmt->field == V4L2_FIELD_ALTERNATE)
+ fld |= FLD_FLD_EN(ch);
+
+ ch++;
+ }
/*
* Get the number of active data lanes inspecting the remote mbus
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 17/18] media: rcar-csi2: Add full streams support
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (15 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 16/18] media: rcar-csi2: Call get_frame_desc to find out VC & DT (Gen3) Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 18/18] media: rcar-isp: " Tomi Valkeinen
2025-02-19 14:22 ` [PATCH 00/18] media: rcar: Streams support Niklas Söderlund
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Add the missing pieces to enable full streams support:
- Add set_routing
- Drop the explicit uses of a single stream, and instead use the streams
mask.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-csi2.c | 85 ++++++++++++++++++++++--------
1 file changed, 63 insertions(+), 22 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
index 627b116a96c4..357840753601 100644
--- a/drivers/media/platform/renesas/rcar-csi2.c
+++ b/drivers/media/platform/renesas/rcar-csi2.c
@@ -694,6 +694,17 @@ static const struct rcar_csi2_format rcar_csi2_formats[] = {
},
};
+static const struct v4l2_mbus_framefmt rcar_csi2_default_fmt = {
+ .width = 1920,
+ .height = 1080,
+ .code = MEDIA_BUS_FMT_RGB888_1X24,
+ .colorspace = V4L2_COLORSPACE_SRGB,
+ .field = V4L2_FIELD_NONE,
+ .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT,
+ .quantization = V4L2_QUANTIZATION_DEFAULT,
+ .xfer_func = V4L2_XFER_FUNC_DEFAULT,
+};
+
static const struct rcar_csi2_format *rcsi2_code_to_fmt(unsigned int code)
{
unsigned int i;
@@ -1637,10 +1648,8 @@ static int rcsi2_enable_streams(struct v4l2_subdev *sd,
u64 source_streams_mask)
{
struct rcar_csi2 *priv = sd_to_csi2(sd);
- int ret = 0;
-
- if (source_streams_mask != 1)
- return -EINVAL;
+ u64 sink_streams;
+ int ret;
if (!priv->remote)
return -ENODEV;
@@ -1651,8 +1660,13 @@ static int rcsi2_enable_streams(struct v4l2_subdev *sd,
return ret;
}
+ sink_streams = v4l2_subdev_state_xlate_streams(state,
+ RCAR_CSI2_SOURCE_VC0,
+ RCAR_CSI2_SINK,
+ &source_streams_mask);
+
ret = v4l2_subdev_enable_streams(priv->remote, priv->remote_pad,
- BIT_ULL(0));
+ sink_streams);
if (ret) {
rcsi2_stop(priv);
return ret;
@@ -1668,10 +1682,7 @@ static int rcsi2_disable_streams(struct v4l2_subdev *sd,
u32 source_pad, u64 source_streams_mask)
{
struct rcar_csi2 *priv = sd_to_csi2(sd);
- int ret = 0;
-
- if (source_streams_mask != 1)
- return -EINVAL;
+ u64 sink_streams;
if (!priv->remote)
return -ENODEV;
@@ -1679,11 +1690,17 @@ static int rcsi2_disable_streams(struct v4l2_subdev *sd,
if (priv->stream_count == 1)
rcsi2_stop(priv);
- v4l2_subdev_disable_streams(priv->remote, priv->remote_pad, BIT_ULL(0));
+ sink_streams = v4l2_subdev_state_xlate_streams(state,
+ RCAR_CSI2_SOURCE_VC0,
+ RCAR_CSI2_SINK,
+ &source_streams_mask);
+
+ v4l2_subdev_disable_streams(priv->remote, priv->remote_pad,
+ sink_streams);
priv->stream_count -= 1;
- return ret;
+ return 0;
}
static int rcsi2_set_pad_format(struct v4l2_subdev *sd,
@@ -1716,6 +1733,40 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *sd,
return 0;
}
+static int rcsi2_set_routing(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ enum v4l2_subdev_format_whence which,
+ struct v4l2_subdev_krouting *routing)
+{
+ struct rcar_csi2 *priv = sd_to_csi2(sd);
+ int ret;
+
+ if (!priv->info->use_isp)
+ return -ENOTTY;
+
+ if (routing->num_routes > V4L2_FRAME_DESC_ENTRY_MAX)
+ return -EINVAL;
+
+ if (priv->info->use_isp) {
+ ret = v4l2_subdev_routing_validate(sd, routing,
+ V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
+ } else {
+ ret = v4l2_subdev_routing_validate(sd, routing,
+ V4L2_SUBDEV_ROUTING_ONLY_1_TO_1 |
+ V4L2_SUBDEV_ROUTING_NO_SOURCE_MULTIPLEXING);
+ }
+
+ if (ret)
+ return ret;
+
+ ret = v4l2_subdev_set_routing_with_fmt(sd, state, routing,
+ &rcar_csi2_default_fmt);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static int rcsi2_get_frame_desc_fallback(struct v4l2_subdev *sd,
unsigned int pad,
struct v4l2_mbus_frame_desc *fd)
@@ -1777,6 +1828,7 @@ static const struct v4l2_subdev_pad_ops rcar_csi2_pad_ops = {
.set_fmt = rcsi2_set_pad_format,
.get_fmt = v4l2_subdev_get_fmt,
+ .set_routing = rcsi2_set_routing,
.get_frame_desc = rcsi2_get_frame_desc,
};
@@ -1797,17 +1849,6 @@ static int rcsi2_init_state(struct v4l2_subdev *sd,
},
};
- static const struct v4l2_mbus_framefmt rcar_csi2_default_fmt = {
- .width = 1920,
- .height = 1080,
- .code = MEDIA_BUS_FMT_RGB888_1X24,
- .colorspace = V4L2_COLORSPACE_SRGB,
- .field = V4L2_FIELD_NONE,
- .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT,
- .quantization = V4L2_QUANTIZATION_DEFAULT,
- .xfer_func = V4L2_XFER_FUNC_DEFAULT,
- };
-
static const struct v4l2_subdev_krouting routing = {
.num_routes = ARRAY_SIZE(routes),
.routes = routes,
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 18/18] media: rcar-isp: Add full streams support
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (16 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 17/18] media: rcar-csi2: Add full streams support Tomi Valkeinen
@ 2025-02-19 13:49 ` Tomi Valkeinen
2025-02-19 14:22 ` [PATCH 00/18] media: rcar: Streams support Niklas Söderlund
18 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 13:49 UTC (permalink / raw)
To: Niklas Söderlund, Mauro Carvalho Chehab, Sakari Ailus
Cc: linux-media, linux-renesas-soc, linux-kernel,
Niklas Söderlund, Mauro Carvalho Chehab, Laurent Pinchart,
Jacopo Mondi, Tomi Valkeinen
Add the missing pieces to enable full streams support:
- Add set_routing
- Drop the explicit uses of a single stream, and instead use the streams
mask.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
---
drivers/media/platform/renesas/rcar-isp.c | 41 +++++++++++++++++++++++++++++--
1 file changed, 39 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/renesas/rcar-isp.c b/drivers/media/platform/renesas/rcar-isp.c
index 53927954ba73..20aa451cc64f 100644
--- a/drivers/media/platform/renesas/rcar-isp.c
+++ b/drivers/media/platform/renesas/rcar-isp.c
@@ -342,6 +342,7 @@ static int risp_enable_streams(struct v4l2_subdev *sd,
{
struct rcar_isp *isp = sd_to_isp(sd);
int ret = 0;
+ u64 sink_streams;
if (source_streams_mask != 1)
return -EINVAL;
@@ -355,8 +356,13 @@ static int risp_enable_streams(struct v4l2_subdev *sd,
return ret;
}
+ sink_streams = v4l2_subdev_state_xlate_streams(state,
+ source_pad,
+ RCAR_ISP_SINK,
+ &source_streams_mask);
+
ret = v4l2_subdev_enable_streams(isp->remote, isp->remote_pad,
- BIT_ULL(0));
+ sink_streams);
if (ret) {
risp_stop(isp);
return ret;
@@ -372,6 +378,7 @@ static int risp_disable_streams(struct v4l2_subdev *sd,
u64 source_streams_mask)
{
struct rcar_isp *isp = sd_to_isp(sd);
+ u64 sink_streams;
if (source_streams_mask != 1)
return -EINVAL;
@@ -379,7 +386,12 @@ static int risp_disable_streams(struct v4l2_subdev *sd,
if (!isp->remote)
return -ENODEV;
- v4l2_subdev_disable_streams(isp->remote, isp->remote_pad, BIT_ULL(0));
+ sink_streams = v4l2_subdev_state_xlate_streams(state,
+ source_pad,
+ RCAR_ISP_SINK,
+ &source_streams_mask);
+
+ v4l2_subdev_disable_streams(isp->remote, isp->remote_pad, sink_streams);
if (isp->stream_count == 1)
risp_stop(isp);
@@ -419,12 +431,37 @@ static int risp_set_pad_format(struct v4l2_subdev *sd,
return 0;
}
+static int risp_set_routing(struct v4l2_subdev *sd,
+ struct v4l2_subdev_state *state,
+ enum v4l2_subdev_format_whence which,
+ struct v4l2_subdev_krouting *routing)
+{
+ int ret;
+
+ if (routing->num_routes > V4L2_FRAME_DESC_ENTRY_MAX)
+ return -EINVAL;
+
+ ret = v4l2_subdev_routing_validate(sd, routing,
+ V4L2_SUBDEV_ROUTING_ONLY_1_TO_1 |
+ V4L2_SUBDEV_ROUTING_NO_SOURCE_MULTIPLEXING);
+ if (ret)
+ return ret;
+
+ ret = v4l2_subdev_set_routing_with_fmt(sd, state, routing,
+ &risp_default_fmt);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static const struct v4l2_subdev_pad_ops risp_pad_ops = {
.enable_streams = risp_enable_streams,
.disable_streams = risp_disable_streams,
.set_fmt = risp_set_pad_format,
.get_fmt = v4l2_subdev_get_fmt,
.link_validate = v4l2_subdev_link_validate_default,
+ .set_routing = risp_set_routing,
};
static const struct v4l2_subdev_ops rcar_isp_subdev_ops = {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH 00/18] media: rcar: Streams support
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
` (17 preceding siblings ...)
2025-02-19 13:49 ` [PATCH 18/18] media: rcar-isp: " Tomi Valkeinen
@ 2025-02-19 14:22 ` Niklas Söderlund
2025-02-19 14:41 ` Tomi Valkeinen
18 siblings, 1 reply; 27+ messages in thread
From: Niklas Söderlund @ 2025-02-19 14:22 UTC (permalink / raw)
To: Tomi Valkeinen
Cc: Mauro Carvalho Chehab, Sakari Ailus, linux-media,
linux-renesas-soc, linux-kernel, Mauro Carvalho Chehab,
Laurent Pinchart, Jacopo Mondi
Hi Tomi,
I'm happy to see this, nice work.
Unfortunately it does not apply to the media-tree. As this series is a
mix of fixes and new features as well as covering multiple drivers. Do
you think it would make sens to break out the fixes per driver which we
could review and apply ASAP and the new features which we can review but
need to wait until the dependencies are meet?
If the new features depends on stuff that is hard to upport, maybe just
focus on the fixes to get them out of the way?
On 2025-02-19 15:48:54 +0200, Tomi Valkeinen wrote:
> Add streams support to Renesas rcar platform driver.
>
> The series attempts to keep compatibility with the current upstream.
> However, in upstream there's some kind of custom multi-stream support
> implemented to the rcar driver, which breaks at patch "media: rcar-csi2:
> Simplify rcsi2_calc_mbps()".
I would not worry about breaking the make shift multi-stream, it was
based on our first attempt to allow streams for GMSL many years ago and
it was bonkers ;-) As long as it don't break a single streams, even from
subdevs that do not themself support streams I'm happy.
>
> The behavior should not change when using a single stream.
>
> A problem with the series currently is that it has a lot of
> dependencies that are not in upstream yet.
>
> Testing is even more problematic, as the only way currently for me to
> get multiple streams is by using the GMSL2 deserializer add-on board
> with GMSL2 serializers. These are not supported in upstream. If someone
> has the hardware and wants to test, I can share the very-WIP branch that
> contains the missing pieces.
>
> Tomi
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
> ---
> Tomi Valkeinen (18):
> media: rcar-vin: Add RCAR_GEN4 model value
> media: rcar-vin: Fix RAW8
> media: rcar-vin: Fix RAW10
> media: rcar-isp: Improve ISPPROCMODE_DT_PROC_MODE_VC
> media: rcar-isp: Move {enable|disable}_streams() calls
> media: rcar-csi2: Move {enable|disable}_streams() calls
> media: rcar-csi2: Fix typo
> media: rcar-csi2: Move rcar2_calc_mbps()
> media: rcar-csi2: Simplify rcsi2_calc_mbps()
> media: rcar-csi2: Optimize rcsi2_calc_mbps()
> media: rcar-csi2: Switch to Streams API
> media: rcar-isp: Switch to Streams API
> media: rcar-csi2: Add .get_frame_desc op
> media: rcar-isp: Call get_frame_desc to find out VC & DT
> media: rcar-csi2: Add more stream support to rcsi2_calc_mbps()
> media: rcar-csi2: Call get_frame_desc to find out VC & DT (Gen3)
> media: rcar-csi2: Add full streams support
> media: rcar-isp: Add full streams support
>
> drivers/media/platform/renesas/rcar-csi2.c | 430 ++++++++++++++-------
> drivers/media/platform/renesas/rcar-isp.c | 228 ++++++++---
> .../media/platform/renesas/rcar-vin/rcar-core.c | 2 +-
> drivers/media/platform/renesas/rcar-vin/rcar-dma.c | 20 +-
> .../media/platform/renesas/rcar-vin/rcar-v4l2.c | 8 +-
> drivers/media/platform/renesas/rcar-vin/rcar-vin.h | 1 +
> 6 files changed, 499 insertions(+), 190 deletions(-)
> ---
> base-commit: c4b7779abc6633677e6edb79e2809f4f61fde157
> change-id: 20250219-rcar-streams-1fdea8860e5e
> prerequisite-message-id: <20240129202254.1126012-1-niklas.soderlund+renesas@ragnatech.se>
> prerequisite-patch-id: 23c9dfd64dd6176312d50191e60b0a92937c0051
> prerequisite-patch-id: c49831184e0a6ff063cadbc79381c0f68d5b0f63
> prerequisite-patch-id: 47104e797dfef692022a72cb62d7fad2fc44f0f5
> prerequisite-patch-id: c89cf1fd9e528e6685ba8ce1e93e94f019f43913
> prerequisite-patch-id: e096565500ed748974824328adf14905ae40bcaa
> prerequisite-patch-id: 87a61e2c15f59928a96e9213c338cc2a65344c58
> prerequisite-message-id: <20240129195954.1110643-1-niklas.soderlund+renesas@ragnatech.se>
> prerequisite-patch-id: 748963119debbf990374b9eb06659381a3924824
> prerequisite-change-id: 20250120-rcar-media-impro-2c37c1036e19:v1
> prerequisite-patch-id: 3741e9cc665b78b56d18eee0041626d3c739dad5
> prerequisite-patch-id: 99a13857e0de3c1cadc7a971f6c3fb4449599313
> prerequisite-patch-id: a034cd446e21ba28273607f1d928c13739fb83f9
> prerequisite-patch-id: cdf480b4562e749c4190ceec50e78a8dac155bd5
> prerequisite-patch-id: 94c99ecd291d3d3f86b148406bbc383405016f2a
> prerequisite-patch-id: 690790ff01515aa452e73581c3ee4312246bfbc2
> prerequisite-patch-id: 74c5bed5396ef54ded950b9c449ea23b8f67636b
> prerequisite-patch-id: 3a6b197715760886ab383fefe1d5f95f40d8b063
> prerequisite-patch-id: e9f04f626ae08c981faa66de72663e8940a4f92e
> prerequisite-patch-id: 58b5dc8fd9026dcfede60b005294692964def2a1
> prerequisite-message-id: <20250210175615.1686529-1-niklas.soderlund+renesas@ragnatech.se>
> prerequisite-patch-id: a4aa6a184c6a21fc4536c11e14d9b5cc61f13346
> prerequisite-patch-id: 1b0091875529d392b142814005baa38b2ef77f98
> prerequisite-patch-id: 4c960ae93b1e663b11194903ed1810e0ed1e4f59
> prerequisite-patch-id: a5641e1dcad0f39baef8996b6731a471046f18f9
> prerequisite-patch-id: 481317ba4b987cbb069c31f3372686a59c0fcb67
> prerequisite-change-id: 20250218-frame-desc-passthrough-66805e413974:v2
> prerequisite-patch-id: da0097f1a6c5b58f87210acd974d7eba0b721dc3
> prerequisite-patch-id: 7cc5997549353a7e300f4778fd883e900d2251b2
> prerequisite-patch-id: 57d4622505842a9c9b8cbedb49745a155826c464
>
> Best regards,
> --
> Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
>
--
Kind Regards,
Niklas Söderlund
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 07/18] media: rcar-csi2: Fix typo
2025-02-19 13:49 ` [PATCH 07/18] media: rcar-csi2: Fix typo Tomi Valkeinen
@ 2025-02-19 14:24 ` Niklas Söderlund
2025-02-19 14:36 ` Tomi Valkeinen
0 siblings, 1 reply; 27+ messages in thread
From: Niklas Söderlund @ 2025-02-19 14:24 UTC (permalink / raw)
To: Tomi Valkeinen
Cc: Mauro Carvalho Chehab, Sakari Ailus, linux-media,
linux-renesas-soc, linux-kernel, Mauro Carvalho Chehab,
Laurent Pinchart, Jacopo Mondi
Hi Tomi,
On 2025-02-19 15:49:01 +0200, Tomi Valkeinen wrote:
> Fix typo with variable name 'msps'.
FWIW, this is not a typo, C-PHY uses symbols per seconds, not bits per
second.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
> ---
> drivers/media/platform/renesas/rcar-csi2.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
> index 845fb3e155f1..92697ea3df01 100644
> --- a/drivers/media/platform/renesas/rcar-csi2.c
> +++ b/drivers/media/platform/renesas/rcar-csi2.c
> @@ -1301,7 +1301,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
> const struct rcar_csi2_format *format;
> const struct v4l2_mbus_framefmt *fmt;
> unsigned int lanes;
> - int msps;
> + int mbps;
> int ret;
>
> /* Use the format on the sink pad to compute the receiver config. */
> @@ -1314,9 +1314,9 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
> if (ret)
> return ret;
>
> - msps = rcsi2_calc_mbps(priv, format->bpp, lanes);
> - if (msps < 0)
> - return msps;
> + mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
> + if (mbps < 0)
> + return mbps;
>
> /* Reset LINK and PHY*/
> rcsi2_write(priv, V4H_CSI2_RESETN_REG, 0);
> @@ -1352,7 +1352,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
> rcsi2_write16(priv, V4H_PPI_RW_COMMON_CFG_REG, 0x0003);
>
> /* C-PHY settings */
> - ret = rcsi2_c_phy_setting_v4h(priv, msps);
> + ret = rcsi2_c_phy_setting_v4h(priv, mbps);
> if (ret)
> return ret;
>
>
> --
> 2.43.0
>
--
Kind Regards,
Niklas Söderlund
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 07/18] media: rcar-csi2: Fix typo
2025-02-19 14:24 ` Niklas Söderlund
@ 2025-02-19 14:36 ` Tomi Valkeinen
2025-02-19 14:46 ` Niklas Söderlund
0 siblings, 1 reply; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 14:36 UTC (permalink / raw)
To: Niklas Söderlund
Cc: Mauro Carvalho Chehab, Sakari Ailus, linux-media,
linux-renesas-soc, linux-kernel, Mauro Carvalho Chehab,
Laurent Pinchart, Jacopo Mondi
Hi,
On 19/02/2025 16:24, Niklas Söderlund wrote:
> Hi Tomi,
>
> On 2025-02-19 15:49:01 +0200, Tomi Valkeinen wrote:
>> Fix typo with variable name 'msps'.
>
> FWIW, this is not a typo, C-PHY uses symbols per seconds, not bits per
> second.
Hmm, but the code calls rcsi2_calc_mbps() and uses the returned value as
msps. How can that be right, if it's symbols?
Tomi
>>
>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
>> ---
>> drivers/media/platform/renesas/rcar-csi2.c | 10 +++++-----
>> 1 file changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
>> index 845fb3e155f1..92697ea3df01 100644
>> --- a/drivers/media/platform/renesas/rcar-csi2.c
>> +++ b/drivers/media/platform/renesas/rcar-csi2.c
>> @@ -1301,7 +1301,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
>> const struct rcar_csi2_format *format;
>> const struct v4l2_mbus_framefmt *fmt;
>> unsigned int lanes;
>> - int msps;
>> + int mbps;
>> int ret;
>>
>> /* Use the format on the sink pad to compute the receiver config. */
>> @@ -1314,9 +1314,9 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
>> if (ret)
>> return ret;
>>
>> - msps = rcsi2_calc_mbps(priv, format->bpp, lanes);
>> - if (msps < 0)
>> - return msps;
>> + mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
>> + if (mbps < 0)
>> + return mbps;
>>
>> /* Reset LINK and PHY*/
>> rcsi2_write(priv, V4H_CSI2_RESETN_REG, 0);
>> @@ -1352,7 +1352,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
>> rcsi2_write16(priv, V4H_PPI_RW_COMMON_CFG_REG, 0x0003);
>>
>> /* C-PHY settings */
>> - ret = rcsi2_c_phy_setting_v4h(priv, msps);
>> + ret = rcsi2_c_phy_setting_v4h(priv, mbps);
>> if (ret)
>> return ret;
>>
>>
>> --
>> 2.43.0
>>
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 00/18] media: rcar: Streams support
2025-02-19 14:22 ` [PATCH 00/18] media: rcar: Streams support Niklas Söderlund
@ 2025-02-19 14:41 ` Tomi Valkeinen
2025-02-19 14:56 ` Niklas Söderlund
0 siblings, 1 reply; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 14:41 UTC (permalink / raw)
To: Niklas Söderlund
Cc: Mauro Carvalho Chehab, Sakari Ailus, linux-media,
linux-renesas-soc, linux-kernel, Mauro Carvalho Chehab,
Laurent Pinchart, Jacopo Mondi
Hi,
On 19/02/2025 16:22, Niklas Söderlund wrote:
> Hi Tomi,
>
> I'm happy to see this, nice work.
>
> Unfortunately it does not apply to the media-tree. As this series is a
It should, if you apply the dependencies first. But one of the
dependencies from you is a bit old and that doesn't apply without some
conflicts resolved. So... Yes, doesn't apply =).
> mix of fixes and new features as well as covering multiple drivers. Do
> you think it would make sens to break out the fixes per driver which we
> could review and apply ASAP and the new features which we can review but
> need to wait until the dependencies are meet?
Yes. I think that's the RAW8 and RAW10 fixes. However, I can't test them
without streams and GMSL2, so...
> If the new features depends on stuff that is hard to upport, maybe just
> focus on the fixes to get them out of the way?
>
> On 2025-02-19 15:48:54 +0200, Tomi Valkeinen wrote:
>> Add streams support to Renesas rcar platform driver.
>>
>> The series attempts to keep compatibility with the current upstream.
>> However, in upstream there's some kind of custom multi-stream support
>> implemented to the rcar driver, which breaks at patch "media: rcar-csi2:
>> Simplify rcsi2_calc_mbps()".
>
> I would not worry about breaking the make shift multi-stream, it was
> based on our first attempt to allow streams for GMSL many years ago and
> it was bonkers ;-) As long as it don't break a single streams, even from
> subdevs that do not themself support streams I'm happy.
Alright. Then you're happy with this series. I hope =). I don't have
anything to test this with, and only the v4h board.
Tomi
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 07/18] media: rcar-csi2: Fix typo
2025-02-19 14:36 ` Tomi Valkeinen
@ 2025-02-19 14:46 ` Niklas Söderlund
2025-02-19 14:50 ` Tomi Valkeinen
0 siblings, 1 reply; 27+ messages in thread
From: Niklas Söderlund @ 2025-02-19 14:46 UTC (permalink / raw)
To: Tomi Valkeinen
Cc: Mauro Carvalho Chehab, Sakari Ailus, linux-media,
linux-renesas-soc, linux-kernel, Mauro Carvalho Chehab,
Laurent Pinchart, Jacopo Mondi
On 2025-02-19 16:36:27 +0200, Tomi Valkeinen wrote:
> Hi,
>
> On 19/02/2025 16:24, Niklas Söderlund wrote:
> > Hi Tomi,
> >
> > On 2025-02-19 15:49:01 +0200, Tomi Valkeinen wrote:
> > > Fix typo with variable name 'msps'.
> >
> > FWIW, this is not a typo, C-PHY uses symbols per seconds, not bits per
> > second.
>
> Hmm, but the code calls rcsi2_calc_mbps() and uses the returned value as
> msps. How can that be right, if it's symbols?
I don't recall all the details off hand, but IIRC it's just a naming
thing in the specification. I'm fine with using either, just wanted to
point out it was not a typo but intentional name.
>
> Tomi
>
> > >
> > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
> > > ---
> > > drivers/media/platform/renesas/rcar-csi2.c | 10 +++++-----
> > > 1 file changed, 5 insertions(+), 5 deletions(-)
> > >
> > > diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
> > > index 845fb3e155f1..92697ea3df01 100644
> > > --- a/drivers/media/platform/renesas/rcar-csi2.c
> > > +++ b/drivers/media/platform/renesas/rcar-csi2.c
> > > @@ -1301,7 +1301,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
> > > const struct rcar_csi2_format *format;
> > > const struct v4l2_mbus_framefmt *fmt;
> > > unsigned int lanes;
> > > - int msps;
> > > + int mbps;
> > > int ret;
> > > /* Use the format on the sink pad to compute the receiver config. */
> > > @@ -1314,9 +1314,9 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
> > > if (ret)
> > > return ret;
> > > - msps = rcsi2_calc_mbps(priv, format->bpp, lanes);
> > > - if (msps < 0)
> > > - return msps;
> > > + mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
> > > + if (mbps < 0)
> > > + return mbps;
> > > /* Reset LINK and PHY*/
> > > rcsi2_write(priv, V4H_CSI2_RESETN_REG, 0);
> > > @@ -1352,7 +1352,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
> > > rcsi2_write16(priv, V4H_PPI_RW_COMMON_CFG_REG, 0x0003);
> > > /* C-PHY settings */
> > > - ret = rcsi2_c_phy_setting_v4h(priv, msps);
> > > + ret = rcsi2_c_phy_setting_v4h(priv, mbps);
> > > if (ret)
> > > return ret;
> > >
> > > --
> > > 2.43.0
> > >
> >
>
--
Kind Regards,
Niklas Söderlund
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 07/18] media: rcar-csi2: Fix typo
2025-02-19 14:46 ` Niklas Söderlund
@ 2025-02-19 14:50 ` Tomi Valkeinen
0 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 14:50 UTC (permalink / raw)
To: Niklas Söderlund
Cc: Mauro Carvalho Chehab, Sakari Ailus, linux-media,
linux-renesas-soc, linux-kernel, Mauro Carvalho Chehab,
Laurent Pinchart, Jacopo Mondi
Hi,
On 19/02/2025 16:46, Niklas Söderlund wrote:
> On 2025-02-19 16:36:27 +0200, Tomi Valkeinen wrote:
>> Hi,
>>
>> On 19/02/2025 16:24, Niklas Söderlund wrote:
>>> Hi Tomi,
>>>
>>> On 2025-02-19 15:49:01 +0200, Tomi Valkeinen wrote:
>>>> Fix typo with variable name 'msps'.
>>>
>>> FWIW, this is not a typo, C-PHY uses symbols per seconds, not bits per
>>> second.
>>
>> Hmm, but the code calls rcsi2_calc_mbps() and uses the returned value as
>> msps. How can that be right, if it's symbols?
>
> I don't recall all the details off hand, but IIRC it's just a naming
> thing in the specification. I'm fine with using either, just wanted to
> point out it was not a typo but intentional name.
Ok. I don't mind either way that much, it was just very confusing. I'm
not familiar with C-PHY, but I thought usually "symbol" is something
else than a single bit. As msps is used in some other places in the
file, adding a comment to the place where we switch from mbps to msps
should be enough.
Tomi
>
>>
>> Tomi
>>
>>>>
>>>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
>>>> ---
>>>> drivers/media/platform/renesas/rcar-csi2.c | 10 +++++-----
>>>> 1 file changed, 5 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c
>>>> index 845fb3e155f1..92697ea3df01 100644
>>>> --- a/drivers/media/platform/renesas/rcar-csi2.c
>>>> +++ b/drivers/media/platform/renesas/rcar-csi2.c
>>>> @@ -1301,7 +1301,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
>>>> const struct rcar_csi2_format *format;
>>>> const struct v4l2_mbus_framefmt *fmt;
>>>> unsigned int lanes;
>>>> - int msps;
>>>> + int mbps;
>>>> int ret;
>>>> /* Use the format on the sink pad to compute the receiver config. */
>>>> @@ -1314,9 +1314,9 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
>>>> if (ret)
>>>> return ret;
>>>> - msps = rcsi2_calc_mbps(priv, format->bpp, lanes);
>>>> - if (msps < 0)
>>>> - return msps;
>>>> + mbps = rcsi2_calc_mbps(priv, format->bpp, lanes);
>>>> + if (mbps < 0)
>>>> + return mbps;
>>>> /* Reset LINK and PHY*/
>>>> rcsi2_write(priv, V4H_CSI2_RESETN_REG, 0);
>>>> @@ -1352,7 +1352,7 @@ static int rcsi2_start_receiver_v4h(struct rcar_csi2 *priv,
>>>> rcsi2_write16(priv, V4H_PPI_RW_COMMON_CFG_REG, 0x0003);
>>>> /* C-PHY settings */
>>>> - ret = rcsi2_c_phy_setting_v4h(priv, msps);
>>>> + ret = rcsi2_c_phy_setting_v4h(priv, mbps);
>>>> if (ret)
>>>> return ret;
>>>>
>>>> --
>>>> 2.43.0
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 00/18] media: rcar: Streams support
2025-02-19 14:41 ` Tomi Valkeinen
@ 2025-02-19 14:56 ` Niklas Söderlund
2025-02-19 15:00 ` Tomi Valkeinen
0 siblings, 1 reply; 27+ messages in thread
From: Niklas Söderlund @ 2025-02-19 14:56 UTC (permalink / raw)
To: Tomi Valkeinen
Cc: Mauro Carvalho Chehab, Sakari Ailus, linux-media,
linux-renesas-soc, linux-kernel, Mauro Carvalho Chehab,
Laurent Pinchart, Jacopo Mondi
On 2025-02-19 16:41:24 +0200, Tomi Valkeinen wrote:
> Hi,
>
> On 19/02/2025 16:22, Niklas Söderlund wrote:
> > Hi Tomi,
> >
> > I'm happy to see this, nice work.
> >
> > Unfortunately it does not apply to the media-tree. As this series is a
>
> It should, if you apply the dependencies first. But one of the dependencies
> from you is a bit old and that doesn't apply without some conflicts
> resolved. So... Yes, doesn't apply =).
:-)
>
> > mix of fixes and new features as well as covering multiple drivers. Do
> > you think it would make sens to break out the fixes per driver which we
> > could review and apply ASAP and the new features which we can review but
> > need to wait until the dependencies are meet?
>
> Yes. I think that's the RAW8 and RAW10 fixes. However, I can't test them
> without streams and GMSL2, so...
Sure but the fixes for the format setup registers don't depend on
streams support, right? The fixes are properly tested but depend on new
features to enable hardware to produce the test environment. It's miles
better then the BSP testing done when these things where first
written...
>
> > If the new features depends on stuff that is hard to upport, maybe just
> > focus on the fixes to get them out of the way?
> >
> > On 2025-02-19 15:48:54 +0200, Tomi Valkeinen wrote:
> > > Add streams support to Renesas rcar platform driver.
> > >
> > > The series attempts to keep compatibility with the current upstream.
> > > However, in upstream there's some kind of custom multi-stream support
> > > implemented to the rcar driver, which breaks at patch "media: rcar-csi2:
> > > Simplify rcsi2_calc_mbps()".
> >
> > I would not worry about breaking the make shift multi-stream, it was
> > based on our first attempt to allow streams for GMSL many years ago and
> > it was bonkers ;-) As long as it don't break a single streams, even from
> > subdevs that do not themself support streams I'm happy.
>
> Alright. Then you're happy with this series. I hope =). I don't have
> anything to test this with, and only the v4h board.
You can test single stream on V4H using the staging GMSL2 driver and the
TPG. I will ofc also test it so no need if it's troublesome for you to
rewire the V4H you have to this configuration.
--
Kind Regards,
Niklas Söderlund
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 00/18] media: rcar: Streams support
2025-02-19 14:56 ` Niklas Söderlund
@ 2025-02-19 15:00 ` Tomi Valkeinen
0 siblings, 0 replies; 27+ messages in thread
From: Tomi Valkeinen @ 2025-02-19 15:00 UTC (permalink / raw)
To: Niklas Söderlund
Cc: Mauro Carvalho Chehab, Sakari Ailus, linux-media,
linux-renesas-soc, linux-kernel, Mauro Carvalho Chehab,
Laurent Pinchart, Jacopo Mondi
Hi,
On 19/02/2025 16:56, Niklas Söderlund wrote:
> On 2025-02-19 16:41:24 +0200, Tomi Valkeinen wrote:
>> Hi,
>>
>> On 19/02/2025 16:22, Niklas Söderlund wrote:
>>> Hi Tomi,
>>>
>>> I'm happy to see this, nice work.
>>>
>>> Unfortunately it does not apply to the media-tree. As this series is a
>>
>> It should, if you apply the dependencies first. But one of the dependencies
>> from you is a bit old and that doesn't apply without some conflicts
>> resolved. So... Yes, doesn't apply =).
>
> :-)
>
>>
>>> mix of fixes and new features as well as covering multiple drivers. Do
>>> you think it would make sens to break out the fixes per driver which we
>>> could review and apply ASAP and the new features which we can review but
>>> need to wait until the dependencies are meet?
>>
>> Yes. I think that's the RAW8 and RAW10 fixes. However, I can't test them
>> without streams and GMSL2, so...
>
> Sure but the fixes for the format setup registers don't depend on
> streams support, right? The fixes are properly tested but depend on new
> features to enable hardware to produce the test environment. It's miles
> better then the BSP testing done when these things where first
> written...
If you say so. I'm reluctant to apply fixes that I can only test with a
huge pile of other stuff =).
>>
>>> If the new features depends on stuff that is hard to upport, maybe just
>>> focus on the fixes to get them out of the way?
>>>
>>> On 2025-02-19 15:48:54 +0200, Tomi Valkeinen wrote:
>>>> Add streams support to Renesas rcar platform driver.
>>>>
>>>> The series attempts to keep compatibility with the current upstream.
>>>> However, in upstream there's some kind of custom multi-stream support
>>>> implemented to the rcar driver, which breaks at patch "media: rcar-csi2:
>>>> Simplify rcsi2_calc_mbps()".
>>>
>>> I would not worry about breaking the make shift multi-stream, it was
>>> based on our first attempt to allow streams for GMSL many years ago and
>>> it was bonkers ;-) As long as it don't break a single streams, even from
>>> subdevs that do not themself support streams I'm happy.
>>
>> Alright. Then you're happy with this series. I hope =). I don't have
>> anything to test this with, and only the v4h board.
>
> You can test single stream on V4H using the staging GMSL2 driver and the
> TPG. I will ofc also test it so no need if it's troublesome for you to
> rewire the V4H you have to this configuration.
Yes, that I have tested. So I have used my V4H board with two GMSL2
deserializers + imx219 cameras, with unpublished GMSL drivers, and some
other stuff. And I have tested (just the patches in this series, and the
dependencies, no "other stuff") with the upstream staging driver with
deser TPG.
I meant that I can't test this with anything "real" except with the full
multi-stream gmsl setup. It would be great to be able to just plug in a
single imx219 or such, but, nope.
Tomi
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2025-02-19 15:00 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-19 13:48 [PATCH 00/18] media: rcar: Streams support Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 01/18] media: rcar-vin: Add RCAR_GEN4 model value Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 02/18] media: rcar-vin: Fix RAW8 Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 03/18] media: rcar-vin: Fix RAW10 Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 04/18] media: rcar-isp: Improve ISPPROCMODE_DT_PROC_MODE_VC Tomi Valkeinen
2025-02-19 13:48 ` [PATCH 05/18] media: rcar-isp: Move {enable|disable}_streams() calls Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 06/18] media: rcar-csi2: " Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 07/18] media: rcar-csi2: Fix typo Tomi Valkeinen
2025-02-19 14:24 ` Niklas Söderlund
2025-02-19 14:36 ` Tomi Valkeinen
2025-02-19 14:46 ` Niklas Söderlund
2025-02-19 14:50 ` Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 08/18] media: rcar-csi2: Move rcar2_calc_mbps() Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 09/18] media: rcar-csi2: Simplify rcsi2_calc_mbps() Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 10/18] media: rcar-csi2: Optimize rcsi2_calc_mbps() Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 11/18] media: rcar-csi2: Switch to Streams API Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 12/18] media: rcar-isp: " Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 13/18] media: rcar-csi2: Add .get_frame_desc op Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 14/18] media: rcar-isp: Call get_frame_desc to find out VC & DT Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 15/18] media: rcar-csi2: Add more stream support to rcsi2_calc_mbps() Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 16/18] media: rcar-csi2: Call get_frame_desc to find out VC & DT (Gen3) Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 17/18] media: rcar-csi2: Add full streams support Tomi Valkeinen
2025-02-19 13:49 ` [PATCH 18/18] media: rcar-isp: " Tomi Valkeinen
2025-02-19 14:22 ` [PATCH 00/18] media: rcar: Streams support Niklas Söderlund
2025-02-19 14:41 ` Tomi Valkeinen
2025-02-19 14:56 ` Niklas Söderlund
2025-02-19 15:00 ` Tomi Valkeinen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox