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@xxxxxxxxxxxxxx> --- Changes in v2: None drivers/mmc/core/mmc_ops.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index ee5f5ea..7e8be97 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -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; -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html