diff options
Diffstat (limited to 'drivers/mmc/host/sdhci-esdhc-imx.c')
-rw-r--r-- | drivers/mmc/host/sdhci-esdhc-imx.c | 26 |
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; |