* [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C
@ 2026-05-22 10:22 Claudiu Beznea
2026-05-22 10:22 ` [PATCH 1/9] pinctrl: renesas: rzg2l: Generalize the power source code Claudiu Beznea
` (8 more replies)
0 siblings, 9 replies; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Hi,
Series adds pinctrl support for the I3C on Renesas RZ/G3S SoC. For a
clean I3C support, cleanup patches for the pinctrl driver were also
included.
Series is based on next-20260521 + series at [1].
Thank you,
Claudiu
[1] https://lore.kernel.org/all20260515124008.2947838-1-claudiu.beznea@kernel.org
Claudiu Beznea (9):
pinctrl: renesas: rzg2l: Generalize the power source code
pinctrl: renesas: rzg2l: Drop defines present in struct rzg2l_hwcfg
pinctrl: renesas: rzg2l: Keep member documentation aligned
pinctrl: renesas: rzg2l: Use tab instead of spaces
dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the missing I3C
power source option
pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C
power source
dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the I3C standby
property
pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C
standby state
arm64: dts: renesas: rzg3s-smarc-som: Enable I3C
.../pinctrl/renesas,rzg2l-pinctrl.yaml | 9 +-
.../boot/dts/renesas/rzg3s-smarc-som.dtsi | 30 ++
.../boot/dts/renesas/rzg3s-smarc-switches.h | 4 +
drivers/pinctrl/renesas/pinctrl-rzg2l.c | 305 +++++++++++++-----
4 files changed, 271 insertions(+), 77 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/9] pinctrl: renesas: rzg2l: Generalize the power source code
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 10:22 ` [PATCH 2/9] pinctrl: renesas: rzg2l: Drop defines present in struct rzg2l_hwcfg Claudiu Beznea
` (7 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
The current functions used to get/set the pin power source check the
OTHER_POC register, which is specific to the RZ/G3L SoC only. To allow the
code to be extended for other power source functionalities (e.g. I3C on
RZ/G3S), generalize the functions used to get/set the pin power source.
For this, introduce the struct rzg2l_register_masks data structure whose
purpose is to store SoC specific register bit masks. The members of this
structure are then used in rzg2l_caps_to_pwr_reg() to retrieve the bitmask
corresponding to a SoC specific power source capability.
The conversion between HW specific power source values and SW specific
power source values is now handled through rzg2l_pwr_reg_val_to_ps() and
rzg2l_ps_to_pwr_reg_val().
Finally, to keep the code generic, the register update in
rzg2l_set_power_source() was changed to a read-modify-write approach to
cover all cases.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
drivers/pinctrl/renesas/pinctrl-rzg2l.c | 177 +++++++++++++++---------
1 file changed, 112 insertions(+), 65 deletions(-)
diff --git a/drivers/pinctrl/renesas/pinctrl-rzg2l.c b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
index ac42093fc579..a648d75a2bd2 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
@@ -186,6 +186,7 @@
#define PVDD_2500 2 /* I/O domain voltage 2.5V */
#define PVDD_1800 1 /* I/O domain voltage <= 1.8V */
#define PVDD_3300 0 /* I/O domain voltage >= 3.3V */
+#define PVDD_MASK 0x3
#define PWPR_B0WI BIT(7) /* Bit Write Disable */
#define PWPR_PFCWE BIT(6) /* PFC Register Write Enable */
@@ -268,6 +269,23 @@ struct rzg2l_register_offsets {
u16 other_poc;
};
+/**
+ * struct rzg2l_register_masks - Masks for different RZ/G2L pinctrl functionalities
+ * @other_poc_pvdd1833_oth_awo_poc: PVDD1833_OTH_AWO_POC mask
+ * @other_poc_pvdd1833_oth_iso_poc: PVDD1833_OTH_ISO_POC mask
+ * @other_poc_wdtovf_n_poc: WDTOVF_N_POC mask
+ */
+struct rzg2l_register_masks {
+ union {
+ /* RZ/G3L masks */
+ struct {
+ u8 other_poc_pvdd1833_oth_awo_poc;
+ u8 other_poc_pvdd1833_oth_iso_poc;
+ u8 other_poc_wdtovf_n_poc;
+ };
+ };
+};
+
/**
* enum rzg2l_iolh_index - starting indices in IOLH specific arrays
* @RZG2L_IOLH_IDX_1V8: starting index for 1V8 power source
@@ -288,6 +306,8 @@ enum rzg2l_iolh_index {
/**
* struct rzg2l_hwcfg - hardware configuration data structure
* @regs: hardware specific register offsets
+ * @masks: hardware specific masks for various functionalities available in
+ * the registers described by regs
* @iolh_groupa_ua: IOLH group A uA specific values
* @iolh_groupb_ua: IOLH group B uA specific values
* @iolh_groupc_ua: IOLH group C uA specific values
@@ -301,6 +321,7 @@ enum rzg2l_iolh_index {
*/
struct rzg2l_hwcfg {
const struct rzg2l_register_offsets regs;
+ const struct rzg2l_register_masks masks;
u16 iolh_groupa_ua[RZG2L_IOLH_IDX_MAX];
u16 iolh_groupb_ua[RZG2L_IOLH_IDX_MAX];
u16 iolh_groupc_ua[RZG2L_IOLH_IDX_MAX];
@@ -1047,27 +1068,73 @@ static void rzg2l_rmw_pin_config(struct rzg2l_pinctrl *pctrl, u32 offset,
}
static int rzg2l_caps_to_pwr_reg(const struct rzg2l_register_offsets *regs,
- u32 caps, u8 *mask)
+ const struct rzg2l_register_masks *masks,
+ u32 caps, u16 *offset, u8 *mask)
{
- if (caps & PIN_CFG_IO_VMC_SD0)
- return SD_CH(regs->sd_ch, 0);
- if (caps & PIN_CFG_IO_VMC_SD1)
- return SD_CH(regs->sd_ch, 1);
- if (caps & PIN_CFG_IO_VMC_ETH0)
- return ETH_POC(regs->eth_poc, 0);
- if (caps & PIN_CFG_IO_VMC_ETH1)
- return ETH_POC(regs->eth_poc, 1);
- if (caps & PIN_CFG_IO_VMC_QSPI)
- return QSPI;
+ *mask = PVDD_MASK;
+
+ if (caps & PIN_CFG_IO_VMC_SD0) {
+ *offset = SD_CH(regs->sd_ch, 0);
+ return 0;
+ }
+ if (caps & PIN_CFG_IO_VMC_SD1) {
+ *offset = SD_CH(regs->sd_ch, 1);
+ return 0;
+ }
+ if (caps & PIN_CFG_IO_VMC_ETH0) {
+ *offset = ETH_POC(regs->eth_poc, 0);
+ return 0;
+ }
+ if (caps & PIN_CFG_IO_VMC_ETH1) {
+ *offset = ETH_POC(regs->eth_poc, 1);
+ return 0;
+ }
+ if (caps & PIN_CFG_IO_VMC_QSPI) {
+ *offset = regs->qspi;
+ return 0;
+ }
if (caps & PIN_CFG_OTHER_POC_MASK) {
+ *offset = regs->other_poc;
if (caps & PIN_CFG_PVDD1833_OTH_AWO_POC)
- *mask = BIT(0);
+ *mask = masks->other_poc_pvdd1833_oth_awo_poc;
else if (caps & PIN_CFG_PVDD1833_OTH_ISO_POC)
- *mask = BIT(1);
+ *mask = masks->other_poc_pvdd1833_oth_iso_poc;
else
- *mask = BIT(2);
+ *mask = masks->other_poc_wdtovf_n_poc;
+ return 0;
+ }
- return OTHER_POC;
+ return -EINVAL;
+}
+
+static int rzg2l_pwr_reg_val_to_ps(u8 val, u32 caps)
+{
+ switch (val) {
+ case PVDD_1800:
+ return 1800;
+ case PVDD_2500:
+ return 2500;
+ case PVDD_3300:
+ return 3300;
+ }
+
+ return -EINVAL;
+}
+
+static int rzg2l_ps_to_pwr_reg_val(u8 *val, u32 ps, u32 caps)
+{
+ switch (ps) {
+ case 1800:
+ *val = PVDD_1800;
+ return 0;
+ case 2500:
+ if (!(caps & (PIN_CFG_IO_VMC_ETH0 | PIN_CFG_IO_VMC_ETH1)))
+ return -EINVAL;
+ *val = PVDD_2500;
+ return 0;
+ case 3300:
+ *val = PVDD_3300;
+ return 0;
}
return -EINVAL;
@@ -1077,76 +1144,51 @@ static int rzg2l_get_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps
{
const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
const struct rzg2l_register_offsets *regs = &hwcfg->regs;
- u8 val, mask;
- int pwr_reg;
+ const struct rzg2l_register_masks *masks = &hwcfg->masks;
+ u8 mask, val;
+ u16 offset;
+ int ret;
if (caps & PIN_CFG_SOFT_PS)
return pctrl->settings[pin].power_source;
- pwr_reg = rzg2l_caps_to_pwr_reg(regs, caps, &mask);
- if (pwr_reg < 0)
- return pwr_reg;
+ ret = rzg2l_caps_to_pwr_reg(regs, masks, caps, &offset, &mask);
+ if (ret)
+ return ret;
- val = readb(pctrl->base + pwr_reg);
- if (pwr_reg == OTHER_POC)
- val = field_get(mask, val);
+ val = readb(pctrl->base + offset);
- switch (val) {
- case PVDD_1800:
- return 1800;
- case PVDD_2500:
- return 2500;
- case PVDD_3300:
- return 3300;
- default:
- /* Should not happen. */
- return -EINVAL;
- }
+ return rzg2l_pwr_reg_val_to_ps(field_get(mask, val), caps);
}
static int rzg2l_set_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps, u32 ps)
{
const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
const struct rzg2l_register_offsets *regs = &hwcfg->regs;
- u8 poc_val, val, mask;
- int pwr_reg;
+ const struct rzg2l_register_masks *masks = &hwcfg->masks;
+ u8 mask, val;
+ u16 offset;
+ int ret;
if (caps & PIN_CFG_SOFT_PS) {
pctrl->settings[pin].power_source = ps;
return 0;
}
- switch (ps) {
- case 1800:
- poc_val = PVDD_1800;
- break;
- case 2500:
- if (!(caps & (PIN_CFG_IO_VMC_ETH0 | PIN_CFG_IO_VMC_ETH1)))
- return -EINVAL;
- poc_val = PVDD_2500;
- break;
- case 3300:
- poc_val = PVDD_3300;
- break;
- default:
- return -EINVAL;
- }
+ ret = rzg2l_ps_to_pwr_reg_val(&val, ps, caps);
+ if (ret)
+ return ret;
+
+ ret = rzg2l_caps_to_pwr_reg(regs, masks, caps, &offset, &mask);
+ if (ret)
+ return ret;
- pwr_reg = rzg2l_caps_to_pwr_reg(regs, caps, &mask);
- if (pwr_reg < 0)
- return pwr_reg;
+ scoped_guard(raw_spinlock, &pctrl->lock) {
+ u8 tmp = readb(pctrl->base + offset);
- if (pwr_reg == OTHER_POC) {
- scoped_guard(raw_spinlock, &pctrl->lock) {
- val = readb(pctrl->base + pwr_reg);
- if (poc_val)
- val |= mask;
- else
- val &= ~mask;
- writeb(val, pctrl->base + pwr_reg);
- }
- } else {
- writeb(poc_val, pctrl->base + pwr_reg);
+ tmp &= ~mask;
+ tmp |= field_prep(mask, val);
+ writeb(tmp, pctrl->base + offset);
}
pctrl->settings[pin].power_source = ps;
@@ -3795,6 +3837,11 @@ static const struct rzg2l_hwcfg rzg3l_hwcfg = {
.oen = 0x3018,
.other_poc = OTHER_POC,
},
+ .masks = {
+ .other_poc_pvdd1833_oth_awo_poc = BIT(0),
+ .other_poc_pvdd1833_oth_iso_poc = BIT(1),
+ .other_poc_wdtovf_n_poc = BIT(2),
+ },
.iolh_groupa_ua = {
/* 1v8 power source */
[RZG2L_IOLH_IDX_1V8] = 2200, 4400, 9000, 10000,
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/9] pinctrl: renesas: rzg2l: Drop defines present in struct rzg2l_hwcfg
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
2026-05-22 10:22 ` [PATCH 1/9] pinctrl: renesas: rzg2l: Generalize the power source code Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 10:22 ` [PATCH 3/9] pinctrl: renesas: rzg2l: Keep member documentation aligned Claudiu Beznea
` (6 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Drop the QSPI and OTHER_POC register defines, which are SoC specific and
accessible through struct rzg2l_hwcfg::{qspi, other_poc}.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
drivers/pinctrl/renesas/pinctrl-rzg2l.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/pinctrl/renesas/pinctrl-rzg2l.c b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
index a648d75a2bd2..77443cf1f431 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
@@ -180,8 +180,6 @@
#define SMT(off) (0x3400 + (off) * 8)
#define SD_CH(off, ch) ((off) + (ch) * 4)
#define ETH_POC(off, ch) ((off) + (ch) * 4)
-#define QSPI (0x3008) /* known on RZ/{G2L,G2LC,G2UL,Five} only */
-#define OTHER_POC (0x3028) /* known on RZ/G3L only */
#define PVDD_2500 2 /* I/O domain voltage 2.5V */
#define PVDD_1800 1 /* I/O domain voltage <= 1.8V */
@@ -3816,9 +3814,9 @@ static const struct rzg2l_hwcfg rzg2l_hwcfg = {
.regs = {
.pwpr = 0x3014,
.sd_ch = 0x3000,
+ .qspi = 0x3008,
.eth_poc = 0x300c,
.oen = 0x3018,
- .qspi = QSPI,
},
.iolh_groupa_ua = {
/* 3v3 power source */
@@ -3835,7 +3833,7 @@ static const struct rzg2l_hwcfg rzg3l_hwcfg = {
.sd_ch = 0x3004,
.eth_poc = 0x3010,
.oen = 0x3018,
- .other_poc = OTHER_POC,
+ .other_poc = 0x3028,
},
.masks = {
.other_poc_pvdd1833_oth_awo_poc = BIT(0),
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/9] pinctrl: renesas: rzg2l: Keep member documentation aligned
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
2026-05-22 10:22 ` [PATCH 1/9] pinctrl: renesas: rzg2l: Generalize the power source code Claudiu Beznea
2026-05-22 10:22 ` [PATCH 2/9] pinctrl: renesas: rzg2l: Drop defines present in struct rzg2l_hwcfg Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 10:22 ` [PATCH 4/9] pinctrl: renesas: rzg2l: Use tab instead of spaces Claudiu Beznea
` (5 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Keep the documentation for struct rzg2l_pinctrl_reg_cache members aligned
with the struct member order.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
drivers/pinctrl/renesas/pinctrl-rzg2l.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/pinctrl/renesas/pinctrl-rzg2l.c b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
index 77443cf1f431..b1ffdc133987 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
@@ -380,16 +380,16 @@ struct rzg2l_pinctrl_pin_settings {
* @pmc: PMC registers cache
* @pfc: PFC registers cache
* @iolh: IOLH registers cache
- * @pupd: PUPD registers cache
* @ien: IEN registers cache
+ * @pupd: PUPD registers cache
* @smt: SMT registers cache
* @sr: SR registers cache
* @nod: NOD registers cache
* @clone: Clone register cache
* @sd_ch: SD_CH registers cache
* @eth_poc: ET_POC registers cache
- * @other_poc: OTHER_POC register cache
* @oen: Output Enable register cache
+ * @other_poc: OTHER_POC register cache
* @qspi: QSPI registers cache
*/
struct rzg2l_pinctrl_reg_cache {
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/9] pinctrl: renesas: rzg2l: Use tab instead of spaces
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
` (2 preceding siblings ...)
2026-05-22 10:22 ` [PATCH 3/9] pinctrl: renesas: rzg2l: Keep member documentation aligned Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 10:22 ` [PATCH 5/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the missing I3C power source option Claudiu Beznea
` (4 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Use tab instead of spaces to follow the same coding style.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
drivers/pinctrl/renesas/pinctrl-rzg2l.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/pinctrl/renesas/pinctrl-rzg2l.c b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
index b1ffdc133987..517001145bd0 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
@@ -407,7 +407,7 @@ struct rzg2l_pinctrl_reg_cache {
u8 sd_ch[2];
u8 eth_poc[2];
u8 oen;
- u8 other_poc;
+ u8 other_poc;
u8 qspi;
};
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 5/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the missing I3C power source option
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
` (3 preceding siblings ...)
2026-05-22 10:22 ` [PATCH 4/9] pinctrl: renesas: rzg2l: Use tab instead of spaces Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 16:11 ` Conor Dooley
2026-05-22 10:22 ` [PATCH 6/9] pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C power source Claudiu Beznea
` (3 subsequent siblings)
8 siblings, 1 reply; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
The I3C pins on the Renesas RZ/G3S SoC can be powered at either 1.2V or
1.8V. Document the missing 1.2V power source option.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
.../devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml
index fb1fe1ea759f..32864c9add4a 100644
--- a/Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml
@@ -129,7 +129,7 @@ additionalProperties:
enum: [ 33, 50, 66, 100 ]
power-source:
description: I/O voltage in millivolt.
- enum: [ 1800, 2500, 3300 ]
+ enum: [ 1200, 1800, 2500, 3300 ]
slew-rate: true
gpio-hog: true
gpios: true
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 6/9] pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C power source
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
` (4 preceding siblings ...)
2026-05-22 10:22 ` [PATCH 5/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the missing I3C power source option Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 10:22 ` [PATCH 7/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the I3C standby property Claudiu Beznea
` (2 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
The Renesas RZ/G3S I3C pins can be powered at either 1.8V or 1.2V. The
pin controller provides a register to select between these two options.
Update the Renesas RZ/G2L pin controller driver to allow selecting the
I3C power source on RZ/G3S SoC.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
drivers/pinctrl/renesas/pinctrl-rzg2l.c | 73 +++++++++++++++++++++++--
1 file changed, 68 insertions(+), 5 deletions(-)
diff --git a/drivers/pinctrl/renesas/pinctrl-rzg2l.c b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
index 517001145bd0..68329b6c6649 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
@@ -69,6 +69,7 @@
#define PIN_CFG_PVDD1833_OTH_AWO_POC BIT(19) /* known on RZ/G3L only */
#define PIN_CFG_PVDD1833_OTH_ISO_POC BIT(20) /* known on RZ/G3L only */
#define PIN_CFG_WDTOVF_N_POC BIT(21) /* known on RZ/G3L only */
+#define PIN_CFG_IO_VMC_I3C BIT(22)
#define RZG2L_SINGLE_PIN BIT_ULL(63) /* Dedicated pin */
#define RZG2L_VARIABLE_CFG BIT_ULL(62) /* Variable cfg for port pins */
@@ -186,6 +187,9 @@
#define PVDD_3300 0 /* I/O domain voltage >= 3.3V */
#define PVDD_MASK 0x3
+#define PVDD_I3C_1200 1 /* I3C I/O domain voltage 1.2V */
+#define PVDD_I3C_1800 0 /* I3C I/O domain voltage 1.8V */
+
#define PWPR_B0WI BIT(7) /* Bit Write Disable */
#define PWPR_PFCWE BIT(6) /* PFC Register Write Enable */
#define PWPR_REGWE_A BIT(6) /* PFC and PMC Register Write Enable on RZ/V2H(P) */
@@ -257,6 +261,7 @@ static const struct pin_config_item renesas_rzv2h_conf_items[] = {
* @oen: OEN register offset
* @qspi: QSPI register offset
* @other_poc: OTHER_POC register offset
+ * @i3c_set: I3C_SET register offset
*/
struct rzg2l_register_offsets {
u16 pwpr;
@@ -265,6 +270,7 @@ struct rzg2l_register_offsets {
u16 oen;
u16 qspi;
u16 other_poc;
+ u16 i3c_set;
};
/**
@@ -272,6 +278,7 @@ struct rzg2l_register_offsets {
* @other_poc_pvdd1833_oth_awo_poc: PVDD1833_OTH_AWO_POC mask
* @other_poc_pvdd1833_oth_iso_poc: PVDD1833_OTH_ISO_POC mask
* @other_poc_wdtovf_n_poc: WDTOVF_N_POC mask
+ * @i3c_set_poc: I3C_SET_POC mask
*/
struct rzg2l_register_masks {
union {
@@ -281,6 +288,11 @@ struct rzg2l_register_masks {
u8 other_poc_pvdd1833_oth_iso_poc;
u8 other_poc_wdtovf_n_poc;
};
+
+ /* RZ/G3S masks */
+ struct {
+ u8 i3c_set_poc;
+ };
};
};
@@ -391,6 +403,7 @@ struct rzg2l_pinctrl_pin_settings {
* @oen: Output Enable register cache
* @other_poc: OTHER_POC register cache
* @qspi: QSPI registers cache
+ * @i3c_set: I3C_SET register cache
*/
struct rzg2l_pinctrl_reg_cache {
u8 *p;
@@ -409,6 +422,7 @@ struct rzg2l_pinctrl_reg_cache {
u8 oen;
u8 other_poc;
u8 qspi;
+ u8 i3c_set;
};
struct rzg2l_pinctrl {
@@ -441,6 +455,7 @@ struct rzg2l_pinctrl {
};
static const u16 available_ps[] = { 1800, 2500, 3300 };
+static const u16 available_i3c_ps[] = { 1200, 1800 };
static u64 rzg2l_pinctrl_get_variable_pin_cfg(struct rzg2l_pinctrl *pctrl,
u64 pincfg,
@@ -1101,12 +1116,28 @@ static int rzg2l_caps_to_pwr_reg(const struct rzg2l_register_offsets *regs,
*mask = masks->other_poc_wdtovf_n_poc;
return 0;
}
+ if (caps & PIN_CFG_IO_VMC_I3C) {
+ *offset = regs->i3c_set;
+ *mask = masks->i3c_set_poc;
+ return 0;
+ }
return -EINVAL;
}
static int rzg2l_pwr_reg_val_to_ps(u8 val, u32 caps)
{
+ if (caps & PIN_CFG_IO_VMC_I3C) {
+ switch (val) {
+ case PVDD_I3C_1200:
+ return 1200;
+ case PVDD_I3C_1800:
+ return 1800;
+ }
+
+ return -EINVAL;
+ }
+
switch (val) {
case PVDD_1800:
return 1800;
@@ -1121,6 +1152,19 @@ static int rzg2l_pwr_reg_val_to_ps(u8 val, u32 caps)
static int rzg2l_ps_to_pwr_reg_val(u8 *val, u32 ps, u32 caps)
{
+ if (caps & PIN_CFG_IO_VMC_I3C) {
+ switch (ps) {
+ case 1200:
+ *val = PVDD_I3C_1200;
+ return 0;
+ case 1800:
+ *val = PVDD_I3C_1800;
+ return 0;
+ }
+
+ return -EINVAL;
+ }
+
switch (ps) {
case 1800:
*val = PVDD_1800;
@@ -1194,12 +1238,21 @@ static int rzg2l_set_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps
return 0;
}
-static bool rzg2l_ps_is_supported(u16 ps)
+static bool rzg2l_ps_is_supported(u16 ps, u32 caps)
{
- unsigned int i;
+ unsigned int i, len;
+ const u16 *array;
- for (i = 0; i < ARRAY_SIZE(available_ps); i++) {
- if (available_ps[i] == ps)
+ if (caps & PIN_CFG_IO_VMC_I3C) {
+ array = available_i3c_ps;
+ len = ARRAY_SIZE(available_i3c_ps);
+ } else {
+ array = available_ps;
+ len = ARRAY_SIZE(available_ps);
+ }
+
+ for (i = 0; i < len; i++) {
+ if (array[i] == ps)
return true;
}
@@ -1800,7 +1853,7 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
/* Apply power source. */
if (settings.power_source != pctrl->settings[_pin].power_source) {
- ret = rzg2l_ps_is_supported(settings.power_source);
+ ret = rzg2l_ps_is_supported(settings.power_source, cfg);
if (!ret)
return -EINVAL;
@@ -2498,6 +2551,8 @@ static const struct rzg2l_dedicated_configs rzg3s_dedicated_pins[] = {
{ "AUDIO_CLK1", RZG2L_SINGLE_PIN_PACK(0x2, 0, PIN_CFG_IEN) },
{ "AUDIO_CLK2", RZG2L_SINGLE_PIN_PACK(0x2, 1, PIN_CFG_IEN) },
{ "WDTOVF_PERROUT#", RZG2L_SINGLE_PIN_PACK(0x6, 0, PIN_CFG_IOLH_A | PIN_CFG_SOFT_PS) },
+ { "I3C_SDA", RZG2L_SINGLE_PIN_PACK(0x9, 0, (PIN_CFG_IEN | PIN_CFG_IO_VMC_I3C)) },
+ { "I3C_SCL", RZG2L_SINGLE_PIN_PACK(0x9, 1, (PIN_CFG_IEN | PIN_CFG_IO_VMC_I3C)) },
{ "SD0_CLK", RZG2L_SINGLE_PIN_PACK(0x10, 0, (PIN_CFG_IOLH_B | PIN_CFG_IO_VMC_SD0)) },
{ "SD0_CMD", RZG2L_SINGLE_PIN_PACK(0x10, 1, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
PIN_CFG_IO_VMC_SD0)) },
@@ -3717,6 +3772,8 @@ static int rzg2l_pinctrl_suspend_noirq(struct device *dev)
cache->oen = readb(pctrl->base + pctrl->data->hwcfg->regs.oen);
if (regs->other_poc)
cache->other_poc = readb(pctrl->base + regs->other_poc);
+ if (regs->i3c_set)
+ cache->i3c_set = readb(pctrl->base + regs->i3c_set);
if (pctrl->syscon) {
int ret;
@@ -3759,6 +3816,8 @@ static int rzg2l_pinctrl_resume_noirq(struct device *dev)
writeb(cache->qspi, pctrl->base + regs->qspi);
if (regs->other_poc)
writeb(cache->other_poc, pctrl->base + regs->other_poc);
+ if (regs->i3c_set)
+ writeb(cache->i3c_set, pctrl->base + regs->i3c_set);
raw_spin_lock_irqsave(&pctrl->lock, flags);
rzg2l_oen_write_with_pwpr(pctrl, cache->oen);
@@ -3871,8 +3930,12 @@ static const struct rzg2l_hwcfg rzg3s_hwcfg = {
.pwpr = 0x3000,
.sd_ch = 0x3004,
.eth_poc = 0x3010,
+ .i3c_set = 0x301c,
.oen = 0x3018,
},
+ .masks = {
+ .i3c_set_poc = BIT(2),
+ },
.iolh_groupa_ua = {
/* 1v8 power source */
[RZG2L_IOLH_IDX_1V8] = 2200, 4400, 9000, 10000,
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 7/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the I3C standby property
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
` (5 preceding siblings ...)
2026-05-22 10:22 ` [PATCH 6/9] pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C power source Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 12:30 ` Wolfram Sang
2026-05-22 10:22 ` [PATCH 8/9] pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C standby state Claudiu Beznea
2026-05-22 10:22 ` [PATCH 9/9] arm64: dts: renesas: rzg3s-smarc-som: Enable I3C Claudiu Beznea
8 siblings, 1 reply; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
The I3C pins on the Renesas RZ/G3S SoC can be configured in standby mode
when operating in I2C mode. According to the RZ/G3S HW manual (Rev. 1.20),
when standby mode is selected, the output is fixed at Hi-Z and no data is
transferred internally, even if data is received from outside.
Document the renesas,i3c-standby property.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
.../devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml
index 32864c9add4a..94a51666b1a2 100644
--- a/Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/renesas,rzg2l-pinctrl.yaml
@@ -153,6 +153,13 @@ additionalProperties:
register, which adjusts the drive strength value and is pin-dependent.
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 1, 2, 3]
+ renesas,i3c-standby:
+ description:
+ Controls the standby mode of the I3C interface when operating in I2C mode.
+ When standby mode is selected, the output is fixed at Hi-Z and no data is
+ transferred internally, even if data is received from outside.
+ $ref: /schemas/types.yaml#/definitions/uint32
+ enum: [0, 1]
- type: object
additionalProperties:
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 8/9] pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C standby state
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
` (6 preceding siblings ...)
2026-05-22 10:22 ` [PATCH 7/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the I3C standby property Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 10:22 ` [PATCH 9/9] arm64: dts: renesas: rzg3s-smarc-som: Enable I3C Claudiu Beznea
8 siblings, 0 replies; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
The I3C pins on the Renesas RZ/G3S SoC can be switched to a standby mode
when the controller operates in I2C mode. According to the RZ/G3S HW
manual (Rev. 1.20), in standby mode "the output is fixed at Hi-Z and no
data is transferred to the inside even if data is input from outside".
Add support to configure the I3C standby mode.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
drivers/pinctrl/renesas/pinctrl-rzg2l.c | 49 ++++++++++++++++++++++++-
1 file changed, 47 insertions(+), 2 deletions(-)
diff --git a/drivers/pinctrl/renesas/pinctrl-rzg2l.c b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
index 68329b6c6649..b313de35e9df 100644
--- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c
+++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
@@ -70,6 +70,7 @@
#define PIN_CFG_PVDD1833_OTH_ISO_POC BIT(20) /* known on RZ/G3L only */
#define PIN_CFG_WDTOVF_N_POC BIT(21) /* known on RZ/G3L only */
#define PIN_CFG_IO_VMC_I3C BIT(22)
+#define PIN_CFG_I3C_STANDBY_RZG3S BIT(23)
#define RZG2L_SINGLE_PIN BIT_ULL(63) /* Dedicated pin */
#define RZG2L_VARIABLE_CFG BIT_ULL(62) /* Variable cfg for port pins */
@@ -215,15 +216,24 @@
/* Custom pinconf parameters */
#define RENESAS_RZV2H_PIN_CONFIG_OUTPUT_IMPEDANCE (PIN_CONFIG_END + 1)
+#define RENESAS_RZG3S_PIN_CONFIG_I3C_STANDBY (PIN_CONFIG_END + 2)
static const struct pinconf_generic_params renesas_rzv2h_custom_bindings[] = {
{ "renesas,output-impedance", RENESAS_RZV2H_PIN_CONFIG_OUTPUT_IMPEDANCE, 1 },
};
+static const struct pinconf_generic_params renesas_rzg3s_custom_bindings[] = {
+ { "renesas,i3c-standby", RENESAS_RZG3S_PIN_CONFIG_I3C_STANDBY, 0 },
+};
+
#ifdef CONFIG_DEBUG_FS
static const struct pin_config_item renesas_rzv2h_conf_items[] = {
PCONFDUMP(RENESAS_RZV2H_PIN_CONFIG_OUTPUT_IMPEDANCE, "output-impedance", "x", true),
};
+
+static const struct pin_config_item renesas_rzg3s_conf_items[] = {
+ PCONFDUMP(RENESAS_RZG3S_PIN_CONFIG_I3C_STANDBY, "standby", NULL, true),
+};
#endif
/* Read/write 8 bits register */
@@ -279,6 +289,7 @@ struct rzg2l_register_offsets {
* @other_poc_pvdd1833_oth_iso_poc: PVDD1833_OTH_ISO_POC mask
* @other_poc_wdtovf_n_poc: WDTOVF_N_POC mask
* @i3c_set_poc: I3C_SET_POC mask
+ * @i3c_set_stbn: I3C_SET_STBN mask
*/
struct rzg2l_register_masks {
union {
@@ -292,6 +303,7 @@ struct rzg2l_register_masks {
/* RZ/G3S masks */
struct {
u8 i3c_set_poc;
+ u8 i3c_set_stbn;
};
};
};
@@ -1560,6 +1572,8 @@ static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
struct rzg2l_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
const struct pinctrl_pin_desc *pin = &pctrl->desc.pins[_pin];
+ const struct rzg2l_register_offsets *regs = &hwcfg->regs;
+ const struct rzg2l_register_masks *masks = &hwcfg->masks;
u32 param = pinconf_to_config_param(*config);
u64 *pin_data = pin->drv_data;
unsigned int arg = 0;
@@ -1702,6 +1716,14 @@ static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
arg = rzg2l_read_pin_config(pctrl, IOLH(off), bit, IOLH_MASK);
break;
+ case RENESAS_RZG3S_PIN_CONFIG_I3C_STANDBY:
+ if (!(cfg & PIN_CFG_I3C_STANDBY_RZG3S))
+ return -EINVAL;
+
+ arg = readb(pctrl->base + regs->i3c_set);
+ arg = !field_get(masks->i3c_set_stbn, arg);
+ break;
+
default:
return -ENOTSUPP;
}
@@ -1720,6 +1742,8 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
const struct pinctrl_pin_desc *pin = &pctrl->desc.pins[_pin];
const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
struct rzg2l_pinctrl_pin_settings settings = pctrl->settings[_pin];
+ const struct rzg2l_register_offsets *regs = &hwcfg->regs;
+ const struct rzg2l_register_masks *masks = &hwcfg->masks;
u64 *pin_data = pin->drv_data;
unsigned int i, arg, index;
u32 off, param;
@@ -1846,6 +1870,19 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
rzg2l_rmw_pin_config(pctrl, IOLH(off), bit, IOLH_MASK, arg);
break;
+ case RENESAS_RZG3S_PIN_CONFIG_I3C_STANDBY:
+ if (!(cfg & PIN_CFG_I3C_STANDBY_RZG3S))
+ return -EINVAL;
+
+ scoped_guard(raw_spinlock, &pctrl->lock) {
+ u8 tmp = readb(pctrl->base + regs->i3c_set);
+
+ tmp &= ~masks->i3c_set_stbn;
+ tmp |= field_prep(masks->i3c_set_stbn, !arg);
+ writeb(tmp, pctrl->base + regs->i3c_set);
+ }
+ break;
+
default:
return -ENOTSUPP;
}
@@ -2551,8 +2588,10 @@ static const struct rzg2l_dedicated_configs rzg3s_dedicated_pins[] = {
{ "AUDIO_CLK1", RZG2L_SINGLE_PIN_PACK(0x2, 0, PIN_CFG_IEN) },
{ "AUDIO_CLK2", RZG2L_SINGLE_PIN_PACK(0x2, 1, PIN_CFG_IEN) },
{ "WDTOVF_PERROUT#", RZG2L_SINGLE_PIN_PACK(0x6, 0, PIN_CFG_IOLH_A | PIN_CFG_SOFT_PS) },
- { "I3C_SDA", RZG2L_SINGLE_PIN_PACK(0x9, 0, (PIN_CFG_IEN | PIN_CFG_IO_VMC_I3C)) },
- { "I3C_SCL", RZG2L_SINGLE_PIN_PACK(0x9, 1, (PIN_CFG_IEN | PIN_CFG_IO_VMC_I3C)) },
+ { "I3C_SDA", RZG2L_SINGLE_PIN_PACK(0x9, 0, (PIN_CFG_IEN | PIN_CFG_IO_VMC_I3C |
+ PIN_CFG_I3C_STANDBY_RZG3S)) },
+ { "I3C_SCL", RZG2L_SINGLE_PIN_PACK(0x9, 1, (PIN_CFG_IEN | PIN_CFG_IO_VMC_I3C |
+ PIN_CFG_I3C_STANDBY_RZG3S)) },
{ "SD0_CLK", RZG2L_SINGLE_PIN_PACK(0x10, 0, (PIN_CFG_IOLH_B | PIN_CFG_IO_VMC_SD0)) },
{ "SD0_CMD", RZG2L_SINGLE_PIN_PACK(0x10, 1, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
PIN_CFG_IO_VMC_SD0)) },
@@ -3934,6 +3973,7 @@ static const struct rzg2l_hwcfg rzg3s_hwcfg = {
.oen = 0x3018,
},
.masks = {
+ .i3c_set_stbn = BIT(0),
.i3c_set_poc = BIT(2),
},
.iolh_groupa_ua = {
@@ -4020,6 +4060,11 @@ static struct rzg2l_pinctrl_data r9a08g045_data = {
.pin_to_oen_bit = &rzg3s_pin_to_oen_bit,
.hw_to_bias_param = &rzg2l_hw_to_bias_param,
.bias_param_to_hw = &rzg2l_bias_param_to_hw,
+ .num_custom_params = ARRAY_SIZE(renesas_rzg3s_custom_bindings),
+ .custom_params = renesas_rzg3s_custom_bindings,
+#ifdef CONFIG_DEBUG_FS
+ .custom_conf_items = renesas_rzg3s_conf_items,
+#endif
};
static struct rzg2l_pinctrl_data r9a08g046_data = {
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 9/9] arm64: dts: renesas: rzg3s-smarc-som: Enable I3C
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
` (7 preceding siblings ...)
2026-05-22 10:22 ` [PATCH 8/9] pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C standby state Claudiu Beznea
@ 2026-05-22 10:22 ` Claudiu Beznea
2026-05-22 12:29 ` Wolfram Sang
8 siblings, 1 reply; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 10:22 UTC (permalink / raw)
To: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas
Cc: claudiu.beznea, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
The Renesas RZ/G3S SMARC SoM board has a connector for I3C interface.
Enable I3C.
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---
.../boot/dts/renesas/rzg3s-smarc-som.dtsi | 30 +++++++++++++++++++
.../boot/dts/renesas/rzg3s-smarc-switches.h | 4 +++
2 files changed, 34 insertions(+)
diff --git a/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi b/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi
index b45acfe6288a..370b39b6a33d 100644
--- a/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi
+++ b/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi
@@ -168,6 +168,15 @@ a0 80 30 30 9c
};
};
+&i3c {
+ pinctrl-names = "default", "sleep";
+ pinctrl-0 = <&i3c_pins>;
+ pinctrl-1 = <&i3c_standby_pins>;
+ i2c-scl-hz = <400000>;
+ i3c-scl-hz = <12500000>;
+ status = "okay";
+};
+
&pcie_port0 {
clocks = <&versa3 5>;
clock-names = "ref";
@@ -302,6 +311,27 @@ mux {
};
};
+ i3c_pins: i3c {
+ pins = "I3C_SDA", "I3C_SCL";
+#if SW_CONFIG4 == SW_ON
+ power-source = <1200>;
+#else
+ power-source = <1800>;
+#endif
+ input-enable;
+ renesas,i3c-standby = <0>;
+ };
+
+ i3c_standby_pins: i3c-standby {
+ pins = "I3C_SDA", "I3C_SCL";
+#if SW_CONFIG4 == SW_ON
+ power-source = <1200>;
+#else
+ power-source = <1800>;
+#endif
+ renesas,i3c-standby = <1>;
+ };
+
sdhi0_pins: sd0 {
data {
pins = "SD0_DATA0", "SD0_DATA1", "SD0_DATA2", "SD0_DATA3";
diff --git a/arch/arm64/boot/dts/renesas/rzg3s-smarc-switches.h b/arch/arm64/boot/dts/renesas/rzg3s-smarc-switches.h
index bbf908a5322c..9cccc87da057 100644
--- a/arch/arm64/boot/dts/renesas/rzg3s-smarc-switches.h
+++ b/arch/arm64/boot/dts/renesas/rzg3s-smarc-switches.h
@@ -25,9 +25,13 @@
* @SW_CONFIG3:
* SW_OFF - SD2 is connected to SoC
* SW_ON - SCIF1, SSI0, IRQ0, IRQ1 connected to SoC
+ * @SW_CONFIG4:
+ * SW_OFF - I3C voltage is 1.8V
+ * SW_ON - I3C voltage is 1.2V
*/
#define SW_CONFIG2 SW_OFF
#define SW_CONFIG3 SW_ON
+#define SW_CONFIG4 SW_OFF
/*
* SW_OPT_MUX[x] switches' states:
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 9/9] arm64: dts: renesas: rzg3s-smarc-som: Enable I3C
2026-05-22 10:22 ` [PATCH 9/9] arm64: dts: renesas: rzg3s-smarc-som: Enable I3C Claudiu Beznea
@ 2026-05-22 12:29 ` Wolfram Sang
2026-05-22 13:01 ` Claudiu Beznea
0 siblings, 1 reply; 14+ messages in thread
From: Wolfram Sang @ 2026-05-22 12:29 UTC (permalink / raw)
To: Claudiu Beznea
Cc: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
claudiu.beznea, linux-renesas-soc, linux-gpio, devicetree,
linux-kernel, Claudiu Beznea
[-- Attachment #1: Type: text/plain, Size: 731 bytes --]
Hi Claudiu,
> + i3c_pins: i3c {
> + pins = "I3C_SDA", "I3C_SCL";
> +#if SW_CONFIG4 == SW_ON
> + power-source = <1200>;
> +#else
> + power-source = <1800>;
> +#endif
> + input-enable;
> + renesas,i3c-standby = <0>;
> + };
> +
> + i3c_standby_pins: i3c-standby {
> + pins = "I3C_SDA", "I3C_SCL";
> +#if SW_CONFIG4 == SW_ON
> + power-source = <1200>;
> +#else
> + power-source = <1800>;
> +#endif
> + renesas,i3c-standby = <1>;
> + };
That doesn't look like HW description to me because the pins are the
same for regular and standby mode. Their state is changed when powering
down, but that should not need DT encoding, I'd think. The driver should
know what to do, or? Am I missing something?
Happy hacking,
Wolfram
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 7/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the I3C standby property
2026-05-22 10:22 ` [PATCH 7/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the I3C standby property Claudiu Beznea
@ 2026-05-22 12:30 ` Wolfram Sang
0 siblings, 0 replies; 14+ messages in thread
From: Wolfram Sang @ 2026-05-22 12:30 UTC (permalink / raw)
To: Claudiu Beznea
Cc: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
claudiu.beznea, linux-renesas-soc, linux-gpio, devicetree,
linux-kernel, Claudiu Beznea
[-- Attachment #1: Type: text/plain, Size: 507 bytes --]
Hi all,
> + renesas,i3c-standby:
> + description:
> + Controls the standby mode of the I3C interface when operating in I2C mode.
> + When standby mode is selected, the output is fixed at Hi-Z and no data is
> + transferred internally, even if data is received from outside.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + enum: [0, 1]
I commented on patch 9 to discuss if this binding is really needed.
Happy hacking,
Wolfram
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 9/9] arm64: dts: renesas: rzg3s-smarc-som: Enable I3C
2026-05-22 12:29 ` Wolfram Sang
@ 2026-05-22 13:01 ` Claudiu Beznea
0 siblings, 0 replies; 14+ messages in thread
From: Claudiu Beznea @ 2026-05-22 13:01 UTC (permalink / raw)
To: Wolfram Sang
Cc: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
claudiu.beznea, linux-renesas-soc, linux-gpio, devicetree,
linux-kernel, Claudiu Beznea
Hi, Wolfram,
On 5/22/26 15:29, Wolfram Sang wrote:
> Hi Claudiu,
>
>> + i3c_pins: i3c {
>> + pins = "I3C_SDA", "I3C_SCL";
>> +#if SW_CONFIG4 == SW_ON
>> + power-source = <1200>;
>> +#else
>> + power-source = <1800>;
>> +#endif
>> + input-enable;
>> + renesas,i3c-standby = <0>;
>> + };
>> +
>> + i3c_standby_pins: i3c-standby {
>> + pins = "I3C_SDA", "I3C_SCL";
>> +#if SW_CONFIG4 == SW_ON
>> + power-source = <1200>;
>> +#else
>> + power-source = <1800>;
>> +#endif
>> + renesas,i3c-standby = <1>;
>> + };
>
> That doesn't look like HW description to me because the pins are the
> same for regular and standby mode.
Yes, same pins, different states. Isn't that the role of different pinctrl
entries in DT for the same node? E.g., for SHDI we use the same approach, same
pins but different states. Bellow is an example from RZ/G3S but same approach is
used for other Renesas SoCs as well:
https://elixir.bootlin.com/linux/v7.1-rc4/source/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi#L305
https://elixir.bootlin.com/linux/v7.1-rc4/source/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi#L321
> Their state is changed when powering
> down, but that should not need DT encoding, I'd think. The driver should
> know what to do, or?
Through different pinctrl states different pinctrl settings are applied in the
pin controller HW by calling well known pinctrl APIs from the consumer drivers
(e.g. pinctrl_pm_select_sleep_state() in case of the I3C driver as proposed in [1]).
Is there another way the I3C driver (or any pinctrl driver consumer) could apply
pinctrl settings?
[1] https://lore.kernel.org/all/20260522101815.1722909-18-claudiu.beznea@kernel.org
--
Thank you,
Claudiu
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 5/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the missing I3C power source option
2026-05-22 10:22 ` [PATCH 5/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the missing I3C power source option Claudiu Beznea
@ 2026-05-22 16:11 ` Conor Dooley
0 siblings, 0 replies; 14+ messages in thread
From: Conor Dooley @ 2026-05-22 16:11 UTC (permalink / raw)
To: Claudiu Beznea
Cc: geert+renesas, linusw, robh, krzk+dt, conor+dt, magnus.damm,
wsa+renesas, claudiu.beznea, linux-renesas-soc, linux-gpio,
devicetree, linux-kernel, Claudiu Beznea
[-- Attachment #1: Type: text/plain, Size: 75 bytes --]
Acked-by: Conor Dooley <conor.dooley@microchip.com>
pw-bot: not-applicable
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-05-22 16:11 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-22 10:22 [PATCH 0/9] pinctrl: renesas: rzg2l: Add support for RZ/G3S I3C Claudiu Beznea
2026-05-22 10:22 ` [PATCH 1/9] pinctrl: renesas: rzg2l: Generalize the power source code Claudiu Beznea
2026-05-22 10:22 ` [PATCH 2/9] pinctrl: renesas: rzg2l: Drop defines present in struct rzg2l_hwcfg Claudiu Beznea
2026-05-22 10:22 ` [PATCH 3/9] pinctrl: renesas: rzg2l: Keep member documentation aligned Claudiu Beznea
2026-05-22 10:22 ` [PATCH 4/9] pinctrl: renesas: rzg2l: Use tab instead of spaces Claudiu Beznea
2026-05-22 10:22 ` [PATCH 5/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the missing I3C power source option Claudiu Beznea
2026-05-22 16:11 ` Conor Dooley
2026-05-22 10:22 ` [PATCH 6/9] pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C power source Claudiu Beznea
2026-05-22 10:22 ` [PATCH 7/9] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the I3C standby property Claudiu Beznea
2026-05-22 12:30 ` Wolfram Sang
2026-05-22 10:22 ` [PATCH 8/9] pinctrl: renesas: rzg2l: Add RZ/G3S support for selecting the I3C standby state Claudiu Beznea
2026-05-22 10:22 ` [PATCH 9/9] arm64: dts: renesas: rzg3s-smarc-som: Enable I3C Claudiu Beznea
2026-05-22 12:29 ` Wolfram Sang
2026-05-22 13:01 ` Claudiu Beznea
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox