mmc: host: renesas_sdhi: Fix the actual clock
authorBiju Das <biju.das.jz@bp.renesas.com>
Sun, 29 Jun 2025 20:38:56 +0000 (21:38 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 19 Aug 2025 12:34:14 +0000 (14:34 +0200)
Wrong actual clock reported, if the SD clock division ratio is other
than 1:1(bits DIV[7:0] in SD_CLK_CTRL are set to 11111111).

On high speed mode, cat /sys/kernel/debug/mmc1/ios
Without the patch:
clock:          50000000 Hz
actual clock:   200000000 Hz

After the fix:
clock:          50000000 Hz
actual clock:   50000000 Hz

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://lore.kernel.org/r/20250629203859.170850-1-biju.das.jz@bp.renesas.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/renesas_sdhi_core.c

index fb8ca03..a41291a 100644 (file)
@@ -222,7 +222,11 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
                        clk &= ~0xff;
        }
 
-       sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk & CLK_CTL_DIV_MASK);
+       clock = clk & CLK_CTL_DIV_MASK;
+       if (clock != 0xff)
+               host->mmc->actual_clock /= (1 << (ffs(clock) + 1));
+
+       sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clock);
        if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2))
                usleep_range(10000, 11000);