RE: [PATCH v23 00/14] Add Renesas RZ/G3L SD/eMMC support

Biju Das <[email protected]> Wed, 5 Aug 2026 12:56:50 +0000
Newsgroups org.kernel.vger.linux-mmc,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-renesas-soc
Message-ID <TY3PR01MB113463AADCC6D60F6995E36C486D32@TY3PR01MB11346.jpnprd01.prod.outlook.com>
Hi All,

> -----Original Message-----
> From: Biju <[email protected]>
> Sent: 30 July 2026 12:32
> Subject: [PATCH v23 00/14] Add Renesas RZ/G3L SD/eMMC support
>=20
> From: Biju Das <[email protected]>
>=20
> Hi All,
>=20
> The Renesas RZ/G3L SoC has:
>=20
> Channel 0 supports SD and eMMC (including HS400/HS400ES).
> Channel 1 supports SD and eMMC (except for HS400).
> Channel 2 supports SD.
>=20
> The SoC supports a maximum frequency of 150 MHz. The SD0 interface does n=
ot support IOVS and PWEN in the
> SDHI register (no internal regulator), unlike SD1 and SD2. It has an inte=
rnal 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.
>=20
> This patch series support all modes. Please see the test logs for smarc-r=
zg3l[1]
>=20
> This patch series tested on smarc-rz{v2l,g2l,g2lc,g2ul,g3s,g3l,g3e},
> rz{v2h,t2h}-evk and hihope-rz{g2h,g2m,g2n} boards
>=20
> v22->v23:
>  * Added write32hook function for hardware idle synchronization for
>    CTL_SD_CARD_CLK_CTL writes.
>  * Changed the data type of max_divider from unsigned int to signed int.
>  * Assigned of_data->clk_div_mask in renesas_sdhi_probe().
>  * Updated commit description for patch#7.
>  * Updated tmio_mmc_reset() to handle 32 bit divider register in RZ/G3L.
> v21->v22:
>  * Added HS400 ES mode after fixing inode corruption when eMMC is
>    mounted as rootfs.
>  * Updated commit descriptions for patches #4, #5, #6, #7, #9, #12,
>    and #13.
>  * Added clk_div_mask to of_default_cfg and of_rcar_gen2_compatible.
>  * Added a renesas_sdhi_set_hw_adjustment_delay() call to
>    renesas_sdhi_init_tuning().
>  * Added renesas_sdhi_is_internal_divider_enabled() and
>    renesas_sdhi_clk_get_rate() to simplify the clock rate logic.
>  * Added `clock &=3D ~GENMASK(9, 8)` to clear the divider mask bits in
>    the register value.
>  * Added a renesas_sdhi_set_tmpport() helper to set delay values.
>  * Added a check in renesas_sdhi_is_internal_divider_enabled() to
>    return disabled status when in HS400 mode.
>  * renesas_sdhi_reset() now restores data strobe register values
>    after reset.
> v20->v21:
>  * Dropped HS400 ES support due to file system corruption, will add this
>    mode later after investigation.
>  * Added support for make clock divider mask configurable
>  * Added clk_div_mask to RZ/G2L of_data.
>  * Added clk_div_mask to RZ/G3L of_data.
>  * Restored actual_clk calculation in renesas_sdhi_set_clock().
>  * Updated renesas_sdhi_set_clock() for RZ/G3L HS400 clock handling as
>    it supports only single clk divider value and other values are
>    prohibited.
>  * Updated commit description for patch#12.
> v19->v20:
>  * Replaced the check mmd->clk_mask with mmc_data->clk_mask and moved
>    the code after assignment of variable mmd, this ensures assigning
>    the default values for non-DT platforms and DT platforms with no
>    device data.
>  * Replaced the check mmd->max_divider with mmc_data->max_divider and
>    moved the code after assignment of variable mmd, this ensures
>    assigning the default values for non-DT platforms and DT platforms wit=
h
>    no device data.
>  * Fixed the ordering of resets in suspend/resume paths.
>  * Added bitfield.h header file.
>  * Reworked on renesas_sdhi_set_clock() to handle the 11-bit divider
>    case and the 32-bit register write.
>  * Updated resume() with scoped PM runtime call.
>  * SD_CLK_CTRL clk enable turned off before updating SCC_CKSEL_DTSEL
>    register.
> v18->v19:
>  * Updated commit description for patch#1,#2,#6,#8,#11 and #12
>  * Updated clock and reset description with AXI master and AXI slave
>  * Added else condition for reset and reset-names.
>  * Renamed aclk->aclkm and reordered the axi clocks similar to resets.
>  * Retained the tag got binding patch as the changes are trivial.
>  * Fixed the clk_mask for non-DT platforms.
>  * Fixed max-divider setting for non-DT platforms.
>  * Replaced the magic number '9' with ilog2 function in
>    renesas_sdhi_clk_enable().
>  * Dropped divider variable from struct renesas_sdhi.
>  * Updated renesas_sdhi_clk_update() to return rate for HS400 mode
>    and non HS400 mode(uses 1/2 internal divider).
>  * Updated handling for clk divider.
>  * Renamed TMIO_MMC_HWADJ2->TMIO_MMC_HWADJ to make it generic for
>    hardware tuning delays
>  * Dropped duplicate SH_MOBILE_SDHI_SCC_TMPPORT2 macro
>  * Updated suspend/resume with scoped runtime calls in suspend.
>  * Fixed extra space in HS400MODE2 comment block.
>  * Updated the comment HS400mode2->HS400MODE2.
>  * Dropped the updation of clk handling as it is taken care in
>    previous patches.
>  * HS400ES support is enabled based on of_data.
>  * Fixed the space in HS400ES comment block.
>=20
> v17->v18:
>  * Collected tag
>  * Merged patch #4 and #5 and updated commit description
>  * Annotated the empty sentinel entries in the OF match tables with a
>    "Sentinel." comment for clarity.
>  * Retained the tag as it is a trivial cleanup.
>  * New patches drop struct renesas_sdhi_hw_info, instead using
>    renesas_sdhi_of_data and tmio_mmc_data.
>  * Dropped clk, pinctrl, SoC, and board dtsi from this patch series;
>    will send later.
> v1->v17:
>  * Collected tag for binding patch.
>  * Resending the series as there is an issue with patch threading from
>    patch #14.
>=20
> [1]
> Logs:
> HS200:(With internal divider)
> root@smarc-rzg3l:~# cat /sys/kernel/debug/mmc0/ios
> clock:          150000000 Hz
> actual clock:   150000000 Hz
> vdd:            21 (3.3 ~ 3.4 V)
> bus mode:       2 (push-pull)
> chip select:    0 (don't care)
> power mode:     2 (on)
> bus width:      3 (8 bits)
> timing spec:    9 (mmc HS200)
> signal voltage: 1 (1.80 V)
> driver type:    1 (driver type A)
>=20
> SDR104:(With internal divider)
> root@smarc-rzg3l:~# cat /sys/kernel/debug/mmc1/ios
> clock:          150000000 Hz
> actual clock:   150000000 Hz
> vdd:            21 (3.3 ~ 3.4 V)
> bus mode:       2 (push-pull)
> chip select:    0 (don't care)
> power mode:     2 (on)
> bus width:      2 (4 bits)
> timing spec:    6 (sd uhs SDR104)
> signal voltage: 1 (1.80 V)
> driver type:    0 (driver type B)
>=20
> HS400: (Without internal divider)
> root@smarc-rzg3l:~# cat /sys/kernel/debug/mmc0/ios
> clock:          150000000 Hz
> actual clock:   150000000 Hz
> vdd:            21 (3.3 ~ 3.4 V)
> bus mode:       2 (push-pull)
> chip select:    0 (don't care)
> power mode:     2 (on)
> bus width:      3 (8 bits)
> timing spec:    10 (mmc HS400)
> signal voltage: 1 (1.80 V)
> driver type:    1 (driver type A)
>=20
> HS400 ES: (Without internal divider)
> root@smarc-rzg3l:~# cat /proc/cmdline
> rw rootwait earlycon root=3D/dev/mmcblk0p2 net.ifnames=3D0 root@smarc-rzg=
3l:~# cat /sys/kernel/debug/mmc0/ios
> clock:          150000000 Hz
> actual clock:   150000000 Hz
> vdd:            21 (3.3 ~ 3.4 V)
> bus mode:       2 (push-pull)
> chip select:    0 (don't care)
> power mode:     2 (on)
> bus width:      3 (8 bits)
> timing spec:    10 (mmc HS400 enhanced strobe)
> signal voltage: 1 (1.80 V)
> driver type:    1 (driver type A)
>=20
> s2ram:
> root@smarc-rzg3l:~# echo mem > /sys/power/state
> [   72.838238] PM: suspend entry (deep)
> [   72.864225] Filesystems sync: 0.021 seconds
> [   72.875166] Freezing user space processes
> [   72.883030] Freezing user space processes completed (elapsed 0.003 sec=
onds)
> [   72.890237] OOM killer disabled.
> [   72.893612] Freezing remaining freezable tasks
> [   72.900038] Freezing remaining freezable tasks completed (elapsed 0.00=
1 seconds)
> [   72.907677] printk: Suspending console(s) (use no_console_suspend to d=
ebug)
> NOTICE:  BL2: v2.10.5(release):2.10.5/rzg3l_1.0.1_rc2
> NOTICE:  BL2: Built : 11:18:41, Jul 15 2026
> INFO:    BL2: Doing platform setup
> INFO:    Configuring TrustZone Controller
> INFO:    Total 3 regions set.
> INFO:    Configuring TrustZone Controller
> INFO:    Total 1 regions set.
> INFO:    Configuring TrustZone Controller
> INFO:    Total 1 regions set.
> INFO:    eMMC boot from partition 1
> INFO:    Loading image id=3D39 at address 0x44428
> INFO:    emmcdrv_block_len: len: 0x00001000
> INFO:    Load dst=3D0x44428 src=3D(p:1)0x260000(4864) len=3D0x1000(8)
> INFO:    Image id=3D39 loaded: 0x44428 - 0x45428
> INFO:    DDR: Retention Exit (Rev. 02.05)
> NOTICE:  BL2: SYS_LSI_MODE: 0x12051
> NOTICE:  BL2: SYS_LSI_DEVID: 0x87d9447
> INFO:    BL2: Skip loading image id 3
> INFO:    BL2: Skip loading image id 5
> NOTICE:  BL2: Booting BL31
> INFO:    Entry point address =3D 0x44000000
> INFO:    SPSR =3D 0x3cd
> [   72.951851] renesas-gbeth 11c30000.ethernet eth0: Link is Down
> [   72.955613] Disabling non-boot CPUs ...
> [   72.957320] psci: CPU3 killed (polled 4 ms)
> [   72.961085] psci: CPU2 killed (polled 0 ms)
> [   72.964897] psci: CPU1 killed (polled 0 ms)
> [   72.966874] Enabling non-boot CPUs ...
> [   72.967144] Detected VIPT I-cache on CPU1
> [   72.967202] GICv3: CPU1: found redistributor 100 region 0:0x0000000012=
460000
> [   72.967250] CPU1: Booted secondary processor 0x0000000100 [0x412fd050]
> [   72.968284] CPU1 is up
> [   72.968428] Detected VIPT I-cache on CPU2
> [   72.968462] GICv3: CPU2: found redistributor 200 region 0:0x0000000012=
480000
> [   72.968493] CPU2: Booted secondary processor 0x0000000200 [0x412fd050]
> [   72.969465] CPU2 is up
> [   72.969633] Detected VIPT I-cache on CPU3
> [   72.969673] GICv3: CPU3: found redistributor 300 region 0:0x0000000012=
4a0000
> [   72.969714] CPU3: Booted secondary processor 0x0000000300 [0x412fd050]
> [   72.970760] CPU3 is up
> [   72.989187] dwmac4: Master AXI performs fixed burst length
> [   72.989231] renesas-gbeth 11c30000.ethernet eth0: No Safety Features s=
upport found
> [   72.989275] renesas-gbeth 11c30000.ethernet eth0: IEEE 1588-2008 Advan=
ced Timestamp supported
> [   72.990364] renesas-gbeth 11c30000.ethernet eth0: configuring for phy/=
rgmii-id link mode
> [   73.005175] dwmac4: Master AXI performs fixed burst length
> [   73.005205] renesas-gbeth 11c40000.ethernet eth1: No Safety Features s=
upport found
> [   73.005236] renesas-gbeth 11c40000.ethernet eth1: IEEE 1588-2008 Advan=
ced Timestamp supported
> [   73.006314] renesas-gbeth 11c40000.ethernet eth1: configuring for phy/=
rgmii-id link mode
> [   73.177702] OOM killer enabled.
> [   73.180837] Restarting tasks: Starting
> [   73.186007] Restarting tasks: Done
> [   73.189570] random: crng reseeded on system resumption
> [   73.195001] PM: suspend exit
> root@smarc-rzg3l:~# cat /sys/kernel/debug/mmc0/ios[   75.705532] renesas-=
gbeth 11c30000.ethernet eth0:
> Link is Up - 1Gbps/Full - flow control rx/tx
>=20
> clock:          150000000 Hz
> actual clock:   150000000 Hz
> vdd:            21 (3.3 ~ 3.4 V)
> bus mode:       2 (push-pull)
> chip select:    0 (don't care)
> power mode:     2 (on)
> bus width:      3 (8 bits)
> timing spec:    10 (mmc HS400 enhanced strobe)
> signal voltage: 1 (1.80 V)
> driver type:    1 (driver type A)
> root@smarc-rzg3l:~#
>=20
> s2idle:
> root@smarc-rzg3l:~# echo freeze > /sys/power/state
> [   97.634564] PM: suspend entry (s2idle)
> [   97.655343] Filesystems sync: 0.016 seconds
> [   97.662352] Freezing user space processes
> [   97.666531] Freezing user space processes completed (elapsed 0.004 sec=
onds)
> [   97.676132] OOM killer disabled.
> [   97.679743] Freezing remaining freezable tasks
> [   97.687107] Freezing remaining freezable tasks completed (elapsed 0.00=
2 seconds)
> [   97.695071] printk: Suspending console(s) (use no_console_suspend to d=
ebug)
> [   97.744129] renesas-gbeth 11c30000.ethernet eth0: Link is Down
> [  100.135760] dwmac4: Master AXI performs fixed burst length [  100.1358=
05] renesas-gbeth
> 11c30000.ethernet eth0: No Safety Features support found [  100.135848] r=
enesas-gbeth 11c30000.ethernet
> eth0: IEEE 1588-2008 Advanced Timestamp supported [  100.137950] renesas-=
gbeth 11c30000.ethernet eth0:
> configuring for phy/rgmii-id link mode [  100.154860] dwmac4: Master AXI =
performs fixed burst length
> [  100.154890] renesas-gbeth 11c40000.ethernet eth1: No Safety Features s=
upport found [  100.154919]
> renesas-gbeth 11c40000.ethernet eth1: IEEE 1588-2008 Advanced Timestamp s=
upported [  100.154984] renesas-
> gbeth 11c40000.ethernet eth1: configuring for phy/rgmii-id link mode [  1=
00.246688] OOM killer enabled.
> [  100.249851] Restarting tasks: Starting [  100.254395] Restarting tasks=
: Done [  100.258012] random:
> crng reseeded on system resumption [  100.263468] PM: suspend exit root@s=
marc-rzg3l:~# root@smarc-
> rzg3l:~# cat /sys/kernel/debug/mmc0/ios[  102.690106] renesas-gbeth 11c30=
000.ethernet eth0: Link is Up -
> 1Gbps/Full - flow control rx/tx
>=20
> clock:          150000000 Hz
> actual clock:   150000000 Hz
> vdd:            21 (3.3 ~ 3.4 V)
> bus mode:       2 (push-pull)
> chip select:    0 (don't care)
> power mode:     2 (on)
> bus width:      3 (8 bits)
> timing spec:    10 (mmc HS400 enhanced strobe)
> signal voltage: 1 (1.80 V)
> driver type:    1 (driver type A)
> root@smarc-rzg3l:~#
>=20
> SDIO testing:
> root@smarc-rzg3l:~# cat /sys/kernel/debug/mmc1/ios
> clock:          100000000 Hz
> actual clock:   100000000 Hz
> vdd:            21 (3.3 ~ 3.4 V)
> bus mode:       2 (push-pull)
> chip select:    0 (don't care)
> power mode:     2 (on)
> bus width:      2 (4 bits)
> timing spec:    5 (sd uhs SDR50)
> signal voltage: 1 (1.80 V)
> driver type:    0 (driver type B)
> root@smarc-rzg3l:~#
> root@smarc-rzg3l:~# ping google.com
> PING google.com (142.250.151.139): 56 data bytes
> 64 bytes from 142.250.151.139: seq=3D0 ttl=3D112 time=3D7.679 ms
> 64 bytes from 142.250.151.139: seq=3D1 ttl=3D112 time=3D12.283 ms ^C goog=
le.com ping statistic packets
> transmitted, 2 packets received, 0% packet loss round-trip min/avg/max =
=3D 7.679/9.981/12.283 ms
>=20
> Biju Das (14):
>   dt-bindings: mmc: renesas,sdhi: Document RZ/G3L (r9a08g046) SoC
>   mmc: renesas_sdhi: Clean up whitespace and add OF table sentinels
>   mmc: renesas_sdhi: Add clk_mask field to support flexible clock
>     divider widths
>   mmc: renesas_sdhi: Add max_divider field to support SoC-specific clock
>     ranges
>   mmc: renesas_sdhi: Make clock divider mask configurable
>   mmc: renesas_sdhi: Add tuning delay support for RZ/G2L
>   mmc: renesas_sdhi: Add TMIO_MMC_INTERNAL_DIVIDER flag
>   mmc: renesas_sdhi: Add optional axis/axim reset controls
>   mmc: renesas_sdhi: Add write32_hook for CTL_SD_CARD_CLK_CTL register
>     writes
>   mmc: renesas_sdhi: Add RZ/G3L SDHI support
>   mmc: renesas_sdhi: Save and restore IOVS across suspend/resume
>   mmc: renesas_sdhi: Make HS400 OSEL bit configurable per SoC
>   mmc: renesas_sdhi: Add RZ/G3L HS400 support
>   mmc: renesas_sdhi: Add HS400 enhanced strobe support for RZ/G3L
>=20
>  .../devicetree/bindings/mmc/renesas,sdhi.yaml | 108 ++++--
>  drivers/mmc/host/renesas_sdhi.h               |  12 +-
>  drivers/mmc/host/renesas_sdhi_core.c          | 337 +++++++++++++++---
>  drivers/mmc/host/renesas_sdhi_internal_dmac.c |  78 +++-
>  drivers/mmc/host/renesas_sdhi_sys_dmac.c      |  16 +-
>  drivers/mmc/host/tmio_mmc.h                   |   7 +
>  drivers/mmc/host/tmio_mmc_core.c              |  13 +-
>  include/linux/platform_data/tmio.h            |  19 +
>  8 files changed, 499 insertions(+), 91 deletions(-)
>=20

Gentle Ping.

Cheers,
Biju