[U-Boot] [PATCH 6/6] mmc: Fix splitting device initialization

Pantelis Antoniou pantelis.antoniou at gmail.com
Tue May 5 11:10:48 CEST 2015


Hi Andrew,

> On Mar 19, 2015, at 14:44 , Andrew Gabbasov <andrew_gabbasov at mentor.com> wrote:
> 
> Starting part of device initialization sets the init_in_progress flag
> only if the MMC card did not yet come to ready state and needs to continue
> polling. If the card is SD or if the MMC card became ready quickly,
> the flag is not set and (if using pre-initialization) the starting
> phase will be re-executed from mmc_init function.
> 
> Set the init_in_progress flag in all non-error cases. Also, move flags
> setting statements around so that the flags are not set in error paths.
> Also, IN_PROGRESS return status becomes unnecessary, so get rid of it.
> 
> Signed-off-by: Andrew Gabbasov <andrew_gabbasov at mentor.com>
> ---
> drivers/mmc/mmc.c | 16 ++++++++--------
> include/mmc.h     |  3 +--
> 2 files changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index b81533c..31f8647 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -387,7 +387,6 @@ static int mmc_send_op_cond(struct mmc *mmc)
> 	mmc_go_idle(mmc);
> 
>  	/* Asking to the card its capabilities */
> -	mmc->op_cond_pending = 1;
> 	for (i = 0; i < 2; i++) {
> 		err = mmc_send_op_cond_iter(mmc, i != 0);
> 		if (err)
> @@ -395,9 +394,10 @@ static int mmc_send_op_cond(struct mmc *mmc)
> 
> 		/* exit if not busy (flag seems to be inverted) */
> 		if (mmc->ocr & OCR_BUSY)
> -			return 0;
> +			break;
> 	}
> -	return IN_PROGRESS;
> +	mmc->op_cond_pending = 1;
> +	return 0;
> }
> 
> static int mmc_complete_op_cond(struct mmc *mmc)
> @@ -1627,7 +1627,7 @@ int mmc_start_init(struct mmc *mmc)
> 	if (err == TIMEOUT) {
> 		err = mmc_send_op_cond(mmc);
> 
> -		if (err && err != IN_PROGRESS) {
> +		if (err) {
> #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
> 			printf("Card did not respond to voltage select!\n");
> #endif
> @@ -1635,7 +1635,7 @@ int mmc_start_init(struct mmc *mmc)
> 		}
> 	}
> 
> -	if (err == IN_PROGRESS)
> +	if (!err)
> 		mmc->init_in_progress = 1;
> 
> 	return err;
> @@ -1645,6 +1645,7 @@ static int mmc_complete_init(struct mmc *mmc)
> {
> 	int err = 0;
> 
> +	mmc->init_in_progress = 0;
> 	if (mmc->op_cond_pending)
> 		err = mmc_complete_op_cond(mmc);
> 
> @@ -1654,13 +1655,12 @@ static int mmc_complete_init(struct mmc *mmc)
> 		mmc->has_init = 0;
> 	else
> 		mmc->has_init = 1;
> -	mmc->init_in_progress = 0;
> 	return err;
> }
> 
> int mmc_init(struct mmc *mmc)
> {
> -	int err = IN_PROGRESS;
> +	int err = 0;
> 	unsigned start;
> 
> 	if (mmc->has_init)
> @@ -1671,7 +1671,7 @@ int mmc_init(struct mmc *mmc)
> 	if (!mmc->init_in_progress)
> 		err = mmc_start_init(mmc);
> 
> -	if (!err || err == IN_PROGRESS)
> +	if (!err)
> 		err = mmc_complete_init(mmc);
> 	debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
> 	return err;
> diff --git a/include/mmc.h b/include/mmc.h
> index 644e3fa..fbcbe35 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -70,8 +70,7 @@
> #define UNUSABLE_ERR		-17 /* Unusable Card */
> #define COMM_ERR		-18 /* Communications Error */
> #define TIMEOUT			-19
> -#define IN_PROGRESS		-20 /* operation is in progress */
> -#define SWITCH_ERR		-21 /* Card reports failure to switch mode */
> +#define SWITCH_ERR		-20 /* Card reports failure to switch mode */
> 
> #define MMC_CMD_GO_IDLE_STATE		0
> #define MMC_CMD_SEND_OP_COND		1
> -- 
> 2.1.0

Thanks, Applied.

— Pantelis



More information about the U-Boot mailing list