public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] Fixing timing issue with eMMC on atmel MCI
@ 2015-11-05 14:53 Gregory CLEMENT
  2015-11-05 14:53 ` [U-Boot] [PATCH] mmc: atmel: Properly fix clock configuration Gregory CLEMENT
  0 siblings, 1 reply; 4+ messages in thread
From: Gregory CLEMENT @ 2015-11-05 14:53 UTC (permalink / raw)
  To: u-boot

Hi,

I got similar issues that Marek had:
http://lists.denx.de/pipermail/u-boot/2015-October/231420.html.

When trying to initialize an eMMC on a SAMA5D4 based board the CPU
stuck. However, the fix sent by Marek was not enough for me and after
digging in the sources and trying many combinations I found that the
culprit was the switch command (CMD 6). A small delay was needed after
this command before the next one. The MMC spec seems to confirm that
by speaking about waiting 8 clocks after this command.

In the following patch I removed the delay introduced by Marek, and
instead I added a 8 clocks wait just after the switch command.

Marek, could you test it on your board and confirm that it is still
work for you?

Thanks,

Gregory CLEMENT (1):
  mmc: atmel: Properly fix clock configuration

 drivers/mmc/gen_atmel_mci.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

-- 
2.5.0

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

* [U-Boot] [PATCH] mmc: atmel: Properly fix clock configuration
  2015-11-05 14:53 [U-Boot] [PATCH] Fixing timing issue with eMMC on atmel MCI Gregory CLEMENT
@ 2015-11-05 14:53 ` Gregory CLEMENT
  2015-11-05 16:38   ` Marek Vasut
  0 siblings, 1 reply; 4+ messages in thread
From: Gregory CLEMENT @ 2015-11-05 14:53 UTC (permalink / raw)
  To: u-boot

Timing issue occurs on eMMC not only when modifying the frequency but
also for all the switch command(CMD6). According to the MMC spec waiting
8 clocks after a switch command would be the thing to do.

This patch allows fixing CPU hang observed when trying to changing the
bus width on a eMMC on SAMA5D4.

Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
---
 drivers/mmc/gen_atmel_mci.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/gen_atmel_mci.c b/drivers/mmc/gen_atmel_mci.c
index da870c6..3f7cfba 100644
--- a/drivers/mmc/gen_atmel_mci.c
+++ b/drivers/mmc/gen_atmel_mci.c
@@ -36,6 +36,7 @@ struct atmel_mci_priv {
 	struct mmc_config	cfg;
 	struct atmel_mci	*mci;
 	unsigned int		initialized:1;
+	unsigned int		curr_clk;
 };
 
 /* Read Atmel MCI IP version */
@@ -91,7 +92,10 @@ static void mci_set_mode(struct mmc *mmc, u32 hz, u32 blklen)
 
 		}
 	}
-
+	if (version >= 0x500)
+		priv->curr_clk = bus_hz / (clkdiv * 2 + clkodd + 2);
+	else
+		priv->curr_clk = (bus_hz / (clkdiv + 1)) / 2;
 	blklen &= 0xfffc;
 
 	mr = MMCI_BF(CLKDIV, clkdiv);
@@ -118,8 +122,6 @@ static void mci_set_mode(struct mmc *mmc, u32 hz, u32 blklen)
 	if (mmc->card_caps & mmc->cfg->host_caps & MMC_MODE_HS)
 		writel(MMCI_BIT(HSMODE), &mci->cfg);
 
-	udelay(50);
-
 	priv->initialized = 1;
 }
 
@@ -284,8 +286,10 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 			{
 				u32 cnt = word_count * 4;
 				printf("Read Data:\n");
+				/*
 				print_buffer(0, data->dest + cnt * block_count,
 					     1, cnt, 0);
+				*/
 			}
 #endif
 #ifdef DEBUG
@@ -323,6 +327,12 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 		}
 	}
 
+	/* After the switch command, wait for 8 clocks before the next
+	 * command
+	 */
+	if (cmd->cmdidx == MMC_CMD_SWITCH)
+		udelay(8*1000000/ priv->curr_clk); /* 8 clk in us*/
+
 	return 0;
 }
 
-- 
2.5.0

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

* [U-Boot] [PATCH] mmc: atmel: Properly fix clock configuration
  2015-11-05 14:53 ` [U-Boot] [PATCH] mmc: atmel: Properly fix clock configuration Gregory CLEMENT
@ 2015-11-05 16:38   ` Marek Vasut
  2015-11-05 19:56     ` Gregory CLEMENT
  0 siblings, 1 reply; 4+ messages in thread
From: Marek Vasut @ 2015-11-05 16:38 UTC (permalink / raw)
  To: u-boot

On Thursday, November 05, 2015 at 03:53:16 PM, Gregory CLEMENT wrote:
> Timing issue occurs on eMMC not only when modifying the frequency but
> also for all the switch command(CMD6). According to the MMC spec waiting
> 8 clocks after a switch command would be the thing to do.
> 
> This patch allows fixing CPU hang observed when trying to changing the
> bus width on a eMMC on SAMA5D4.
> 
> Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>

On DENX MA5D4EVK:

Tested-by: Marek Vasut <marex@denx.de>

[...]

> @@ -284,8 +286,10 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
> struct mmc_data *data) {
>  				u32 cnt = word_count * 4;
>  				printf("Read Data:\n");
> +				/*
>  				print_buffer(0, data->dest + cnt * block_count,
>  					     1, cnt, 0);
> +				*/

This bit shouldn't be in the patch I guess ;-)

>  			}
>  #endif
>  #ifdef DEBUG
> @@ -323,6 +327,12 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
> struct mmc_data *data) }
>  	}
> 
> +	/* After the switch command, wait for 8 clocks before the next
> +	 * command
> +	 */

The comment style should match the kernel one -- multilines go like this:
/*
 * foo
 * bar
 */

> +	if (cmd->cmdidx == MMC_CMD_SWITCH)
> +		udelay(8*1000000/ priv->curr_clk); /* 8 clk in us*/
> +
>  	return 0;
>  }

Best regards,
Marek Vasut

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

* [U-Boot] [PATCH] mmc: atmel: Properly fix clock configuration
  2015-11-05 16:38   ` Marek Vasut
@ 2015-11-05 19:56     ` Gregory CLEMENT
  0 siblings, 0 replies; 4+ messages in thread
From: Gregory CLEMENT @ 2015-11-05 19:56 UTC (permalink / raw)
  To: u-boot

Hi Marek,
 
 On jeu., nov. 05 2015, Marek Vasut <marex@denx.de> wrote:

> On Thursday, November 05, 2015 at 03:53:16 PM, Gregory CLEMENT wrote:
>> Timing issue occurs on eMMC not only when modifying the frequency but
>> also for all the switch command(CMD6). According to the MMC spec waiting
>> 8 clocks after a switch command would be the thing to do.
>> 
>> This patch allows fixing CPU hang observed when trying to changing the
>> bus width on a eMMC on SAMA5D4.
>> 
>> Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
>
> On DENX MA5D4EVK:
>
> Tested-by: Marek Vasut <marex@denx.de>

Thanks for having tested it so quick!

>
> [...]
>
>> @@ -284,8 +286,10 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
>> struct mmc_data *data) {
>>  				u32 cnt = word_count * 4;
>>  				printf("Read Data:\n");
>> +				/*
>>  				print_buffer(0, data->dest + cnt * block_count,
>>  					     1, cnt, 0);
>> +				*/
>
> This bit shouldn't be in the patch I guess ;-)

You're right!

>
>>  			}
>>  #endif
>>  #ifdef DEBUG
>> @@ -323,6 +327,12 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
>> struct mmc_data *data) }
>>  	}
>> 
>> +	/* After the switch command, wait for 8 clocks before the next
>> +	 * command
>> +	 */
>
> The comment style should match the kernel one -- multilines go like this:
> /*
>  * foo
>  * bar
>  */

Sure, I will send a v2 with tour comment taken into account anw with
your tested-by.

Thanks,

Gregory

>
>> +	if (cmd->cmdidx == MMC_CMD_SWITCH)
>> +		udelay(8*1000000/ priv->curr_clk); /* 8 clk in us*/
>> +
>>  	return 0;
>>  }
>
> Best regards,
> Marek Vasut

-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

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

end of thread, other threads:[~2015-11-05 19:56 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-05 14:53 [U-Boot] [PATCH] Fixing timing issue with eMMC on atmel MCI Gregory CLEMENT
2015-11-05 14:53 ` [U-Boot] [PATCH] mmc: atmel: Properly fix clock configuration Gregory CLEMENT
2015-11-05 16:38   ` Marek Vasut
2015-11-05 19:56     ` Gregory CLEMENT

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox