@@ -447,7 +447,8 @@ int mmc_switch_status(struct mmc_card *card)
}
static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
- bool send_status, bool retry_crc_err, bool use_r1b_resp)
+ bool send_status, bool retry_crc_err, bool use_r1b_resp,
+ u32 *resp_status, bool check_busy(u32 device_status))
{
struct mmc_host *host = card->host;
int err;
@@ -461,6 +462,9 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
mmc_host_is_spi(host))
return 0;
+ if (WARN_ON(!check_busy))
+ return 0;
+
/* We have an unspecified cmd timeout, use the fallback value. */
if (!timeout_ms)
timeout_ms = MMC_OPS_TIMEOUT_MS;
@@ -487,6 +491,9 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
busy = host->ops->card_busy(host);
} else {
err = mmc_send_status(card, &status);
+ /* Accumulate any response error bits seen */
+ if (resp_status)
+ *resp_status |= status;
if (retry_crc_err && err == -EILSEQ) {
busy = true;
} else if (err) {
@@ -495,7 +502,7 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
err = mmc_switch_status_error(host, status);
if (err)
return err;
- busy = R1_CURRENT_STATE(status) == R1_STATE_PRG;
+ busy = check_busy(status);
}
}
@@ -510,6 +517,11 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
return 0;
}
+static inline bool mmc_switch_in_prg_state(u32 status)
+{
+ return R1_CURRENT_STATE(status) == R1_STATE_PRG;
+}
+
/**
* __mmc_switch - modify EXT_CSD register
* @card: the MMC card associated with the data transfer
@@ -577,7 +589,7 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
/* Let's try to poll to find out when the command is completed. */
err = mmc_poll_for_busy(card, timeout_ms, send_status, retry_crc_err,
- use_r1b_resp);
+ use_r1b_resp, NULL, &mmc_switch_in_prg_state);
if (err)
goto out;
In preparation for reusing mmc_poll_for_busy() to avoid duplication of code for polling busy. No functional change intended. Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> --- Changes in v2: None drivers/mmc/core/mmc_ops.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)