diff options
-rw-r--r-- | drivers/mmc/host/rtsx_pci_sdmmc.c | 9 |
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 | ||
351 | out: | 354 | out: |
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 | ||
355 | static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq) | 362 | static 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 | ||
1131 | out: | ||
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 | ||
1128 | out: | ||
1129 | mutex_unlock(&pcr->pcr_mutex); | 1136 | mutex_unlock(&pcr->pcr_mutex); |
1130 | 1137 | ||
1131 | return err; | 1138 | return err; |