diff mbox

[U-Boot,v3] fsl_esdhc: Correcting esdhc timeout counter calculation

Message ID 1299124136-26859-1-git-send-email-Priyanka.Jain@freescale.com
State Accepted, archived
Headers show

Commit Message

Priyanka Jain March 3, 2011, 3:48 a.m. UTC
- Timeout counter value is set as DTOCV bits in SYSCTL register
  For counter value set as timeout,
  Timeout period = (2^(timeout + 13)) SD Clock cycles

- As per 4.6.2.2 section of SD Card specification v2.00, host should
  cofigure timeout period value to minimum 0.25 sec.

- 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

- Calculating timeout based on
	(2^(timeout + 13)) >=  mmc->tran_speed * 1/4
	Taking log2 both the sides and rounding up to next power of 2
	=> timeout + 13 = log2(mmc->tran_speed/4) + 1

Signed-off-by: Priyanka Jain <Priyanka.Jain@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Acked-by: Mingkai Hu <Mingkai.Hu@freescale.com>
---
 Changes for v3:
	 Including code changes of v1 as suggested by Stefano Babic

 Changes for v2:
	Added proper description as suggested by Wolfgang Denk
 
 drivers/mmc/fsl_esdhc.c |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)

Comments

Kumar Gala March 4, 2011, 12:26 p.m. UTC | #1
On Mar 2, 2011, at 9:48 PM, Priyanka Jain wrote:

> - Timeout counter value is set as DTOCV bits in SYSCTL register
>  For counter value set as timeout,
>  Timeout period = (2^(timeout + 13)) SD Clock cycles
> 
> - As per 4.6.2.2 section of SD Card specification v2.00, host should
>  cofigure timeout period value to minimum 0.25 sec.
> 
> - 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
> 
> - Calculating timeout based on
> 	(2^(timeout + 13)) >=  mmc->tran_speed * 1/4
> 	Taking log2 both the sides and rounding up to next power of 2
> 	=> timeout + 13 = log2(mmc->tran_speed/4) + 1
> 
> Signed-off-by: Priyanka Jain <Priyanka.Jain@freescale.com>
> Signed-off-by: Andy Fleming <afleming@freescale.com>
> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
> Acked-by: Mingkai Hu <Mingkai.Hu@freescale.com>
> ---
> Changes for v3:
> 	 Including code changes of v1 as suggested by Stefano Babic
> 
> Changes for v2:
> 	Added proper description as suggested by Wolfgang Denk
> 
> drivers/mmc/fsl_esdhc.c |   16 +++++++++++++++-
> 1 files changed, 15 insertions(+), 1 deletions(-)

Stefano,

Got a chance to test on imx?  Would like this fix in v2011.03

- k
Stefano Babic March 7, 2011, 9:41 a.m. UTC | #2
On 03/03/2011 04:48 AM, Priyanka Jain wrote:
> - Timeout counter value is set as DTOCV bits in SYSCTL register
>   For counter value set as timeout,
>   Timeout period = (2^(timeout + 13)) SD Clock cycles
> 
> - As per 4.6.2.2 section of SD Card specification v2.00, host should
>   cofigure timeout period value to minimum 0.25 sec.
> 
> - 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
> 
> - Calculating timeout based on
> 	(2^(timeout + 13)) >=  mmc->tran_speed * 1/4
> 	Taking log2 both the sides and rounding up to next power of 2
> 	=> timeout + 13 = log2(mmc->tran_speed/4) + 1
> 
> Signed-off-by: Priyanka Jain <Priyanka.Jain@freescale.com>
> Signed-off-by: Andy Fleming <afleming@freescale.com>
> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
> Acked-by: Mingkai Hu <Mingkai.Hu@freescale.com>
> ---

Tested on a i.MX51 board.

Tested-by: Stefano Babic <sbabic@denx.de>

Best regards,
Stefano Babic
Kumar Gala March 7, 2011, 3:04 p.m. UTC | #3
On Mar 7, 2011, at 3:41 AM, Stefano Babic wrote:

> On 03/03/2011 04:48 AM, Priyanka Jain wrote:
>> - Timeout counter value is set as DTOCV bits in SYSCTL register
>>  For counter value set as timeout,
>>  Timeout period = (2^(timeout + 13)) SD Clock cycles
>> 
>> - As per 4.6.2.2 section of SD Card specification v2.00, host should
>>  cofigure timeout period value to minimum 0.25 sec.
>> 
>> - 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
>> 
>> - Calculating timeout based on
>> 	(2^(timeout + 13)) >=  mmc->tran_speed * 1/4
>> 	Taking log2 both the sides and rounding up to next power of 2
>> 	=> timeout + 13 = log2(mmc->tran_speed/4) + 1
>> 
>> Signed-off-by: Priyanka Jain <Priyanka.Jain@freescale.com>
>> Signed-off-by: Andy Fleming <afleming@freescale.com>
>> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
>> Acked-by: Mingkai Hu <Mingkai.Hu@freescale.com>
>> ---
> 
> Tested on a i.MX51 board.
> 
> Tested-by: Stefano Babic <sbabic@denx.de>
> 
> Best regards,
> Stefano Babic

thanks

applied.

- k
diff mbox

Patch

diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
index a368fe6..359d939 100644
--- a/drivers/mmc/fsl_esdhc.c
+++ b/drivers/mmc/fsl_esdhc.c
@@ -207,7 +207,21 @@  static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
 	esdhc_write32(&regs->blkattr, data->blocks << 16 | data->blocksize);
 
 	/* Calculate the timeout period for data transactions */
-	timeout = fls(mmc->tran_speed/10) - 1;
+	/*
+	 * 1)Timeout period = (2^(timeout+13)) SD Clock cycles
+	 * 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
+	 * As 1) >=  2)
+	 * => (2^(timeout+13)) >= mmc->tran_speed * 1/4
+	 * Taking log2 both the sides
+	 * => timeout + 13 >= log2(mmc->tran_speed/4)
+	 * Rounding up to next power of 2
+	 * => timeout + 13 = log2(mmc->tran_speed/4) + 1
+	 * => timeout + 13 = fls(mmc->tran_speed/4)
+	 */
+	timeout = fls(mmc->tran_speed/4);
 	timeout -= 13;
 
 	if (timeout > 14)