diff options
| author | Andrew Gabbasov <andrew_gabbasov@mentor.com> | 2015-03-19 07:44:06 -0500 | 
|---|---|---|
| committer | Pantelis Antoniou <pantelis.antoniou@konsulko.com> | 2015-05-05 11:55:00 +0300 | 
| commit | 1677eef45976da1cdccc73cd4291877dbb05eea9 (patch) | |
| tree | ed05c85e37348591dd9204425e6ca74c087c8faf /drivers | |
| parent | cc17c01f2d3b691ddadbd46727d5f22db0a90808 (diff) | |
mmc: Restructure polling loops to avoid extra delays
The polling loops in sd_send_op_cond and mmc_complete_op_cond functions
check the ready flag state at the end of the loop, that is after executing
a delay inside the loop, which, in case of exiting with no error,
is not needed. Also, one of these loops, as well as the loop
in mmc_send_status, have the delay just before exiting on timeout
conditions.
Restructure all these loops to check the respective conditions before making
a delay for the next loop pass, and to appropriately exit without the delay.
Signed-off-by: Andrew Gabbasov <andrew_gabbasov@mentor.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/mmc/mmc.c | 27 | 
1 files changed, 17 insertions, 10 deletions
| diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 42af47c4c27..b81533c600f 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -118,7 +118,7 @@ int mmc_send_status(struct mmc *mmc, int timeout)  	if (!mmc_host_is_spi(mmc))  		cmd.cmdarg = mmc->rca << 16; -	do { +	while (1) {  		err = mmc_send_cmd(mmc, &cmd, NULL);  		if (!err) {  			if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) && @@ -135,9 +135,11 @@ int mmc_send_status(struct mmc *mmc, int timeout)  		} else if (--retries < 0)  			return err; -		udelay(1000); +		if (timeout-- <= 0) +			break; -	} while (timeout--); +		udelay(1000); +	}  #ifdef CONFIG_MMC_TRACE  	status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9; @@ -291,7 +293,7 @@ static int sd_send_op_cond(struct mmc *mmc)  	int err;  	struct mmc_cmd cmd; -	do { +	while (1) {  		cmd.cmdidx = MMC_CMD_APP_CMD;  		cmd.resp_type = MMC_RSP_R1;  		cmd.cmdarg = 0; @@ -322,11 +324,14 @@ static int sd_send_op_cond(struct mmc *mmc)  		if (err)  			return err; -		udelay(1000); -	} while ((!(cmd.response[0] & OCR_BUSY)) && timeout--); +		if (cmd.response[0] & OCR_BUSY) +			break; -	if (timeout <= 0) -		return UNUSABLE_ERR; +		if (timeout-- <= 0) +			return UNUSABLE_ERR; + +		udelay(1000); +	}  	if (mmc->version != SD_VERSION_2)  		mmc->version = SD_VERSION_1_0; @@ -405,14 +410,16 @@ static int mmc_complete_op_cond(struct mmc *mmc)  	mmc->op_cond_pending = 0;  	if (!(mmc->ocr & OCR_BUSY)) {  		start = get_timer(0); -		do { +		while (1) {  			err = mmc_send_op_cond_iter(mmc, 1);  			if (err)  				return err; +			if (mmc->ocr & OCR_BUSY) +				break;  			if (get_timer(start) > timeout)  				return UNUSABLE_ERR;  			udelay(100); -		} while (!(mmc->ocr & OCR_BUSY)); +		}  	}  	if (mmc_host_is_spi(mmc)) { /* read OCR for spi */ | 
