mirror of
https://github.com/u-boot/u-boot.git
synced 2024-12-02 00:53:29 +08:00
mmc: retry CMD1 in mmc_send_op_cond() until the eMMC is ready
According to eMMC specification v5.1 section 6.4.3, we should issue CMD1 repeatedly in the idle state until the eMMC is ready even if mmc_send_op_cond() send CMD1 with argument = 0. Otherwise some eMMC devices seems to enter the inactive mode after mmc_complete_op_cond() issued CMD0 when the eMMC device is busy. Signed-off-by: Haibo Chen <haibo.chen@nxp.com> Reviewed-by: Peng Fan <peng.fan@nxp.com>
This commit is contained in:
parent
ba61676ff9
commit
fe95905ffe
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user