[PATCH] mmc: sdhci-of-dwcmshc: Prevent illegal clock reduction in HS200/HS400 mode

Ulf Hansson ulf.hansson at linaro.org
Tue Dec 30 07:33:51 PST 2025


On Mon, 22 Dec 2025 at 08:11, Shawn Lin <shawn.lin at rock-chips.com> wrote:
>
> When operating in HS200 or HS400 timing modes, reducing the clock frequency
> below 52MHz will lead to link broken as the Rockchip DWC MSHC controller
> requires maintaining a minimum clock of 52MHz in these modes.
>
> Add a check to prevent illegal clock reduction through debugfs:
>
> root at debian:/# echo 50000000 > /sys/kernel/debug/mmc0/clock
> root at debian:/# [   30.090146] mmc0: running CQE recovery
> mmc0: cqhci: Failed to halt
> mmc0: cqhci: spurious TCN for tag 0
> WARNING: drivers/mmc/host/cqhci-core.c:797 at cqhci_irq+0x254/0x818, CPU#1: kworker/1:0H/24
> Modules linked in:
> CPU: 1 UID: 0 PID: 24 Comm: kworker/1:0H Not tainted 6.19.0-rc1-00001-g09db0998649d-dirty #204 PREEMPT
> Hardware name: Rockchip RK3588 EVB1 V10 Board (DT)
> Workqueue: kblockd blk_mq_run_work_fn
> pstate: 604000c9 (nZCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> pc : cqhci_irq+0x254/0x818
> lr : cqhci_irq+0x254/0x818
> ...
>
> Fixes: c6f361cba51c ("mmc: sdhci-of-dwcmshc: add support for rk3588")
> Cc: Sebastian Reichel <sebastian.reichel at collabora.com>
> Cc: Yifeng Zhao <yifeng.zhao at rock-chips.com>
> Signed-off-by: Shawn Lin <shawn.lin at rock-chips.com>

Applied for fixes and by adding a stable-tag, thanks!

Kind regards
Uffe


> ---
>
>  drivers/mmc/host/sdhci-of-dwcmshc.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
> index 51949cd..204830b 100644
> --- a/drivers/mmc/host/sdhci-of-dwcmshc.c
> +++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
> @@ -739,6 +739,13 @@ static void dwcmshc_rk3568_set_clock(struct sdhci_host *host, unsigned int clock
>         sdhci_writel(host, extra, reg);
>
>         if (clock <= 52000000) {
> +               if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200 ||
> +                   host->mmc->ios.timing == MMC_TIMING_MMC_HS400) {
> +                       dev_err(mmc_dev(host->mmc),
> +                               "Can't reduce the clock below 52MHz in HS200/HS400 mode");
> +                       return;
> +               }
> +
>                 /*
>                  * Disable DLL and reset both of sample and drive clock.
>                  * The bypass bit and start bit need to be set if DLL is not locked.
> --
> 2.7.4
>



More information about the Linux-rockchip mailing list