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: Wei WANG <wei_wang@realsil.com.cn> Acked-by: Chris Ball <cjb@laptop.org> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
84d72f9cc2
commit
1b8055b490
@ -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,
|
|||||||
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,
|
|||||||
|
|
||||||
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)
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user