mmc: Fix splitting device initialization
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@mentor.com>
This commit is contained in:
parent
1677eef459
commit
bd47c13583
@ -387,7 +387,6 @@ static int mmc_send_op_cond(struct mmc *mmc)
|
|||||||
mmc_go_idle(mmc);
|
mmc_go_idle(mmc);
|
||||||
|
|
||||||
/* Asking to the card its capabilities */
|
/* Asking to the card its capabilities */
|
||||||
mmc->op_cond_pending = 1;
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
err = mmc_send_op_cond_iter(mmc, i != 0);
|
err = mmc_send_op_cond_iter(mmc, i != 0);
|
||||||
if (err)
|
if (err)
|
||||||
@ -395,9 +394,10 @@ static int mmc_send_op_cond(struct mmc *mmc)
|
|||||||
|
|
||||||
/* exit if not busy (flag seems to be inverted) */
|
/* exit if not busy (flag seems to be inverted) */
|
||||||
if (mmc->ocr & OCR_BUSY)
|
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)
|
static int mmc_complete_op_cond(struct mmc *mmc)
|
||||||
@ -1627,7 +1627,7 @@ int mmc_start_init(struct mmc *mmc)
|
|||||||
if (err == TIMEOUT) {
|
if (err == TIMEOUT) {
|
||||||
err = mmc_send_op_cond(mmc);
|
err = mmc_send_op_cond(mmc);
|
||||||
|
|
||||||
if (err && err != IN_PROGRESS) {
|
if (err) {
|
||||||
#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
|
#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
|
||||||
printf("Card did not respond to voltage select!\n");
|
printf("Card did not respond to voltage select!\n");
|
||||||
#endif
|
#endif
|
||||||
@ -1635,7 +1635,7 @@ int mmc_start_init(struct mmc *mmc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err == IN_PROGRESS)
|
if (!err)
|
||||||
mmc->init_in_progress = 1;
|
mmc->init_in_progress = 1;
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
@ -1645,6 +1645,7 @@ static int mmc_complete_init(struct mmc *mmc)
|
|||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
mmc->init_in_progress = 0;
|
||||||
if (mmc->op_cond_pending)
|
if (mmc->op_cond_pending)
|
||||||
err = mmc_complete_op_cond(mmc);
|
err = mmc_complete_op_cond(mmc);
|
||||||
|
|
||||||
@ -1654,13 +1655,12 @@ static int mmc_complete_init(struct mmc *mmc)
|
|||||||
mmc->has_init = 0;
|
mmc->has_init = 0;
|
||||||
else
|
else
|
||||||
mmc->has_init = 1;
|
mmc->has_init = 1;
|
||||||
mmc->init_in_progress = 0;
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mmc_init(struct mmc *mmc)
|
int mmc_init(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
int err = IN_PROGRESS;
|
int err = 0;
|
||||||
unsigned start;
|
unsigned start;
|
||||||
|
|
||||||
if (mmc->has_init)
|
if (mmc->has_init)
|
||||||
@ -1671,7 +1671,7 @@ int mmc_init(struct mmc *mmc)
|
|||||||
if (!mmc->init_in_progress)
|
if (!mmc->init_in_progress)
|
||||||
err = mmc_start_init(mmc);
|
err = mmc_start_init(mmc);
|
||||||
|
|
||||||
if (!err || err == IN_PROGRESS)
|
if (!err)
|
||||||
err = mmc_complete_init(mmc);
|
err = mmc_complete_init(mmc);
|
||||||
debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
|
debug("%s: %d, time %lu\n", __func__, err, get_timer(start));
|
||||||
return err;
|
return err;
|
||||||
|
@ -70,8 +70,7 @@
|
|||||||
#define UNUSABLE_ERR -17 /* Unusable Card */
|
#define UNUSABLE_ERR -17 /* Unusable Card */
|
||||||
#define COMM_ERR -18 /* Communications Error */
|
#define COMM_ERR -18 /* Communications Error */
|
||||||
#define TIMEOUT -19
|
#define TIMEOUT -19
|
||||||
#define IN_PROGRESS -20 /* operation is in progress */
|
#define SWITCH_ERR -20 /* Card reports failure to switch mode */
|
||||||
#define SWITCH_ERR -21 /* Card reports failure to switch mode */
|
|
||||||
|
|
||||||
#define MMC_CMD_GO_IDLE_STATE 0
|
#define MMC_CMD_GO_IDLE_STATE 0
|
||||||
#define MMC_CMD_SEND_OP_COND 1
|
#define MMC_CMD_SEND_OP_COND 1
|
||||||
|
Loading…
Reference in New Issue
Block a user