mmc: sdhci-sprd: Add HS400 enhanced strobe mode
Add HS400 enhanced strobe mode support for Spreadtrum SD host controller. Signed-off-by: Baolin Wang <baolin.wang@linaro.org> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
7486831d7d
commit
494c11e1a5
|
@ -41,6 +41,7 @@
|
|||
/* SDHCI_HOST_CONTROL2 */
|
||||
#define SDHCI_SPRD_CTRL_HS200 0x0005
|
||||
#define SDHCI_SPRD_CTRL_HS400 0x0006
|
||||
#define SDHCI_SPRD_CTRL_HS400ES 0x0007
|
||||
|
||||
/*
|
||||
* According to the standard specification, BIT(3) of SDHCI_SOFTWARE_RESET is
|
||||
|
@ -132,6 +133,15 @@ static inline void sdhci_sprd_sd_clk_off(struct sdhci_host *host)
|
|||
sdhci_writew(host, ctrl, SDHCI_CLOCK_CONTROL);
|
||||
}
|
||||
|
||||
static inline void sdhci_sprd_sd_clk_on(struct sdhci_host *host)
|
||||
{
|
||||
u16 ctrl;
|
||||
|
||||
ctrl = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
|
||||
ctrl |= SDHCI_CLOCK_CARD_EN;
|
||||
sdhci_writew(host, ctrl, SDHCI_CLOCK_CONTROL);
|
||||
}
|
||||
|
||||
static inline void
|
||||
sdhci_sprd_set_dll_invert(struct sdhci_host *host, u32 mask, bool en)
|
||||
{
|
||||
|
@ -325,6 +335,26 @@ static void sdhci_sprd_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|||
sdhci_request(mmc, mrq);
|
||||
}
|
||||
|
||||
static void sdhci_sprd_hs400_enhanced_strobe(struct mmc_host *mmc,
|
||||
struct mmc_ios *ios)
|
||||
{
|
||||
struct sdhci_host *host = mmc_priv(mmc);
|
||||
u16 ctrl_2;
|
||||
|
||||
if (!ios->enhanced_strobe)
|
||||
return;
|
||||
|
||||
sdhci_sprd_sd_clk_off(host);
|
||||
|
||||
/* Set HS400 enhanced strobe mode */
|
||||
ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
||||
ctrl_2 &= ~SDHCI_CTRL_UHS_MASK;
|
||||
ctrl_2 |= SDHCI_SPRD_CTRL_HS400ES;
|
||||
sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
|
||||
|
||||
sdhci_sprd_sd_clk_on(host);
|
||||
}
|
||||
|
||||
static const struct sdhci_pltfm_data sdhci_sprd_pdata = {
|
||||
.quirks = SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK,
|
||||
.quirks2 = SDHCI_QUIRK2_BROKEN_HS200 |
|
||||
|
@ -346,6 +376,8 @@ static int sdhci_sprd_probe(struct platform_device *pdev)
|
|||
host->dma_mask = DMA_BIT_MASK(64);
|
||||
pdev->dev.dma_mask = &host->dma_mask;
|
||||
host->mmc_host_ops.request = sdhci_sprd_request;
|
||||
host->mmc_host_ops.hs400_enhanced_strobe =
|
||||
sdhci_sprd_hs400_enhanced_strobe;
|
||||
|
||||
host->mmc->caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED |
|
||||
MMC_CAP_ERASE | MMC_CAP_CMD23;
|
||||
|
|
Loading…
Reference in New Issue