Message ID | 20230405-pl180-busydetect-fix-v2-1-eeb10323b546@linaro.org |
---|---|
State | New |
Headers | show |
Series | Fix busydetect on Ux500 PL180/MMCI | expand |
On Sun, 9 Apr 2023 at 00:00, Linus Walleij <linus.walleij@linaro.org> wrote: > > 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@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; To be even more safe, I don't think we should check "cmd->flags & MMC_RSP_BUSY". Let's just reset it always instead. > > - 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) > Kind regards Uffe
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)
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@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(-)