]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mmc: rtsx_pci_sdmmc: simplify voltage switch handling after card_busy()
authorRicky Wu <ricky_wu@realtek.com>
Fri, 30 Jan 2026 03:05:01 +0000 (11:05 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 4 Mar 2026 15:33:36 +0000 (16:33 +0100)
Now that the Realtek PCIe SDMMC host implements the card_busy() callback,
the MMC core performs the required DAT[3:0] validation during the signal
voltage switch sequence.

As a result, the driver-side voltage stabilization helpers
sd_wait_voltage_stable_1() and sd_wait_voltage_stable_2() become redundant.
These helpers duplicate DAT line checks that are now handled centrally by
the MMC core via card_busy().

Remove the two stabilization helpers and simplify sdmmc_switch_voltage()
accordingly, keeping only the minimal clock control needed around the
voltage switch.

No functional changes and intended.

Signed-off-by: Ricky Wu <ricky_wu@realtek.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/rtsx_pci_sdmmc.c

index 4db3328f46dfbd1e7439aff5f9d42c6c9fc48f67..8dfbc62f165bc36bebe1f856a4cdadf179d3c537 100644 (file)
@@ -1181,79 +1181,6 @@ static int sdmmc_get_cd(struct mmc_host *mmc)
        return cd;
 }
 
-static int sd_wait_voltage_stable_1(struct realtek_pci_sdmmc *host)
-{
-       struct rtsx_pcr *pcr = host->pcr;
-       int err;
-       u8 stat;
-
-       /* Reference to Signal Voltage Switch Sequence in SD spec.
-        * Wait for a period of time so that the card can drive SD_CMD and
-        * SD_DAT[3:0] to low after sending back CMD11 response.
-        */
-       mdelay(1);
-
-       /* SD_CMD, SD_DAT[3:0] should be driven to low by card;
-        * If either one of SD_CMD,SD_DAT[3:0] is not low,
-        * abort the voltage switch sequence;
-        */
-       err = rtsx_pci_read_register(pcr, SD_BUS_STAT, &stat);
-       if (err < 0)
-               return err;
-
-       if (stat & (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
-                               SD_DAT1_STATUS | SD_DAT0_STATUS))
-               return -EINVAL;
-
-       /* Stop toggle SD clock */
-       err = rtsx_pci_write_register(pcr, SD_BUS_STAT,
-                       0xFF, SD_CLK_FORCE_STOP);
-       if (err < 0)
-               return err;
-
-       return 0;
-}
-
-static int sd_wait_voltage_stable_2(struct realtek_pci_sdmmc *host)
-{
-       struct rtsx_pcr *pcr = host->pcr;
-       int err;
-       u8 stat, mask, val;
-
-       /* Wait 1.8V output of voltage regulator in card stable */
-       msleep(50);
-
-       /* Toggle SD clock again */
-       err = rtsx_pci_write_register(pcr, SD_BUS_STAT, 0xFF, SD_CLK_TOGGLE_EN);
-       if (err < 0)
-               return err;
-
-       /* Wait for a period of time so that the card can drive
-        * SD_DAT[3:0] to high at 1.8V
-        */
-       msleep(20);
-
-       /* SD_CMD, SD_DAT[3:0] should be pulled high by host */
-       err = rtsx_pci_read_register(pcr, SD_BUS_STAT, &stat);
-       if (err < 0)
-               return err;
-
-       mask = SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
-               SD_DAT1_STATUS | SD_DAT0_STATUS;
-       val = SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
-               SD_DAT1_STATUS | SD_DAT0_STATUS;
-       if ((stat & mask) != val) {
-               dev_dbg(sdmmc_dev(host),
-                       "%s: SD_BUS_STAT = 0x%x\n", __func__, stat);
-               rtsx_pci_write_register(pcr, SD_BUS_STAT,
-                               SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
-               rtsx_pci_write_register(pcr, CARD_CLK_EN, 0xFF, 0);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
 static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)
 {
        struct realtek_pci_sdmmc *host = mmc_priv(mmc);
@@ -1281,7 +1208,9 @@ static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)
                voltage = OUTPUT_1V8;
 
        if (voltage == OUTPUT_1V8) {
-               err = sd_wait_voltage_stable_1(host);
+               /* Stop toggle SD clock */
+               err = rtsx_pci_write_register(pcr, SD_BUS_STAT,
+                               0xFF, SD_CLK_FORCE_STOP);
                if (err < 0)
                        goto out;
        }
@@ -1290,16 +1219,11 @@ static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)
        if (err < 0)
                goto out;
 
-       if (voltage == OUTPUT_1V8) {
-               err = sd_wait_voltage_stable_2(host);
-               if (err < 0)
-                       goto out;
-       }
-
 out:
        /* Stop toggle SD clock in idle */
-       err = rtsx_pci_write_register(pcr, SD_BUS_STAT,
-                       SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
+       if (err < 0)
+               rtsx_pci_write_register(pcr, SD_BUS_STAT,
+                               SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
 
        mutex_unlock(&pcr->pcr_mutex);