mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0
@ 2026-05-17  1:53 Inochi Amaoto
  2026-05-18 22:20 ` Gabriel L. Somlo
  0 siblings, 1 reply; 8+ messages in thread
From: Inochi Amaoto @ 2026-05-17  1:53 UTC (permalink / raw)
  To: Ulf Hansson, Karol Gugala, Mateusz Holenko, Gabriel Somlo,
	Joel Stanley, Kamil Rakoczy, 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>
---
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: 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(-)
---
 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..65d5c728f536 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
@@ -449,6 +452,9 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 {
 	struct litex_mmc_host *host = mmc_priv(mmc);

+	if (ios->chip_select == MMC_CS_HIGH)
+		ios->clock = SD_INIT_CLK_HZ;
+
 	/*
 	 * NOTE: Ignore any ios->bus_width updates; they occur right after
 	 * the mmc core sends its own acmd6 bus-width change notification,
@@ -459,6 +465,11 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 	/* Update sd_clk */
 	if (ios->clock != host->sd_clk)
 		litex_mmc_setclk(host, ios->clock);
+
+	if (ios->chip_select == MMC_CS_HIGH) {
+		litex_write8(host->sdphy + LITEX_PHY_INITIALIZE, 1);
+		fsleep(SD_INIT_DELAY_US);
+	}
 }

 static const struct mmc_host_ops litex_mmc_ops = {
--
2.54.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0
  2026-05-17  1:53 [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
@ 2026-05-18 22:20 ` Gabriel L. Somlo
  2026-05-18 22:24   ` Inochi Amaoto
  0 siblings, 1 reply; 8+ messages in thread
From: Gabriel L. Somlo @ 2026-05-18 22:20 UTC (permalink / raw)
  To: Inochi Amaoto
  Cc: Ulf Hansson, Karol Gugala, Mateusz Holenko, Joel Stanley,
	Kamil Rakoczy, Andy Shevchenko, linux-mmc, linux-kernel,
	Yixun Lan, Longbin Li

with this patch on top of today's latest (4d3a2a466b8d), I get
(on 64-bit rocketchip with Litex):

[    6.475114] mmc0: invalid bus width
[    6.477870] mmc0: error -22 whilst initialising SD card

Thanks,
--Gabriel

On Sun, May 17, 2026 at 09:53:23AM +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.
> 
> Fixes: 92e099104729 ("mmc: Add driver for LiteX's LiteSDCard interface")
> Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
> ---
> 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: 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(-)
> ---
>  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..65d5c728f536 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
> @@ -449,6 +452,9 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
>  {
>  	struct litex_mmc_host *host = mmc_priv(mmc);
> 
> +	if (ios->chip_select == MMC_CS_HIGH)
> +		ios->clock = SD_INIT_CLK_HZ;
> +
>  	/*
>  	 * NOTE: Ignore any ios->bus_width updates; they occur right after
>  	 * the mmc core sends its own acmd6 bus-width change notification,
> @@ -459,6 +465,11 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
>  	/* Update sd_clk */
>  	if (ios->clock != host->sd_clk)
>  		litex_mmc_setclk(host, ios->clock);
> +
> +	if (ios->chip_select == MMC_CS_HIGH) {
> +		litex_write8(host->sdphy + LITEX_PHY_INITIALIZE, 1);
> +		fsleep(SD_INIT_DELAY_US);
> +	}
>  }
> 
>  static const struct mmc_host_ops litex_mmc_ops = {
> --
> 2.54.0
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0
  2026-05-18 22:20 ` Gabriel L. Somlo
@ 2026-05-18 22:24   ` Inochi Amaoto
  2026-05-18 22:45     ` Gabriel L. Somlo
  0 siblings, 1 reply; 8+ messages in thread
From: Inochi Amaoto @ 2026-05-18 22:24 UTC (permalink / raw)
  To: Gabriel L. Somlo, Inochi Amaoto
  Cc: Ulf Hansson, Karol Gugala, Mateusz Holenko, Joel Stanley,
	Kamil Rakoczy, Andy Shevchenko, linux-mmc, linux-kernel,
	Yixun Lan, Longbin Li

On Mon, May 18, 2026 at 06:20:49PM -0400, Gabriel L. Somlo wrote:
> with this patch on top of today's latest (4d3a2a466b8d), I get
> (on 64-bit rocketchip with Litex):
> 
> [    6.475114] mmc0: invalid bus width
> [    6.477870] mmc0: error -22 whilst initialising SD card
> 
> Thanks,
> --Gabriel
> 

Hi, Gabriel,

Could you share the board link and build commands? I think I need to
take a look for why this occurs.

Regards,
Inochi

> On Sun, May 17, 2026 at 09:53:23AM +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.
> > 
> > Fixes: 92e099104729 ("mmc: Add driver for LiteX's LiteSDCard interface")
> > Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
> > ---
> > 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: 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(-)
> > ---
> >  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..65d5c728f536 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
> > @@ -449,6 +452,9 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> >  {
> >  	struct litex_mmc_host *host = mmc_priv(mmc);
> > 
> > +	if (ios->chip_select == MMC_CS_HIGH)
> > +		ios->clock = SD_INIT_CLK_HZ;
> > +
> >  	/*
> >  	 * NOTE: Ignore any ios->bus_width updates; they occur right after
> >  	 * the mmc core sends its own acmd6 bus-width change notification,
> > @@ -459,6 +465,11 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> >  	/* Update sd_clk */
> >  	if (ios->clock != host->sd_clk)
> >  		litex_mmc_setclk(host, ios->clock);
> > +
> > +	if (ios->chip_select == MMC_CS_HIGH) {
> > +		litex_write8(host->sdphy + LITEX_PHY_INITIALIZE, 1);
> > +		fsleep(SD_INIT_DELAY_US);
> > +	}
> >  }
> > 
> >  static const struct mmc_host_ops litex_mmc_ops = {
> > --
> > 2.54.0
> > 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0
  2026-05-18 22:24   ` Inochi Amaoto
@ 2026-05-18 22:45     ` Gabriel L. Somlo
  2026-05-19  1:11       ` Inochi Amaoto
  2026-05-19  2:51       ` Inochi Amaoto
  0 siblings, 2 replies; 8+ messages in thread
From: Gabriel L. Somlo @ 2026-05-18 22:45 UTC (permalink / raw)
  To: Inochi Amaoto
  Cc: Ulf Hansson, Karol Gugala, Mateusz Holenko, Joel Stanley,
	Kamil Rakoczy, Andy Shevchenko, linux-mmc, linux-kernel,
	Yixun Lan, Longbin Li

On Tue, May 19, 2026 at 06:24:19AM +0800, Inochi Amaoto wrote:
> On Mon, May 18, 2026 at 06:20:49PM -0400, Gabriel L. Somlo wrote:
> > with this patch on top of today's latest (4d3a2a466b8d), I get
> > (on 64-bit rocketchip with Litex):
> > 
> > [    6.475114] mmc0: invalid bus width
> > [    6.477870] mmc0: error -22 whilst initialising SD card
> > 
> > Thanks,
> > --Gabriel
> > 
> 
> Hi, Gabriel,
> 
> Could you share the board link and build commands? I think I need to
> take a look for why this occurs.
> 
> Regards,
> Inochi

Hi Inochi,

it's the digilent nexys-video board; the command line to build the
bitstream is:

litex-boards/litex_boards/targets/digilent_nexys_video.py --build \
  --cpu-type rocket --cpu-variant linux --cpu-num-cores 4 --cpu-mem-width 2 \
  --sys-clk-freq 50e6 --with-ethernet --with-sdcard --with-sata --sata-gen 1

(for more details see https://github.com/litex-hub/linux-on-litex-rocket)

I've added your patch on top of the LiteX kernel tree at
https://github.com/litex-hub/linux/tree/litex-rebase

and compiled it with:

make clean
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- litex_rocket_defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-

FWIW, your previous versions of the patch did work, and did fix the
issue you were trying to address (which I did notice being a problem
on my configuration :)

Thanks,
--Gabriel
 
> > On Sun, May 17, 2026 at 09:53:23AM +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.
> > > 
> > > Fixes: 92e099104729 ("mmc: Add driver for LiteX's LiteSDCard interface")
> > > Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
> > > ---
> > > 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: 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(-)
> > > ---
> > >  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..65d5c728f536 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
> > > @@ -449,6 +452,9 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> > >  {
> > >  	struct litex_mmc_host *host = mmc_priv(mmc);
> > > 
> > > +	if (ios->chip_select == MMC_CS_HIGH)
> > > +		ios->clock = SD_INIT_CLK_HZ;
> > > +
> > >  	/*
> > >  	 * NOTE: Ignore any ios->bus_width updates; they occur right after
> > >  	 * the mmc core sends its own acmd6 bus-width change notification,
> > > @@ -459,6 +465,11 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> > >  	/* Update sd_clk */
> > >  	if (ios->clock != host->sd_clk)
> > >  		litex_mmc_setclk(host, ios->clock);
> > > +
> > > +	if (ios->chip_select == MMC_CS_HIGH) {
> > > +		litex_write8(host->sdphy + LITEX_PHY_INITIALIZE, 1);
> > > +		fsleep(SD_INIT_DELAY_US);
> > > +	}
> > >  }
> > > 
> > >  static const struct mmc_host_ops litex_mmc_ops = {
> > > --
> > > 2.54.0
> > > 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0
  2026-05-18 22:45     ` Gabriel L. Somlo
@ 2026-05-19  1:11       ` Inochi Amaoto
  2026-05-19  2:51       ` Inochi Amaoto
  1 sibling, 0 replies; 8+ messages in thread
From: Inochi Amaoto @ 2026-05-19  1:11 UTC (permalink / raw)
  To: Gabriel L. Somlo, Inochi Amaoto
  Cc: Ulf Hansson, Karol Gugala, Mateusz Holenko, Joel Stanley,
	Kamil Rakoczy, Andy Shevchenko, linux-mmc, linux-kernel,
	Yixun Lan, Longbin Li

On Mon, May 18, 2026 at 06:45:26PM -0400, Gabriel L. Somlo wrote:
> On Tue, May 19, 2026 at 06:24:19AM +0800, Inochi Amaoto wrote:
> > On Mon, May 18, 2026 at 06:20:49PM -0400, Gabriel L. Somlo wrote:
> > > with this patch on top of today's latest (4d3a2a466b8d), I get
> > > (on 64-bit rocketchip with Litex):
> > > 
> > > [    6.475114] mmc0: invalid bus width
> > > [    6.477870] mmc0: error -22 whilst initialising SD card
> > > 
> > > Thanks,
> > > --Gabriel
> > > 
> > 
> > Hi, Gabriel,
> > 
> > Could you share the board link and build commands? I think I need to
> > take a look for why this occurs.
> > 
> > Regards,
> > Inochi
> 
> Hi Inochi,
> 
> it's the digilent nexys-video board; the command line to build the
> bitstream is:
> 
> litex-boards/litex_boards/targets/digilent_nexys_video.py --build \
>   --cpu-type rocket --cpu-variant linux --cpu-num-cores 4 --cpu-mem-width 2 \
>   --sys-clk-freq 50e6 --with-ethernet --with-sdcard --with-sata --sata-gen 1
> 
> (for more details see https://github.com/litex-hub/linux-on-litex-rocket)
> 
> I've added your patch on top of the LiteX kernel tree at
> https://github.com/litex-hub/linux/tree/litex-rebase
> 
> and compiled it with:
> 
> make clean
> make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- litex_rocket_defconfig
> make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-
> 
> FWIW, your previous versions of the patch did work, and did fix the
> issue you were trying to address (which I did notice being a problem
> on my configuration :)
> 
> Thanks,
> --Gabriel
>  

Hi, Gabriel,

Could you do me a favor by testing this patch (and the new patch below)
on the VexiiRiscv. My own board does not have a "rst" pin. I guess that
gives some difference? The build command could be:
./litex-boards/litex_boards/targets/riguke_xcku5p.py \
  --build --update-repo=no --cpu-type vexiiriscv --cpu-variant debian \
  --cpu-count 4 \
  --with-coherent-dma --no-netlist-cache \
  --sys-clk-freq 150000000.0 --libc-mode full \
  --with-isa sstc \
  --with-sdcard --with-ethernet

--with-coherent-dma is a requirement for sdcard, and others you
can modify freely.

Anyway, there is a new slice that mitigates the side effect of
changing the ios->clock. Could you have a try? Hope this could
solve the problem.

Regards,
Inochi

diff --git a/drivers/mmc/host/litex_mmc.c b/drivers/mmc/host/litex_mmc.c
index d2f19c2dc673..95fc07d9a613 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
@@ -448,6 +451,10 @@ static void litex_mmc_setclk(struct litex_mmc_host *host, unsigned int freq)
 static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 {
 	struct litex_mmc_host *host = mmc_priv(mmc);
+	unsigned int ios_clock = ios->clock;
+
+	if (ios->chip_select == MMC_CS_HIGH)
+		ios_clock = SD_INIT_CLK_HZ;
 
 	/*
 	 * NOTE: Ignore any ios->bus_width updates; they occur right after
@@ -457,8 +464,13 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 	 */
 
 	/* Update sd_clk */
-	if (ios->clock != host->sd_clk)
+	if (ios_clock != host->sd_clk)
 		litex_mmc_setclk(host, ios->clock);
+
+	if (ios->chip_select == MMC_CS_HIGH) {
+		litex_write8(host->sdphy + LITEX_PHY_INITIALIZE, 1);
+		fsleep(SD_INIT_DELAY_US);
+	}
 }
 
 static const struct mmc_host_ops litex_mmc_ops = {

> > > On Sun, May 17, 2026 at 09:53:23AM +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.
> > > > 
> > > > Fixes: 92e099104729 ("mmc: Add driver for LiteX's LiteSDCard interface")
> > > > Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
> > > > ---
> > > > 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: 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(-)
> > > > ---
> > > >  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..65d5c728f536 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
> > > > @@ -449,6 +452,9 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> > > >  {
> > > >  	struct litex_mmc_host *host = mmc_priv(mmc);
> > > > 
> > > > +	if (ios->chip_select == MMC_CS_HIGH)
> > > > +		ios->clock = SD_INIT_CLK_HZ;
> > > > +
> > > >  	/*
> > > >  	 * NOTE: Ignore any ios->bus_width updates; they occur right after
> > > >  	 * the mmc core sends its own acmd6 bus-width change notification,
> > > > @@ -459,6 +465,11 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> > > >  	/* Update sd_clk */
> > > >  	if (ios->clock != host->sd_clk)
> > > >  		litex_mmc_setclk(host, ios->clock);
> > > > +
> > > > +	if (ios->chip_select == MMC_CS_HIGH) {
> > > > +		litex_write8(host->sdphy + LITEX_PHY_INITIALIZE, 1);
> > > > +		fsleep(SD_INIT_DELAY_US);
> > > > +	}
> > > >  }
> > > > 
> > > >  static const struct mmc_host_ops litex_mmc_ops = {
> > > > --
> > > > 2.54.0
> > > > 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0
  2026-05-18 22:45     ` Gabriel L. Somlo
  2026-05-19  1:11       ` Inochi Amaoto
@ 2026-05-19  2:51       ` Inochi Amaoto
  2026-05-19  7:52         ` Andy Shevchenko
  1 sibling, 1 reply; 8+ messages in thread
From: Inochi Amaoto @ 2026-05-19  2:51 UTC (permalink / raw)
  To: Gabriel L. Somlo, Inochi Amaoto
  Cc: Ulf Hansson, Karol Gugala, Mateusz Holenko, Joel Stanley,
	Kamil Rakoczy, Andy Shevchenko, linux-mmc, linux-kernel,
	Yixun Lan, Longbin Li

On Mon, May 18, 2026 at 06:45:26PM -0400, Gabriel L. Somlo wrote:
> On Tue, May 19, 2026 at 06:24:19AM +0800, Inochi Amaoto wrote:
> > On Mon, May 18, 2026 at 06:20:49PM -0400, Gabriel L. Somlo wrote:
> > > with this patch on top of today's latest (4d3a2a466b8d), I get
> > > (on 64-bit rocketchip with Litex):
> > > 
> > > [    6.475114] mmc0: invalid bus width
> > > [    6.477870] mmc0: error -22 whilst initialising SD card
> > > 
> > > Thanks,
> > > --Gabriel
> > > 
> > 
> > Hi, Gabriel,
> > 
> > Could you share the board link and build commands? I think I need to
> > take a look for why this occurs.
> > 
> > Regards,
> > Inochi
> 
> Hi Inochi,
> 
> it's the digilent nexys-video board; the command line to build the
> bitstream is:
> 
> litex-boards/litex_boards/targets/digilent_nexys_video.py --build \
>   --cpu-type rocket --cpu-variant linux --cpu-num-cores 4 --cpu-mem-width 2 \
>   --sys-clk-freq 50e6 --with-ethernet --with-sdcard --with-sata --sata-gen 1
> 
> (for more details see https://github.com/litex-hub/linux-on-litex-rocket)
> 
> I've added your patch on top of the LiteX kernel tree at
> https://github.com/litex-hub/linux/tree/litex-rebase
> 
> and compiled it with:
> 
> make clean
> make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- litex_rocket_defconfig
> make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-
> 
> FWIW, your previous versions of the patch did work, and did fix the
> issue you were trying to address (which I did notice being a problem
> on my configuration :)
> 
> Thanks,
> --Gabriel
>  

Hi Gabriel,

Although I fail to compile the rocket and can not reproduced this
error with VexiiRiscv, I have noticed some interesting things:

[  745.321341] mmc0: card aaaa removed
[  745.363624] litex-mmc f0004000.mmc: clock 25000000 -> 0
[  747.357770] litex-mmc f0004000.mmc: clock 0 -> 12500000
[  747.374898] litex-mmc f0004000.mmc: clock 12500000 -> 400000
[  747.706917] litex-mmc f0004000.mmc: clock 400000 -> 25000000
[  747.711954] mmc0: new SDHC card at address aaaa
[  747.722665] mmcblk0: mmc0:aaaa SL16G 14.8 GiB
[  747.751452]  mmcblk0: p1 p2

It seems like that the controller does not switch to the required init
frequency. Instead, it jump to a working frequency. It may lead to a
false reset.

Another thing is that I noticed the bios sets the PHY to x1 when
initing, but the current set_ios() does nothing with this, only
setting x4 every time that sends the command. I have added a simple
reset that changes the PHY to x1 when setting MMC_CS_HIGH.
(And I think it could be better to add bus width length handler
instead of leaving a force x4 mode).

I have prepared a new patch for these thing. Could you have a try?

Regards,
Inochi

diff --git a/drivers/mmc/host/litex_mmc.c b/drivers/mmc/host/litex_mmc.c
index d2f19c2dc673..97e07222872e 100644
--- a/drivers/mmc/host/litex_mmc.c
+++ b/drivers/mmc/host/litex_mmc.c
@@ -28,6 +28,7 @@
 #define LITEX_PHY_CLOCKERDIV  0x04
 #define LITEX_PHY_INITIALIZE  0x08
 #define LITEX_PHY_WRITESTATUS 0x0C
+#define LITEX_PHY_SETTINGS    0x18
 #define LITEX_CORE_CMDARG     0x00
 #define LITEX_CORE_CMDCMD     0x04
 #define LITEX_CORE_CMDSND     0x08
@@ -68,6 +69,12 @@
 #define SD_SLEEP_US       5
 #define SD_TIMEOUT_US 20000
 
+#define SD_INIT_DELAY_US  1000
+#define SD_INIT_CLK_HZ    400000
+
+#define SD_PHY_SPEED_1X 0
+#define SD_PHY_SPEED_4X 1
+
 #define SDIRQ_CARD_DETECT    1
 #define SDIRQ_SD_TO_MEM_DONE 2
 #define SDIRQ_MEM_TO_SD_DONE 4
@@ -220,6 +227,8 @@ static int litex_mmc_set_bus_width(struct litex_mmc_host *host)
 	if (ret)
 		return ret;
 
+	litex_write8(host->sdphy + LITEX_PHY_SETTINGS, SD_PHY_SPEED_4X);
+
 	/* Re-send 'app_cmd' if necessary */
 	if (app_cmd_sent) {
 		ret = litex_mmc_send_app_cmd(host);
@@ -449,6 +458,12 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 {
 	struct litex_mmc_host *host = mmc_priv(mmc);
 
+	if (ios->chip_select == MMC_CS_HIGH) {
+		litex_write8(host->sdphy + LITEX_PHY_SETTINGS, SD_PHY_SPEED_1X);
+		ios->clock = SD_INIT_CLK_HZ;
+		host->is_bus_width_set = false;
+	}
+
 	/*
 	 * NOTE: Ignore any ios->bus_width updates; they occur right after
 	 * the mmc core sends its own acmd6 bus-width change notification,
@@ -457,8 +472,14 @@ static void litex_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 	 */
 
 	/* Update sd_clk */
-	if (ios->clock != host->sd_clk)
+	if (ios->clock != host->sd_clk) {
 		litex_mmc_setclk(host, ios->clock);
+	}
+
+	if (ios->chip_select == MMC_CS_HIGH) {
+		litex_write8(host->sdphy + LITEX_PHY_INITIALIZE, 1);
+		fsleep(SD_INIT_DELAY_US);
+	}
 }
 
 static const struct mmc_host_ops litex_mmc_ops = {
@@ -590,7 +611,7 @@ static int litex_mmc_probe(struct platform_device *pdev)
 	 * Set default sd_clk frequency range based on empirical observations
 	 * of LiteSDCard gateware behavior on typical SDCard media
 	 */
-	mmc->f_min = 12.5e6;
+	mmc->f_min = SD_INIT_CLK_HZ;
 	mmc->f_max = 50e6;
 
 	ret = mmc_of_parse(mmc);
---

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0
  2026-05-19  2:51       ` Inochi Amaoto
@ 2026-05-19  7:52         ` Andy Shevchenko
  2026-05-19 23:48           ` Gabriel L. Somlo
  0 siblings, 1 reply; 8+ messages in thread
From: Andy Shevchenko @ 2026-05-19  7:52 UTC (permalink / raw)
  To: Inochi Amaoto
  Cc: Gabriel L. Somlo, Ulf Hansson, Karol Gugala, Mateusz Holenko,
	Joel Stanley, Kamil Rakoczy, linux-mmc, linux-kernel, Yixun Lan,
	Longbin Li

On Tue, May 19, 2026 at 5:51 AM Inochi Amaoto <inochiama@gmail.com> wrote:
> On Mon, May 18, 2026 at 06:45:26PM -0400, Gabriel L. Somlo wrote:

...

>         /* Update sd_clk */
> -       if (ios->clock != host->sd_clk)
> +       if (ios->clock != host->sd_clk) {
>                 litex_mmc_setclk(host, ios->clock);
> +       }

FWIW, it's a stray change.

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0
  2026-05-19  7:52         ` Andy Shevchenko
@ 2026-05-19 23:48           ` Gabriel L. Somlo
  0 siblings, 0 replies; 8+ messages in thread
From: Gabriel L. Somlo @ 2026-05-19 23:48 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Inochi Amaoto, Ulf Hansson, Karol Gugala, Mateusz Holenko,
	Joel Stanley, Kamil Rakoczy, linux-mmc, linux-kernel, Yixun Lan,
	Longbin Li

On Tue, May 19, 2026 at 10:52:10AM +0300, Andy Shevchenko wrote:
> On Tue, May 19, 2026 at 5:51 AM Inochi Amaoto <inochiama@gmail.com> wrote:
> > On Mon, May 18, 2026 at 06:45:26PM -0400, Gabriel L. Somlo wrote:
> 
> ...
> 
> >         /* Update sd_clk */
> > -       if (ios->clock != host->sd_clk)
> > +       if (ios->clock != host->sd_clk) {
> >                 litex_mmc_setclk(host, ios->clock);
> > +       }
> 
> FWIW, it's a stray change.

and I'm still getting:

[    6.508084] mmc0: invalid bus width
[    6.510652] mmc0: error -22 whilst initialising SD card

when booting with this change on 64-bit litex/rocket.

Thanks,
--Gabriel

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-05-19 23:48 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-17  1:53 [PATCH v4] mmc: litex_mmc: Set mandatory idle clocks before CMD0 Inochi Amaoto
2026-05-18 22:20 ` Gabriel L. Somlo
2026-05-18 22:24   ` Inochi Amaoto
2026-05-18 22:45     ` Gabriel L. Somlo
2026-05-19  1:11       ` Inochi Amaoto
2026-05-19  2:51       ` Inochi Amaoto
2026-05-19  7:52         ` Andy Shevchenko
2026-05-19 23:48           ` 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

all inboxes | Powered by JetHome®