[Linux-stm32] [PATCH v2 01/12] mmc: mmci: Clear busy_status when starting command
Linus Walleij
linus.walleij at linaro.org
Sat Apr 8 22:00:22 UTC 2023
If we are starting a command which can generate a busy
response, then clear the variable host->busy_status
if the variant is using a ->busy_complete callback.
We are lucky that the member is zero by default and
hopefully always gets cleared in the ->busy_complete
callback even on errors, but it's just fragile so
make sure it is always initialized to zero.
Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
---
ChangeLog v1->v2:
- Unconditionally clear host->busy_status if we get a
busy response.
---
drivers/mmc/host/mmci.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index b9e5dfe74e5c..9b48df842425 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -1238,17 +1238,21 @@ mmci_start_command(struct mmci_host *host, struct mmc_command *cmd, u32 c)
c |= host->variant->cmdreg_srsp;
}
- if (host->variant->busy_timeout && cmd->flags & MMC_RSP_BUSY) {
- if (!cmd->busy_timeout)
- cmd->busy_timeout = 10 * MSEC_PER_SEC;
+ if (cmd->flags & MMC_RSP_BUSY) {
+ host->busy_status = 0;
- if (cmd->busy_timeout > host->mmc->max_busy_timeout)
- clks = (unsigned long long)host->mmc->max_busy_timeout * host->cclk;
- else
- clks = (unsigned long long)cmd->busy_timeout * host->cclk;
+ if (host->variant->busy_timeout) {
+ if (!cmd->busy_timeout)
+ cmd->busy_timeout = 10 * MSEC_PER_SEC;
- do_div(clks, MSEC_PER_SEC);
- writel_relaxed(clks, host->base + MMCIDATATIMER);
+ if (cmd->busy_timeout > host->mmc->max_busy_timeout)
+ clks = (unsigned long long)host->mmc->max_busy_timeout * host->cclk;
+ else
+ clks = (unsigned long long)cmd->busy_timeout * host->cclk;
+
+ do_div(clks, MSEC_PER_SEC);
+ writel_relaxed(clks, host->base + MMCIDATATIMER);
+ }
}
if (host->ops->pre_sig_volt_switch && cmd->opcode == SD_SWITCH_VOLTAGE)
--
2.39.2
More information about the Linux-stm32
mailing list