提交 1b8055b4 编写于 作者: W Wei WANG 提交者: Samuel Ortiz

mmc: rtsx: Clear SD_CLK toggle enable bit if switching voltage fail

If switching voltage fails, SD_CLK toggle enable bit should been cleared
so that SD host can control SD clock automatically.
Signed-off-by: NWei WANG <wei_wang@realsil.com.cn>
Acked-by: NChris Ball <cjb@laptop.org>
Signed-off-by: NSamuel Ortiz <sameo@linux.intel.com>
上级 84d72f9c
...@@ -227,6 +227,7 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host, ...@@ -227,6 +227,7 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
int stat_idx = 0; int stat_idx = 0;
u8 rsp_type; u8 rsp_type;
int rsp_len = 5; int rsp_len = 5;
bool clock_toggled = false;
dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD %d, arg = 0x%08x\n", dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD %d, arg = 0x%08x\n",
__func__, cmd_idx, arg); __func__, cmd_idx, arg);
...@@ -270,6 +271,8 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host, ...@@ -270,6 +271,8 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
0xFF, SD_CLK_TOGGLE_EN); 0xFF, SD_CLK_TOGGLE_EN);
if (err < 0) if (err < 0)
goto out; goto out;
clock_toggled = true;
} }
rtsx_pci_init_cmd(pcr); rtsx_pci_init_cmd(pcr);
...@@ -350,6 +353,10 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host, ...@@ -350,6 +353,10 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
out: out:
cmd->error = err; cmd->error = err;
if (err && clock_toggled)
rtsx_pci_write_register(pcr, SD_BUS_STAT,
SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
} }
static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq) 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,11 +1128,11 @@ static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)
goto out; goto out;
} }
out:
/* Stop toggle SD clock in idle */ /* Stop toggle SD clock in idle */
err = rtsx_pci_write_register(pcr, SD_BUS_STAT, err = rtsx_pci_write_register(pcr, SD_BUS_STAT,
SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0); SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
out:
mutex_unlock(&pcr->pcr_mutex); mutex_unlock(&pcr->pcr_mutex);
return err; return err;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册