* [PATCH 01/16] dt-bindings: display: bridge: renesas,dsi: Document RZ/G3L
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
@ 2026-07-04 9:34 ` Biju
2026-07-08 8:29 ` Krzysztof Kozlowski
2026-07-04 9:34 ` [PATCH 02/16] drm: renesas: rzg2l_mipi_dsi: Add dphyctrl0_init_val to hw_info Biju
` (14 subsequent siblings)
15 siblings, 1 reply; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Andrzej Hajda, Neil Armstrong, Robert Foss, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm
Cc: Biju Das, Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Luca Ceresoli, dri-devel, devicetree, linux-kernel,
linux-renesas-soc, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
The RZ/G3L DSI IP is similar to the RZ/G2L but has different global PHY
timings and also the PLLCLK is ungateble clock. Add the compatible
string "renesas,r9a08g046-mipi-dsi" to handle these difference for the
Renesas RZ/G3L SoC. The power to DSI region is controlled by SYSC block.
Document renesas,sysc-pwrrdy property to handle the power control.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
.../bindings/display/bridge/renesas,dsi.yaml | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml b/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
index c20625b8425e..b114ac3b111a 100644
--- a/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
+++ b/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
@@ -28,6 +28,7 @@ properties:
- const: renesas,r9a09g057-mipi-dsi
- enum:
+ - renesas,r9a08g046-mipi-dsi # RZ/G3L
- renesas,r9a09g057-mipi-dsi # RZ/V2H(P)
reg:
@@ -108,6 +109,20 @@ properties:
power-domains:
maxItems: 1
+ renesas,sysc-pwrrdy:
+ description:
+ The system controller PWRRDY indicates to the DSI region, if the power
+ supply is ready. PWRRDY needs to be set during power-on before applying
+ any other settings. It also needs to be set before powering off the DSI.
+ $ref: /schemas/types.yaml#/definitions/phandle-array
+ items:
+ - items:
+ - description:
+ System controller phandle required by DSI driver to set
+ PWRRDY
+ - description: Register offset associated with PWRRDY
+ - description: Register bitmask associated with PWRRDY
+
ports:
$ref: /schemas/graph.yaml#/properties/ports
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* Re: [PATCH 01/16] dt-bindings: display: bridge: renesas,dsi: Document RZ/G3L
2026-07-04 9:34 ` [PATCH 01/16] dt-bindings: display: bridge: renesas,dsi: Document RZ/G3L Biju
@ 2026-07-08 8:29 ` Krzysztof Kozlowski
2026-07-08 9:39 ` Biju Das
0 siblings, 1 reply; 25+ messages in thread
From: Krzysztof Kozlowski @ 2026-07-08 8:29 UTC (permalink / raw)
To: Biju
Cc: Andrzej Hajda, Neil Armstrong, Robert Foss, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Biju Das, Laurent Pinchart,
Jonas Karlman, Jernej Skrabec, Luca Ceresoli, dri-devel,
devicetree, linux-kernel, linux-renesas-soc,
Prabhakar Mahadev Lad
On Sat, Jul 04, 2026 at 10:34:11AM +0100, Biju wrote:
> From: Biju Das <biju.das.jz@bp.renesas.com>
>
> The RZ/G3L DSI IP is similar to the RZ/G2L but has different global PHY
> timings and also the PLLCLK is ungateble clock. Add the compatible
> string "renesas,r9a08g046-mipi-dsi" to handle these difference for the
> Renesas RZ/G3L SoC. The power to DSI region is controlled by SYSC block.
> Document renesas,sysc-pwrrdy property to handle the power control.
>
> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
> ---
> .../bindings/display/bridge/renesas,dsi.yaml | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml b/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
> index c20625b8425e..b114ac3b111a 100644
> --- a/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
> +++ b/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
> @@ -28,6 +28,7 @@ properties:
> - const: renesas,r9a09g057-mipi-dsi
>
> - enum:
> + - renesas,r9a08g046-mipi-dsi # RZ/G3L
> - renesas,r9a09g057-mipi-dsi # RZ/V2H(P)
>
> reg:
> @@ -108,6 +109,20 @@ properties:
> power-domains:
> maxItems: 1
>
> + renesas,sysc-pwrrdy:
> + description:
> + The system controller PWRRDY indicates to the DSI region, if the power
> + supply is ready. PWRRDY needs to be set during power-on before applying
> + any other settings. It also needs to be set before powering off the DSI.
> + $ref: /schemas/types.yaml#/definitions/phandle-array
This feels a lot like a power domain. Please elaborate what is PWRRDY
and why power-on/off and power status within SoC (important!) is not
encoded as power domain.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 25+ messages in thread
* RE: [PATCH 01/16] dt-bindings: display: bridge: renesas,dsi: Document RZ/G3L
2026-07-08 8:29 ` Krzysztof Kozlowski
@ 2026-07-08 9:39 ` Biju Das
0 siblings, 0 replies; 25+ messages in thread
From: Biju Das @ 2026-07-08 9:39 UTC (permalink / raw)
To: Krzysztof Kozlowski, biju.das.au
Cc: Andrzej Hajda, Neil Armstrong, Robert Foss, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, magnus.damm, laurent.pinchart, Jonas Karlman,
Jernej Skrabec, Luca Ceresoli, dri-devel@lists.freedesktop.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-renesas-soc@vger.kernel.org, Prabhakar Mahadev Lad
Hi Krzysztof Kozlowski,
Thanks for the feedback.
> -----Original Message-----
> From: Krzysztof Kozlowski <krzk@kernel.org>
> Sent: 08 July 2026 09:30
> Subject: Re: [PATCH 01/16] dt-bindings: display: bridge: renesas,dsi: Document RZ/G3L
>
> On Sat, Jul 04, 2026 at 10:34:11AM +0100, Biju wrote:
> > From: Biju Das <biju.das.jz@bp.renesas.com>
> >
> > The RZ/G3L DSI IP is similar to the RZ/G2L but has different global
> > PHY timings and also the PLLCLK is ungateble clock. Add the compatible
> > string "renesas,r9a08g046-mipi-dsi" to handle these difference for the
> > Renesas RZ/G3L SoC. The power to DSI region is controlled by SYSC block.
> > Document renesas,sysc-pwrrdy property to handle the power control.
> >
> > Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
> > ---
> > .../bindings/display/bridge/renesas,dsi.yaml | 15 +++++++++++++++
> > 1 file changed, 15 insertions(+)
> >
> > diff --git
> > a/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
> > b/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
> > index c20625b8425e..b114ac3b111a 100644
> > ---
> > a/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
> > +++ b/Documentation/devicetree/bindings/display/bridge/renesas,dsi.yam
> > +++ l
> > @@ -28,6 +28,7 @@ properties:
> > - const: renesas,r9a09g057-mipi-dsi
> >
> > - enum:
> > + - renesas,r9a08g046-mipi-dsi # RZ/G3L
> > - renesas,r9a09g057-mipi-dsi # RZ/V2H(P)
> >
> > reg:
> > @@ -108,6 +109,20 @@ properties:
> > power-domains:
> > maxItems: 1
> >
> > + renesas,sysc-pwrrdy:
> > + description:
> > + The system controller PWRRDY indicates to the DSI region, if the power
> > + supply is ready. PWRRDY needs to be set during power-on before applying
> > + any other settings. It also needs to be set before powering off the DSI.
> > + $ref: /schemas/types.yaml#/definitions/phandle-array
>
> This feels a lot like a power domain. Please elaborate what is PWRRDY and why power-on/off and power
> status within SoC (important!) is not encoded as power domain.
We already tried modelling signal as power domain in RZ/G3S and finally Ulf
agreed that it cannot be power-domain[1]
" SYSC signal seems best to be modelled as a reset.
Although, it looks like the USB PM domain provider should rather be
the consumer of that reset, instead of having the reset being consumed
by the consumers of the USB PM domain."
Then Phillip proposed power sequencing driver[2] and finally he and Rob ok for the
solution [3]
[1] https://lore.kernel.org/all/CAPDyKFpLnREr4C=wZ7o8Lb-CZbQa4Nr2VTuYdZHZ26Rcb1Masg@mail.gmail.com/
[2] https://lore.kernel.org/all/c7fc31f1247332196516394a22f6feef9733a0b4.camel@pengutronix.de/#t
[3] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/Documentation/devicetree/bindings/reset/renesas,rzg2l-usbphy-ctrl.yaml?h=next-20260707&id=20eee0f69c9034a0f613528f829dcaca192740d5
Cheers,
Biju
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 02/16] drm: renesas: rzg2l_mipi_dsi: Add dphyctrl0_init_val to hw_info
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
2026-07-04 9:34 ` [PATCH 01/16] dt-bindings: display: bridge: renesas,dsi: Document RZ/G3L Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 03/16] drm: renesas: rzg2l_mipi_dsi: Add activation_dly " Biju
` (13 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter
Cc: dri-devel, linux-renesas-soc, linux-kernel, Geert Uytterhoeven,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Move the DSIDPHYCTRL0 initialization value into the hw_info structure as
dphyctrl0_init_val, allowing SoC-specific D-PHY control register
initialization to be defined per compatible. This prepares the driver for
supporting SoCs that require a different initial DSIDPHYCTRL0 value.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
index 0590ade96b91..2128fd16ebc9 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
@@ -56,6 +56,7 @@ struct rzg2l_mipi_dsi_hw_info {
} cpg_plldsi;
u32 phy_reg_offset;
u32 link_reg_offset;
+ u32 dphyctrl0_init_val;
unsigned long min_dclk;
unsigned long max_dclk;
u8 features;
@@ -493,9 +494,7 @@ static int rzg2l_mipi_dsi_dphy_init(struct rzg2l_mipi_dsi *dsi,
}
/* Initializing DPHY before accessing LINK */
- dphyctrl0 = DSIDPHYCTRL0_CAL_EN_HSRX_OFS | DSIDPHYCTRL0_CMN_MASTER_EN |
- DSIDPHYCTRL0_RE_VDD_DETVCCQLV18 | DSIDPHYCTRL0_EN_BGR;
-
+ dphyctrl0 = dsi->info->dphyctrl0_init_val;
rzg2l_mipi_dsi_phy_write(dsi, DSIDPHYCTRL0, dphyctrl0);
usleep_range(20, 30);
@@ -1531,6 +1530,8 @@ static const struct rzg2l_mipi_dsi_hw_info rzg2l_mipi_dsi_info = {
.dphy_exit = rzg2l_mipi_dsi_dphy_exit,
.dphy_conf_clks = rzg2l_dphy_conf_clks,
.link_reg_offset = 0x10000,
+ .dphyctrl0_init_val = DSIDPHYCTRL0_CAL_EN_HSRX_OFS | DSIDPHYCTRL0_CMN_MASTER_EN |
+ DSIDPHYCTRL0_RE_VDD_DETVCCQLV18 | DSIDPHYCTRL0_EN_BGR,
.min_dclk = 5803,
.max_dclk = 148500,
};
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 03/16] drm: renesas: rzg2l_mipi_dsi: Add activation_dly to hw_info
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
2026-07-04 9:34 ` [PATCH 01/16] dt-bindings: display: bridge: renesas,dsi: Document RZ/G3L Biju
2026-07-04 9:34 ` [PATCH 02/16] drm: renesas: rzg2l_mipi_dsi: Add dphyctrl0_init_val to hw_info Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 04/16] drm: renesas: rzg2l_mipi_dsi: Move global timings into hardware info struct Biju
` (12 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter
Cc: dri-devel, linux-renesas-soc, linux-kernel, Geert Uytterhoeven,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Move the post-reset activation delay into the hw_info structure as
activation_dly, allowing SoC-specific values to be defined per
compatible. This prepares the driver for supporting SoCs that require a
different delay after reset deassertion.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
index 2128fd16ebc9..1538eeece2b5 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
@@ -59,6 +59,7 @@ struct rzg2l_mipi_dsi_hw_info {
u32 dphyctrl0_init_val;
unsigned long min_dclk;
unsigned long max_dclk;
+ u16 activation_dly;
u8 features;
};
@@ -806,7 +807,7 @@ static int rzg2l_mipi_dsi_startup(struct rzg2l_mipi_dsi *dsi,
if (ret < 0)
goto err_phy;
- fsleep(1000);
+ fsleep(dsi->info->activation_dly);
}
return 0;
@@ -1534,6 +1535,7 @@ static const struct rzg2l_mipi_dsi_hw_info rzg2l_mipi_dsi_info = {
DSIDPHYCTRL0_RE_VDD_DETVCCQLV18 | DSIDPHYCTRL0_EN_BGR,
.min_dclk = 5803,
.max_dclk = 148500,
+ .activation_dly = 1000,
};
static const struct of_device_id rzg2l_mipi_dsi_of_table[] = {
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 04/16] drm: renesas: rzg2l_mipi_dsi: Move global timings into hardware info struct
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (2 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 03/16] drm: renesas: rzg2l_mipi_dsi: Add activation_dly " Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 05/16] drm: renesas: rzg2l_mipi_dsi: Add support for DSI PWRRDY Biju
` (11 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter
Cc: dri-devel, linux-renesas-soc, linux-kernel, Geert Uytterhoeven,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Move rzg2l_mipi_dsi_global_timings and its array size out of the hardcoded
ARRAY_SIZE reference in rzg2l_mipi_dsi_dphy_init() and into the struct
rzg2l_mipi_dsi_hw_info. This allows future hardware variants to supply
their own timing tables rather than sharing a single global array, making
the driver more extensible without code duplication.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
index 1538eeece2b5..180384c10264 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
@@ -54,6 +54,8 @@ struct rzg2l_mipi_dsi_hw_info {
const u8 *table;
const u8 table_size;
} cpg_plldsi;
+ const struct rzg2l_mipi_dsi_timings *dsi_global_timings;
+ unsigned int num_dsi_global_timings;
u32 phy_reg_offset;
u32 link_reg_offset;
u32 dphyctrl0_init_val;
@@ -488,8 +490,8 @@ static int rzg2l_mipi_dsi_dphy_init(struct rzg2l_mipi_dsi *dsi,
u32 dphytim3;
/* All DSI global operation timings are set with recommended setting */
- for (i = 0; i < ARRAY_SIZE(rzg2l_mipi_dsi_global_timings); ++i) {
- dphy_timings = &rzg2l_mipi_dsi_global_timings[i];
+ for (i = 0; i < dsi->info->num_dsi_global_timings; ++i) {
+ dphy_timings = &dsi->info->dsi_global_timings[i];
if (hsfreq <= dphy_timings->hsfreq_max)
break;
}
@@ -1519,6 +1521,8 @@ static const struct rzg2l_mipi_dsi_hw_info rzv2h_mipi_dsi_info = {
.cpg_plldsi.limits = rzv2h_plldsi_limits,
.cpg_plldsi.table = rzv2h_cpg_div_table,
.cpg_plldsi.table_size = ARRAY_SIZE(rzv2h_cpg_div_table),
+ .dsi_global_timings = rzg2l_mipi_dsi_global_timings,
+ .num_dsi_global_timings = ARRAY_SIZE(rzg2l_mipi_dsi_global_timings),
.phy_reg_offset = 0x10000,
.link_reg_offset = 0,
.min_dclk = 5440,
@@ -1530,6 +1534,8 @@ static const struct rzg2l_mipi_dsi_hw_info rzg2l_mipi_dsi_info = {
.dphy_init = rzg2l_mipi_dsi_dphy_init,
.dphy_exit = rzg2l_mipi_dsi_dphy_exit,
.dphy_conf_clks = rzg2l_dphy_conf_clks,
+ .dsi_global_timings = rzg2l_mipi_dsi_global_timings,
+ .num_dsi_global_timings = ARRAY_SIZE(rzg2l_mipi_dsi_global_timings),
.link_reg_offset = 0x10000,
.dphyctrl0_init_val = DSIDPHYCTRL0_CAL_EN_HSRX_OFS | DSIDPHYCTRL0_CMN_MASTER_EN |
DSIDPHYCTRL0_RE_VDD_DETVCCQLV18 | DSIDPHYCTRL0_EN_BGR,
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 05/16] drm: renesas: rzg2l_mipi_dsi: Add support for DSI PWRRDY
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (3 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 04/16] drm: renesas: rzg2l_mipi_dsi: Move global timings into hardware info struct Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 06/16] drm: renesas: rzg2l_mipi_dsi: Add RZ/G3L MIPI DSI support Biju
` (10 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter, Geert Uytterhoeven, Magnus Damm
Cc: dri-devel, linux-renesas-soc, linux-kernel, Prabhakar Mahadev Lad,
Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
The register for controlling power to the DSI region is in the SYSC
(System Controller) block. Add support for controlling the DSI PWRRDY
signal so the driver can efficiently manage power to the DSI region.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
.../gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 56 +++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
index 180384c10264..8bd664aa69ac 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
@@ -13,11 +13,13 @@
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/math.h>
+#include <linux/mfd/syscon.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_graph.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
#include <linux/reset.h>
#include <linux/slab.h>
#include <linux/units.h>
@@ -54,6 +56,7 @@ struct rzg2l_mipi_dsi_hw_info {
const u8 *table;
const u8 table_size;
} cpg_plldsi;
+ const struct reg_field *syscon_field;
const struct rzg2l_mipi_dsi_timings *dsi_global_timings;
unsigned int num_dsi_global_timings;
u32 phy_reg_offset;
@@ -87,6 +90,8 @@ struct rzg2l_mipi_dsi {
struct clk *vclk;
struct clk *lpclk;
+ struct regmap_field *pwrrdy;
+
enum mipi_dsi_pixel_format format;
unsigned int num_data_lanes;
unsigned int lanes;
@@ -1396,6 +1401,53 @@ static const struct dev_pm_ops rzg2l_mipi_pm_ops = {
* Probe & Remove
*/
+static int rzg2l_mipi_dsi_set_pwrrdy(struct rzg2l_mipi_dsi *dsi, bool power_on)
+{
+ u32 val, mask;
+
+ mask = BIT(dsi->info->syscon_field->msb);
+ val = power_on ? 0 : mask;
+
+ return regmap_field_update_bits(dsi->pwrrdy, mask, val);
+}
+
+static void rzg2l_mipi_dsi_pwrrdy_off(void *data)
+{
+ rzg2l_mipi_dsi_set_pwrrdy(data, false);
+}
+
+static int rzg2l_mipi_dsi_pwrrdy_init(struct rzg2l_mipi_dsi *dsi)
+{
+ struct regmap *regmap;
+ u32 args[2];
+ int ret;
+
+ if (!dsi->info->syscon_field)
+ return 0;
+
+ regmap = syscon_regmap_lookup_by_phandle_args(dsi->dev->of_node,
+ "renesas,sysc-pwrrdy",
+ ARRAY_SIZE(args), args);
+ if (IS_ERR(regmap))
+ return PTR_ERR(regmap);
+
+ if (args[0] != dsi->info->syscon_field->reg)
+ return -EINVAL;
+
+ if (args[1] != BIT(dsi->info->syscon_field->msb))
+ return -EINVAL;
+
+ dsi->pwrrdy = devm_regmap_field_alloc(dsi->dev, regmap, *dsi->info->syscon_field);
+ if (IS_ERR(dsi->pwrrdy))
+ return PTR_ERR(dsi->pwrrdy);
+
+ ret = rzg2l_mipi_dsi_set_pwrrdy(dsi, true);
+ if (ret)
+ return ret;
+
+ return devm_add_action_or_reset(dsi->dev, rzg2l_mipi_dsi_pwrrdy_off, dsi);
+}
+
static int rzg2l_mipi_dsi_probe(struct platform_device *pdev)
{
unsigned int num_data_lanes;
@@ -1424,6 +1476,10 @@ static int rzg2l_mipi_dsi_probe(struct platform_device *pdev)
if (IS_ERR(dsi->mmio))
return PTR_ERR(dsi->mmio);
+ ret = rzg2l_mipi_dsi_pwrrdy_init(dsi);
+ if (ret)
+ return ret;
+
dsi->vclk = devm_clk_get(dsi->dev, "vclk");
if (IS_ERR(dsi->vclk))
return PTR_ERR(dsi->vclk);
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 06/16] drm: renesas: rzg2l_mipi_dsi: Add RZ/G3L MIPI DSI support
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (4 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 05/16] drm: renesas: rzg2l_mipi_dsi: Add support for DSI PWRRDY Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC Biju
` (9 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter, Geert Uytterhoeven, Magnus Damm
Cc: dri-devel, linux-renesas-soc, linux-kernel, Prabhakar Mahadev Lad,
Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add support for the MIPI DSI controller found on the Renesas RZ/G3L
(R9A08G046) SoC. The D-PHY global timing table of RZ/G3L SoC different
compared to the other SoCs. Introduce a dedicated D-PHY global timing
table rzg3l_mipi_dsi_global_timings and wire it up via a new
rzg3l_mipi_dsi_info hw_info variant for RZ/G3L SoC.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
.../gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 129 +++++++++++++++++-
1 file changed, 128 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
index 8bd664aa69ac..25f7602397dc 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
@@ -227,6 +227,107 @@ static const struct rzg2l_mipi_dsi_timings rzg2l_mipi_dsi_global_timings[] = {
},
};
+static const struct rzg2l_mipi_dsi_timings rzg3l_mipi_dsi_global_timings[] = {
+ {
+ .hsfreq_max = 100000000,
+ .t_init = 79801,
+ .tclk_prepare = 10,
+ .ths_prepare = 18,
+ .tclk_zero = 35,
+ .tclk_pre = 13,
+ .tclk_post = 94,
+ .tclk_trail = 10,
+ .ths_zero = 16,
+ .ths_trail = 22,
+ .ths_exit = 15,
+ .tlpx = 9,
+ },
+ {
+ .hsfreq_max = 150000000,
+ .t_init = 79801,
+ .tclk_prepare = 10,
+ .ths_prepare = 16,
+ .tclk_zero = 35,
+ .tclk_pre = 13,
+ .tclk_post = 94,
+ .tclk_trail = 10,
+ .ths_zero = 16,
+ .ths_trail = 15,
+ .ths_exit = 15,
+ .tlpx = 9,
+ },
+ {
+ .hsfreq_max = 250000000,
+ .t_init = 79801,
+ .tclk_prepare = 10,
+ .ths_prepare = 13,
+ .tclk_zero = 35,
+ .tclk_pre = 13,
+ .tclk_post = 58,
+ .tclk_trail = 8,
+ .ths_zero = 16,
+ .ths_trail = 10,
+ .ths_exit = 15,
+ .tlpx = 9,
+ },
+ {
+ .hsfreq_max = 400000000,
+ .t_init = 79801,
+ .tclk_prepare = 10,
+ .ths_prepare = 12,
+ .tclk_zero = 35,
+ .tclk_pre = 4,
+ .tclk_post = 58,
+ .tclk_trail = 7,
+ .ths_zero = 16,
+ .ths_trail = 9,
+ .ths_exit = 15,
+ .tlpx = 9,
+ },
+ {
+ .hsfreq_max = 600000000,
+ .t_init = 79801,
+ .tclk_prepare = 10,
+ .ths_prepare = 11,
+ .tclk_zero = 35,
+ .tclk_pre = 4,
+ .tclk_post = 35,
+ .tclk_trail = 5,
+ .ths_zero = 16,
+ .ths_trail = 6,
+ .ths_exit = 15,
+ .tlpx = 9,
+ },
+ {
+ .hsfreq_max = 1000000000,
+ .t_init = 79801,
+ .tclk_prepare = 10,
+ .ths_prepare = 11,
+ .tclk_zero = 35,
+ .tclk_pre = 4,
+ .tclk_post = 35,
+ .tclk_trail = 5,
+ .ths_zero = 16,
+ .ths_trail = 6,
+ .ths_exit = 15,
+ .tlpx = 9,
+ },
+ {
+ .hsfreq_max = 1500000000,
+ .t_init = 79801,
+ .tclk_prepare = 10,
+ .ths_prepare = 11,
+ .tclk_zero = 35,
+ .tclk_pre = 4,
+ .tclk_post = 35,
+ .tclk_trail = 4,
+ .ths_zero = 16,
+ .ths_trail = 5,
+ .ths_exit = 15,
+ .tlpx = 9,
+ },
+};
+
/**
* struct rzv2h_mipi_dsi_timings - Timing parameter table structure
*
@@ -1132,6 +1233,7 @@ static int rzg2l_mipi_dsi_host_attach(struct mipi_dsi_host *host,
struct mipi_dsi_device *device)
{
struct rzg2l_mipi_dsi *dsi = host_to_rzg2l_mipi_dsi(host);
+ struct clk *clk_parent;
int bpp;
int ret;
@@ -1186,7 +1288,10 @@ static int rzg2l_mipi_dsi_host_attach(struct mipi_dsi_host *host,
*/
rzg2l_cpg_dsi_div_set_divider(bpp * 2 / dsi->lanes, PLL5_TARGET_DSI);
- return 0;
+ /* DSI has symmetric 50% duty cycle */
+ clk_parent = clk_get_parent(dsi->vclk);
+
+ return clk_set_duty_cycle(clk_parent, 1, 2);
}
static int rzg2l_mipi_dsi_host_detach(struct mipi_dsi_host *host,
@@ -1600,7 +1705,29 @@ static const struct rzg2l_mipi_dsi_hw_info rzg2l_mipi_dsi_info = {
.activation_dly = 1000,
};
+static const struct reg_field rzg3l_pwrrdy_reg_field = {
+ .reg = 0xd70,
+ .lsb = 0,
+ .msb = 1,
+};
+
+static const struct rzg2l_mipi_dsi_hw_info rzg3l_mipi_dsi_info = {
+ .dphy_init = rzg2l_mipi_dsi_dphy_init,
+ .dphy_exit = rzg2l_mipi_dsi_dphy_exit,
+ .dphy_conf_clks = rzg2l_dphy_conf_clks,
+ .syscon_field = &rzg3l_pwrrdy_reg_field,
+ .dsi_global_timings = rzg3l_mipi_dsi_global_timings,
+ .num_dsi_global_timings = ARRAY_SIZE(rzg3l_mipi_dsi_global_timings),
+ .link_reg_offset = 0x10000,
+ .dphyctrl0_init_val = DSIDPHYCTRL0_CMN_MASTER_EN | DSIDPHYCTRL0_EN_BGR,
+ .min_dclk = 5440,
+ .max_dclk = 187500,
+ .activation_dly = 100,
+ .features = RZ_MIPI_DSI_FEATURE_16BPP,
+};
+
static const struct of_device_id rzg2l_mipi_dsi_of_table[] = {
+ { .compatible = "renesas,r9a08g046-mipi-dsi", .data = &rzg3l_mipi_dsi_info, },
{ .compatible = "renesas,r9a09g057-mipi-dsi", .data = &rzv2h_mipi_dsi_info, },
{ .compatible = "renesas,rzg2l-mipi-dsi", .data = &rzg2l_mipi_dsi_info, },
{ /* sentinel */ }
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (5 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 06/16] drm: renesas: rzg2l_mipi_dsi: Add RZ/G3L MIPI DSI support Biju
@ 2026-07-04 9:34 ` Biju
2026-07-08 8:30 ` Krzysztof Kozlowski
2026-07-08 16:45 ` Tommaso Merciai
2026-07-04 9:34 ` [PATCH 08/16] drm: renesas: rz-du: Add RZ/G3L (R9A08G046) DU support Biju
` (8 subsequent siblings)
15 siblings, 2 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm
Cc: Laurent Pinchart, dri-devel, linux-renesas-soc, devicetree,
linux-kernel, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
The DU block on the RZ/G3L SoC is identical to the one found on the RZ/G2L
SoC. However, it supports the DSI, DPI, and LVDS interfaces, while the
RZ/G2L supports only the DSI and DPI interfaces.
Due to this difference, a SoC-specific compatible string,
'renesas,r9a08g046-du', is added for the RZ/G3L SoC.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
.../bindings/display/renesas,rzg2l-du.yaml | 27 +++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml b/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
index 7c84a9ecc7a7..65368649fe77 100644
--- a/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
+++ b/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
@@ -20,6 +20,7 @@ properties:
- enum:
- renesas,r9a07g043u-du # RZ/G2UL
- renesas,r9a07g044-du # RZ/G2{L,LC}
+ - renesas,r9a08g046-du # RZ/G3L
- renesas,r9a09g057-du # RZ/V2H(P)
- renesas,r9a09g077-du # RZ/T2H
- items:
@@ -65,7 +66,7 @@ properties:
model-dependent. Each port shall have a single endpoint.
patternProperties:
- "^port@[0-1]$":
+ "^port@[0-2]$":
$ref: /schemas/graph.yaml#/properties/port
unevaluatedProperties: false
@@ -88,7 +89,6 @@ required:
- clocks
- clock-names
- power-domains
- - ports
- renesas,vsps
additionalProperties: false
@@ -108,6 +108,7 @@ allOf:
port@0:
description: DPI
port@1: false
+ port@2: false
required:
- port@0
@@ -124,10 +125,31 @@ allOf:
description: DSI
port@1:
description: DPI
+ port@2: false
required:
- port@0
- port@1
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: renesas,r9a08g046-du
+ then:
+ properties:
+ port:
+ properties:
+ endpoint@0:
+ description: DSI
+ endpoint@1:
+ description: DPI
+ endpoint@2:
+ description: LVDS
+
+ required:
+ - port@0
+ - port@1
+ - port@2
- if:
properties:
compatible:
@@ -140,6 +162,7 @@ allOf:
port@0:
description: DSI
port@1: false
+ port@2: false
required:
- port@0
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* Re: [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC
2026-07-04 9:34 ` [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC Biju
@ 2026-07-08 8:30 ` Krzysztof Kozlowski
2026-07-08 8:38 ` Biju Das
2026-07-08 16:45 ` Tommaso Merciai
1 sibling, 1 reply; 25+ messages in thread
From: Krzysztof Kozlowski @ 2026-07-08 8:30 UTC (permalink / raw)
To: Biju
Cc: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm, Laurent Pinchart,
dri-devel, linux-renesas-soc, devicetree, linux-kernel,
Prabhakar Mahadev Lad
On Sat, Jul 04, 2026 at 10:34:17AM +0100, Biju wrote:
> model-dependent. Each port shall have a single endpoint.
>
> patternProperties:
> - "^port@[0-1]$":
> + "^port@[0-2]$":
> $ref: /schemas/graph.yaml#/properties/port
> unevaluatedProperties: false
>
> @@ -88,7 +89,6 @@ required:
> - clocks
> - clock-names
> - power-domains
> - - ports
Why doing this change?
> - renesas,vsps
>
> additionalProperties: false
> @@ -108,6 +108,7 @@ allOf:
> port@0:
> description: DPI
> port@1: false
> + port@2: false
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 25+ messages in thread
* RE: [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC
2026-07-08 8:30 ` Krzysztof Kozlowski
@ 2026-07-08 8:38 ` Biju Das
0 siblings, 0 replies; 25+ messages in thread
From: Biju Das @ 2026-07-08 8:38 UTC (permalink / raw)
To: Krzysztof Kozlowski, biju.das.au
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, magnus.damm, Laurent Pinchart,
dri-devel@lists.freedesktop.org,
linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, Prabhakar Mahadev Lad
Hi Krzysztof Kozlowski,
Thanks for the feedback.
> -----Original Message-----
> From: Krzysztof Kozlowski <krzk@kernel.org>
> Sent: 08 July 2026 09:31
> Subject: Re: [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC
>
> On Sat, Jul 04, 2026 at 10:34:17AM +0100, Biju wrote:
> > model-dependent. Each port shall have a single endpoint.
> >
> > patternProperties:
> > - "^port@[0-1]$":
> > + "^port@[0-2]$":
> > $ref: /schemas/graph.yaml#/properties/port
> > unevaluatedProperties: false
> >
> > @@ -88,7 +89,6 @@ required:
> > - clocks
> > - clock-names
> > - power-domains
> > - - ports
>
> Why doing this change?
Oops, I forgot to undo this change. Previously, I had a version
not yet posted that removed "ports" and used "port" and "endpoints"
instead.
I will restore this in the next version.
Cheers,
Biju
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC
2026-07-04 9:34 ` [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC Biju
2026-07-08 8:30 ` Krzysztof Kozlowski
@ 2026-07-08 16:45 ` Tommaso Merciai
2026-07-08 17:12 ` Biju Das
1 sibling, 1 reply; 25+ messages in thread
From: Tommaso Merciai @ 2026-07-08 16:45 UTC (permalink / raw)
To: Biju
Cc: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm, Laurent Pinchart,
dri-devel, linux-renesas-soc, devicetree, linux-kernel,
Prabhakar Mahadev Lad
Hi Biju,
Thanks for your patch.
On Sat, Jul 04, 2026 at 10:34:17AM +0100, Biju wrote:
> From: Biju Das <biju.das.jz@bp.renesas.com>
>
> The DU block on the RZ/G3L SoC is identical to the one found on the RZ/G2L
> SoC. However, it supports the DSI, DPI, and LVDS interfaces, while the
> RZ/G2L supports only the DSI and DPI interfaces.
>
> Due to this difference, a SoC-specific compatible string,
> 'renesas,r9a08g046-du', is added for the RZ/G3L SoC.
>
> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
> ---
> .../bindings/display/renesas,rzg2l-du.yaml | 27 +++++++++++++++++--
> 1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml b/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
> index 7c84a9ecc7a7..65368649fe77 100644
> --- a/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
> +++ b/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
> @@ -20,6 +20,7 @@ properties:
> - enum:
> - renesas,r9a07g043u-du # RZ/G2UL
> - renesas,r9a07g044-du # RZ/G2{L,LC}
> + - renesas,r9a08g046-du # RZ/G3L
> - renesas,r9a09g057-du # RZ/V2H(P)
> - renesas,r9a09g077-du # RZ/T2H
> - items:
> @@ -65,7 +66,7 @@ properties:
> model-dependent. Each port shall have a single endpoint.
>
> patternProperties:
> - "^port@[0-1]$":
> + "^port@[0-2]$":
> $ref: /schemas/graph.yaml#/properties/port
> unevaluatedProperties: false
>
> @@ -88,7 +89,6 @@ required:
> - clocks
> - clock-names
> - power-domains
> - - ports
> - renesas,vsps
>
> additionalProperties: false
> @@ -108,6 +108,7 @@ allOf:
> port@0:
> description: DPI
> port@1: false
> + port@2: false
>
> required:
> - port@0
> @@ -124,10 +125,31 @@ allOf:
> description: DSI
> port@1:
> description: DPI
> + port@2: false
>
> required:
> - port@0
> - port@1
> + - if:
> + properties:
> + compatible:
> + contains:
> + const: renesas,r9a08g046-du
> + then:
> + properties:
> + port:
> + properties:
> + endpoint@0:
> + description: DSI
> + endpoint@1:
> + description: DPI
> + endpoint@2:
> + description: LVDS
I'm seeing you are using ports + port@{0,1,2} in driver and soc .dtsi
so I think here we will need to have ports + port@{0,1,2} aswell.
Kind Regards,
Tommaso
> +
> + required:
> + - port@0
> + - port@1
> + - port@2
> - if:
> properties:
> compatible:
> @@ -140,6 +162,7 @@ allOf:
> port@0:
> description: DSI
> port@1: false
> + port@2: false
>
> required:
> - port@0
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 25+ messages in thread* RE: [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC
2026-07-08 16:45 ` Tommaso Merciai
@ 2026-07-08 17:12 ` Biju Das
0 siblings, 0 replies; 25+ messages in thread
From: Biju Das @ 2026-07-08 17:12 UTC (permalink / raw)
To: Tommaso Merciai, biju.das.au
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, magnus.damm, Laurent Pinchart,
dri-devel@lists.freedesktop.org,
linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, Prabhakar Mahadev Lad
Hi Tommaso,
> -----Original Message-----
> From: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> Sent: 08 July 2026 17:46
> Subject: Re: [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC
>
> Hi Biju,
> Thanks for your patch.
>
> On Sat, Jul 04, 2026 at 10:34:17AM +0100, Biju wrote:
> > From: Biju Das <biju.das.jz@bp.renesas.com>
> >
> > The DU block on the RZ/G3L SoC is identical to the one found on the
> > RZ/G2L SoC. However, it supports the DSI, DPI, and LVDS interfaces,
> > while the RZ/G2L supports only the DSI and DPI interfaces.
> >
> > Due to this difference, a SoC-specific compatible string,
> > 'renesas,r9a08g046-du', is added for the RZ/G3L SoC.
> >
> > Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
> > ---
> > .../bindings/display/renesas,rzg2l-du.yaml | 27 +++++++++++++++++--
> > 1 file changed, 25 insertions(+), 2 deletions(-)
> >
> > diff --git
> > a/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
> > b/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
> > index 7c84a9ecc7a7..65368649fe77 100644
> > --- a/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
> > +++ b/Documentation/devicetree/bindings/display/renesas,rzg2l-du.yaml
> > @@ -20,6 +20,7 @@ properties:
> > - enum:
> > - renesas,r9a07g043u-du # RZ/G2UL
> > - renesas,r9a07g044-du # RZ/G2{L,LC}
> > + - renesas,r9a08g046-du # RZ/G3L
> > - renesas,r9a09g057-du # RZ/V2H(P)
> > - renesas,r9a09g077-du # RZ/T2H
> > - items:
> > @@ -65,7 +66,7 @@ properties:
> > model-dependent. Each port shall have a single endpoint.
> >
> > patternProperties:
> > - "^port@[0-1]$":
> > + "^port@[0-2]$":
> > $ref: /schemas/graph.yaml#/properties/port
> > unevaluatedProperties: false
> >
> > @@ -88,7 +89,6 @@ required:
> > - clocks
> > - clock-names
> > - power-domains
> > - - ports
> > - renesas,vsps
> >
> > additionalProperties: false
> > @@ -108,6 +108,7 @@ allOf:
> > port@0:
> > description: DPI
> > port@1: false
> > + port@2: false
> >
> > required:
> > - port@0
> > @@ -124,10 +125,31 @@ allOf:
> > description: DSI
> > port@1:
> > description: DPI
> > + port@2: false
> >
> > required:
> > - port@0
> > - port@1
> > + - if:
> > + properties:
> > + compatible:
> > + contains:
> > + const: renesas,r9a08g046-du
> > + then:
> > + properties:
> > + port:
> > + properties:
> > + endpoint@0:
> > + description: DSI
> > + endpoint@1:
> > + description: DPI
> > + endpoint@2:
> > + description: LVDS
>
> I'm seeing you are using ports + port@{0,1,2} in driver and soc .dtsi so I think here we will need to
> have ports + port@{0,1,2} aswell.
Good catch. My binding test did not catch this.
I will fix it in next version.
Cheers,
Biju
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 08/16] drm: renesas: rz-du: Add RZ/G3L (R9A08G046) DU support
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (6 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 07/16] dt-bindings: display: renesas,rzg2l-du: Document RZ/G3L SoC Biju
@ 2026-07-04 9:34 ` Biju
2026-07-08 17:01 ` Tommaso Merciai
2026-07-04 9:34 ` [PATCH 09/16] dt-bindings: display: bridge: Document Renesas RZ/G3L LVDS encoder Biju
` (7 subsequent siblings)
15 siblings, 1 reply; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter, Geert Uytterhoeven, Magnus Damm
Cc: dri-devel, linux-renesas-soc, linux-kernel, Prabhakar Mahadev Lad,
Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add Display Unit support for the Renesas RZ/G3L SoC (R9A08G046). It is
similar to the one found on RZ/G2L, but has LVDS support.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 22 ++++++++++++++++++-
drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h | 4 ++++
.../gpu/drm/renesas/rz-du/rzg2l_du_encoder.c | 4 ++++
.../gpu/drm/renesas/rz-du/rzg2l_du_encoder.h | 1 +
4 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
index 3d13f61d3c97..a8d841421a0b 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
@@ -55,6 +55,24 @@ static const struct rzg2l_du_device_info rzg2l_du_r9a07g044_info = {
.mode_clock_max = 83500,
};
+static const struct rzg2l_du_device_info rzg2l_du_r9a08g046_info = {
+ .channels_mask = BIT(0),
+ .routes = {
+ [RZG2L_DU_OUTPUT_DSI0] = {
+ .possible_outputs = BIT(0),
+ .port = 0,
+ },
+ [RZG2L_DU_OUTPUT_DPAD0] = {
+ .possible_outputs = BIT(0),
+ .port = 1,
+ },
+ [RZG2L_DU_OUTPUT_LVDS0] = {
+ .possible_outputs = BIT(0),
+ .port = 2,
+ },
+ },
+};
+
static const struct rzg2l_du_device_info rzg2l_du_r9a09g057_info = {
.channels_mask = BIT(0),
.routes = {
@@ -81,6 +99,7 @@ static const struct rzg2l_du_device_info rzg2l_du_r9a09g077_info = {
static const struct of_device_id rzg2l_du_of_table[] = {
{ .compatible = "renesas,r9a07g043u-du", .data = &rzg2l_du_r9a07g043u_info },
{ .compatible = "renesas,r9a07g044-du", .data = &rzg2l_du_r9a07g044_info },
+ { .compatible = "renesas,r9a08g046-du", .data = &rzg2l_du_r9a08g046_info },
{ .compatible = "renesas,r9a09g057-du", .data = &rzg2l_du_r9a09g057_info },
{ .compatible = "renesas,r9a09g077-du", .data = &rzg2l_du_r9a09g077_info },
{ /* sentinel */ }
@@ -92,7 +111,8 @@ const char *rzg2l_du_output_name(enum rzg2l_du_output output)
{
static const char * const names[] = {
[RZG2L_DU_OUTPUT_DSI0] = "DSI0",
- [RZG2L_DU_OUTPUT_DPAD0] = "DPAD0"
+ [RZG2L_DU_OUTPUT_DPAD0] = "DPAD0",
+ [RZG2L_DU_OUTPUT_LVDS0] = "LVDS0"
};
if (output >= ARRAY_SIZE(names))
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
index baf076d69cda..0b86c5a01210 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
@@ -21,10 +21,12 @@ struct device;
struct drm_property;
#define RZG2L_DU_FEATURE_DPIO_OE BIT(0) /* Has DPIO output enable control */
+#define RZG2L_DU_FEATURE_SMUX2_DSI_CLK BIT(1) /* Per output mux */
enum rzg2l_du_output {
RZG2L_DU_OUTPUT_DSI0,
RZG2L_DU_OUTPUT_DPAD0,
+ RZG2L_DU_OUTPUT_LVDS0,
RZG2L_DU_OUTPUT_MAX,
};
@@ -61,6 +63,7 @@ struct rzg2l_du_device_info {
#define RZG2L_DU_MAX_CRTCS 1
#define RZG2L_DU_MAX_VSPS 1
#define RZG2L_DU_MAX_DSI 1
+#define RZG2L_DU_MAX_LVDS 1
struct rzg2l_du_device {
struct device *dev;
@@ -74,6 +77,7 @@ struct rzg2l_du_device {
unsigned int num_crtcs;
struct rzg2l_du_vsp vsps[RZG2L_DU_MAX_VSPS];
+ struct drm_bridge *lvds[RZG2L_DU_MAX_LVDS];
};
static inline struct rzg2l_du_device *to_rzg2l_du_device(struct drm_device *dev)
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
index f50d166b764f..7315d437c2ea 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
@@ -105,6 +105,9 @@ int rzg2l_du_encoder_init(struct rzg2l_du_device *rcdu,
return -EPROBE_DEFER;
}
+ if (output == RZG2L_DU_OUTPUT_LVDS0)
+ rcdu->lvds[output - RZG2L_DU_OUTPUT_LVDS0] = bridge;
+
dev_dbg(rcdu->dev, "initializing encoder %pOF for output %s\n",
enc_node, rzg2l_du_output_name(output));
@@ -115,6 +118,7 @@ int rzg2l_du_encoder_init(struct rzg2l_du_device *rcdu,
return PTR_ERR(renc);
renc->output = output;
+ renc->rcdu = rcdu;
drm_encoder_helper_add(&renc->base, &rzg2l_du_encoder_helper_funcs);
/* Attach the bridge to the encoder. */
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
index 3e430c1f6132..8b048ca508be 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
@@ -17,6 +17,7 @@ struct rzg2l_du_device;
struct rzg2l_du_encoder {
struct drm_encoder base;
+ struct rzg2l_du_device *rcdu;
enum rzg2l_du_output output;
};
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* Re: [PATCH 08/16] drm: renesas: rz-du: Add RZ/G3L (R9A08G046) DU support
2026-07-04 9:34 ` [PATCH 08/16] drm: renesas: rz-du: Add RZ/G3L (R9A08G046) DU support Biju
@ 2026-07-08 17:01 ` Tommaso Merciai
2026-07-08 17:16 ` Biju Das
0 siblings, 1 reply; 25+ messages in thread
From: Tommaso Merciai @ 2026-07-08 17:01 UTC (permalink / raw)
To: Biju
Cc: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter, Geert Uytterhoeven, Magnus Damm,
dri-devel, linux-renesas-soc, linux-kernel, Prabhakar Mahadev Lad
Hi Biju,
Thanks for your patch.
On Sat, Jul 04, 2026 at 10:34:18AM +0100, Biju wrote:
> From: Biju Das <biju.das.jz@bp.renesas.com>
>
> Add Display Unit support for the Renesas RZ/G3L SoC (R9A08G046). It is
> similar to the one found on RZ/G2L, but has LVDS support.
>
> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
> ---
> drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 22 ++++++++++++++++++-
> drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h | 4 ++++
> .../gpu/drm/renesas/rz-du/rzg2l_du_encoder.c | 4 ++++
> .../gpu/drm/renesas/rz-du/rzg2l_du_encoder.h | 1 +
> 4 files changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> index 3d13f61d3c97..a8d841421a0b 100644
> --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> @@ -55,6 +55,24 @@ static const struct rzg2l_du_device_info rzg2l_du_r9a07g044_info = {
> .mode_clock_max = 83500,
> };
>
> +static const struct rzg2l_du_device_info rzg2l_du_r9a08g046_info = {
> + .channels_mask = BIT(0),
> + .routes = {
> + [RZG2L_DU_OUTPUT_DSI0] = {
> + .possible_outputs = BIT(0),
> + .port = 0,
> + },
> + [RZG2L_DU_OUTPUT_DPAD0] = {
> + .possible_outputs = BIT(0),
> + .port = 1,
> + },
> + [RZG2L_DU_OUTPUT_LVDS0] = {
> + .possible_outputs = BIT(0),
> + .port = 2,
> + },
> + },
> +};
> +
> static const struct rzg2l_du_device_info rzg2l_du_r9a09g057_info = {
> .channels_mask = BIT(0),
> .routes = {
> @@ -81,6 +99,7 @@ static const struct rzg2l_du_device_info rzg2l_du_r9a09g077_info = {
> static const struct of_device_id rzg2l_du_of_table[] = {
> { .compatible = "renesas,r9a07g043u-du", .data = &rzg2l_du_r9a07g043u_info },
> { .compatible = "renesas,r9a07g044-du", .data = &rzg2l_du_r9a07g044_info },
> + { .compatible = "renesas,r9a08g046-du", .data = &rzg2l_du_r9a08g046_info },
> { .compatible = "renesas,r9a09g057-du", .data = &rzg2l_du_r9a09g057_info },
> { .compatible = "renesas,r9a09g077-du", .data = &rzg2l_du_r9a09g077_info },
> { /* sentinel */ }
> @@ -92,7 +111,8 @@ const char *rzg2l_du_output_name(enum rzg2l_du_output output)
> {
> static const char * const names[] = {
> [RZG2L_DU_OUTPUT_DSI0] = "DSI0",
> - [RZG2L_DU_OUTPUT_DPAD0] = "DPAD0"
> + [RZG2L_DU_OUTPUT_DPAD0] = "DPAD0",
> + [RZG2L_DU_OUTPUT_LVDS0] = "LVDS0"
> };
>
> if (output >= ARRAY_SIZE(names))
> diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
> index baf076d69cda..0b86c5a01210 100644
> --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
> +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
> @@ -21,10 +21,12 @@ struct device;
> struct drm_property;
>
> #define RZG2L_DU_FEATURE_DPIO_OE BIT(0) /* Has DPIO output enable control */
> +#define RZG2L_DU_FEATURE_SMUX2_DSI_CLK BIT(1) /* Per output mux */
This is not needed, we decide to move setting clock duty cycle handling into
encoder driver.
>
> enum rzg2l_du_output {
> RZG2L_DU_OUTPUT_DSI0,
> RZG2L_DU_OUTPUT_DPAD0,
> + RZG2L_DU_OUTPUT_LVDS0,
> RZG2L_DU_OUTPUT_MAX,
> };
>
> @@ -61,6 +63,7 @@ struct rzg2l_du_device_info {
> #define RZG2L_DU_MAX_CRTCS 1
> #define RZG2L_DU_MAX_VSPS 1
> #define RZG2L_DU_MAX_DSI 1
> +#define RZG2L_DU_MAX_LVDS 1
This is not used, please remove.
>
> struct rzg2l_du_device {
> struct device *dev;
> @@ -74,6 +77,7 @@ struct rzg2l_du_device {
> unsigned int num_crtcs;
>
> struct rzg2l_du_vsp vsps[RZG2L_DU_MAX_VSPS];
> + struct drm_bridge *lvds[RZG2L_DU_MAX_LVDS];
Same here.
> };
>
> static inline struct rzg2l_du_device *to_rzg2l_du_device(struct drm_device *dev)
> diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
> index f50d166b764f..7315d437c2ea 100644
> --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
> +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
> @@ -105,6 +105,9 @@ int rzg2l_du_encoder_init(struct rzg2l_du_device *rcdu,
> return -EPROBE_DEFER;
> }
>
> + if (output == RZG2L_DU_OUTPUT_LVDS0)
> + rcdu->lvds[output - RZG2L_DU_OUTPUT_LVDS0] = bridge;
> +
Same here.
> dev_dbg(rcdu->dev, "initializing encoder %pOF for output %s\n",
> enc_node, rzg2l_du_output_name(output));
>
> @@ -115,6 +118,7 @@ int rzg2l_du_encoder_init(struct rzg2l_du_device *rcdu,
> return PTR_ERR(renc);
>
> renc->output = output;
> + renc->rcdu = rcdu;
Same.
> drm_encoder_helper_add(&renc->base, &rzg2l_du_encoder_helper_funcs);
>
> /* Attach the bridge to the encoder. */
> diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
> index 3e430c1f6132..8b048ca508be 100644
> --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
> +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
> @@ -17,6 +17,7 @@ struct rzg2l_du_device;
>
> struct rzg2l_du_encoder {
> struct drm_encoder base;
> + struct rzg2l_du_device *rcdu;
Same.
Thanks.
Kind Regards,
Tommaso
> enum rzg2l_du_output output;
> };
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 25+ messages in thread* RE: [PATCH 08/16] drm: renesas: rz-du: Add RZ/G3L (R9A08G046) DU support
2026-07-08 17:01 ` Tommaso Merciai
@ 2026-07-08 17:16 ` Biju Das
0 siblings, 0 replies; 25+ messages in thread
From: Biju Das @ 2026-07-08 17:16 UTC (permalink / raw)
To: Tommaso Merciai, biju.das.au
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Geert Uytterhoeven, magnus.damm,
dri-devel@lists.freedesktop.org,
linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org,
Prabhakar Mahadev Lad
Hi Tommaso,
Thanks for the feedback.
> -----Original Message-----
> From: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> Sent: 08 July 2026 18:01
> Subject: Re: [PATCH 08/16] drm: renesas: rz-du: Add RZ/G3L (R9A08G046) DU support
>
> Hi Biju,
> Thanks for your patch.
>
> On Sat, Jul 04, 2026 at 10:34:18AM +0100, Biju wrote:
> > From: Biju Das <biju.das.jz@bp.renesas.com>
> >
> > Add Display Unit support for the Renesas RZ/G3L SoC (R9A08G046). It is
> > similar to the one found on RZ/G2L, but has LVDS support.
> >
> > Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
> > ---
> > drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 22
> > ++++++++++++++++++- drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h |
> > 4 ++++ .../gpu/drm/renesas/rz-du/rzg2l_du_encoder.c | 4 ++++
> > .../gpu/drm/renesas/rz-du/rzg2l_du_encoder.h | 1 +
> > 4 files changed, 30 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> > b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> > index 3d13f61d3c97..a8d841421a0b 100644
> > --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> > +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
> > @@ -55,6 +55,24 @@ static const struct rzg2l_du_device_info rzg2l_du_r9a07g044_info = {
> > .mode_clock_max = 83500,
> > };
> >
> > +static const struct rzg2l_du_device_info rzg2l_du_r9a08g046_info = {
> > + .channels_mask = BIT(0),
> > + .routes = {
> > + [RZG2L_DU_OUTPUT_DSI0] = {
> > + .possible_outputs = BIT(0),
> > + .port = 0,
> > + },
> > + [RZG2L_DU_OUTPUT_DPAD0] = {
> > + .possible_outputs = BIT(0),
> > + .port = 1,
> > + },
> > + [RZG2L_DU_OUTPUT_LVDS0] = {
> > + .possible_outputs = BIT(0),
> > + .port = 2,
> > + },
> > + },
> > +};
> > +
> > static const struct rzg2l_du_device_info rzg2l_du_r9a09g057_info = {
> > .channels_mask = BIT(0),
> > .routes = {
> > @@ -81,6 +99,7 @@ static const struct rzg2l_du_device_info
> > rzg2l_du_r9a09g077_info = { static const struct of_device_id rzg2l_du_of_table[] = {
> > { .compatible = "renesas,r9a07g043u-du", .data = &rzg2l_du_r9a07g043u_info },
> > { .compatible = "renesas,r9a07g044-du", .data =
> > &rzg2l_du_r9a07g044_info },
> > + { .compatible = "renesas,r9a08g046-du", .data =
> > +&rzg2l_du_r9a08g046_info },
> > { .compatible = "renesas,r9a09g057-du", .data = &rzg2l_du_r9a09g057_info },
> > { .compatible = "renesas,r9a09g077-du", .data = &rzg2l_du_r9a09g077_info },
> > { /* sentinel */ }
> > @@ -92,7 +111,8 @@ const char *rzg2l_du_output_name(enum
> > rzg2l_du_output output) {
> > static const char * const names[] = {
> > [RZG2L_DU_OUTPUT_DSI0] = "DSI0",
> > - [RZG2L_DU_OUTPUT_DPAD0] = "DPAD0"
> > + [RZG2L_DU_OUTPUT_DPAD0] = "DPAD0",
> > + [RZG2L_DU_OUTPUT_LVDS0] = "LVDS0"
> > };
> >
> > if (output >= ARRAY_SIZE(names))
> > diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
> > b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
> > index baf076d69cda..0b86c5a01210 100644
> > --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
> > +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.h
> > @@ -21,10 +21,12 @@ struct device;
> > struct drm_property;
> >
> > #define RZG2L_DU_FEATURE_DPIO_OE BIT(0) /* Has DPIO output enable control */
> > +#define RZG2L_DU_FEATURE_SMUX2_DSI_CLK BIT(1) /* Per output mux */
>
> This is not needed, we decide to move setting clock duty cycle handling into encoder driver.
Agreed.
>
> >
> > enum rzg2l_du_output {
> > RZG2L_DU_OUTPUT_DSI0,
> > RZG2L_DU_OUTPUT_DPAD0,
> > + RZG2L_DU_OUTPUT_LVDS0,
> > RZG2L_DU_OUTPUT_MAX,
> > };
> >
> > @@ -61,6 +63,7 @@ struct rzg2l_du_device_info {
> > #define RZG2L_DU_MAX_CRTCS 1
> > #define RZG2L_DU_MAX_VSPS 1
> > #define RZG2L_DU_MAX_DSI 1
> > +#define RZG2L_DU_MAX_LVDS 1
>
> This is not used, please remove.
>
> >
> > struct rzg2l_du_device {
> > struct device *dev;
> > @@ -74,6 +77,7 @@ struct rzg2l_du_device {
> > unsigned int num_crtcs;
> >
> > struct rzg2l_du_vsp vsps[RZG2L_DU_MAX_VSPS];
> > + struct drm_bridge *lvds[RZG2L_DU_MAX_LVDS];
>
> Same here.
Ok.
>
> > };
> >
> > static inline struct rzg2l_du_device *to_rzg2l_du_device(struct
> > drm_device *dev) diff --git
> > a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
> > b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
> > index f50d166b764f..7315d437c2ea 100644
> > --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
> > +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c
> > @@ -105,6 +105,9 @@ int rzg2l_du_encoder_init(struct rzg2l_du_device *rcdu,
> > return -EPROBE_DEFER;
> > }
> >
> > + if (output == RZG2L_DU_OUTPUT_LVDS0)
> > + rcdu->lvds[output - RZG2L_DU_OUTPUT_LVDS0] = bridge;
> > +
>
> Same here.
>
> > dev_dbg(rcdu->dev, "initializing encoder %pOF for output %s\n",
> > enc_node, rzg2l_du_output_name(output));
> >
> > @@ -115,6 +118,7 @@ int rzg2l_du_encoder_init(struct rzg2l_du_device *rcdu,
> > return PTR_ERR(renc);
> >
> > renc->output = output;
> > + renc->rcdu = rcdu;
>
> Same.
>
> > drm_encoder_helper_add(&renc->base, &rzg2l_du_encoder_helper_funcs);
> >
> > /* Attach the bridge to the encoder. */ diff --git
> > a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
> > b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
> > index 3e430c1f6132..8b048ca508be 100644
> > --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
> > +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.h
> > @@ -17,6 +17,7 @@ struct rzg2l_du_device;
> >
> > struct rzg2l_du_encoder {
> > struct drm_encoder base;
> > + struct rzg2l_du_device *rcdu;
>
> Same.
Will fix this in next version.
Cheers,
Biju
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 09/16] dt-bindings: display: bridge: Document Renesas RZ/G3L LVDS encoder
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (7 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 08/16] drm: renesas: rz-du: Add RZ/G3L (R9A08G046) DU support Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 10/16] drm: renesas: rz-du: Add support for " Biju
` (6 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Andrzej Hajda, Neil Armstrong, Robert Foss, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm
Cc: Biju Das, Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Luca Ceresoli, Tommaso Merciai, dri-devel, devicetree,
linux-kernel, linux-renesas-soc, Prabhakar Mahadev Lad, Biju Das,
Krzysztof Kozlowski
From: Biju Das <biju.das.jz@bp.renesas.com>
Document the LVDS encoder IP found on the RZ/G3L SoC. It supports
single-link mode. LVDS and the DSI interface share a peripheral clock and
the MIPI_DSI_PRESET_N reset signal. However, the LVDS module cannot be
used at the same time as MIPI-DSI.
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
v5[1]->v1:
* No change.
v5 [1] https://lore.kernel.org/all/20260625172359.292631-2-biju.das.jz@bp.renesas.com/#t
v4->v5:
* Collected tag.
v3->v4:
* Dropped the tags as it is a rework dropping parent node that contains
simple-mfd and syscon.
v2->v3:
* Collected tag.
v2->v2[1]:
* No change.
[1] https://lore.kernel.org/all/20260524195829.960401F000E9@smtp.kernel.org/
v1->v2:
* Collected tag.
---
.../bridge/renesas,r9a08g046-lvds.yaml | 120 ++++++++++++++++++
1 file changed, 120 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/bridge/renesas,r9a08g046-lvds.yaml
diff --git a/Documentation/devicetree/bindings/display/bridge/renesas,r9a08g046-lvds.yaml b/Documentation/devicetree/bindings/display/bridge/renesas,r9a08g046-lvds.yaml
new file mode 100644
index 000000000000..4cd7b688fbf7
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/bridge/renesas,r9a08g046-lvds.yaml
@@ -0,0 +1,120 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/bridge/renesas,r9a08g046-lvds.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Renesas RZ/G3L LVDS Encoder
+
+maintainers:
+ - Biju Das <biju.das.jz@bp.renesas.com>
+ - Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
+
+description: |
+ This binding describes the LVDS encoder embedded in the Renesas RZ/G3L
+ SoC. The encoder can operate in LVDS Single-link mode with 4 lanes
+ (Data) + 1 lane (Clock).
+
+properties:
+ compatible:
+ const: renesas,r9a08g046-lvds
+
+ reg:
+ maxItems: 1
+
+ clocks:
+ items:
+ - description: Peripheral clock
+ - description: PHY clock
+ - description: Dot clock
+
+ clock-names:
+ items:
+ - const: pclk
+ - const: phyclk
+ - const: dotclk
+
+ resets:
+ items:
+ - description: LVDS_RESET_N
+ - description: MIPI_DSI_PRESET_N
+ - description: MIPI_DSI_CMN_RSTB
+ - description: MIPI_DSI_ARESET_N
+
+ reset-names:
+ items:
+ - const: lvdrst
+ - const: prst
+ - const: rst
+ - const: arst
+
+ power-domains:
+ maxItems: 1
+
+ ports:
+ $ref: /schemas/graph.yaml#/properties/ports
+
+ properties:
+ port@0:
+ $ref: /schemas/graph.yaml#/properties/port
+ description: Input channel, directly connected to the Display Unit.
+
+ port@1:
+ $ref: /schemas/graph.yaml#/properties/port
+ description: |
+ Output channel, directly connected to the LVDS panel or bridge.
+
+ required:
+ - port@0
+ - port@1
+
+required:
+ - compatible
+ - reg
+ - clocks
+ - clock-names
+ - resets
+ - reset-names
+ - power-domains
+ - ports
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/renesas,r9a08g046-cpg.h>
+
+ lvds@108a0000 {
+ compatible = "renesas,r9a08g046-lvds";
+ reg = <0x108a0000 0x10000>;
+ clocks = <&cpg CPG_MOD R9A08G046_MIPI_DSI_PCLK>,
+ <&cpg CPG_MOD R9A08G046_LVDS_PLLCLK>,
+ <&cpg CPG_MOD R9A08G046_LVDS_CLK_DOT0>;
+ clock-names = "pclk", "phyclk", "dotclk";
+ resets = <&cpg R9A08G046_LVDS_RESET_N>,
+ <&cpg R9A08G046_MIPI_DSI_PRESET_N>,
+ <&cpg R9A08G046_MIPI_DSI_CMN_RSTB>,
+ <&cpg R9A08G046_MIPI_DSI_ARESET_N>;
+ reset-names = "lvdrst", "prst", "rst", "arst";
+ power-domains = <&cpg>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ lvds0_in: endpoint {
+ remote-endpoint = <&du_out_lvds0>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ lvds0_out: endpoint {
+ remote-endpoint = <&panel_in>;
+ };
+ };
+ };
+ };
+...
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 10/16] drm: renesas: rz-du: Add support for RZ/G3L LVDS encoder
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (8 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 09/16] dt-bindings: display: bridge: Document Renesas RZ/G3L LVDS encoder Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 11/16] arm64: dts: renesas: r9a08g046: Add fcpvd node Biju
` (5 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Biju Das, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter, Philipp Zabel, Geert Uytterhoeven,
Magnus Damm
Cc: linux-kernel, dri-devel, linux-renesas-soc, Prabhakar Mahadev Lad,
Biju Das, Tommaso Merciai
From: Biju Das <biju.das.jz@bp.renesas.com>
Add support for the RZ/G3L LVDS encoder driver. It operates in single-link
mode with 4 lanes (Data) + 1 lane (Clock) and supports pixel clock rates
from 25 to 87 MHz. The LVDS module cannot be used at the same time as
MIPI-DSI. However, LVDS and the DSI interface share a peripheral clock and
the MIPI_DSI_PRESET_N reset signal. Also, the MIPI_DSI_CMN_RSTB and
MIPI_DSI_ARESET_N reset signals must be asserted before using the LVDS
module.
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Tested-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Reviewed-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
v5[1]->v1:
* Added clk.h as LVDS requires 4:7 duty clock and moved this handling to
LVDS driver
* Avoided accessing register in disable if clk is disabled.
v5[1]: https://lore.kernel.org/all/20260625172359.292631-3-biju.das.jz@bp.renesas.com/
v4->v5:
* Added Kconfig functional dependency for DRM_RZG2L_DU
* Dropped DRM_PANEL from DRM_RZG3L_LVDS config
* Dropped unused headers of_device.h,of_graph.h and drm_panel.h
* Dropped the unused macro LVDS_CMN_RST_PHY0_SEL_CH0
* Used plain number for macro LVDS_0_PHY_CH_IO_EN0_MSK
* Retained the tag as the above changes are trivial.
v3->v4:
* Dropped the header files clk.h and syscon.h
* Dropped next_bridge check in attach().
* Dropped syscon for getting regmap.
* Replaced the below macros to match with hardware manual:
LVDS_0_CTL_FMT_SEL_MSK->LVDS_0_CTL_FMT_SEL0_MSK
LVDS_0_PHY_CH_IO_EN_MSK->LVDS_0_PHY_CH_IO_EN0_MSK
Replaced LVDS_0_PHY_CH_IO_EN->LVDS_0_PHY_CH_IO_EN0
* Replaced atomic_reset()->atomic_create_state()
* Dropped the tags as there are new changes.
v2->v3:
* Collected tags.
v2->v2[1]:
* Replace drm_atomic_state with drm_atomic_commit in
rzg3l_lvds_atomic_{en,dis}able().
* Drop local variable ret and dev_err() messages in
rzg3l_lvds_atomic_enable(); use WARN_ON() instead to
capture unexpected failures since atomic_enable should not fail.
* Drop local variable next_bridge from rzg3l_lvds_probe().
[1] https://lore.kernel.org/all/20260524194457.479681-3-biju.das.jz@bp.renesas.com/
v1->v2:
* Dropped unused function rzg3l_lvds_is_connected() and removed the
corresponding header file rzg3l_lvds.h
* Dropped next_bridge from struct rzg3l_lvds instead using bridge's
next_bridge.
* Replaced pm_runtime_resume_and_get()->pm_runtime_get_sync() as
atomic_enable doesn't fail and for each enable there always will be an
atomic_disable() call.
* Started using DEFINE_RUNTIME_DEV_PM_OPS for PM callback.
* Replaced rzg3l_lvds_parse_dt() with devm_drm_of_get_bridge() in probe()
* Started using reset_control_bulk_*() in rzg3l_lvds_pm_runtime_{suspend,
resume}()
---
drivers/gpu/drm/renesas/rz-du/Kconfig | 13 +
drivers/gpu/drm/renesas/rz-du/Makefile | 1 +
drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c | 299 ++++++++++++++++++
.../gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h | 25 ++
4 files changed, 338 insertions(+)
create mode 100644 drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c
create mode 100644 drivers/gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h
diff --git a/drivers/gpu/drm/renesas/rz-du/Kconfig b/drivers/gpu/drm/renesas/rz-du/Kconfig
index 7f2ef7137ae5..0dbe86bd65d0 100644
--- a/drivers/gpu/drm/renesas/rz-du/Kconfig
+++ b/drivers/gpu/drm/renesas/rz-du/Kconfig
@@ -26,3 +26,16 @@ config DRM_RZG2L_MIPI_DSI
def_tristate DRM_RZG2L_DU
depends on DRM_RZG2L_USE_MIPI_DSI
select DRM_MIPI_DSI
+
+config DRM_RZG3L_USE_LVDS
+ bool "RZ/G3L DU LVDS Encoder Support"
+ depends on DRM_BRIDGE && OF
+ depends on DRM_RZG2L_DU || COMPILE_TEST
+ default DRM_RZG2L_DU
+ help
+ Enable support for the RZ/G3L Display Unit embedded LVDS encoder.
+
+config DRM_RZG3L_LVDS
+ def_tristate DRM_RZG2L_DU
+ depends on DRM_RZG3L_USE_LVDS
+ select DRM_KMS_HELPER
diff --git a/drivers/gpu/drm/renesas/rz-du/Makefile b/drivers/gpu/drm/renesas/rz-du/Makefile
index 2987900ea6b6..46decb7ac4f1 100644
--- a/drivers/gpu/drm/renesas/rz-du/Makefile
+++ b/drivers/gpu/drm/renesas/rz-du/Makefile
@@ -8,3 +8,4 @@ rzg2l-du-drm-$(CONFIG_VIDEO_RENESAS_VSP1) += rzg2l_du_vsp.o
obj-$(CONFIG_DRM_RZG2L_DU) += rzg2l-du-drm.o
obj-$(CONFIG_DRM_RZG2L_MIPI_DSI) += rzg2l_mipi_dsi.o
+obj-$(CONFIG_DRM_RZG3L_LVDS) += rzg3l_lvds.o
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c b/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c
new file mode 100644
index 000000000000..7d06c1a683e6
--- /dev/null
+++ b/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c
@@ -0,0 +1,299 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * RZ/G3L LVDS Encoder Driver
+ *
+ * Copyright (C) 2026 Renesas Electronics Corporation
+ */
+
+#include <linux/bitfield.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/media-bus-format.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+
+#include <drm/drm_atomic.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_bridge.h>
+#include <drm/drm_of.h>
+#include <drm/drm_probe_helper.h>
+
+#include "rzg3l_lvds_regs.h"
+
+enum rzg3l_lvds_mode {
+ RZG3L_LVDS_MODE_JEIDA = 0,
+ RZG3L_LVDS_MODE_JEIDA_MIRROR = 1,
+ RZG3L_LVDS_MODE_MODE2 = 2,
+ RZG3L_LVDS_MODE_MODE2_MIRROR = 3,
+ RZG3L_LVDS_MODE_VESA = 4,
+ RZG3L_LVDS_MODE_VESA_MIRROR = 5,
+ RZG3L_LVDS_MODE_MODE6 = 6,
+ RZG3L_LVDS_MODE_MODE6_MIRROR = 7,
+};
+
+struct rzg3l_lvds {
+ struct device *dev;
+ struct clk *dotclk;
+ struct reset_control *prstc;
+ struct reset_control *lvd_rstc;
+ struct regmap *regmap;
+ struct drm_bridge bridge;
+};
+
+#define bridge_to_rzg3l_lvds(b) \
+ container_of(b, struct rzg3l_lvds, bridge)
+
+static const struct regmap_config rzg3l_lvds_regmap_config = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+ .max_register = LVDS_0_CTL_OFFSET,
+};
+
+/* -----------------------------------------------------------------------------
+ * Bridge
+ */
+
+static void rzg3l_lvds_atomic_enable(struct drm_bridge *bridge,
+ struct drm_atomic_commit *state)
+{
+ struct rzg3l_lvds *lvds = bridge_to_rzg3l_lvds(bridge);
+ const struct drm_bridge_state *bridge_state;
+ u32 fmt;
+
+ /* Get the LVDS format from the bridge state. */
+ bridge_state = drm_atomic_get_new_bridge_state(state, bridge);
+ if (WARN_ON(!bridge_state))
+ return;
+
+ switch (bridge_state->output_bus_cfg.format) {
+ case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
+ fmt = RZG3L_LVDS_MODE_JEIDA;
+ break;
+ case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
+ fmt = RZG3L_LVDS_MODE_VESA;
+ break;
+ default:
+ fmt = RZG3L_LVDS_MODE_VESA;
+ dev_warn(lvds->dev, "Unsupported bus fmt 0x%04x\n",
+ bridge_state->output_bus_cfg.format);
+ break;
+ }
+
+ if (WARN_ON(pm_runtime_get_sync(lvds->dev) < 0))
+ return;
+
+ regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET,
+ LVDS_0_PHY_CH_EN_BGR, LVDS_0_PHY_CH_EN_BGR);
+ fsleep(20);
+
+ regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET,
+ LVDS_0_PHY_CH_EN_LDO, LVDS_0_PHY_CH_EN_LDO);
+ fsleep(10);
+
+ regmap_write(lvds->regmap, LVDS_CMN, LVDS_CMN_RST_PHY0_SEL);
+ regmap_update_bits(lvds->regmap, LVDS_0_CTL_OFFSET,
+ LVDS_0_CTL_FMT_SEL0_MSK,
+ FIELD_PREP(LVDS_0_CTL_FMT_SEL0_MSK, fmt));
+ regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET,
+ LVDS_0_PHY_CH_IO_EN0_MSK, LVDS_0_PHY_CH_IO_EN0);
+ regmap_write(lvds->regmap, LVDS_CMN,
+ LVDS_CMN_RST_PHY0_SEL | LVDS_CMN_PHY_RESET);
+ fsleep(100);
+}
+
+static void rzg3l_lvds_atomic_disable(struct drm_bridge *bridge,
+ struct drm_atomic_commit *state)
+{
+ struct rzg3l_lvds *lvds = bridge_to_rzg3l_lvds(bridge);
+ int ret;
+
+ PM_RUNTIME_ACQUIRE_IF_ENABLED(lvds->dev, pm);
+ ret = PM_RUNTIME_ACQUIRE_ERR(&pm);
+ if (ret < 0)
+ goto pm_put_sync;
+
+ regmap_update_bits(lvds->regmap, LVDS_CMN, LVDS_CMN_PHY_RESET, 0);
+ regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET,
+ LVDS_0_PHY_CH_IO_EN0_MSK, 0);
+ regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET,
+ LVDS_0_PHY_CH_EN_LDO, 0);
+ regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET,
+ LVDS_0_PHY_CH_EN_BGR, 0);
+
+pm_put_sync:
+ pm_runtime_put_sync(lvds->dev);
+}
+
+static int rzg3l_lvds_attach(struct drm_bridge *bridge,
+ struct drm_encoder *encoder,
+ enum drm_bridge_attach_flags flags)
+{
+ struct rzg3l_lvds *lvds = bridge_to_rzg3l_lvds(bridge);
+ struct clk *clk_parent;
+
+ clk_parent = clk_get_parent(lvds->dotclk);
+ clk_set_duty_cycle(clk_parent, 4, 7);
+
+ return drm_bridge_attach(encoder, lvds->bridge.next_bridge, bridge, flags);
+}
+
+static enum drm_mode_status
+rzg3l_lvds_bridge_mode_valid(struct drm_bridge *bridge,
+ const struct drm_display_info *info,
+ const struct drm_display_mode *mode)
+{
+ if (mode->clock > 87000)
+ return MODE_CLOCK_HIGH;
+
+ if (mode->clock < 25000)
+ return MODE_CLOCK_LOW;
+
+ return MODE_OK;
+}
+
+static const struct drm_bridge_funcs rzg3l_lvds_bridge_ops = {
+ .attach = rzg3l_lvds_attach,
+ .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
+ .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
+ .atomic_create_state = drm_atomic_helper_bridge_create_state,
+ .atomic_enable = rzg3l_lvds_atomic_enable,
+ .atomic_disable = rzg3l_lvds_atomic_disable,
+ .mode_valid = rzg3l_lvds_bridge_mode_valid,
+};
+
+/* -----------------------------------------------------------------------------
+ * Power Management
+ */
+
+static int rzg3l_lvds_pm_runtime_suspend(struct device *dev)
+{
+ struct rzg3l_lvds *lvds = dev_get_drvdata(dev);
+ struct reset_control_bulk_data resets[] = {
+ { .rstc = lvds->lvd_rstc },
+ { .rstc = lvds->prstc },
+ };
+
+ return reset_control_bulk_assert(ARRAY_SIZE(resets), resets);
+}
+
+static int rzg3l_lvds_pm_runtime_resume(struct device *dev)
+{
+ struct rzg3l_lvds *lvds = dev_get_drvdata(dev);
+ struct reset_control_bulk_data resets[] = {
+ { .rstc = lvds->lvd_rstc },
+ { .rstc = lvds->prstc },
+ };
+
+ return reset_control_bulk_deassert(ARRAY_SIZE(resets), resets);
+}
+
+static DEFINE_RUNTIME_DEV_PM_OPS(rzg3l_lvds_pm_ops,
+ rzg3l_lvds_pm_runtime_suspend,
+ rzg3l_lvds_pm_runtime_resume, NULL);
+
+/* -----------------------------------------------------------------------------
+ * Probe & Remove
+ */
+
+static int rzg3l_lvds_probe(struct platform_device *pdev)
+{
+ struct reset_control *rstc, *arstc;
+ struct device *dev = &pdev->dev;
+ struct rzg3l_lvds *lvds;
+ void __iomem *base;
+ int ret;
+
+ lvds = devm_drm_bridge_alloc(dev, struct rzg3l_lvds, bridge,
+ &rzg3l_lvds_bridge_ops);
+ if (IS_ERR(lvds))
+ return PTR_ERR(lvds);
+
+ lvds->dev = dev;
+ lvds->bridge.of_node = pdev->dev.of_node;
+
+ base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(base))
+ return PTR_ERR(base);
+
+ lvds->regmap = devm_regmap_init_mmio(dev, base, &rzg3l_lvds_regmap_config);
+ if (IS_ERR(lvds->regmap))
+ return dev_err_probe(dev, PTR_ERR(lvds->regmap),
+ "failed to init regmap\n");
+
+ lvds->dotclk = devm_clk_get(dev, "dotclk");
+ if (IS_ERR(lvds->dotclk))
+ return PTR_ERR(lvds->dotclk);
+
+ rstc = devm_reset_control_get_exclusive(dev, "rst");
+ if (IS_ERR(rstc))
+ return dev_err_probe(dev, PTR_ERR(rstc), "failed to get rst\n");
+
+ arstc = devm_reset_control_get_exclusive(dev, "arst");
+ if (IS_ERR(arstc))
+ return dev_err_probe(dev, PTR_ERR(arstc),
+ "failed to get arst\n");
+
+ lvds->prstc = devm_reset_control_get_exclusive(dev, "prst");
+ if (IS_ERR(lvds->prstc))
+ return dev_err_probe(dev, PTR_ERR(lvds->prstc),
+ "failed to get prst\n");
+
+ lvds->lvd_rstc = devm_reset_control_get_exclusive(dev, "lvdrst");
+ if (IS_ERR(lvds->lvd_rstc))
+ return dev_err_probe(dev, PTR_ERR(lvds->lvd_rstc),
+ "failed to get core reset\n");
+
+ platform_set_drvdata(pdev, lvds);
+ ret = devm_pm_runtime_enable(dev);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to enable Runtime PM\n");
+
+ lvds->bridge.next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
+ if (IS_ERR(lvds->bridge.next_bridge))
+ return dev_err_probe(dev, PTR_ERR(lvds->bridge.next_bridge),
+ "failed to get next bridge\n");
+
+ ret = reset_control_assert(rstc);
+ if (ret < 0)
+ return ret;
+
+ ret = reset_control_assert(arstc);
+ if (ret < 0)
+ return ret;
+
+ ret = devm_drm_bridge_add(dev, &lvds->bridge);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "Failed to register drm bridge\n");
+
+ return ret;
+}
+
+static const struct of_device_id rzg3l_lvds_of_table[] = {
+ { .compatible = "renesas,r9a08g046-lvds" },
+ { /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, rzg3l_lvds_of_table);
+
+static struct platform_driver rzg3l_lvds_platform_driver = {
+ .probe = rzg3l_lvds_probe,
+ .driver = {
+ .name = "rzg3l-lvds",
+ .pm = pm_ptr(&rzg3l_lvds_pm_ops),
+ .of_match_table = rzg3l_lvds_of_table,
+ },
+};
+
+module_platform_driver(rzg3l_lvds_platform_driver);
+
+MODULE_AUTHOR("Biju Das <biju.das.jz@bp.renesas.com>");
+MODULE_AUTHOR("Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>");
+MODULE_DESCRIPTION("Renesas RZ/G3L LVDS Encoder Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h b/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h
new file mode 100644
index 000000000000..5b276cca9a5d
--- /dev/null
+++ b/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * RZ/G3L LVDS Interface Registers Definitions
+ *
+ * Copyright (C) 2026 Renesas Electronics Corporation
+ *
+ */
+
+#ifndef __RZG3L_LVDS_REGS_H__
+#define __RZG3L_LVDS_REGS_H__
+
+#define LVDS_CMN 0x00
+#define LVDS_CMN_RST_PHY0_SEL BIT(24)
+#define LVDS_CMN_PHY_RESET BIT(0)
+
+#define LVDS_0_PHY_OFFSET 0x10
+#define LVDS_0_PHY_CH_IO_EN0_MSK 0x1f
+#define LVDS_0_PHY_CH_IO_EN0 (LVDS_0_PHY_CH_IO_EN0_MSK << 0)
+#define LVDS_0_PHY_CH_EN_BGR BIT(8)
+#define LVDS_0_PHY_CH_EN_LDO BIT(9)
+
+#define LVDS_0_CTL_OFFSET 0x14
+#define LVDS_0_CTL_FMT_SEL0_MSK GENMASK(23, 20)
+
+#endif /* __RZG3L_LVDS_REGS_H__ */
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 11/16] arm64: dts: renesas: r9a08g046: Add fcpvd node
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (9 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 10/16] drm: renesas: rz-du: Add support for " Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 12/16] arm64: dts: renesas: r9a08g046: Add vspd node Biju
` (4 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Geert Uytterhoeven, Magnus Damm, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Biju Das, linux-renesas-soc, devicetree, linux-kernel,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add fcpvd node to RZ/G3L SoC DTSI.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
arch/arm64/boot/dts/renesas/r9a08g046.dtsi | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/arch/arm64/boot/dts/renesas/r9a08g046.dtsi b/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
index 85e409ac8d5c..eb5604b84287 100644
--- a/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
+++ b/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
@@ -696,6 +696,17 @@ ssi3: ssi@100e4c00 {
status = "disabled";
};
+ fcpvd: fcp@10880000 {
+ compatible = "renesas,r9a08g046-fcpvd", "renesas,fcpv";
+ reg = <0 0x10880000 0 0x10000>;
+ clocks = <&cpg CPG_MOD R9A08G046_LCDC_CLK_A>,
+ <&cpg CPG_MOD R9A08G046_LCDC_CLK_P>,
+ <&cpg CPG_MOD R9A08G046_LCDC_CLK_D>;
+ clock-names = "aclk", "pclk", "vclk";
+ resets = <&cpg R9A08G046_LCDC_RESET_N>;
+ power-domains = <&cpg>;
+ };
+
gpu: gpu@108b0000 {
compatible = "renesas,r9a08g046-mali",
"arm,mali-bifrost";
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 12/16] arm64: dts: renesas: r9a08g046: Add vspd node
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (10 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 11/16] arm64: dts: renesas: r9a08g046: Add fcpvd node Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 13/16] arm64: dts: renesas: r9a08g046: Add DU and DSI nodes Biju
` (3 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Geert Uytterhoeven, Magnus Damm, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Biju Das, linux-renesas-soc, devicetree, linux-kernel,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add vspd node to RZ/G3L SoC DTSI.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
arch/arm64/boot/dts/renesas/r9a08g046.dtsi | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/arch/arm64/boot/dts/renesas/r9a08g046.dtsi b/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
index eb5604b84287..0d8507e0666d 100644
--- a/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
+++ b/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
@@ -696,6 +696,20 @@ ssi3: ssi@100e4c00 {
status = "disabled";
};
+ vspd: vsp@10870000 {
+ compatible = "renesas,r9a08g046-vsp2",
+ "renesas,r9a07g044-vsp2";
+ reg = <0 0x10870000 0 0x10000>;
+ interrupts = <GIC_SPI 177 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD R9A08G046_LCDC_CLK_A>,
+ <&cpg CPG_MOD R9A08G046_LCDC_CLK_P>,
+ <&cpg CPG_MOD R9A08G046_LCDC_CLK_D>;
+ clock-names = "aclk", "pclk", "vclk";
+ resets = <&cpg R9A08G046_LCDC_RESET_N>;
+ power-domains = <&cpg>;
+ renesas,fcp = <&fcpvd>;
+ };
+
fcpvd: fcp@10880000 {
compatible = "renesas,r9a08g046-fcpvd", "renesas,fcpv";
reg = <0 0x10880000 0 0x10000>;
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 13/16] arm64: dts: renesas: r9a08g046: Add DU and DSI nodes
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (11 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 12/16] arm64: dts: renesas: r9a08g046: Add vspd node Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 14/16] arm64: dts: renesas: r9a08g046: Add LVDS node Biju
` (2 subsequent siblings)
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Geert Uytterhoeven, Magnus Damm, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Biju Das, linux-renesas-soc, devicetree, linux-kernel,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add DU and DSI nodes to RZ/G3L SoC DTSI.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
arch/arm64/boot/dts/renesas/r9a08g046.dtsi | 78 ++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/arch/arm64/boot/dts/renesas/r9a08g046.dtsi b/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
index 0d8507e0666d..fe2779d334dc 100644
--- a/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
+++ b/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
@@ -696,6 +696,50 @@ ssi3: ssi@100e4c00 {
status = "disabled";
};
+ dsi: dsi@10850000 {
+ compatible = "renesas,r9a08g046-mipi-dsi";
+ reg = <0 0x10850000 0 0x20000>;
+ interrupts = <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 175 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 176 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "seq0", "seq1", "vin1", "rcv",
+ "ferr", "ppi", "debug";
+ clocks = <&cpg CPG_CORE R9A08G046_MIPI_DSI_PLLCLK>,
+ <&cpg CPG_MOD R9A08G046_MIPI_DSI_SYSCLK>,
+ <&cpg CPG_MOD R9A08G046_MIPI_DSI_ACLK>,
+ <&cpg CPG_MOD R9A08G046_MIPI_DSI_PCLK>,
+ <&cpg CPG_MOD R9A08G046_MIPI_DSI_VCLK>,
+ <&cpg CPG_MOD R9A08G046_MIPI_DSI_LPCLK>;
+ clock-names = "pllclk", "sysclk", "aclk", "pclk", "vclk", "lpclk";
+ resets = <&cpg R9A08G046_MIPI_DSI_CMN_RSTB>,
+ <&cpg R9A08G046_MIPI_DSI_ARESET_N>,
+ <&cpg R9A08G046_MIPI_DSI_PRESET_N>;
+ reset-names = "rst", "arst", "prst";
+ power-domains = <&cpg>;
+ renesas,sysc-pwrrdy = <&sysc 0xd70 0x2>;
+ status = "disabled";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ dsi_in: endpoint {
+ remote-endpoint = <&du_out_dsi>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ };
+ };
+ };
+
vspd: vsp@10870000 {
compatible = "renesas,r9a08g046-vsp2",
"renesas,r9a07g044-vsp2";
@@ -721,6 +765,40 @@ fcpvd: fcp@10880000 {
power-domains = <&cpg>;
};
+ du: display@10890000 {
+ compatible = "renesas,r9a08g046-du";
+ reg = <0 0x10890000 0 0x10000>;
+ interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&cpg CPG_MOD R9A08G046_LCDC_CLK_A>,
+ <&cpg CPG_MOD R9A08G046_LCDC_CLK_P>,
+ <&cpg CPG_MOD R9A08G046_LCDC_CLK_D>;
+ clock-names = "aclk", "pclk", "vclk";
+ power-domains = <&cpg>;
+ resets = <&cpg R9A08G046_LCDC_RESET_N>;
+ renesas,vsps = <&vspd 0>;
+ status = "disabled";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ du_out_dsi: endpoint {
+ remote-endpoint = <&dsi_in>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ };
+
+ port@2 {
+ reg = <2>;
+ };
+ };
+ };
+
gpu: gpu@108b0000 {
compatible = "renesas,r9a08g046-mali",
"arm,mali-bifrost";
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 14/16] arm64: dts: renesas: r9a08g046: Add LVDS node
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (12 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 13/16] arm64: dts: renesas: r9a08g046: Add DU and DSI nodes Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 15/16] arm64: dts: renesas: Add DSI overlay for RZ/G3L SMARC EVK with ADV7535 Biju
2026-07-04 9:34 ` [PATCH 16/16] arm64: dts: renesas: Add LVDS overlay for RZ/G3L SMARC EVK with ITE6263 Biju
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Geert Uytterhoeven, Magnus Damm, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Biju Das, linux-renesas-soc, devicetree, linux-kernel,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add LVDS node to RZ/G3L SoC DTSI.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
arch/arm64/boot/dts/renesas/r9a08g046.dtsi | 37 ++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/arch/arm64/boot/dts/renesas/r9a08g046.dtsi b/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
index fe2779d334dc..a8b45443a78c 100644
--- a/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
+++ b/arch/arm64/boot/dts/renesas/r9a08g046.dtsi
@@ -795,6 +795,43 @@ port@1 {
port@2 {
reg = <2>;
+ du_out_lvds: endpoint {
+ remote-endpoint = <&lvds_in>;
+ };
+ };
+ };
+ };
+
+ lvds: lvds@108a0000 {
+ compatible = "renesas,r9a08g046-lvds";
+ reg = <0 0x108a0000 0 0x10000>;
+ clocks = <&cpg CPG_MOD R9A08G046_MIPI_DSI_PCLK>,
+ <&cpg CPG_MOD R9A08G046_LVDS_PLLCLK>,
+ <&cpg CPG_MOD R9A08G046_LVDS_CLK_DOT0>;
+ clock-names = "pclk", "phyclk", "dotclk";
+ resets = <&cpg R9A08G046_LVDS_RESET_N>,
+ <&cpg R9A08G046_MIPI_DSI_PRESET_N>,
+ <&cpg R9A08G046_MIPI_DSI_CMN_RSTB>,
+ <&cpg R9A08G046_MIPI_DSI_ARESET_N>;
+ reset-names = "lvdrst", "prst", "rst", "arst";
+ power-domains = <&cpg>;
+ status = "disabled";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ lvds_in: endpoint {
+ remote-endpoint = <&du_out_lvds>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ lvds_out: endpoint {
+ };
};
};
};
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 15/16] arm64: dts: renesas: Add DSI overlay for RZ/G3L SMARC EVK with ADV7535
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (13 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 14/16] arm64: dts: renesas: r9a08g046: Add LVDS node Biju
@ 2026-07-04 9:34 ` Biju
2026-07-04 9:34 ` [PATCH 16/16] arm64: dts: renesas: Add LVDS overlay for RZ/G3L SMARC EVK with ITE6263 Biju
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Geert Uytterhoeven, Magnus Damm, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Biju Das, linux-renesas-soc, devicetree, linux-kernel,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add a Device Tree overlay (r9a08g046l48-smarc-dsi-adv7535.dtso) for the
RZ/G3L (R9A08G046) SMARC EVK board to support DSI-to-HDMI output via the
Analog Devices ADV7535 HDMI transmitter.
The overlay enables the DSI controller with a 4-lane data path and the
display unit (DU/LCDC), and configures the ADV7535 on I2C2.
Update the Makefile to build the overlay as both a standalone .dtbo and
a composite .dtb (base DTB + overlay).
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
arch/arm64/boot/dts/renesas/Makefile | 3 +
.../r9a08g046l48-smarc-dsi-adv7535.dtso | 95 +++++++++++++++++++
2 files changed, 98 insertions(+)
create mode 100644 arch/arm64/boot/dts/renesas/r9a08g046l48-smarc-dsi-adv7535.dtso
diff --git a/arch/arm64/boot/dts/renesas/Makefile b/arch/arm64/boot/dts/renesas/Makefile
index 8bf155badd11..8c6a44890715 100644
--- a/arch/arm64/boot/dts/renesas/Makefile
+++ b/arch/arm64/boot/dts/renesas/Makefile
@@ -187,6 +187,9 @@ r9a08g045s33-smarc-pmod1-type-3a-dtbs := r9a08g045s33-smarc.dtb r9a08g045s33-sma
dtb-$(CONFIG_ARCH_R9A08G045) += r9a08g045s33-smarc-pmod1-type-3a.dtb
dtb-$(CONFIG_ARCH_R9A08G046) += r9a08g046l48-smarc.dtb
+dtb-$(CONFIG_ARCH_R9A08G046) += r9a08g046l48-smarc-dsi-adv7535.dtbo
+r9a08g046l48-smarc-dsi-adv7535-dtbs := r9a08g046l48-smarc.dtb r9a08g046l48-smarc-dsi-adv7535.dtbo
+dtb-$(CONFIG_ARCH_R9A08G046) += r9a08g046l48-smarc-dsi-adv7535.dtb
dtb-$(CONFIG_ARCH_R9A09G011) += r9a09g011-v2mevk2.dtb
diff --git a/arch/arm64/boot/dts/renesas/r9a08g046l48-smarc-dsi-adv7535.dtso b/arch/arm64/boot/dts/renesas/r9a08g046l48-smarc-dsi-adv7535.dtso
new file mode 100644
index 000000000000..cede3b4ba318
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/r9a08g046l48-smarc-dsi-adv7535.dtso
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree overlay for the RZ/G3L SMARC EVK with ADV7535
+ * connected to DSI and LCDC enabled.
+ *
+ * Copyright (C) 2026 Renesas Electronics Corp.
+ */
+
+/dts-v1/;
+/plugin/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/pinctrl/renesas,r9a08g046-pinctrl.h>
+
+&{/} {
+ osc1: cec-clock {
+ compatible = "fixed-clock";
+ #clock-cells = <0>;
+ clock-frequency = <12000000>;
+ };
+
+ dsi-to-hdmi-out {
+ compatible = "hdmi-connector";
+ type = "d";
+
+ port {
+ dsi_to_hdmi_con_out: endpoint {
+ remote-endpoint = <&adv7535_out>;
+ };
+ };
+ };
+};
+
+&dsi {
+ status = "okay";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@1 {
+ reg = <1>;
+ dsi_out: endpoint {
+ data-lanes = <1 2 3 4>;
+ remote-endpoint = <&adv7535_in>;
+ };
+ };
+ };
+};
+
+&du {
+ status = "okay";
+};
+
+&i2c2 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ adv7535: hdmi@3d {
+ compatible = "adi,adv7535";
+ reg = <0x3d>;
+
+ interrupts-extended = <&pinctrl RZG3L_GPIO(K, 3) IRQ_TYPE_EDGE_FALLING>;
+ clocks = <&osc1>;
+ clock-names = "cec";
+ avdd-supply = <®_1p8v>;
+ dvdd-supply = <®_1p8v>;
+ pvdd-supply = <®_1p8v>;
+ a2vdd-supply = <®_1p8v>;
+ v3p3-supply = <®_3p3v>;
+ v1p2-supply = <®_1p8v>;
+
+ adi,dsi-lanes = <4>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ adv7535_in: endpoint {
+ remote-endpoint = <&dsi_out>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ adv7535_out: endpoint {
+ remote-endpoint = <&dsi_to_hdmi_con_out>;
+ };
+ };
+ };
+ };
+};
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread* [PATCH 16/16] arm64: dts: renesas: Add LVDS overlay for RZ/G3L SMARC EVK with ITE6263
2026-07-04 9:34 [PATCH 00/16] Add support for DU, LVDS and DSI on the Renesas RZ/G3L SoC Biju
` (14 preceding siblings ...)
2026-07-04 9:34 ` [PATCH 15/16] arm64: dts: renesas: Add DSI overlay for RZ/G3L SMARC EVK with ADV7535 Biju
@ 2026-07-04 9:34 ` Biju
15 siblings, 0 replies; 25+ messages in thread
From: Biju @ 2026-07-04 9:34 UTC (permalink / raw)
To: Geert Uytterhoeven, Magnus Damm, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: Biju Das, linux-renesas-soc, devicetree, linux-kernel,
Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add a Device Tree overlay (r9a08g046l48-smarc-lvds-ite6263.dtso) for the
RZ/G3L (R9A08G046) SMARC EVK board to support LVDS-to-HDMI output via the
ITE 6263 HDMI transmitter.
The overlay enables the LVDS controller and the display unit (DU/LCDC),
and configures the ITE6263 on I2C2.
Update the Makefile to build the overlay as both a standalone .dtbo and
a composite .dtb (base DTB + overlay).
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
arch/arm64/boot/dts/renesas/Makefile | 3 +
.../r9a08g046l48-smarc-lvds-ite6263.dtso | 104 ++++++++++++++++++
2 files changed, 107 insertions(+)
create mode 100644 arch/arm64/boot/dts/renesas/r9a08g046l48-smarc-lvds-ite6263.dtso
diff --git a/arch/arm64/boot/dts/renesas/Makefile b/arch/arm64/boot/dts/renesas/Makefile
index 8c6a44890715..3cecc40204e9 100644
--- a/arch/arm64/boot/dts/renesas/Makefile
+++ b/arch/arm64/boot/dts/renesas/Makefile
@@ -190,6 +190,9 @@ dtb-$(CONFIG_ARCH_R9A08G046) += r9a08g046l48-smarc.dtb
dtb-$(CONFIG_ARCH_R9A08G046) += r9a08g046l48-smarc-dsi-adv7535.dtbo
r9a08g046l48-smarc-dsi-adv7535-dtbs := r9a08g046l48-smarc.dtb r9a08g046l48-smarc-dsi-adv7535.dtbo
dtb-$(CONFIG_ARCH_R9A08G046) += r9a08g046l48-smarc-dsi-adv7535.dtb
+dtb-$(CONFIG_ARCH_R9A08G046) += r9a08g046l48-smarc-lvds-ite6263.dtbo
+r9a08g046l48-smarc-lvds-ite6263-dtbs := r9a08g046l48-smarc.dtb r9a08g046l48-smarc-lvds-ite6263.dtbo
+dtb-$(CONFIG_ARCH_R9A08G046) += r9a08g046l48-smarc-lvds-ite6263.dtb
dtb-$(CONFIG_ARCH_R9A09G011) += r9a09g011-v2mevk2.dtb
diff --git a/arch/arm64/boot/dts/renesas/r9a08g046l48-smarc-lvds-ite6263.dtso b/arch/arm64/boot/dts/renesas/r9a08g046l48-smarc-lvds-ite6263.dtso
new file mode 100644
index 000000000000..95e1f411fa04
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/r9a08g046l48-smarc-lvds-ite6263.dtso
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree overlay for the RZ/G3L SMARC EVK with ITE6263
+ * connected to LVDS and LCDC enabled.
+ *
+ * Copyright (C) 2026 Renesas Electronics Corp.
+ */
+
+/dts-v1/;
+/plugin/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/pinctrl/renesas,r9a08g046-pinctrl.h>
+
+&{/} {
+ lvds-to-hdmi-out {
+ compatible = "hdmi-connector";
+ type = "d";
+
+ port {
+ lvds_to_hdmi_con_out: endpoint {
+ remote-endpoint = <&it6263_out>;
+ };
+ };
+ };
+
+ reg_1v8: regulator-1v8 {
+ compatible = "regulator-fixed";
+ regulator-name = "fixed-1.8V";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
+ reg_3v3: regulator-3v3 {
+ compatible = "regulator-fixed";
+ regulator-name = "fixed-3.3V";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+};
+
+&du {
+ status = "okay";
+};
+
+&i2c2 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ it6263: it6263@4c {
+ compatible = "ite,it6263";
+ reg = <0x4c>;
+ data-mapping = "vesa-24";
+ ivdd-supply = <®_1v8>;
+ ovdd-supply = <®_3v3>;
+ txavcc18-supply = <®_1v8>;
+ txavcc33-supply = <®_3v3>;
+ pvcc1-supply = <®_1v8>;
+ pvcc2-supply = <®_1v8>;
+ avcc-supply = <®_3v3>;
+ anvdd-supply = <®_1v8>;
+ apvdd-supply = <®_1v8>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ bridge_in: endpoint {
+ remote-endpoint = <&lvds_out>;
+ };
+ };
+
+ port@2 {
+ reg = <2>;
+ it6263_out: endpoint {
+ remote-endpoint = <&lvds_to_hdmi_con_out>;
+ };
+ };
+ };
+ };
+};
+
+&lvds {
+ status = "okay";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@1 {
+ reg = <1>;
+ lvds_out: endpoint {
+ remote-endpoint = <&bridge_in>;
+ };
+ };
+ };
+};
--
2.43.0
^ permalink raw reply related [flat|nested] 25+ messages in thread