aboutsummaryrefslogtreecommitdiff
path: root/drivers/mtd/nand/sunxi_nand_spl.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2015-08-15 12:32:24 +0200
committerHans de Goede <hdegoede@redhat.com>2015-08-31 08:43:41 +0200
commit2a43973f64bce7dba1a5aabd18f2268f062aa0ef (patch)
tree0e1c589c5c32f1a5f842f82effa9a74e10304c58 /drivers/mtd/nand/sunxi_nand_spl.c
parent5d65c67bf10bc5a815023ac13a2689aee9956d92 (diff)
sunxi_nand_spl: Add proper cache flusing
We are using dma, so we should flush the cache before starting the dma, and invalidate it once the dma is done. Things are working without this by mostly luck, but lets not rely on that. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Ian Campbell <ijc@hellion.org.uk>
Diffstat (limited to 'drivers/mtd/nand/sunxi_nand_spl.c')
-rw-r--r--drivers/mtd/nand/sunxi_nand_spl.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/mtd/nand/sunxi_nand_spl.c b/drivers/mtd/nand/sunxi_nand_spl.c
index 147d47638f..663c03ec4f 100644
--- a/drivers/mtd/nand/sunxi_nand_spl.c
+++ b/drivers/mtd/nand/sunxi_nand_spl.c
@@ -266,6 +266,10 @@ static void nand_read_page(unsigned int real_addr, dma_addr_t dst,
writel(oob_offset, SUNXI_NFC_BASE + NFC_SPARE_AREA);
}
+ flush_dcache_range(dst,
+ ALIGN(dst + CONFIG_NAND_SUNXI_SPL_ECC_PAGE_SIZE,
+ ARCH_DMA_MINALIGN));
+
/* SUNXI_DMA */
writel(0x0, SUNXI_DMA_BASE + SUNXI_DMA_CFG_REG0); /* clr dma cmd */
/* read from REG_IO_DATA */
@@ -311,6 +315,10 @@ static void nand_read_page(unsigned int real_addr, dma_addr_t dst,
return;
}
+ invalidate_dcache_range(dst,
+ ALIGN(dst + CONFIG_NAND_SUNXI_SPL_ECC_PAGE_SIZE,
+ ARCH_DMA_MINALIGN));
+
if (readl(SUNXI_NFC_BASE + NFC_ECC_ST))
(*ecc_errors)++;
}