On Saturday, September 03, 2011 05:34:17 AM Lei Wen wrote: > For some controller it has dynamic clock gating, and only toggle out clk > when the first cmd0 send out, while some card strictly obey the 74 > clocks rule, the interval may not be sufficient between the cmd0 and > this cmd8, retry to fulfil the clock requirement. > > Signed-off-by: Lei Wen <lei...@marvell.com> > --- > drivers/mmc/mmc.c | 16 ++++++++++++++-- > 1 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > index 7e703c0..f9b2223 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -1178,7 +1178,7 @@ block_dev_desc_t *mmc_get_dev(int dev) > > int mmc_init(struct mmc *mmc) > { > - int err; > + int err, retry = 3; > > if (mmc->has_init) > return 0; > @@ -1201,7 +1201,19 @@ int mmc_init(struct mmc *mmc) > mmc->part_num = 0; > > /* Test for SD version 2 */ > - err = mmc_send_if_cond(mmc); > + /* > + * retry here for 3 times, as for some controller it has dynamic > + * clock gating, and only toggle out clk when the first cmd0 send > + * out, while some card strictly obey the 74 clocks rule, the interval > + * may not be sufficient between the cmd0 and this cmd8, retry to > + * fulfil the clock requirement > + */ > + do { > + err = mmc_send_if_cond(mmc); > + } while (--retry > 0 && err);
Hi, maybe this condition might be a bit more readable ... while (--retry) { err = mmc_send_if_conf(mmc); if (!err) break; } > + > + if (err) > + return err; > > /* Now try to get the SD card's operating condition */ > err = sd_send_op_cond(mmc); Otherwise, works on my hardware. Tested-by: Marek Vasut <marek.va...@gmail.com> Cheers! _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot