summaryrefslogtreecommitdiff
path: root/drivers/mmc/host/sdhci-esdhc-imx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/host/sdhci-esdhc-imx.c')
-rw-r--r--drivers/mmc/host/sdhci-esdhc-imx.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
index 35fd825f4709..fd7046808ed4 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -34,6 +34,7 @@
#define SDHCI_VENDOR_SPEC 0xC0
#define SDHCI_VENDOR_SPEC_SDIO_QUIRK 0x00000002
+#define SDHCI_MIX_CTRL_AC12EN (1 << 2)
#define SDHCI_MIX_CTRL_AC23EN (1 << 7)
#define SDHCI_MIX_CTRL_EXE_TUNE (1 << 22)
#define SDHCI_MIX_CTRL_SMPCLK_SEL (1 << 23)
@@ -291,9 +292,12 @@ static void esdhc_writel_le(struct sdhci_host *host, u32 val, int reg)
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct pltfm_imx_data *imx_data = pltfm_host->priv;
u32 data;
+ struct esdhc_platform_data *boarddata
+ = host->mmc->parent->platform_data;
if (unlikely((reg == SDHCI_INT_ENABLE || reg == SDHCI_SIGNAL_ENABLE))) {
- if (imx_data->flags & ESDHC_FLAG_GPIO_FOR_CD_WP)
+ if ((boarddata->always_present) ||
+ (imx_data->flags & ESDHC_FLAG_GPIO_FOR_CD_WP))
/*
* these interrupts won't work with a custom
* card_detect gpio (only applied to mx25/35)
@@ -556,9 +560,12 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
}
imx_data->scratchpad = val;
- if (val & SDHCI_TRNS_AUTO_CMD23)
+ if (cpu_is_mx6() && (val & SDHCI_TRNS_AUTO_CMD23))
imx_data->scratchpad |= SDHCI_MIX_CTRL_AC23EN;
+ if (cpu_is_mx5() && (val & SDHCI_TRNS_AUTO_CMD12))
+ imx_data->scratchpad |= SDHCI_MIX_CTRL_AC12EN;
+
return;
case SDHCI_COMMAND:
if ((host->cmd->opcode == MMC_STOP_TRANSMISSION ||
@@ -782,9 +789,6 @@ static irqreturn_t cd_irq(int irq, void *data)
imx_data->scratchpad &= ~SDHCI_MIX_CTRL_SMPCLK_SEL;
}
- esdhc_reset(sdhost);
- mdelay(1);
-
tasklet_schedule(&sdhost->card_tasklet);
return IRQ_HANDLED;
};
@@ -823,13 +827,13 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pd
/*
* on mx6dl TO 1.1, ADMA can work when ahb bus frequency is low,
- * like 24Mhz.
+ * like 24Mhz. MX53 does have working ADMA.
*/
- if (mx6dl_revision() >= IMX_CHIP_REVISION_1_1)
+ if (mx6dl_revision() >= IMX_CHIP_REVISION_1_1 || cpu_is_mx53())
host->quirks &= ~SDHCI_QUIRK_BROKEN_ADMA;
if (cpu_is_mx6())
- host->quirks2 |= SDHCI_QUIRK_BROKEN_AUTO_CMD23,
+ host->quirks2 |= SDHCI_QUIRK_BROKEN_AUTO_CMD23;
/* write_protect can't be routed to controller, use gpio */
sdhci_esdhc_ops.get_ro = esdhc_pltfm_get_ro;
@@ -864,6 +868,8 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pd
|| boarddata->cd_type == ESDHC_CD_NONE
|| boarddata->cd_type == ESDHC_CD_GPIO)
host->mmc->caps &= ~MMC_CAP_NONREMOVABLE;
+ if (boarddata->runtime_pm)
+ host->mmc->caps |= MMC_CAP_POWER_OFF_CARD;
if (cpu_is_mx6()) {
host->mmc->caps |= MMC_CAP_1_8V_DDR;
host->tuning_min = SDHCI_TUNE_CTRL_MIN;
@@ -915,10 +921,6 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pd
host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION;
}
-#ifdef CONFIG_PM_RUNTIME
- host->mmc->caps |= MMC_CAP_POWER_OFF_CARD;
-#endif
-
if (host->clk_mgr_en)
clk_disable(pltfm_host->clk);
return 0;