]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mmc: sdhci-of-k1: enable essential clock infrastructure for SD operation
authorIker Pedrosa <ikerpedrosam@gmail.com>
Mon, 11 May 2026 08:53:57 +0000 (10:53 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 11 May 2026 15:35:47 +0000 (17:35 +0200)
Ensure SD card pins receive clock signals by enabling pad clock
generation and overriding automatic clock gating. Required for all SD
operation modes.

The SDHC_GEN_PAD_CLK_ON setting in LEGACY_CTRL_REG is safe for both SD
and eMMC operation as both protocols use the same physical MMC interface
pins and require proper clock signal generation at the hardware level
for signal integrity and timing.

Additional SD-specific clock overrides (SDHC_OVRRD_CLK_OEN and
SDHC_FORCE_CLK_ON) are conditionally applied only for SD-only
controllers to handle removable card scenarios.

Tested-by: Anand Moon <linux.amoon@gmail.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Trevor Gamblin <tgamblin@baylibre.com>
Reviewed-by: Troy Mitchell <troy.mitchell@linux.dev>
Tested-by: Vincent Legoll <legoll@online.fr>
Signed-off-by: Iker Pedrosa <ikerpedrosam@gmail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-of-k1.c

index 455656f9842df90c7a94a290aeec22157b378fc1..0dd06fc19b8574ae1b00f7e5d09b7d4c87d06770 100644 (file)
 #include "sdhci.h"
 #include "sdhci-pltfm.h"
 
+#define SPACEMIT_SDHC_OP_EXT_REG       0x108
+#define  SDHC_OVRRD_CLK_OEN            BIT(11)
+#define  SDHC_FORCE_CLK_ON             BIT(12)
+
+#define SPACEMIT_SDHC_LEGACY_CTRL_REG  0x10C
+#define  SDHC_GEN_PAD_CLK_ON           BIT(6)
+
 #define SPACEMIT_SDHC_MMC_CTRL_REG     0x114
 #define  SDHC_MISC_INT_EN              BIT(1)
 #define  SDHC_MISC_INT                 BIT(2)
@@ -101,6 +108,12 @@ static void spacemit_sdhci_reset(struct sdhci_host *host, u8 mask)
 
        if (!(host->mmc->caps2 & MMC_CAP2_NO_MMC))
                spacemit_sdhci_setbits(host, SDHC_MMC_CARD_MODE, SPACEMIT_SDHC_MMC_CTRL_REG);
+
+       spacemit_sdhci_setbits(host, SDHC_GEN_PAD_CLK_ON, SPACEMIT_SDHC_LEGACY_CTRL_REG);
+
+       if (host->mmc->caps2 & MMC_CAP2_NO_MMC)
+               spacemit_sdhci_setbits(host, SDHC_OVRRD_CLK_OEN | SDHC_FORCE_CLK_ON,
+                                      SPACEMIT_SDHC_OP_EXT_REG);
 }
 
 static void spacemit_sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned int timing)