|
@@ -145,6 +145,16 @@ static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing)
|
|
mci_writel(host, CLKSEL64, clksel);
|
|
mci_writel(host, CLKSEL64, clksel);
|
|
else
|
|
else
|
|
mci_writel(host, CLKSEL, clksel);
|
|
mci_writel(host, CLKSEL, clksel);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Exynos4412 and Exynos5250 extends the use of CMD register with the
|
|
|
|
+ * use of bit 29 (which is reserved on standard MSHC controllers) for
|
|
|
|
+ * optionally bypassing the HOLD register for command and data. The
|
|
|
|
+ * HOLD register should be bypassed in case there is no phase shift
|
|
|
|
+ * applied on CMD/DATA that is sent to the card.
|
|
|
|
+ */
|
|
|
|
+ if (!SDMMC_CLKSEL_GET_DRV_WD3(clksel))
|
|
|
|
+ set_bit(DW_MMC_CARD_NO_USE_HOLD, &host->cur_slot->flags);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
#ifdef CONFIG_PM_SLEEP
|
|
@@ -202,26 +212,6 @@ static int dw_mci_exynos_resume_noirq(struct device *dev)
|
|
#define dw_mci_exynos_resume_noirq NULL
|
|
#define dw_mci_exynos_resume_noirq NULL
|
|
#endif /* CONFIG_PM_SLEEP */
|
|
#endif /* CONFIG_PM_SLEEP */
|
|
|
|
|
|
-static void dw_mci_exynos_prepare_command(struct dw_mci *host, u32 *cmdr)
|
|
|
|
-{
|
|
|
|
- struct dw_mci_exynos_priv_data *priv = host->priv;
|
|
|
|
- /*
|
|
|
|
- * Exynos4412 and Exynos5250 extends the use of CMD register with the
|
|
|
|
- * use of bit 29 (which is reserved on standard MSHC controllers) for
|
|
|
|
- * optionally bypassing the HOLD register for command and data. The
|
|
|
|
- * HOLD register should be bypassed in case there is no phase shift
|
|
|
|
- * applied on CMD/DATA that is sent to the card.
|
|
|
|
- */
|
|
|
|
- if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 ||
|
|
|
|
- priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) {
|
|
|
|
- if (SDMMC_CLKSEL_GET_DRV_WD3(mci_readl(host, CLKSEL64)))
|
|
|
|
- *cmdr |= SDMMC_CMD_USE_HOLD_REG;
|
|
|
|
- } else {
|
|
|
|
- if (SDMMC_CLKSEL_GET_DRV_WD3(mci_readl(host, CLKSEL)))
|
|
|
|
- *cmdr |= SDMMC_CMD_USE_HOLD_REG;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void dw_mci_exynos_config_hs400(struct dw_mci *host, u32 timing)
|
|
static void dw_mci_exynos_config_hs400(struct dw_mci *host, u32 timing)
|
|
{
|
|
{
|
|
struct dw_mci_exynos_priv_data *priv = host->priv;
|
|
struct dw_mci_exynos_priv_data *priv = host->priv;
|
|
@@ -500,7 +490,6 @@ static const struct dw_mci_drv_data exynos_drv_data = {
|
|
.caps = exynos_dwmmc_caps,
|
|
.caps = exynos_dwmmc_caps,
|
|
.init = dw_mci_exynos_priv_init,
|
|
.init = dw_mci_exynos_priv_init,
|
|
.setup_clock = dw_mci_exynos_setup_clock,
|
|
.setup_clock = dw_mci_exynos_setup_clock,
|
|
- .prepare_command = dw_mci_exynos_prepare_command,
|
|
|
|
.set_ios = dw_mci_exynos_set_ios,
|
|
.set_ios = dw_mci_exynos_set_ios,
|
|
.parse_dt = dw_mci_exynos_parse_dt,
|
|
.parse_dt = dw_mci_exynos_parse_dt,
|
|
.execute_tuning = dw_mci_exynos_execute_tuning,
|
|
.execute_tuning = dw_mci_exynos_execute_tuning,
|