summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <dev@lynxeye.de>2015-03-05 22:50:05 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2015-03-06 07:52:02 +0100
commite31aa8badc8d1901e9f4f01a98c91447d575c45a (patch)
treeff8a2febeb3c416043304449e09c82164c8b2d34
parent451967e8b936879c77a9e41ea2fc6ac18b91ff68 (diff)
downloadbarebox-e31aa8badc8d1901e9f4f01a98c91447d575c45a.tar.gz
barebox-e31aa8badc8d1901e9f4f01a98c91447d575c45a.tar.xz
MCI: imx: 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>
-rw-r--r--drivers/mci/imx-esdhc.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
index 23bdc1fb15..8b45500a09 100644
--- a/drivers/mci/imx-esdhc.c
+++ b/drivers/mci/imx-esdhc.c
@@ -22,6 +22,7 @@
*/
#include <config.h>
#include <common.h>
+#include <dma.h>
#include <driver.h>
#include <init.h>
#include <of.h>
@@ -31,7 +32,6 @@
#include <io.h>
#include <linux/clk.h>
#include <linux/err.h>
-#include <asm/mmu.h>
#include <mach/generic.h>
#include <mach/esdhc.h>
#include <gpio.h>
@@ -211,6 +211,7 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
u32 irqstat;
struct fsl_esdhc_host *host = to_fsl_esdhc(mci);
void __iomem *regs = host->regs;
+ unsigned int num_bytes = 0;
int ret;
esdhc_write32(regs + SDHCI_INT_STATUS, -1);
@@ -225,12 +226,15 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
err = esdhc_setup_data(mci, data);
if(err)
return err;
- if (data->flags & MMC_DATA_WRITE) {
- dma_flush_range((unsigned long)data->src,
- (unsigned long)(data->src + data->blocks * 512));
- } else
- dma_clean_range((unsigned long)data->src,
- (unsigned long)(data->src + data->blocks * 512));
+
+ num_bytes = data->blocks * data->blocksize;
+
+ if (data->flags & MMC_DATA_WRITE)
+ dma_sync_single_for_device((unsigned long)data->src,
+ num_bytes, DMA_TO_DEVICE);
+ else
+ dma_sync_single_for_device((unsigned long)data->dest,
+ num_bytes, DMA_FROM_DEVICE);
}
@@ -313,10 +317,12 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
} while (!(irqstat & IRQSTAT_TC) &&
(esdhc_read32(regs + SDHCI_PRESENT_STATE) & PRSSTAT_DLA));
- 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);
#endif
}