Commit 195fadb7 authored by Chunyan Zhang's avatar Chunyan Zhang Committed by Ulf Hansson

mmc: sdhci-omap: Add using external dma

sdhci-omap can support both external dma controller via dmaengine framework
as well as ADMA which standard SD host controller provides.

Fixes by Faiz Abbas <fazi_abbas@ti.com>:
1. Switch to DMA slave mode when using external DMA
2. Add offset to mapbase
Signed-off-by: default avatarChunyan Zhang <zhang.chunyan@linaro.org>
Signed-off-by: default avatarFaiz Abbas <faiz_abbas@ti.com>
Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/20200116105154.7685-5-faiz_abbas@ti.comSigned-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 18e762e3
...@@ -1010,6 +1010,7 @@ config MMC_SDHCI_OMAP ...@@ -1010,6 +1010,7 @@ config MMC_SDHCI_OMAP
depends on MMC_SDHCI_PLTFM && OF depends on MMC_SDHCI_PLTFM && OF
select THERMAL select THERMAL
imply TI_SOC_THERMAL imply TI_SOC_THERMAL
select MMC_SDHCI_EXTERNAL_DMA if DMA_ENGINE
help help
This selects the Secure Digital Host Controller Interface (SDHCI) This selects the Secure Digital Host Controller Interface (SDHCI)
support present in TI's DRA7 SOCs. The controller supports support present in TI's DRA7 SOCs. The controller supports
......
...@@ -685,7 +685,11 @@ static int sdhci_omap_enable_dma(struct sdhci_host *host) ...@@ -685,7 +685,11 @@ static int sdhci_omap_enable_dma(struct sdhci_host *host)
struct sdhci_omap_host *omap_host = sdhci_pltfm_priv(pltfm_host); struct sdhci_omap_host *omap_host = sdhci_pltfm_priv(pltfm_host);
reg = sdhci_omap_readl(omap_host, SDHCI_OMAP_CON); reg = sdhci_omap_readl(omap_host, SDHCI_OMAP_CON);
reg &= ~CON_DMA_MASTER;
/* Switch to DMA slave mode when using external DMA */
if (!host->use_external_dma)
reg |= CON_DMA_MASTER; reg |= CON_DMA_MASTER;
sdhci_omap_writel(omap_host, SDHCI_OMAP_CON, reg); sdhci_omap_writel(omap_host, SDHCI_OMAP_CON, reg);
return 0; return 0;
...@@ -1037,6 +1041,7 @@ static int sdhci_omap_probe(struct platform_device *pdev) ...@@ -1037,6 +1041,7 @@ static int sdhci_omap_probe(struct platform_device *pdev)
const struct of_device_id *match; const struct of_device_id *match;
struct sdhci_omap_data *data; struct sdhci_omap_data *data;
const struct soc_device_attribute *soc; const struct soc_device_attribute *soc;
struct resource *regs;
match = of_match_device(omap_sdhci_match, dev); match = of_match_device(omap_sdhci_match, dev);
if (!match) if (!match)
...@@ -1049,6 +1054,10 @@ static int sdhci_omap_probe(struct platform_device *pdev) ...@@ -1049,6 +1054,10 @@ static int sdhci_omap_probe(struct platform_device *pdev)
} }
offset = data->offset; offset = data->offset;
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!regs)
return -ENXIO;
host = sdhci_pltfm_init(pdev, &sdhci_omap_pdata, host = sdhci_pltfm_init(pdev, &sdhci_omap_pdata,
sizeof(*omap_host)); sizeof(*omap_host));
if (IS_ERR(host)) { if (IS_ERR(host)) {
...@@ -1065,6 +1074,7 @@ static int sdhci_omap_probe(struct platform_device *pdev) ...@@ -1065,6 +1074,7 @@ static int sdhci_omap_probe(struct platform_device *pdev)
omap_host->timing = MMC_TIMING_LEGACY; omap_host->timing = MMC_TIMING_LEGACY;
omap_host->flags = data->flags; omap_host->flags = data->flags;
host->ioaddr += offset; host->ioaddr += offset;
host->mapbase = regs->start + offset;
mmc = host->mmc; mmc = host->mmc;
sdhci_get_of_property(pdev); sdhci_get_of_property(pdev);
...@@ -1134,6 +1144,10 @@ static int sdhci_omap_probe(struct platform_device *pdev) ...@@ -1134,6 +1144,10 @@ static int sdhci_omap_probe(struct platform_device *pdev)
host->mmc_host_ops.execute_tuning = sdhci_omap_execute_tuning; host->mmc_host_ops.execute_tuning = sdhci_omap_execute_tuning;
host->mmc_host_ops.enable_sdio_irq = sdhci_omap_enable_sdio_irq; host->mmc_host_ops.enable_sdio_irq = sdhci_omap_enable_sdio_irq;
/* Switch to external DMA only if there is the "dmas" property */
if (of_find_property(dev->of_node, "dmas", NULL))
sdhci_switch_external_dma(host, true);
ret = sdhci_setup_host(host); ret = sdhci_setup_host(host);
if (ret) if (ret)
goto err_put_sync; goto err_put_sync;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment