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:
Peter Geis 2023-04-18 16:46:44 +00:00 committed by Kever Yang
parent bdbfd58974
commit 3cd664dc92
2 changed files with 12 additions and 4 deletions

View file

@ -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

View file

@ -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;
} }