* [PATCH v3 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0
@ 2026-04-26 11:20 Inochi Amaoto
2026-04-26 11:20 ` [PATCH v3 1/2] mmc: litex_mmc: Move litex_mmc_setclk() to bottom for reuse Inochi Amaoto
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Inochi Amaoto @ 2026-04-26 11:20 UTC (permalink / raw)
To: Ulf Hansson, Karol Gugala, Mateusz Holenko, Gabriel Somlo,
Joel Stanley, Paul Mackerras, Maciej Dudek, Andy Shevchenko
Cc: Inochi Amaoto, linux-mmc, linux-kernel, Yixun Lan, Longbin Li
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
Add required clock settings and initialization for the CMD 0, so it can
probe the new card.
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: Move litex_mmc_setclk() to bottom for reuse
mmc: litex_mmc: Set mandatory idle clocks before CMD0
drivers/mmc/host/litex_mmc.c | 37 ++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
--
2.54.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 1/2] mmc: litex_mmc: Move litex_mmc_setclk() to bottom for reuse
2026-04-26 11:20 [PATCH v3 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
@ 2026-04-26 11:20 ` Inochi Amaoto
2026-04-26 11:20 ` [PATCH v3 2/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
2026-04-26 15:59 ` [PATCH v3 0/2] " Gabriel L. Somlo
2 siblings, 0 replies; 4+ messages in thread
From: Inochi Amaoto @ 2026-04-26 11:20 UTC (permalink / raw)
To: Ulf Hansson, Karol Gugala, Mateusz Holenko, Gabriel Somlo,
Joel Stanley, Paul Mackerras, Maciej Dudek, Andy Shevchenko
Cc: Inochi Amaoto, linux-mmc, linux-kernel, Yixun Lan, Longbin Li
Move the litex_mmc_setclk() to the bottom of the driver, this
function is needed to set the idle clock for CMD0
Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
---
drivers/mmc/host/litex_mmc.c | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/drivers/mmc/host/litex_mmc.c b/drivers/mmc/host/litex_mmc.c
index d2f19c2dc673..a8d9c0ece16a 100644
--- a/drivers/mmc/host/litex_mmc.c
+++ b/drivers/mmc/host/litex_mmc.c
@@ -99,6 +99,20 @@ struct litex_mmc_host {
bool app_cmd;
};
+static void litex_mmc_setclk(struct litex_mmc_host *host, unsigned int freq)
+{
+ struct device *dev = mmc_dev(host->mmc);
+ u32 div;
+
+ div = freq ? host->ref_clk / freq : 256U;
+ div = roundup_pow_of_two(div);
+ div = clamp(div, 2U, 256U);
+ dev_dbg(dev, "sd_clk_freq=%d: set to %d via div=%d\n",
+ freq, host->ref_clk / div, div);
+ litex_write16(host->sdphy + LITEX_PHY_CLOCKERDIV, div);
+ host->sd_clk = freq;
+}
+
static int litex_mmc_sdcard_wait_done(void __iomem *reg, struct device *dev)
{
u8 evt;
@@ -431,20 +445,6 @@ static void litex_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
mmc_request_done(mmc, mrq);
}
-static void litex_mmc_setclk(struct litex_mmc_host *host, unsigned int freq)
-{
- struct device *dev = mmc_dev(host->mmc);
- u32 div;
-
- div = freq ? host->ref_clk / freq : 256U;
- div = roundup_pow_of_two(div);
- div = clamp(div, 2U, 256U);
- dev_dbg(dev, "sd_clk_freq=%d: set to %d via div=%d\n",
- freq, host->ref_clk / div, div);
- litex_write16(host->sdphy + LITEX_PHY_CLOCKERDIV, div);
- host->sd_clk = freq;
-}
-
static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
{
struct litex_mmc_host *host = mmc_priv(mmc);
--
2.54.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 2/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0
2026-04-26 11:20 [PATCH v3 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
2026-04-26 11:20 ` [PATCH v3 1/2] mmc: litex_mmc: Move litex_mmc_setclk() to bottom for reuse Inochi Amaoto
@ 2026-04-26 11:20 ` Inochi Amaoto
2026-04-26 15:59 ` [PATCH v3 0/2] " Gabriel L. Somlo
2 siblings, 0 replies; 4+ messages in thread
From: Inochi Amaoto @ 2026-04-26 11:20 UTC (permalink / raw)
To: Ulf Hansson, Karol Gugala, Mateusz Holenko, Gabriel Somlo,
Joel Stanley, Paul Mackerras, Maciej Dudek, Andy Shevchenko
Cc: Inochi Amaoto, linux-mmc, linux-kernel, Yixun Lan, Longbin Li
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
Add required clock settings and initialization for the CMD 0, so it can
probe the new card.
Fixes: 92e099104729 ("mmc: Add driver for LiteX's LiteSDCard interface")
Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
---
drivers/mmc/host/litex_mmc.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/mmc/host/litex_mmc.c b/drivers/mmc/host/litex_mmc.c
index a8d9c0ece16a..c984398d0803 100644
--- a/drivers/mmc/host/litex_mmc.c
+++ b/drivers/mmc/host/litex_mmc.c
@@ -68,6 +68,9 @@
#define SD_SLEEP_US 5
#define SD_TIMEOUT_US 20000
+#define SD_INIT_DELAY_US 1000
+#define SD_INIT_CLK_HZ 400000
+
#define SDIRQ_CARD_DETECT 1
#define SDIRQ_SD_TO_MEM_DONE 2
#define SDIRQ_MEM_TO_SD_DONE 4
@@ -142,6 +145,12 @@ static int litex_mmc_send_cmd(struct litex_mmc_host *host,
int ret;
u8 evt;
+ if (cmd == MMC_GO_IDLE_STATE) {
+ litex_mmc_setclk(host, SD_INIT_CLK_HZ);
+ litex_write8(host->sdphy + LITEX_PHY_INITIALIZE, 1);
+ fsleep(SD_INIT_DELAY_US);
+ }
+
litex_write32(host->sdcore + LITEX_CORE_CMDARG, arg);
litex_write32(host->sdcore + LITEX_CORE_CMDCMD,
cmd << 8 | transfer << 5 | response_len);
--
2.54.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v3 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0
2026-04-26 11:20 [PATCH v3 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
2026-04-26 11:20 ` [PATCH v3 1/2] mmc: litex_mmc: Move litex_mmc_setclk() to bottom for reuse Inochi Amaoto
2026-04-26 11:20 ` [PATCH v3 2/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
@ 2026-04-26 15:59 ` Gabriel L. Somlo
2 siblings, 0 replies; 4+ messages in thread
From: Gabriel L. Somlo @ 2026-04-26 15:59 UTC (permalink / raw)
To: Inochi Amaoto
Cc: Ulf Hansson, Karol Gugala, Mateusz Holenko, Joel Stanley,
Paul Mackerras, Maciej Dudek, Andy Shevchenko, linux-mmc,
linux-kernel, Yixun Lan, Longbin Li
On Sun, Apr 26, 2026 at 07:20:13PM +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
>
> Add required clock settings and initialization for the CMD 0, so it can
> probe the new card.
>
> 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: Move litex_mmc_setclk() to bottom for reuse
> mmc: litex_mmc: Set mandatory idle clocks before CMD0
For the whole series:
Reviewed-by: Gabriel Somlo <gsomlo@gmail.com>
Thanks,
--Gabriel
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-04-26 15:59 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-26 11:20 [PATCH v3 0/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
2026-04-26 11:20 ` [PATCH v3 1/2] mmc: litex_mmc: Move litex_mmc_setclk() to bottom for reuse Inochi Amaoto
2026-04-26 11:20 ` [PATCH v3 2/2] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
2026-04-26 15:59 ` [PATCH v3 0/2] " Gabriel L. Somlo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox