[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