[PATCH v5 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0

Inochi Amaoto posted 2 patches 3 days, 13 hours ago
drivers/mmc/host/litex_mmc.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
[PATCH v5 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0
Posted by Inochi Amaoto 3 days, 13 hours ago
The litex_mmc driver assumes the card is already probed in the BIOS
and skip the phy initialization. This will cause the command fail
like the following when the old card is unplugged and then insert
a new card:

[   62.923593] litex-mmc f0004000.mmc: Command (cmd 8) error, status -110
[   62.949717] litex-mmc f0004000.mmc: Command (cmd 55) error, status -110
[   62.976606] litex-mmc f0004000.mmc: Command (cmd 55) error, status -110
[   63.002516] litex-mmc f0004000.mmc: Command (cmd 55) error, status -110
[   63.028442] litex-mmc f0004000.mmc: Command (cmd 55) error, status -110

Firstly, fix the clock divider calculation so we can get the right
clock frequency, then add required clock settings and initialization
for the CMD 0, so it can probe the new card.

Test Results:
Rocket:
# dmesg | grep mmc
[    0.109176] litex-mmc 12003000.mmc: LiteX MMC controller initialized.
[    0.256926] mmc0: new SDHC card at address aaaa
[    0.257058] mmcblk0: mmc0:aaaa WC32G 29.7 GiB

Note: it seems like the rocket give a wrong DMA result when the target
address is in main memory.
See issue: https://github.com/enjoy-digital/litex/issues/2464

VexiiRiscv:
# dmesg | grep mmc
[    2.368365] litex-mmc f0004000.mmc: LiteX MMC controller initialized.
[    2.576993] mmc0: new SDHC card at address aaaa
[    2.588966] mmcblk0: mmc0:aaaa WC32G 29.7 GiB
[    2.620197]  mmcblk0: p1

Changed from v4:
- https://lore.kernel.org/linux-mmc/20260517015323.264179-1-inochiama@gmail.com/
1. Add a new patch for fixing clock divider calculation
2. Move everything in the set_ios() callback.

Changed from v3:
- https://lore.kernel.org/linux-mmc/20260426112016.1370929-1-inochiama@gmail.com/
1. Remove patch 1: mmc: litex_mmc: Move litex_mmc_setclk() to bottom for reuse
2. Use set_ios() callback to apply the clock change.

Changed from v2:
- https://lore.kernel.org/linux-mmc/20260424013615.470325-1-inochiama@gmail.com/
1. Remove the added function forward reference and add a new patch
   for moving litex_mmc_setclk() function

Change from v1:
- https://lore.kernel.org/linux-mmc/20260421025052.755471-1-inochiama@gmail.com/
1. use fsleep to replace udelay

Inochi Amaoto (2):
  mmc: litex_mmc: Use DIV_ROUND_UP for more accurate clock calculation
  mmc: litex_mmc: Set mandatory idle clocks before CMD0

 drivers/mmc/host/litex_mmc.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

--
2.54.0
Re: [PATCH v5 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0
Posted by Gabriel L. Somlo 3 days, 5 hours ago
On Thu, May 21, 2026 at 03:21:19PM +0800, Inochi Amaoto wrote:
> The litex_mmc driver assumes the card is already probed in the BIOS
> and skip the phy initialization. This will cause the command fail
> like the following when the old card is unplugged and then insert
> a new card:
> 
> [   62.923593] litex-mmc f0004000.mmc: Command (cmd 8) error, status -110
> [   62.949717] litex-mmc f0004000.mmc: Command (cmd 55) error, status -110
> [   62.976606] litex-mmc f0004000.mmc: Command (cmd 55) error, status -110
> [   63.002516] litex-mmc f0004000.mmc: Command (cmd 55) error, status -110
> [   63.028442] litex-mmc f0004000.mmc: Command (cmd 55) error, status -110
> 
> Firstly, fix the clock divider calculation so we can get the right
> clock frequency, then add required clock settings and initialization
> for the CMD 0, so it can probe the new card.
> 
> Test Results:
> Rocket:
> # dmesg | grep mmc
> [    0.109176] litex-mmc 12003000.mmc: LiteX MMC controller initialized.
> [    0.256926] mmc0: new SDHC card at address aaaa
> [    0.257058] mmcblk0: mmc0:aaaa WC32G 29.7 GiB
> 
> Note: it seems like the rocket give a wrong DMA result when the target
> address is in main memory.
> See issue: https://github.com/enjoy-digital/litex/issues/2464
> 
> VexiiRiscv:
> # dmesg | grep mmc
> [    2.368365] litex-mmc f0004000.mmc: LiteX MMC controller initialized.
> [    2.576993] mmc0: new SDHC card at address aaaa
> [    2.588966] mmcblk0: mmc0:aaaa WC32G 29.7 GiB
> [    2.620197]  mmcblk0: p1

For the whole series:

Reviewed-by: Gabriel Somlo <gsomlo@gmail.com>

Thanks,
--Gabriel
 
> Changed from v4:
> - https://lore.kernel.org/linux-mmc/20260517015323.264179-1-inochiama@gmail.com/
> 1. Add a new patch for fixing clock divider calculation
> 2. Move everything in the set_ios() callback.
> 
> Changed from v3:
> - https://lore.kernel.org/linux-mmc/20260426112016.1370929-1-inochiama@gmail.com/
> 1. Remove patch 1: mmc: litex_mmc: Move litex_mmc_setclk() to bottom for reuse
> 2. Use set_ios() callback to apply the clock change.
> 
> Changed from v2:
> - https://lore.kernel.org/linux-mmc/20260424013615.470325-1-inochiama@gmail.com/
> 1. Remove the added function forward reference and add a new patch
>    for moving litex_mmc_setclk() function
> 
> Change from v1:
> - https://lore.kernel.org/linux-mmc/20260421025052.755471-1-inochiama@gmail.com/
> 1. use fsleep to replace udelay
> 
> Inochi Amaoto (2):
>   mmc: litex_mmc: Use DIV_ROUND_UP for more accurate clock calculation
>   mmc: litex_mmc: Set mandatory idle clocks before CMD0
> 
>  drivers/mmc/host/litex_mmc.c | 20 +++++++++++++++++---
>  1 file changed, 17 insertions(+), 3 deletions(-)
> 
> --
> 2.54.0
>