* [PATCH 01/17] dt-bindings: mmc: renesas,sdhi: Document RZ/G3L (r9a08g046) SoC
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
@ 2026-05-30 16:07 ` Biju
2026-06-02 17:06 ` Conor Dooley
2026-05-30 16:07 ` [PATCH 04/17] mmc: renesas_sdhi: Fix whitespace alignment in struct renesas_sdhi_of_data Biju
` (10 subsequent siblings)
11 siblings, 1 reply; 15+ messages in thread
From: Biju @ 2026-05-30 16:07 UTC (permalink / raw)
To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm
Cc: Biju Das, Wolfram Sang, linux-mmc, devicetree, linux-kernel,
linux-renesas-soc, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Document the RZ/G3L (r9a08g046) SDHI controller. The RZ/G3L SDHI
controller is similar to RZ/G2L but has five clocks (core, clkh,
cd, aclk, aclkm) and three resets (rst, axim, axis), so update the
clocks/clock-names maximum to 5 and resets/reset-names maximum to 3.
It has an internal divider for all modes except HS400, and a 2048-bit
divider compared to 512 on others.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
.../devicetree/bindings/mmc/renesas,sdhi.yaml | 101 +++++++++++++-----
1 file changed, 75 insertions(+), 26 deletions(-)
diff --git a/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml b/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml
index 4d66966ce290..16cb395403f6 100644
--- a/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml
+++ b/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml
@@ -18,6 +18,7 @@ properties:
- renesas,sdhi-r7s9210 # SH-Mobile AG5
- renesas,sdhi-r8a73a4 # R-Mobile APE6
- renesas,sdhi-r8a7740 # R-Mobile A1
+ - renesas,sdhi-r9a08g046 # RZ/G3L
- renesas,sdhi-r9a09g057 # RZ/V2H(P)
- renesas,sdhi-sh73a0 # R-Mobile APE6
- items:
@@ -86,11 +87,11 @@ properties:
clocks:
minItems: 1
- maxItems: 4
+ maxItems: 5
clock-names:
minItems: 1
- maxItems: 4
+ maxItems: 5
dmas:
minItems: 4
@@ -116,7 +117,12 @@ properties:
maxItems: 1
resets:
- maxItems: 1
+ minItems: 1
+ maxItems: 3
+
+ reset-names:
+ minItems: 1
+ maxItems: 3
pinctrl-0:
minItems: 1
@@ -155,60 +161,101 @@ allOf:
properties:
compatible:
contains:
- enum:
- - renesas,sdhi-r9a09g057
- - renesas,rzg2l-sdhi
+ const: renesas,sdhi-r9a08g046
then:
properties:
clocks:
items:
- description: IMCLK, SDHI channel main clock1.
- description: CLK_HS, SDHI channel High speed clock which operates
- 4 times that of SDHI channel main clock1.
+ 2 times that of SDHI channel main clock1.
- description: IMCLK2, SDHI channel main clock2. When this clock is
turned off, external SD card detection cannot be
detected.
- - description: ACLK, SDHI channel bus clock.
+ - description: ACLK/IACLKS, SDHI channel bus clock.
+ - description: IACLKM, SDHI channel bus clock m.
clock-names:
items:
- const: core
- const: clkh
- const: cd
- const: aclk
+ - const: aclkm
+ resets:
+ items:
+ - description: rst, Core reset.
+ - description: axim, SDHI axi bus reset m.
+ - description: axis, SDHI axi bus reset s.
+ reset-names:
+ items:
+ - const: rst
+ - const: axim
+ - const: axis
required:
- clock-names
- resets
+ - reset-names
else:
if:
properties:
compatible:
contains:
enum:
- - renesas,rcar-gen2-sdhi
- - renesas,rcar-gen3-sdhi
- - renesas,rcar-gen4-sdhi
+ - renesas,sdhi-r9a09g057
+ - renesas,rzg2l-sdhi
then:
properties:
clocks:
- minItems: 1
- maxItems: 3
- clock-names:
- minItems: 1
- uniqueItems: true
items:
- - const: core
- - enum: [ clkh, cd ]
- - const: cd
- else:
- properties:
- clocks:
- minItems: 1
- maxItems: 2
+ - description: IMCLK, SDHI channel main clock1.
+ - description: CLK_HS, SDHI channel High speed clock which operates
+ 4 times that of SDHI channel main clock1.
+ - description: IMCLK2, SDHI channel main clock2. When this clock is
+ turned off, external SD card detection cannot be
+ detected.
+ - description: ACLK, SDHI channel bus clock.
clock-names:
- minItems: 1
items:
- const: core
+ - const: clkh
- const: cd
+ - const: aclk
+ resets:
+ maxItems: 1
+ required:
+ - clock-names
+ - resets
+ else:
+ if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - renesas,rcar-gen2-sdhi
+ - renesas,rcar-gen3-sdhi
+ - renesas,rcar-gen4-sdhi
+ then:
+ properties:
+ clocks:
+ minItems: 1
+ maxItems: 3
+ clock-names:
+ minItems: 1
+ uniqueItems: true
+ items:
+ - const: core
+ - enum: [ clkh, cd ]
+ - const: cd
+ else:
+ properties:
+ clocks:
+ minItems: 1
+ maxItems: 2
+ clock-names:
+ minItems: 1
+ items:
+ - const: core
+ - const: cd
- if:
properties:
@@ -247,7 +294,9 @@ allOf:
properties:
compatible:
contains:
- const: renesas,sdhi-r9a09g057
+ enum:
+ - renesas,sdhi-r9a08g046
+ - renesas,sdhi-r9a09g057
then:
properties:
vqmmc-regulator:
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH 01/17] dt-bindings: mmc: renesas,sdhi: Document RZ/G3L (r9a08g046) SoC
2026-05-30 16:07 ` [PATCH 01/17] dt-bindings: mmc: renesas,sdhi: Document RZ/G3L (r9a08g046) SoC Biju
@ 2026-06-02 17:06 ` Conor Dooley
0 siblings, 0 replies; 15+ messages in thread
From: Conor Dooley @ 2026-06-02 17:06 UTC (permalink / raw)
To: Biju
Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Biju Das, Wolfram Sang,
linux-mmc, devicetree, linux-kernel, linux-renesas-soc,
Prabhakar Mahadev Lad
[-- 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] 15+ messages in thread
* [PATCH 04/17] mmc: renesas_sdhi: Fix whitespace alignment in struct renesas_sdhi_of_data
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
2026-05-30 16:07 ` [PATCH 01/17] dt-bindings: mmc: renesas,sdhi: Document RZ/G3L (r9a08g046) SoC Biju
@ 2026-05-30 16:07 ` Biju
2026-05-30 16:07 ` [PATCH 05/17] mmc: renesas_sdhi_internal_dmac: Fix whitespace alignment in struct initializer Biju
` (9 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:07 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Remove extra spaces in the renesas_sdhi_of_data struct definition,
replacing the tab/space mix used to align tmio_ocr_mask with a single
space, consistent with kernel coding style.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index afc36a407c2c..09bf9b24a8c3 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -25,7 +25,7 @@ struct renesas_sdhi_scc {
struct renesas_sdhi_of_data {
unsigned long tmio_flags;
- u32 tmio_ocr_mask;
+ u32 tmio_ocr_mask;
unsigned long capabilities;
unsigned long capabilities2;
enum dma_slave_buswidth dma_buswidth;
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 05/17] mmc: renesas_sdhi_internal_dmac: Fix whitespace alignment in struct initializer
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
2026-05-30 16:07 ` [PATCH 01/17] dt-bindings: mmc: renesas,sdhi: Document RZ/G3L (r9a08g046) SoC Biju
2026-05-30 16:07 ` [PATCH 04/17] mmc: renesas_sdhi: Fix whitespace alignment in struct renesas_sdhi_of_data Biju
@ 2026-05-30 16:07 ` Biju
2026-05-30 16:08 ` [PATCH 06/17] mmc: renesas_sdhi: Introduce renesas_sdhi_hw_info to abstract clock mask Biju
` (8 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:07 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Remove extra tabs used to align .of_data and .quirks fields in the
of_rza2_compatible struct initializer, replacing them with single space,
consistent with kernel coding style.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi_internal_dmac.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
index 024edc4e5fe6..08cf1604ef1d 100644
--- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
@@ -272,8 +272,8 @@ static const struct renesas_sdhi_of_data_with_quirks of_rcar_gen3_nohs400_compat
};
static const struct renesas_sdhi_of_data_with_quirks of_rza2_compatible = {
- .of_data = &of_data_rza2,
- .quirks = &sdhi_quirks_fixed_addr,
+ .of_data = &of_data_rza2,
+ .quirks = &sdhi_quirks_fixed_addr,
};
static const struct of_device_id renesas_sdhi_internal_dmac_of_match[] = {
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 06/17] mmc: renesas_sdhi: Introduce renesas_sdhi_hw_info to abstract clock mask
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (2 preceding siblings ...)
2026-05-30 16:07 ` [PATCH 05/17] mmc: renesas_sdhi_internal_dmac: Fix whitespace alignment in struct initializer Biju
@ 2026-05-30 16:08 ` Biju
2026-05-30 16:08 ` [PATCH 07/17] mmc: renesas_sdhi: Add max_divider to renesas_sdhi_hw_info Biju
` (7 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:08 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
The RZ/G3L SoC has 11 divider bits and requires a different clock mask in
renesas_sdhi_set_clock().
Add a new renesas_sdhi_hw_info struct to hold hardware-specific
parameters, starting with clk_mask. This replaces the hardcoded constant
in renesas_sdhi_set_clock() with a value sourced from the per-device
hw_info, and widens the clk variable from u32 to u64 accordingly, as
clk_mask for RZ/G3L exceeds 32 bits.
Wire hw_info through renesas_sdhi_of_data_with_quirks (internalDMAC path)
and a new renesas_sdhi_of_data_with_info wrapper (sysDMAC path), and plumb
it into renesas_sdhi_probe() so it is stored in the per-instance
renesas_sdhi struct.
All existing users are assigned sdhi_hw_info_generic, preserving current
behaviour. No functional change.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi.h | 12 ++++
drivers/mmc/host/renesas_sdhi_core.c | 7 +-
drivers/mmc/host/renesas_sdhi_internal_dmac.c | 16 ++++-
drivers/mmc/host/renesas_sdhi_sys_dmac.c | 66 ++++++++++++++-----
4 files changed, 81 insertions(+), 20 deletions(-)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index 09bf9b24a8c3..a7fc525b7218 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -41,6 +41,15 @@ struct renesas_sdhi_of_data {
#define SDHI_CALIB_TABLE_MAX 32
+struct renesas_sdhi_hw_info {
+ u64 clk_mask;
+};
+
+struct renesas_sdhi_of_data_with_info {
+ const struct renesas_sdhi_of_data *of_data;
+ const struct renesas_sdhi_hw_info *info;
+};
+
#define sdhi_has_quirk(p, q) ((p)->quirks && (p)->quirks->q)
struct renesas_sdhi_quirks {
@@ -57,6 +66,7 @@ struct renesas_sdhi_quirks {
struct renesas_sdhi_of_data_with_quirks {
const struct renesas_sdhi_of_data *of_data;
const struct renesas_sdhi_quirks *quirks;
+ const struct renesas_sdhi_hw_info *info;
};
/* We want both end_flags to be set before we mark DMA as finished */
@@ -79,6 +89,7 @@ struct renesas_sdhi {
struct tmio_mmc_data mmc_data;
struct renesas_sdhi_dma dma_priv;
const struct renesas_sdhi_quirks *quirks;
+ const struct renesas_sdhi_hw_info *info;
struct pinctrl *pinctrl;
struct pinctrl_state *pins_default, *pins_uhs;
void __iomem *scc_ctl;
@@ -106,6 +117,7 @@ struct renesas_sdhi {
int renesas_sdhi_probe(struct platform_device *pdev,
const struct tmio_mmc_dma_ops *dma_ops,
const struct renesas_sdhi_of_data *of_data,
+ const struct renesas_sdhi_hw_info *info,
const struct renesas_sdhi_quirks *quirks);
void renesas_sdhi_remove(struct platform_device *pdev);
int renesas_sdhi_suspend(struct device *dev);
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index f9ec78d699f4..2ff40950f209 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -193,8 +193,9 @@ static unsigned int renesas_sdhi_clk_update(struct tmio_mmc_host *host,
static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
unsigned int new_clock)
{
+ struct renesas_sdhi *priv = host_to_priv(host);
unsigned int clk_margin;
- u32 clk = 0, clock;
+ u64 clk = 0, clock;
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
@@ -213,7 +214,7 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
* provided for actual_clock in renesas_sdhi_clk_update().
*/
clk_margin = new_clock >> 10;
- for (clk = 0x80000080; new_clock + clk_margin >= (clock << 1); clk >>= 1)
+ for (clk = priv->info->clk_mask; new_clock + clk_margin >= (clock << 1); clk >>= 1)
clock <<= 1;
/* 1/1 clock is option */
@@ -1055,6 +1056,7 @@ static const struct regulator_desc renesas_sdhi_vqmmc_regulator = {
int renesas_sdhi_probe(struct platform_device *pdev,
const struct tmio_mmc_dma_ops *dma_ops,
const struct renesas_sdhi_of_data *of_data,
+ const struct renesas_sdhi_hw_info *info,
const struct renesas_sdhi_quirks *quirks)
{
struct tmio_mmc_data *mmd = pdev->dev.platform_data;
@@ -1079,6 +1081,7 @@ int renesas_sdhi_probe(struct platform_device *pdev,
if (!priv)
return -ENOMEM;
+ priv->info = info;
priv->quirks = quirks;
mmc_data = &priv->mmc_data;
dma_priv = &priv->dma_priv;
diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
index 08cf1604ef1d..512ed70b3779 100644
--- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
@@ -232,48 +232,61 @@ static const struct soc_device_attribute sdhi_quirks_match[] = {
{ /* Sentinel. */ }
};
+static const struct renesas_sdhi_hw_info sdhi_hw_info_generic = {
+ .clk_mask = 0x80000080,
+};
+
static const struct renesas_sdhi_of_data_with_quirks of_r8a7795_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_bad_taps2367,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a77961_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_bad_taps1357,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a77965_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_r8a77965,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a77970_compatible = {
.of_data = &of_data_rcar_gen3_no_sdh_fallback,
.quirks = &sdhi_quirks_nohs400,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a77990_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_r8a77990,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_rzg2l_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_rzg2l,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_rcar_gen3_compatible = {
.of_data = &of_data_rcar_gen3,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_rcar_gen3_nohs400_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_nohs400,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_rza2_compatible = {
.of_data = &of_data_rza2,
.quirks = &sdhi_quirks_fixed_addr,
+ .info = &sdhi_hw_info_generic,
};
static const struct of_device_id renesas_sdhi_internal_dmac_of_match[] = {
@@ -599,7 +612,8 @@ static int renesas_sdhi_internal_dmac_probe(struct platform_device *pdev)
dma_set_max_seg_size(dev, 0xffffffff);
return renesas_sdhi_probe(pdev, &renesas_sdhi_internal_dmac_dma_ops,
- of_data_quirks->of_data, quirks);
+ of_data_quirks->of_data, of_data_quirks->info,
+ quirks);
}
static const struct dev_pm_ops renesas_sdhi_internal_dmac_dev_pm_ops = {
diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
index 9215600f03a2..1291970c2810 100644
--- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
@@ -73,23 +73,51 @@ static const struct renesas_sdhi_of_data of_rcar_gen2_compatible = {
.max_blk_count = UINT_MAX / TMIO_MAX_BLK_SIZE,
};
+static const struct renesas_sdhi_hw_info sdhi_hw_info_generic = {
+ .clk_mask = 0x80000080,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_default_cfg_info = {
+ .of_data = &of_default_cfg,
+ .info = &sdhi_hw_info_generic,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_rz_compatible_info = {
+ .of_data = &of_rz_compatible,
+ .info = &sdhi_hw_info_generic,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_rcar_gen1_compatible_info = {
+ .of_data = &of_rcar_gen1_compatible,
+ .info = &sdhi_hw_info_generic,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_rcar_gen2_compatible_info = {
+ .of_data = &of_rcar_gen2_compatible,
+ .info = &sdhi_hw_info_generic,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_shmobile_info = {
+ .info = &sdhi_hw_info_generic,
+};
+
static const struct of_device_id renesas_sdhi_sys_dmac_of_match[] = {
- { .compatible = "renesas,sdhi-sh73a0", .data = &of_default_cfg, },
- { .compatible = "renesas,sdhi-r8a73a4", .data = &of_default_cfg, },
- { .compatible = "renesas,sdhi-r8a7740", .data = &of_default_cfg, },
- { .compatible = "renesas,sdhi-r7s72100", .data = &of_rz_compatible, },
- { .compatible = "renesas,sdhi-r8a7778", .data = &of_rcar_gen1_compatible, },
- { .compatible = "renesas,sdhi-r8a7779", .data = &of_rcar_gen1_compatible, },
- { .compatible = "renesas,sdhi-r8a7743", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7745", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7790", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7791", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7792", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7793", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7794", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,rcar-gen1-sdhi", .data = &of_rcar_gen1_compatible, },
- { .compatible = "renesas,rcar-gen2-sdhi", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-shmobile" },
+ { .compatible = "renesas,sdhi-sh73a0", .data = &of_default_cfg_info, },
+ { .compatible = "renesas,sdhi-r8a73a4", .data = &of_default_cfg_info, },
+ { .compatible = "renesas,sdhi-r8a7740", .data = &of_default_cfg_info, },
+ { .compatible = "renesas,sdhi-r7s72100", .data = &of_rz_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7778", .data = &of_rcar_gen1_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7779", .data = &of_rcar_gen1_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7743", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7745", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7790", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7791", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7792", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7793", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7794", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,rcar-gen1-sdhi", .data = &of_rcar_gen1_compatible_info, },
+ { .compatible = "renesas,rcar-gen2-sdhi", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-shmobile", .data = &of_shmobile_info, },
{},
};
MODULE_DEVICE_TABLE(of, renesas_sdhi_sys_dmac_of_match);
@@ -452,8 +480,12 @@ static const struct tmio_mmc_dma_ops renesas_sdhi_sys_dmac_dma_ops = {
static int renesas_sdhi_sys_dmac_probe(struct platform_device *pdev)
{
+ const struct renesas_sdhi_of_data_with_info *of_data_info;
+
+ of_data_info = of_device_get_match_data(&pdev->dev);
+
return renesas_sdhi_probe(pdev, &renesas_sdhi_sys_dmac_dma_ops,
- of_device_get_match_data(&pdev->dev), NULL);
+ of_data_info->of_data, of_data_info->info, NULL);
}
static DEFINE_RUNTIME_DEV_PM_OPS(renesas_sdhi_sys_dmac_dev_pm_ops,
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 07/17] mmc: renesas_sdhi: Add max_divider to renesas_sdhi_hw_info
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (3 preceding siblings ...)
2026-05-30 16:08 ` [PATCH 06/17] mmc: renesas_sdhi: Introduce renesas_sdhi_hw_info to abstract clock mask Biju
@ 2026-05-30 16:08 ` Biju
2026-05-30 16:08 ` [PATCH 08/17] mmc: renesas_sdhi: Add tuning_delay hw_info flag Biju
` (6 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:08 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
The RZ/G3L SoC has a maximum divider value of 2048 compared to 512 on the
rest of the SoCs.
Add a max_divider field to renesas_sdhi_hw_info and replace the hardcoded
value in renesas_sdhi_clk_enable() and renesas_sdhi_set_clock() with
max_divider.
All existing users are assigned max_divider = 512 via sdhi_hw_info_generic
in both the internal and sys DMAC paths, preserving current behaviour.
No functional change.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi.h | 1 +
drivers/mmc/host/renesas_sdhi_core.c | 4 ++--
drivers/mmc/host/renesas_sdhi_internal_dmac.c | 1 +
drivers/mmc/host/renesas_sdhi_sys_dmac.c | 1 +
4 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index a7fc525b7218..a42934e6d49d 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -43,6 +43,7 @@ struct renesas_sdhi_of_data {
struct renesas_sdhi_hw_info {
u64 clk_mask;
+ unsigned int max_divider;
};
struct renesas_sdhi_of_data_with_info {
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index 2ff40950f209..16ed6fd8470d 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -117,7 +117,7 @@ static int renesas_sdhi_clk_enable(struct tmio_mmc_host *host)
* Minimum frequency is the minimum input clock frequency
* divided by our maximum divider.
*/
- mmc->f_min = max(clk_round_rate(priv->clk, 1) / 512, 1L);
+ mmc->f_min = max(clk_round_rate(priv->clk, 1) / priv->info->max_divider, 1L);
/* enable 16bit data access on SDBUF as default */
renesas_sdhi_sdbuf_width(host, 16);
@@ -206,7 +206,7 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
}
host->mmc->actual_clock = renesas_sdhi_clk_update(host, new_clock);
- clock = host->mmc->actual_clock / 512;
+ clock = host->mmc->actual_clock / priv->info->max_divider;
/*
* Add a margin of 1/1024 rate higher to the clock rate in order
diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
index 512ed70b3779..84b1b38ca465 100644
--- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
@@ -234,6 +234,7 @@ static const struct soc_device_attribute sdhi_quirks_match[] = {
static const struct renesas_sdhi_hw_info sdhi_hw_info_generic = {
.clk_mask = 0x80000080,
+ .max_divider = 512,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a7795_compatible = {
diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
index 1291970c2810..9d34551c6836 100644
--- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
@@ -75,6 +75,7 @@ static const struct renesas_sdhi_of_data of_rcar_gen2_compatible = {
static const struct renesas_sdhi_hw_info sdhi_hw_info_generic = {
.clk_mask = 0x80000080,
+ .max_divider = 512,
};
static const struct renesas_sdhi_of_data_with_info of_default_cfg_info = {
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 08/17] mmc: renesas_sdhi: Add tuning_delay hw_info flag
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (4 preceding siblings ...)
2026-05-30 16:08 ` [PATCH 07/17] mmc: renesas_sdhi: Add max_divider to renesas_sdhi_hw_info Biju
@ 2026-05-30 16:08 ` Biju
2026-05-30 16:08 ` [PATCH 09/17] mmc: renesas_sdhi: Add internal_divider hw_info flag for clk rate adjustment Biju
` (5 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:08 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
As per the RZ/G2L hardware manual, the TMPOUT bit field in the SCC_TMPPORT
register needs to be set to 0 when transferring at 3.3V, and to 1 when
transferring at 1.8V.
Add a tuning_delay bitfield to renesas_sdhi_hw_info to indicate hardware
that requires an adjustment when the signal voltage changes.
Add sdhi_hw_info_rzg2l with tuning_delay = 1 and assign it to
of_rzg2l_compatible, enabling the adjustment for RZ/G2L. All other
platforms retain sdhi_hw_info_generic with tuning_delay = 0 and
are unaffected.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi.h | 2 +
drivers/mmc/host/renesas_sdhi_core.c | 83 +++++++++++--------
drivers/mmc/host/renesas_sdhi_internal_dmac.c | 8 +-
3 files changed, 58 insertions(+), 35 deletions(-)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index a42934e6d49d..a3c5fa368242 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -44,6 +44,8 @@ struct renesas_sdhi_of_data {
struct renesas_sdhi_hw_info {
u64 clk_mask;
unsigned int max_divider;
+ /* hardware features */
+ unsigned tuning_delay:1; /* Has tuning delay */
};
struct renesas_sdhi_of_data_with_info {
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index 16ed6fd8470d..868ba6a6919e 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -257,40 +257,6 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc)
TMIO_STAT_DAT0);
}
-static int renesas_sdhi_start_signal_voltage_switch(struct mmc_host *mmc,
- struct mmc_ios *ios)
-{
- struct tmio_mmc_host *host = mmc_priv(mmc);
- struct renesas_sdhi *priv = host_to_priv(host);
- struct pinctrl_state *pin_state;
- int ret;
-
- switch (ios->signal_voltage) {
- case MMC_SIGNAL_VOLTAGE_330:
- pin_state = priv->pins_default;
- break;
- case MMC_SIGNAL_VOLTAGE_180:
- pin_state = priv->pins_uhs;
- break;
- default:
- return -EINVAL;
- }
-
- /*
- * If anything is missing, assume signal voltage is fixed at
- * 3.3V and succeed/fail accordingly.
- */
- if (IS_ERR(priv->pinctrl) || IS_ERR(pin_state))
- return ios->signal_voltage ==
- MMC_SIGNAL_VOLTAGE_330 ? 0 : -EINVAL;
-
- ret = mmc_regulator_set_vqmmc(host->mmc, ios);
- if (ret < 0)
- return ret;
-
- return pinctrl_select_state(priv->pinctrl, pin_state);
-}
-
/* SCC registers */
#define SH_MOBILE_SDHI_SCC_DTCNTL 0x000
#define SH_MOBILE_SDHI_SCC_TAPSET 0x002
@@ -351,6 +317,55 @@ static inline void sd_scc_write32(struct tmio_mmc_host *host,
writel(val, priv->scc_ctl + (addr << host->bus_shift));
}
+static void renesas_sdhi_set_hw_adjustment_delay(struct tmio_mmc_host *host)
+{
+ struct renesas_sdhi *priv = host_to_priv(host);
+
+ if (!priv->info->tuning_delay)
+ return;
+
+ if (host->mmc->ios.signal_voltage == MMC_SIGNAL_VOLTAGE_330)
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x0);
+ else
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x1);
+}
+
+static int renesas_sdhi_start_signal_voltage_switch(struct mmc_host *mmc,
+ struct mmc_ios *ios)
+{
+ struct tmio_mmc_host *host = mmc_priv(mmc);
+ struct renesas_sdhi *priv = host_to_priv(host);
+ struct pinctrl_state *pin_state;
+ int ret;
+
+ switch (ios->signal_voltage) {
+ case MMC_SIGNAL_VOLTAGE_330:
+ pin_state = priv->pins_default;
+ break;
+ case MMC_SIGNAL_VOLTAGE_180:
+ pin_state = priv->pins_uhs;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ /*
+ * If anything is missing, assume signal voltage is fixed at
+ * 3.3V and succeed/fail accordingly.
+ */
+ if (IS_ERR(priv->pinctrl) || IS_ERR(pin_state))
+ return ios->signal_voltage ==
+ MMC_SIGNAL_VOLTAGE_330 ? 0 : -EINVAL;
+
+ ret = mmc_regulator_set_vqmmc(host->mmc, ios);
+ if (ret < 0)
+ return ret;
+
+ renesas_sdhi_set_hw_adjustment_delay(host);
+
+ return pinctrl_select_state(priv->pinctrl, pin_state);
+}
+
static unsigned int renesas_sdhi_init_tuning(struct tmio_mmc_host *host)
{
struct renesas_sdhi *priv;
diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
index 84b1b38ca465..d056c3586e6f 100644
--- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
@@ -237,6 +237,12 @@ static const struct renesas_sdhi_hw_info sdhi_hw_info_generic = {
.max_divider = 512,
};
+static const struct renesas_sdhi_hw_info sdhi_hw_info_rzg2l = {
+ .clk_mask = 0x80000080,
+ .max_divider = 512,
+ .tuning_delay = 1,
+};
+
static const struct renesas_sdhi_of_data_with_quirks of_r8a7795_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_bad_taps2367,
@@ -270,7 +276,7 @@ static const struct renesas_sdhi_of_data_with_quirks of_r8a77990_compatible = {
static const struct renesas_sdhi_of_data_with_quirks of_rzg2l_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_rzg2l,
- .info = &sdhi_hw_info_generic,
+ .info = &sdhi_hw_info_rzg2l,
};
static const struct renesas_sdhi_of_data_with_quirks of_rcar_gen3_compatible = {
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 09/17] mmc: renesas_sdhi: Add internal_divider hw_info flag for clk rate adjustment
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (5 preceding siblings ...)
2026-05-30 16:08 ` [PATCH 08/17] mmc: renesas_sdhi: Add tuning_delay hw_info flag Biju
@ 2026-05-30 16:08 ` Biju
2026-05-30 16:08 ` [PATCH 10/17] mmc: renesas_sdhi: Add optional axis/axim reset controls Biju
` (4 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:08 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
The RZ/G3L SoC has an internal divider for all modes except HS400 mode.
Add an internal_divider bitfield to renesas_sdhi_hw_info and a divider
field to the renesas_sdhi instance struct.
During probe, if internal_divider is set and the device does not
have the mmc-hs400-1_8v property, priv->divider is set to 2;
otherwise it defaults to 1. This divider is then applied in
renesas_sdhi_clk_update() when setting the clk rate relative to
clkh, replacing the implicit divide-by-1 that was previously assumed.
No users set internal_divider yet; this patch only introduces the
infrastructure. No functional change for existing platforms.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi.h | 3 +++
drivers/mmc/host/renesas_sdhi_core.c | 7 ++++++-
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index a3c5fa368242..0ca8ec27c320 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -46,6 +46,7 @@ struct renesas_sdhi_hw_info {
unsigned int max_divider;
/* hardware features */
unsigned tuning_delay:1; /* Has tuning delay */
+ unsigned internal_divider:1; /* Has internal divider */
};
struct renesas_sdhi_of_data_with_info {
@@ -112,6 +113,8 @@ struct renesas_sdhi {
struct reset_control *rstc;
struct tmio_mmc_host *host;
struct regulator_dev *rdev;
+
+ unsigned int divider;
};
#define host_to_priv(host) \
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index 868ba6a6919e..8e2fb19b994b 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -185,7 +185,7 @@ static unsigned int renesas_sdhi_clk_update(struct tmio_mmc_host *host,
clk_set_rate(ref_clk, best_freq);
if (priv->clkh)
- clk_set_rate(priv->clk, best_freq >> clkh_shift);
+ clk_set_rate(priv->clk, (best_freq >> clkh_shift) * priv->divider);
return clk_get_rate(priv->clk);
}
@@ -1223,6 +1223,11 @@ int renesas_sdhi_probe(struct platform_device *pdev,
dev_pm_domain_start(&pdev->dev);
+ if (info->internal_divider && !device_property_read_bool(dev, "mmc-hs400-1_8v"))
+ priv->divider = 2;
+ else
+ priv->divider = 1;
+
ret = renesas_sdhi_clk_enable(host);
if (ret)
return ret;
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 10/17] mmc: renesas_sdhi: Add optional axis/axim reset controls
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (6 preceding siblings ...)
2026-05-30 16:08 ` [PATCH 09/17] mmc: renesas_sdhi: Add internal_divider hw_info flag for clk rate adjustment Biju
@ 2026-05-30 16:08 ` Biju
2026-05-30 16:08 ` [PATCH 11/17] mmc: renesas_sdhi: Add RZ/G3L SDHI support Biju
` (3 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:08 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson, Philipp Zabel
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
The RZ/G3L SoC has axis/axim resets compared to other SoCs.
Add two optional reset controls, rstc_axis and rstc_axim, to the
renesas_sdhi struct. Both are acquired at probe time using
devm_reset_control_get_optional_exclusive_deasserted() with the
"axis" and "axim" reset names respectively.
Include them alongside the existing rstc in bulk reset/assert/deassert
operations: triggered together in renesas_sdhi_reset(), and managed
via reset_control_bulk_assert/deassert() in the suspend and resume
paths, replacing the previous single-control calls.
Being optional, these resets are a no-op on platforms that do not
provide them, so existing behaviour is preserved.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi.h | 2 ++
drivers/mmc/host/renesas_sdhi_core.c | 26 +++++++++++++++++++++++---
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index 0ca8ec27c320..6c024e7f69e1 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -111,6 +111,8 @@ struct renesas_sdhi {
unsigned int tap_set;
struct reset_control *rstc;
+ struct reset_control *rstc_axis;
+ struct reset_control *rstc_axim;
struct tmio_mmc_host *host;
struct regulator_dev *rdev;
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index 8e2fb19b994b..699872766f88 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -615,6 +615,8 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *host, bool preserve)
sd_status = sd_ctrl_read32(host, CTL_SD_STATUS);
reset_control_reset(priv->rstc);
+ reset_control_reset(priv->rstc_axis);
+ reset_control_reset(priv->rstc_axim);
/* Unknown why but without polling reset status, it will hang */
read_poll_timeout(reset_control_status, ret, ret == 0, 1, 100,
false, priv->rstc);
@@ -1128,6 +1130,14 @@ int renesas_sdhi_probe(struct platform_device *pdev,
if (IS_ERR(priv->rstc))
return PTR_ERR(priv->rstc);
+ priv->rstc_axim = devm_reset_control_get_optional_exclusive_deasserted(&pdev->dev, "axim");
+ if (IS_ERR(priv->rstc_axim))
+ return PTR_ERR(priv->rstc_axim);
+
+ priv->rstc_axis = devm_reset_control_get_optional_exclusive_deasserted(&pdev->dev, "axis");
+ if (IS_ERR(priv->rstc_axis))
+ return PTR_ERR(priv->rstc_axis);
+
priv->pinctrl = devm_pinctrl_get(&pdev->dev);
if (!IS_ERR(priv->pinctrl)) {
priv->pins_default = pinctrl_lookup_state(priv->pinctrl,
@@ -1351,13 +1361,18 @@ int renesas_sdhi_suspend(struct device *dev)
{
struct tmio_mmc_host *host = dev_get_drvdata(dev);
struct renesas_sdhi *priv = host_to_priv(host);
+ struct reset_control_bulk_data resets[] = {
+ { .rstc = priv->rstc },
+ { .rstc = priv->rstc_axim },
+ { .rstc = priv->rstc_axis },
+ };
int ret;
ret = pm_runtime_force_suspend(dev);
if (ret)
return ret;
- ret = reset_control_assert(priv->rstc);
+ ret = reset_control_bulk_assert(ARRAY_SIZE(resets), resets);
if (ret)
pm_runtime_force_resume(dev);
@@ -1369,15 +1384,20 @@ int renesas_sdhi_resume(struct device *dev)
{
struct tmio_mmc_host *host = dev_get_drvdata(dev);
struct renesas_sdhi *priv = host_to_priv(host);
+ struct reset_control_bulk_data resets[] = {
+ { .rstc = priv->rstc },
+ { .rstc = priv->rstc_axim },
+ { .rstc = priv->rstc_axis },
+ };
int ret;
- ret = reset_control_deassert(priv->rstc);
+ ret = reset_control_bulk_deassert(ARRAY_SIZE(resets), resets);
if (ret)
return ret;
ret = pm_runtime_force_resume(dev);
if (ret)
- reset_control_assert(priv->rstc);
+ reset_control_bulk_assert(ARRAY_SIZE(resets), resets);
return ret;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 11/17] mmc: renesas_sdhi: Add RZ/G3L SDHI support
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (7 preceding siblings ...)
2026-05-30 16:08 ` [PATCH 10/17] mmc: renesas_sdhi: Add optional axis/axim reset controls Biju
@ 2026-05-30 16:08 ` Biju
2026-05-30 16:08 ` [PATCH 12/17] mmc: renesas_sdhi: Save and restore IOVS across suspend/resume Biju
` (2 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:08 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add support for the RZ/G3L (r9a08g046) SDHI controller, which has a
new hardware version register and also has different tuning registers,
internal clk divider, 11 bit divider, 3 resets and 5 clocks compared
to other SoCs. Similar to RZ/G2L SoCs it need tuning delay.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi_core.c | 23 +++++++---
drivers/mmc/host/renesas_sdhi_internal_dmac.c | 42 +++++++++++++++++++
2 files changed, 59 insertions(+), 6 deletions(-)
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index 699872766f88..ee1b1f70c9e3 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -59,6 +59,7 @@
#define SDHI_VER_GEN2_SDR104 0xcb0d
#define SDHI_VER_GEN3_SD 0xcc10
#define SDHI_VER_GEN3_SDMMC 0xcd10
+#define SDHI_VER_RZ_G3L_SDMMC 0xce10
#define SDHI_GEN3_MMC0_ADDR 0xee140000
@@ -79,6 +80,7 @@ static void renesas_sdhi_sdbuf_width(struct tmio_mmc_host *host, int width)
break;
case SDHI_VER_GEN3_SD:
case SDHI_VER_GEN3_SDMMC:
+ case SDHI_VER_RZ_G3L_SDMMC:
if (width == 64)
val = HOST_MODE_GEN3_64BIT;
else if (width == 32)
@@ -205,7 +207,8 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
goto out;
}
- host->mmc->actual_clock = renesas_sdhi_clk_update(host, new_clock);
+ host->mmc->actual_clock = renesas_sdhi_clk_update(host, new_clock) /
+ (priv->info->internal_divider ? 2 : 1);
clock = host->mmc->actual_clock / priv->info->max_divider;
/*
@@ -265,12 +268,14 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc)
#define SH_MOBILE_SDHI_SCC_RVSCNTL 0x008
#define SH_MOBILE_SDHI_SCC_RVSREQ 0x00A
#define SH_MOBILE_SDHI_SCC_SMPCMP 0x00C
-#define SH_MOBILE_SDHI_SCC_TMPPORT2 0x00E
+#define SH_MOBILE_SDHI_SCC_TMPPORT2 0x00E /* G3L: SDm_SCC_HS400MODE1 */
+#define RZG3L_SDHI_SCC_HWADJ2 0x010
#define SH_MOBILE_SDHI_SCC_TMPPORT3 0x014
-#define SH_MOBILE_SDHI_SCC_TMPPORT4 0x016
-#define SH_MOBILE_SDHI_SCC_TMPPORT5 0x018
-#define SH_MOBILE_SDHI_SCC_TMPPORT6 0x01A
-#define SH_MOBILE_SDHI_SCC_TMPPORT7 0x01C
+#define SH_MOBILE_SDHI_SCC_TMPPORT4 0x016 /* R-Car */
+#define SH_MOBILE_SDHI_SCC_TMPPORT5 0x018 /* R-Car */
+#define SH_MOBILE_SDHI_SCC_TMPPORT6 0x01A /* R-Car */
+#define SH_MOBILE_SDHI_SCC_TMPPORT7 0x01C /* R-Car */
+#define RZG3L_SDHI_SCC_HWADJ4 0x022
#define SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN BIT(0)
#define SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT 16
@@ -393,6 +398,9 @@ static unsigned int renesas_sdhi_init_tuning(struct tmio_mmc_host *host)
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DT2FF, priv->scc_tappos);
+ if (priv->info->internal_divider)
+ sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HWADJ4, 0x0);
+
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, CLK_CTL_SCLKEN |
sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
@@ -727,6 +735,9 @@ static int renesas_sdhi_execute_tuning(struct mmc_host *mmc, u32 opcode)
if (!priv->tap_num)
return 0; /* Tuning is not supported */
+ if (priv->info->tuning_delay && priv->tap_num == 8)
+ sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2, 0x0);
+
if (priv->tap_num * 2 >= sizeof(priv->taps) * BITS_PER_BYTE) {
dev_err(&host->pdev->dev,
"Too many taps, please update 'taps' in tmio_mmc_host!\n");
diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
index d056c3586e6f..fb8a70d28eed 100644
--- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
@@ -89,6 +89,13 @@ static struct renesas_sdhi_scc rcar_gen3_scc_taps[] = {
},
};
+static struct renesas_sdhi_scc rzg3l_scc_taps[] = {
+ {
+ .clk_rate = 0,
+ .tap = 0x00000300,
+ },
+};
+
static const struct renesas_sdhi_of_data of_data_rza2 = {
.tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_CLK_ACTUAL |
TMIO_MMC_HAVE_CBSY,
@@ -104,6 +111,23 @@ static const struct renesas_sdhi_of_data of_data_rza2 = {
.max_segs = 1,
};
+static const struct renesas_sdhi_of_data of_data_rzg3l = {
+ .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_CLK_ACTUAL |
+ TMIO_MMC_HAVE_CBSY | TMIO_MMC_MIN_RCAR2 |
+ TMIO_MMC_64BIT_DATA_PORT,
+ .capabilities = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
+ MMC_CAP_CMD23 | MMC_CAP_WAIT_WHILE_BUSY,
+ .capabilities2 = MMC_CAP2_NO_WRITE_PROTECT | MMC_CAP2_MERGE_CAPABLE,
+ .bus_shift = 2,
+ .scc_offset = 0x1000,
+ .taps = rzg3l_scc_taps,
+ .taps_num = ARRAY_SIZE(rzg3l_scc_taps),
+ /* DMAC can handle 32bit blk count but only 1 segment */
+ .max_blk_count = UINT_MAX / TMIO_MAX_BLK_SIZE,
+ .max_segs = 1,
+ .sdhi_flags = SDHI_FLAG_NEED_CLKH_FALLBACK,
+};
+
static const struct renesas_sdhi_of_data of_data_rcar_gen3 = {
.tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_CLK_ACTUAL |
TMIO_MMC_HAVE_CBSY | TMIO_MMC_MIN_RCAR2 |
@@ -217,6 +241,10 @@ static const struct renesas_sdhi_quirks sdhi_quirks_rzg2l = {
.hs400_disabled = true,
};
+static const struct renesas_sdhi_quirks sdhi_quirks_rzg3l = {
+ .fixed_addr_mode = true,
+};
+
/*
* Note for r8a7796 / r8a774a1: we can't distinguish ES1.1 and 1.2 as of now.
* So, we want to treat them equally and only have a match for ES1.2 to enforce
@@ -243,6 +271,13 @@ static const struct renesas_sdhi_hw_info sdhi_hw_info_rzg2l = {
.tuning_delay = 1,
};
+static const struct renesas_sdhi_hw_info sdhi_hw_info_rzg3l = {
+ .clk_mask = 0x200000200,
+ .max_divider = 2048,
+ .tuning_delay = 1,
+ .internal_divider = 1,
+};
+
static const struct renesas_sdhi_of_data_with_quirks of_r8a7795_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_bad_taps2367,
@@ -296,6 +331,12 @@ static const struct renesas_sdhi_of_data_with_quirks of_rza2_compatible = {
.info = &sdhi_hw_info_generic,
};
+static const struct renesas_sdhi_of_data_with_quirks of_rzg3l_compatible = {
+ .of_data = &of_data_rzg3l,
+ .quirks = &sdhi_quirks_rzg3l,
+ .info = &sdhi_hw_info_rzg3l,
+};
+
static const struct of_device_id renesas_sdhi_internal_dmac_of_match[] = {
{ .compatible = "renesas,sdhi-r7s9210", .data = &of_rza2_compatible, },
{ .compatible = "renesas,sdhi-mmc-r8a77470", .data = &of_rcar_gen3_compatible, },
@@ -309,6 +350,7 @@ static const struct of_device_id renesas_sdhi_internal_dmac_of_match[] = {
{ .compatible = "renesas,sdhi-r8a77990", .data = &of_r8a77990_compatible, },
{ .compatible = "renesas,sdhi-r8a77995", .data = &of_rcar_gen3_nohs400_compatible, },
{ .compatible = "renesas,sdhi-r8a779md", .data = &of_rcar_gen3_nohs400_compatible, },
+ { .compatible = "renesas,sdhi-r9a08g046", .data = &of_rzg3l_compatible, },
{ .compatible = "renesas,sdhi-r9a09g011", .data = &of_rzg2l_compatible, },
{ .compatible = "renesas,sdhi-r9a09g057", .data = &of_rzg2l_compatible, },
{ .compatible = "renesas,rzg2l-sdhi", .data = &of_rzg2l_compatible, },
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 12/17] mmc: renesas_sdhi: Save and restore IOVS across suspend/resume
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (8 preceding siblings ...)
2026-05-30 16:08 ` [PATCH 11/17] mmc: renesas_sdhi: Add RZ/G3L SDHI support Biju
@ 2026-05-30 16:08 ` Biju
2026-05-30 16:08 ` [PATCH 13/17] mmc: renesas_sdhi: Add RZ/G3L HS400 support Biju
2026-06-02 21:01 ` [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Wolfram Sang
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:08 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
The SD_STATUS register, specifically the IOVS (I/O Voltage Switch) bit, is
not automatically restored after a suspend/resume cycle, causing the
regulator to report an incorrect voltage on resume.
Fix this by caching the CTL_SD_STATUS register value in the renesas_sdhi
private struct at suspend time and writing it back during resume. The
save/restore is only performed when a regulator device (rdev) is present,
as the IOVS bit is only relevant in that context.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi.h | 1 +
drivers/mmc/host/renesas_sdhi_core.c | 6 ++++++
2 files changed, 7 insertions(+)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index 6c024e7f69e1..10f634349da9 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -117,6 +117,7 @@ struct renesas_sdhi {
struct regulator_dev *rdev;
unsigned int divider;
+ u32 cache_sd_status;
};
#define host_to_priv(host) \
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index ee1b1f70c9e3..974acdf110d3 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -1379,6 +1379,9 @@ int renesas_sdhi_suspend(struct device *dev)
};
int ret;
+ if (priv->rdev)
+ priv->cache_sd_status = sd_ctrl_read32(host, CTL_SD_STATUS);
+
ret = pm_runtime_force_suspend(dev);
if (ret)
return ret;
@@ -1410,6 +1413,9 @@ int renesas_sdhi_resume(struct device *dev)
if (ret)
reset_control_bulk_assert(ARRAY_SIZE(resets), resets);
+ if (priv->rdev)
+ sd_ctrl_write32(host, CTL_SD_STATUS, priv->cache_sd_status);
+
return ret;
}
EXPORT_SYMBOL_GPL(renesas_sdhi_resume);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH 13/17] mmc: renesas_sdhi: Add RZ/G3L HS400 support
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (9 preceding siblings ...)
2026-05-30 16:08 ` [PATCH 12/17] mmc: renesas_sdhi: Save and restore IOVS across suspend/resume Biju
@ 2026-05-30 16:08 ` Biju
2026-06-02 21:01 ` [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Wolfram Sang
11 siblings, 0 replies; 15+ messages in thread
From: Biju @ 2026-05-30 16:08 UTC (permalink / raw)
To: Wolfram Sang, Ulf Hansson
Cc: Biju Das, linux-mmc, linux-renesas-soc, linux-kernel,
Geert Uytterhoeven, Prabhakar Mahadev Lad, Biju Das
From: Biju Das <biju.das.jz@bp.renesas.com>
Add HS400 support for RZ/G3L SoC.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
drivers/mmc/host/renesas_sdhi.h | 1 +
drivers/mmc/host/renesas_sdhi_core.c | 17 +++++++++++++++--
drivers/mmc/host/renesas_sdhi_internal_dmac.c | 1 +
3 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index 10f634349da9..92b66116f044 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -47,6 +47,7 @@ struct renesas_sdhi_hw_info {
/* hardware features */
unsigned tuning_delay:1; /* Has tuning delay */
unsigned internal_divider:1; /* Has internal divider */
+ unsigned scc_hs400_mode2:1; /* Has scc hs400 mode2 */
};
struct renesas_sdhi_of_data_with_info {
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index 974acdf110d3..282107d06114 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -186,8 +186,12 @@ static unsigned int renesas_sdhi_clk_update(struct tmio_mmc_host *host,
clk_set_rate(ref_clk, best_freq);
- if (priv->clkh)
+ if (priv->clkh) {
+ if (priv->info->internal_divider && host->mmc->ios.timing == MMC_TIMING_MMC_HS400)
+ clkh_shift = 1;
+
clk_set_rate(priv->clk, (best_freq >> clkh_shift) * priv->divider);
+ }
return clk_get_rate(priv->clk);
}
@@ -229,7 +233,7 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
}
clock = clk & CLK_CTL_DIV_MASK;
- if (clock != CLK_CTL_DIV_MASK)
+ if (clock != CLK_CTL_DIV_MASK && clock != 0)
host->mmc->actual_clock /= (1 << (ffs(clock) + 1));
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clock);
@@ -275,6 +279,7 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc)
#define SH_MOBILE_SDHI_SCC_TMPPORT5 0x018 /* R-Car */
#define SH_MOBILE_SDHI_SCC_TMPPORT6 0x01A /* R-Car */
#define SH_MOBILE_SDHI_SCC_TMPPORT7 0x01C /* R-Car */
+#define RZG3L_SDHI_SCC_HS400MODE2 0x020
#define RZG3L_SDHI_SCC_HWADJ4 0x022
#define SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN BIT(0)
@@ -308,6 +313,7 @@ static int renesas_sdhi_card_busy(struct mmc_host *mmc)
#define SH_MOBILE_SDHI_SCC_TMPPORT_DISABLE_WP_CODE 0xa5000000
#define SH_MOBILE_SDHI_SCC_TMPPORT_CALIB_CODE_MASK 0x1f
#define SH_MOBILE_SDHI_SCC_TMPPORT_MANUAL_MODE BIT(7)
+#define RZG3L_SDHI_SCC_HS400MODE2_HS400EN2 BIT(0)
static inline u32 sd_scc_read32(struct tmio_mmc_host *host,
struct renesas_sdhi *priv, int addr)
@@ -437,6 +443,10 @@ static void renesas_sdhi_hs400_complete(struct mmc_host *mmc)
SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) |
sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
+ if (priv->info->scc_hs400_mode2)
+ sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HS400MODE2,
+ RZG3L_SDHI_SCC_HS400MODE2_HS400EN2);
+
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN |
sd_scc_read32(host, priv,
@@ -578,6 +588,9 @@ static void renesas_sdhi_reset_hs400_mode(struct tmio_mmc_host *host,
SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) &
sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
+ if (priv->info->scc_hs400_mode2)
+ sd_scc_write32(host, priv, RZG3L_SDHI_SCC_HS400MODE2, 0x0);
+
if (sdhi_has_quirk(priv, hs400_calib_table) || sdhi_has_quirk(priv, hs400_bad_taps))
renesas_sdhi_adjust_hs400_mode_disable(host);
diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
index fb8a70d28eed..83d348fb5eeb 100644
--- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
@@ -276,6 +276,7 @@ static const struct renesas_sdhi_hw_info sdhi_hw_info_rzg3l = {
.max_divider = 2048,
.tuning_delay = 1,
.internal_divider = 1,
+ .scc_hs400_mode2 = 1,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a7795_compatible = {
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support
2026-05-30 16:07 [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Biju
` (10 preceding siblings ...)
2026-05-30 16:08 ` [PATCH 13/17] mmc: renesas_sdhi: Add RZ/G3L HS400 support Biju
@ 2026-06-02 21:01 ` Wolfram Sang
2026-06-03 5:34 ` Biju Das
11 siblings, 1 reply; 15+ messages in thread
From: Wolfram Sang @ 2026-06-02 21:01 UTC (permalink / raw)
To: Biju
Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Philipp Zabel, Magnus Damm, Biju Das,
linux-mmc, devicetree, linux-kernel, linux-renesas-soc,
Prabhakar Mahadev Lad
[-- Attachment #1: Type: text/plain, Size: 857 bytes --]
On Sat, May 30, 2026 at 05:07:54PM +0100, Biju wrote:
> From: Biju Das <biju.das.jz@bp.renesas.com>
>
> RZ/G3L SoC has:
>
> Channel 0 supports SD and eMMC (including HS400/HS400ES).
> Channel 1 supports SD and eMMC (except for HS400).
> Channel 2 supports SD.
>
> The SoC supports a maximum frequency of 150 MHz. The SD0 interface does
> not support IOVS and PWEN in the SDHI register (no internal regulator),
> unlike SD1 and SD2. It has an internal divider for all modes except HS400.
> It also has a 2048-bit divider compared to 512 on others. Moreover
> RZ/G3L supports HS400 enhanced strobe mode.
Sigh, so many HW changes again...
I want to review it but I won't have time before the next merge window
ends. In the meantime, could you resend the series properly in just one
thread, please? From patch 14 on, it gets messy...
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread* RE: [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support
2026-06-02 21:01 ` [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support Wolfram Sang
@ 2026-06-03 5:34 ` Biju Das
0 siblings, 0 replies; 15+ messages in thread
From: Biju Das @ 2026-06-03 5:34 UTC (permalink / raw)
To: wsa+renesas, biju.das.au
Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Philipp Zabel, magnus.damm,
linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
Prabhakar Mahadev Lad
Hi Wolfram,
Thanks for the feedback.
> -----Original Message-----
> From: Wolfram Sang <wsa+renesas@sang-engineering.com>
> Sent: 02 June 2026 22:02
> Subject: Re: [PATCH 00/17] Add Renesas RZ/G3L SD/eMMC support
>
> On Sat, May 30, 2026 at 05:07:54PM +0100, Biju wrote:
> > From: Biju Das <biju.das.jz@bp.renesas.com>
> >
> > RZ/G3L SoC has:
> >
> > Channel 0 supports SD and eMMC (including HS400/HS400ES).
> > Channel 1 supports SD and eMMC (except for HS400).
> > Channel 2 supports SD.
> >
> > The SoC supports a maximum frequency of 150 MHz. The SD0 interface
> > does not support IOVS and PWEN in the SDHI register (no internal
> > regulator), unlike SD1 and SD2. It has an internal divider for all modes except HS400.
> > It also has a 2048-bit divider compared to 512 on others. Moreover
> > RZ/G3L supports HS400 enhanced strobe mode.
>
> Sigh, so many HW changes again...
>
> I want to review it but I won't have time before the next merge window ends. In the meantime, could
> you resend the series properly in just one thread, please? From patch 14 on, it gets messy...
Sorry about that. I will send v2 with tags collected for binding patch.
Cheers,
Biju
^ permalink raw reply [flat|nested] 15+ messages in thread