mmc: sdhci: Allow disabling of SDMA in SPL
Rockchip emmc devices have a similar issue to Rockchip dwmmc devices, where performing DMA to SRAM later causes issues with suspend/resume. Allow us to toggle SDMA in SPL for sdhci similar to ADMA support, so we can ensure DMA is not used when loading the SRAM code. Signed-off-by: Peter Geis <pgwipeout@gmail.com> Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com> Reviewed-by: Kever Yang <kever.yang@rock-chips.com> [jonas@kwiboo.se: add Kconfig default value and fix ADMA typo] Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
This commit is contained in:
parent
bdbfd58974
commit
3cd664dc92
2 changed files with 12 additions and 4 deletions
|
@ -476,6 +476,14 @@ config MMC_SDHCI_SDMA
|
||||||
This enables support for the SDMA (Single Operation DMA) defined
|
This enables support for the SDMA (Single Operation DMA) defined
|
||||||
in the SD Host Controller Standard Specification Version 1.00 .
|
in the SD Host Controller Standard Specification Version 1.00 .
|
||||||
|
|
||||||
|
config SPL_MMC_SDHCI_SDMA
|
||||||
|
bool "Support SDHCI SDMA in SPL"
|
||||||
|
depends on SPL_MMC && MMC_SDHCI
|
||||||
|
default y if MMC_SDHCI_SDMA
|
||||||
|
help
|
||||||
|
This enables support for the SDMA (Single Operation DMA) defined
|
||||||
|
in the SD Host Controller Standard Specification Version 1.00 in SPL.
|
||||||
|
|
||||||
config MMC_SDHCI_ADMA
|
config MMC_SDHCI_ADMA
|
||||||
bool "Support SDHCI ADMA2"
|
bool "Support SDHCI ADMA2"
|
||||||
depends on MMC_SDHCI
|
depends on MMC_SDHCI
|
||||||
|
|
|
@ -70,7 +70,7 @@ static void sdhci_transfer_pio(struct sdhci_host *host, struct mmc_data *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined(CONFIG_MMC_SDHCI_SDMA) || CONFIG_IS_ENABLED(MMC_SDHCI_ADMA))
|
#if (CONFIG_IS_ENABLED(MMC_SDHCI_SDMA) || CONFIG_IS_ENABLED(MMC_SDHCI_ADMA))
|
||||||
static void sdhci_prepare_dma(struct sdhci_host *host, struct mmc_data *data,
|
static void sdhci_prepare_dma(struct sdhci_host *host, struct mmc_data *data,
|
||||||
int *is_aligned, int trans_bytes)
|
int *is_aligned, int trans_bytes)
|
||||||
{
|
{
|
||||||
|
@ -177,7 +177,7 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data)
|
||||||
}
|
}
|
||||||
} while (!(stat & SDHCI_INT_DATA_END));
|
} while (!(stat & SDHCI_INT_DATA_END));
|
||||||
|
|
||||||
#if (defined(CONFIG_MMC_SDHCI_SDMA) || CONFIG_IS_ENABLED(MMC_SDHCI_ADMA))
|
#if (CONFIG_IS_ENABLED(MMC_SDHCI_SDMA) || CONFIG_IS_ENABLED(MMC_SDHCI_ADMA))
|
||||||
dma_unmap_single(host->start_addr, data->blocks * data->blocksize,
|
dma_unmap_single(host->start_addr, data->blocks * data->blocksize,
|
||||||
mmc_get_dma_dir(data));
|
mmc_get_dma_dir(data));
|
||||||
#endif
|
#endif
|
||||||
|
@ -877,7 +877,7 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
|
||||||
#endif
|
#endif
|
||||||
debug("%s, caps: 0x%x\n", __func__, caps);
|
debug("%s, caps: 0x%x\n", __func__, caps);
|
||||||
|
|
||||||
#ifdef CONFIG_MMC_SDHCI_SDMA
|
#if CONFIG_IS_ENABLED(MMC_SDHCI_SDMA)
|
||||||
if ((caps & SDHCI_CAN_DO_SDMA)) {
|
if ((caps & SDHCI_CAN_DO_SDMA)) {
|
||||||
host->flags |= USE_SDMA;
|
host->flags |= USE_SDMA;
|
||||||
} else {
|
} else {
|
||||||
|
@ -887,7 +887,7 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_IS_ENABLED(MMC_SDHCI_ADMA)
|
#if CONFIG_IS_ENABLED(MMC_SDHCI_ADMA)
|
||||||
if (!(caps & SDHCI_CAN_DO_ADMA2)) {
|
if (!(caps & SDHCI_CAN_DO_ADMA2)) {
|
||||||
printf("%s: Your controller doesn't support SDMA!!\n",
|
printf("%s: Your controller doesn't support ADMA!!\n",
|
||||||
__func__);
|
__func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue