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

From: Inochi Amaoto

Date: Thu May 21 2026 - 03:25:03 EST


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@xxxxxxxxx/
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@xxxxxxxxx/
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@xxxxxxxxx/
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@xxxxxxxxx/
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