[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20260130030501.373630-1-ricky_wu@realtek.com>
Date: Fri, 30 Jan 2026 11:05:01 +0800
From: <ricky_wu@...ltek.com>
To: <ricky_wu@...ltek.com>, <ulf.hansson@...aro.org>,
<matthew.schwartz@...ux.dev>, <linux-mmc@...r.kernel.org>,
<linux-kernel@...r.kernel.org>
Subject: [PATCH] mmc: rtsx_pci_sdmmc: simplify voltage switch handling after card_busy()
From: Ricky Wu <ricky_wu@...ltek.com>
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@...ltek.com>
---
drivers/mmc/host/rtsx_pci_sdmmc.c | 88 +++----------------------------
1 file changed, 6 insertions(+), 82 deletions(-)
diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
index 4db3328f46df..8dfbc62f165b 100644
--- a/drivers/mmc/host/rtsx_pci_sdmmc.c
+++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
@@ -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);
--
2.25.1
Powered by blists - more mailing lists