aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/host/rtsx_pci_sdmmc.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
index fcb368ef4323..0fefe4e84f4a 100644
--- a/drivers/mmc/host/rtsx_pci_sdmmc.c
+++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
@@ -227,6 +227,7 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
227 int stat_idx = 0; 227 int stat_idx = 0;
228 u8 rsp_type; 228 u8 rsp_type;
229 int rsp_len = 5; 229 int rsp_len = 5;
230 bool clock_toggled = false;
230 231
231 dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD %d, arg = 0x%08x\n", 232 dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD %d, arg = 0x%08x\n",
232 __func__, cmd_idx, arg); 233 __func__, cmd_idx, arg);
@@ -270,6 +271,8 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
270 0xFF, SD_CLK_TOGGLE_EN); 271 0xFF, SD_CLK_TOGGLE_EN);
271 if (err < 0) 272 if (err < 0)
272 goto out; 273 goto out;
274
275 clock_toggled = true;
273 } 276 }
274 277
275 rtsx_pci_init_cmd(pcr); 278 rtsx_pci_init_cmd(pcr);
@@ -350,6 +353,10 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
350 353
351out: 354out:
352 cmd->error = err; 355 cmd->error = err;
356
357 if (err && clock_toggled)
358 rtsx_pci_write_register(pcr, SD_BUS_STAT,
359 SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
353} 360}
354 361
355static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq) 362static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq)
@@ -1121,11 +1128,11 @@ static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)
1121 goto out; 1128 goto out;
1122 } 1129 }
1123 1130
1131out:
1124 /* Stop toggle SD clock in idle */ 1132 /* Stop toggle SD clock in idle */
1125 err = rtsx_pci_write_register(pcr, SD_BUS_STAT, 1133 err = rtsx_pci_write_register(pcr, SD_BUS_STAT,
1126 SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0); 1134 SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
1127 1135
1128out:
1129 mutex_unlock(&pcr->pcr_mutex); 1136 mutex_unlock(&pcr->pcr_mutex);
1130 1137
1131 return err; 1138 return err;