fsl_esdhc: Correcting esdhc timeout counter calculation
- 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> Acked-by: Mingkai Hu <Mingkai.Hu@freescale.com> Tested-by: Stefano Babic <sbabic@denx.de> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
		
							parent
							
								
									509e19cab4
								
							
						
					
					
						commit
						b71ea33699
					
				|  | @ -210,7 +210,21 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) | ||||||
| 	esdhc_write32(®s->blkattr, data->blocks << 16 | data->blocksize); | 	esdhc_write32(®s->blkattr, data->blocks << 16 | data->blocksize); | ||||||
| 
 | 
 | ||||||
| 	/* Calculate the timeout period for data transactions */ | 	/* 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; | 	timeout -= 13; | ||||||
| 
 | 
 | ||||||
| 	if (timeout > 14) | 	if (timeout > 14) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue