[U-Boot] [PATCH] mmc: fsl_esdhc: fix calculation of timeout for data transactions

Pantelis Antoniou pantelis.antoniou at gmail.com
Wed Apr 2 12:15:44 CEST 2014


Hi Andrew,

On Mar 24, 2014, at 9:40 AM, Andrew Gabbasov wrote:

> Calculation of the timeout value should be based on actual clock value,
> written to controller registers. Since mmc->tran_speed is either the
> maximum allowed speed, or the preliminary value, that is be not yet
> set to registers, the actual timeout, taken by the controller, based
> on its clock settings, may be much longer than expected, based on
> mmc->tran_speed value. In particular it happens at early initialization
> stage, when typical value of mmc->tran_speed is 20MHz or 26MHz, while
> actual clock setting, configured in the controller, is 400kHz.
> It's more correct to use mmc->clock value for timeout calculation instead.
> 
> Signed-off-by: Andrew Gabbasov <andrew_gabbasov at mentor.com>
> ---
> drivers/mmc/fsl_esdhc.c |   12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
> index 7b146a3..f4d3132 100644
> --- a/drivers/mmc/fsl_esdhc.c
> +++ b/drivers/mmc/fsl_esdhc.c
> @@ -221,16 +221,16 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
> 	 * 2)Timeout period should be minimum 0.250sec as per SD Card spec
> 	 *  So, Number of SD Clock cycles for 0.25sec should be minimum
> 	 *		(SD Clock/sec * 0.25 sec) SD Clock cycles
> -	 *		= (mmc->tran_speed * 1/4) SD Clock cycles
> +	 *		= (mmc->clock * 1/4) SD Clock cycles
> 	 * As 1) >=  2)
> -	 * => (2^(timeout+13)) >= mmc->tran_speed * 1/4
> +	 * => (2^(timeout+13)) >= mmc->clock * 1/4
> 	 * Taking log2 both the sides
> -	 * => timeout + 13 >= log2(mmc->tran_speed/4)
> +	 * => timeout + 13 >= log2(mmc->clock/4)
> 	 * Rounding up to next power of 2
> -	 * => timeout + 13 = log2(mmc->tran_speed/4) + 1
> -	 * => timeout + 13 = fls(mmc->tran_speed/4)
> +	 * => timeout + 13 = log2(mmc->clock/4) + 1
> +	 * => timeout + 13 = fls(mmc->clock/4)
> 	 */
> -	timeout = fls(mmc->tran_speed/4);
> +	timeout = fls(mmc->clock/4);
> 	timeout -= 13;
> 
> 	if (timeout > 14)
> -- 
> 1.7.10.4

Thanks

Acked-by: Pantelis Antoniou <panto at antoniou-consulting.com>


More information about the U-Boot mailing list