* [PATCH] mmc: litex_mmc: Set mandatory idle clocks before CMD0
@ 2026-04-21 2:50 Inochi Amaoto
2026-04-21 9:01 ` Andy Shevchenko
0 siblings, 1 reply; 3+ messages in thread
From: Inochi Amaoto @ 2026-04-21 2:50 UTC (permalink / raw)
To: Ulf Hansson, Karol Gugala, Mateusz Holenko, Gabriel Somlo,
Joel Stanley, Andy Shevchenko, Maciej Dudek, Kamil Rakoczy
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 | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/mmc/host/litex_mmc.c b/drivers/mmc/host/litex_mmc.c
index d2f19c2dc673..dde9b491a320 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
@@ -99,6 +102,8 @@ struct litex_mmc_host {
bool app_cmd;
};
+static void litex_mmc_setclk(struct litex_mmc_host *host, unsigned int freq);
+
static int litex_mmc_sdcard_wait_done(void __iomem *reg, struct device *dev)
{
u8 evt;
@@ -128,6 +133,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);
+ udelay(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.53.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] mmc: litex_mmc: Set mandatory idle clocks before CMD0
2026-04-21 2:50 [PATCH] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
@ 2026-04-21 9:01 ` Andy Shevchenko
2026-04-21 9:39 ` Inochi Amaoto
0 siblings, 1 reply; 3+ messages in thread
From: Andy Shevchenko @ 2026-04-21 9:01 UTC (permalink / raw)
To: Inochi Amaoto
Cc: Ulf Hansson, Karol Gugala, Mateusz Holenko, Gabriel Somlo,
Joel Stanley, Maciej Dudek, Kamil Rakoczy, linux-mmc,
linux-kernel, Yixun Lan, Longbin Li
On Tue, Apr 21, 2026 at 5:51 AM Inochi Amaoto <inochiama@gmail.com> 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.
...
> 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);
> + udelay(SD_INIT_DELAY_US);
Why is it atomic? I see no evidence this function requires an atomic
context. Please, use fsleep().
> + }
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] mmc: litex_mmc: Set mandatory idle clocks before CMD0
2026-04-21 9:01 ` Andy Shevchenko
@ 2026-04-21 9:39 ` Inochi Amaoto
0 siblings, 0 replies; 3+ messages in thread
From: Inochi Amaoto @ 2026-04-21 9:39 UTC (permalink / raw)
To: Andy Shevchenko, Inochi Amaoto
Cc: Ulf Hansson, Karol Gugala, Mateusz Holenko, Gabriel Somlo,
Joel Stanley, Maciej Dudek, Kamil Rakoczy, linux-mmc,
linux-kernel, Yixun Lan, Longbin Li
On Tue, Apr 21, 2026 at 12:01:57PM +0300, Andy Shevchenko wrote:
> On Tue, Apr 21, 2026 at 5:51 AM Inochi Amaoto <inochiama@gmail.com> 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.
>
> ...
>
> > 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);
>
> > + udelay(SD_INIT_DELAY_US);
>
> Why is it atomic? I see no evidence this function requires an atomic
> context. Please, use fsleep().
>
Thank, it is my mistake. This function does not require atomic context.
I will fix it in the v2.
Regards,
Inochi
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-04-21 9:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-21 2:50 [PATCH] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
2026-04-21 9:01 ` Andy Shevchenko
2026-04-21 9:39 ` Inochi Amaoto
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox