mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 15:41:40 +00:00
mmc: add mmc_poll_for_busy() and change the purpose of mmc_send_status()
mmc_send_status() is currently used to poll the card until it is ready, not actually returning the status of the card. Make it return the status and add another function to poll the card. Also remove the 'extern' declaration in the mmc-private.h header to comply with the coding standard. Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
This commit is contained in:
parent
c2c22b9df3
commit
863d10044a
3 changed files with 38 additions and 22 deletions
|
@ -206,7 +206,7 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
|
|||
}
|
||||
#endif
|
||||
|
||||
int mmc_send_status(struct mmc *mmc, int timeout)
|
||||
int mmc_send_status(struct mmc *mmc, unsigned int *status)
|
||||
{
|
||||
struct mmc_cmd cmd;
|
||||
int err, retries = 5;
|
||||
|
@ -216,31 +216,46 @@ int mmc_send_status(struct mmc *mmc, int timeout)
|
|||
if (!mmc_host_is_spi(mmc))
|
||||
cmd.cmdarg = mmc->rca << 16;
|
||||
|
||||
while (1) {
|
||||
while (retries--) {
|
||||
err = mmc_send_cmd(mmc, &cmd, NULL);
|
||||
if (!err) {
|
||||
if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
|
||||
(cmd.response[0] & MMC_STATUS_CURR_STATE) !=
|
||||
MMC_STATE_PRG)
|
||||
break;
|
||||
mmc_trace_state(mmc, &cmd);
|
||||
*status = cmd.response[0];
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
mmc_trace_state(mmc, &cmd);
|
||||
return -ECOMM;
|
||||
}
|
||||
|
||||
if (cmd.response[0] & MMC_STATUS_MASK) {
|
||||
#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
|
||||
pr_err("Status Error: 0x%08x\n",
|
||||
cmd.response[0]);
|
||||
#endif
|
||||
return -ECOMM;
|
||||
}
|
||||
} else if (--retries < 0)
|
||||
int mmc_poll_for_busy(struct mmc *mmc, int timeout)
|
||||
{
|
||||
unsigned int status;
|
||||
int err;
|
||||
|
||||
while (1) {
|
||||
err = mmc_send_status(mmc, &status);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if ((status & MMC_STATUS_RDY_FOR_DATA) &&
|
||||
(status & MMC_STATUS_CURR_STATE) !=
|
||||
MMC_STATE_PRG)
|
||||
break;
|
||||
|
||||
if (status & MMC_STATUS_MASK) {
|
||||
#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
|
||||
pr_err("Status Error: 0x%08x\n", status);
|
||||
#endif
|
||||
return -ECOMM;
|
||||
}
|
||||
|
||||
if (timeout-- <= 0)
|
||||
break;
|
||||
|
||||
udelay(1000);
|
||||
}
|
||||
|
||||
mmc_trace_state(mmc, &cmd);
|
||||
if (timeout <= 0) {
|
||||
#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
|
||||
pr_err("Timeout waiting card ready\n");
|
||||
|
@ -752,7 +767,7 @@ static int __mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value,
|
|||
}
|
||||
|
||||
/* Waiting for the ready status */
|
||||
return mmc_send_status(mmc, timeout);
|
||||
return mmc_poll_for_busy(mmc, timeout);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -11,10 +11,11 @@
|
|||
|
||||
#include <mmc.h>
|
||||
|
||||
extern int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||
struct mmc_data *data);
|
||||
extern int mmc_send_status(struct mmc *mmc, int timeout);
|
||||
extern int mmc_set_blocklen(struct mmc *mmc, int len);
|
||||
int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data);
|
||||
int mmc_send_status(struct mmc *mmc, unsigned int *status);
|
||||
int mmc_poll_for_busy(struct mmc *mmc, int timeout);
|
||||
|
||||
int mmc_set_blocklen(struct mmc *mmc, int len);
|
||||
#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
|
||||
void mmc_adapter_card_type_ident(void);
|
||||
#endif
|
||||
|
|
|
@ -119,7 +119,7 @@ ulong mmc_berase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt)
|
|||
blk += blk_r;
|
||||
|
||||
/* Waiting for the ready status */
|
||||
if (mmc_send_status(mmc, timeout))
|
||||
if (mmc_poll_for_busy(mmc, timeout))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -177,7 +177,7 @@ static ulong mmc_write_blocks(struct mmc *mmc, lbaint_t start,
|
|||
}
|
||||
|
||||
/* Waiting for the ready status */
|
||||
if (mmc_send_status(mmc, timeout))
|
||||
if (mmc_poll_for_busy(mmc, timeout))
|
||||
return 0;
|
||||
|
||||
return blkcnt;
|
||||
|
|
Loading…
Reference in a new issue