mmc: core: Split up mmc_poll_for_busy()
To make the code more readable, move the part that gets the busy status of the card out into a separate function, mmc_busy_status(). Then call it from mmc_poll_for_busy(). Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Tested-by: Baolin Wang <baolin.wang7@gmail.com> Tested-by: Ludovic Barre <ludovic.barre@st.com> Reviewed-by: Ludovic Barre <ludovic.barre@st.com> Link: https://lore.kernel.org/r/20200204085449.32585-6-ulf.hansson@linaro.org
This commit is contained in:
parent
02098ccdd8
commit
6972096a03
|
@ -444,6 +444,34 @@ int mmc_switch_status(struct mmc_card *card, bool crc_err_fatal)
|
|||
return mmc_switch_status_error(card->host, status);
|
||||
}
|
||||
|
||||
static int mmc_busy_status(struct mmc_card *card, bool retry_crc_err,
|
||||
bool *busy)
|
||||
{
|
||||
struct mmc_host *host = card->host;
|
||||
u32 status = 0;
|
||||
int err;
|
||||
|
||||
if (host->ops->card_busy) {
|
||||
*busy = host->ops->card_busy(host);
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = mmc_send_status(card, &status);
|
||||
if (retry_crc_err && err == -EILSEQ) {
|
||||
*busy = true;
|
||||
return 0;
|
||||
}
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mmc_switch_status_error(card->host, status);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*busy = R1_CURRENT_STATE(status) == R1_STATE_PRG;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
||||
bool send_status, bool retry_crc_err)
|
||||
{
|
||||
|
@ -451,7 +479,6 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
|||
int err;
|
||||
unsigned long timeout;
|
||||
unsigned int udelay = 32, udelay_max = 32768;
|
||||
u32 status = 0;
|
||||
bool expired = false;
|
||||
bool busy = false;
|
||||
|
||||
|
@ -473,21 +500,9 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
|||
*/
|
||||
expired = time_after(jiffies, timeout);
|
||||
|
||||
if (host->ops->card_busy) {
|
||||
busy = host->ops->card_busy(host);
|
||||
} else {
|
||||
err = mmc_send_status(card, &status);
|
||||
if (retry_crc_err && err == -EILSEQ) {
|
||||
busy = true;
|
||||
} else if (err) {
|
||||
return err;
|
||||
} else {
|
||||
err = mmc_switch_status_error(host, status);
|
||||
if (err)
|
||||
return err;
|
||||
busy = R1_CURRENT_STATE(status) == R1_STATE_PRG;
|
||||
}
|
||||
}
|
||||
err = mmc_busy_status(card, retry_crc_err, &busy);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Timeout if the device still remains busy. */
|
||||
if (expired && busy) {
|
||||
|
|
Loading…
Reference in New Issue