diff options
Diffstat (limited to 'drivers/mmc/mmc.c')
| -rw-r--r-- | drivers/mmc/mmc.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 620bb930640..50f47d4ba26 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -669,12 +669,15 @@ static int mmc_send_op_cond_iter(struct mmc *mmc, int use_arg)  static int mmc_send_op_cond(struct mmc *mmc)  {  	int err, i; +	int timeout = 1000; +	uint start;  	/* Some cards seem to need this */  	mmc_go_idle(mmc); +	start = get_timer(0);   	/* Asking to the card its capabilities */ -	for (i = 0; i < 2; i++) { +	for (i = 0; ; i++) {  		err = mmc_send_op_cond_iter(mmc, i != 0);  		if (err)  			return err; @@ -682,6 +685,10 @@ static int mmc_send_op_cond(struct mmc *mmc)  		/* exit if not busy (flag seems to be inverted) */  		if (mmc->ocr & OCR_BUSY)  			break; + +		if (get_timer(start) > timeout) +			return -ETIMEDOUT; +		udelay(100);  	}  	mmc->op_cond_pending = 1;  	return 0; @@ -2824,7 +2831,7 @@ retry:  	if (err)  		return err; -	/* The internal partition reset to user partition(0) at every CMD0*/ +	/* The internal partition reset to user partition(0) at every CMD0 */  	mmc_get_blk_desc(mmc)->hwpart = 0;  	/* Test for SD version 2 */ | 
