[U-Boot] [PATCH] mmc: retry the cmd8 to meet 74 clocks requirement in the spec

Marek Vasut marek.vasut at gmail.com
Mon Sep 5 00:18:27 CEST 2011


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 <leiwen at 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.vasut at gmail.com>

Cheers!


More information about the U-Boot mailing list