diff options
author | Lucas Stach <dev@lynxeye.de> | 2015-03-05 22:50:06 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-03-06 07:52:02 +0100 |
commit | f777398dc5a3152a4402e29cc504a8372986f5a3 (patch) | |
tree | d2b1e04696982764fc1291a61ade74930599db0e /drivers/mci | |
parent | e31aa8badc8d1901e9f4f01a98c91447d575c45a (diff) | |
download | barebox-f777398dc5a3152a4402e29cc504a8372986f5a3.tar.gz barebox-f777398dc5a3152a4402e29cc504a8372986f5a3.tar.xz |
MCI: tegra-sdmmc: convert to streaming DMA ops
Move to the common streaming DMA ops in order to get rid of
the direct usage of the ARM MMU functions for the cache
maintenance.
Signed-off-by: Lucas Stach <dev@lynxeye.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mci')
-rw-r--r-- | drivers/mci/tegra-sdmmc.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/mci/tegra-sdmmc.c b/drivers/mci/tegra-sdmmc.c index 0e23d6fef1..670c280cb8 100644 --- a/drivers/mci/tegra-sdmmc.c +++ b/drivers/mci/tegra-sdmmc.c @@ -17,10 +17,10 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <asm/mmu.h> #include <common.h> #include <clock.h> #include <driver.h> +#include <dma.h> #include <gpio.h> #include <init.h> #include <io.h> @@ -100,6 +100,7 @@ static int tegra_sdmmc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data) { struct tegra_sdmmc_host *host = to_tegra_sdmmc_host(mci); + unsigned int num_bytes = 0; u32 val = 0; int ret; @@ -109,15 +110,15 @@ static int tegra_sdmmc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, /* Set up for a data transfer if we have one */ if (data) { + num_bytes = data->blocks * data->blocksize; + if (data->flags & MMC_DATA_WRITE) { - dma_flush_range((unsigned long)data->src, - (unsigned long)(data->src + - data->blocks * 512)); + dma_sync_single_for_device((unsigned long)data->src, + num_bytes, DMA_TO_DEVICE); writel((u32)data->src, host->regs + SDHCI_DMA_ADDRESS); } else { - dma_clean_range((unsigned long)data->src, - (unsigned long)(data->src + - data->blocks * 512)); + dma_sync_single_for_device((unsigned long)data->dest, + num_bytes, DMA_FROM_DEVICE); writel((u32)data->dest, host->regs + SDHCI_DMA_ADDRESS); } @@ -255,11 +256,12 @@ static int tegra_sdmmc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, } writel(val, host->regs + SDHCI_INT_STATUS); - if (data->flags & MMC_DATA_READ) { - dma_inv_range((unsigned long)data->dest, - (unsigned long)(data->dest + - data->blocks * 512)); - } + if (data->flags & MMC_DATA_WRITE) + dma_sync_single_for_cpu((unsigned long)data->src, + num_bytes, DMA_TO_DEVICE); + else + dma_sync_single_for_cpu((unsigned long)data->dest, + num_bytes, DMA_FROM_DEVICE); } return 0; |