Skip to content

Commit 4c2357f

Browse files
diandersUlf Hansson
authored andcommitted
mmc: dw_mmc: Fix the CTO timeout calculation
In the commit 03de192 ("mmc: dw_mmc: introduce timer for broken command transfer over scheme") we tried to calculate the expected hardware command timeout value. Unfortunately that calculation isn't quite correct in all cases. It used "bus_hz" but, as far as I can tell, it's supposed to use the card clock. Let's account for the div value, which is documented as 2x the value stored in the register, or 1 if the register is 0. NOTE: It's not expected that this will actually fix anything important since the 10 ms margin added by the function will pretty much dwarf any calculations. The card clock should be 100 kHz at minimum and: 1000 ms/s * (255 * 2) / 100000 Hz. Gives us 5.1 ms. ...so really the point of this patch is just to make the code more "correct" in case anyone ever tries to remove the 10 ms buffer. Fixes: 03de192 ("mmc: dw_mmc: introduce timer for broken command transfer over scheme") Tested-by: Emil Renner Berthing <kernel@esmil.dk> Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com> Signed-off-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
1 parent 0363b12 commit 4c2357f

1 file changed

Lines changed: 5 additions & 1 deletion

File tree

drivers/mmc/host/dw_mmc.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,10 +401,14 @@ static u32 dw_mci_prep_stop_abort(struct dw_mci *host, struct mmc_command *cmd)
401401
static inline void dw_mci_set_cto(struct dw_mci *host)
402402
{
403403
unsigned int cto_clks;
404+
unsigned int cto_div;
404405
unsigned int cto_ms;
405406

406407
cto_clks = mci_readl(host, TMOUT) & 0xff;
407-
cto_ms = DIV_ROUND_UP(cto_clks, host->bus_hz / 1000);
408+
cto_div = (mci_readl(host, CLKDIV) & 0xff) * 2;
409+
if (cto_div == 0)
410+
cto_div = 1;
411+
cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz);
408412

409413
/* add a bit spare time */
410414
cto_ms += 10;

0 commit comments

Comments
 (0)