public inbox for linux-mmc@vger.kernel.org
 help / color / mirror / Atom feed
* [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