* [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