summaryrefslogtreecommitdiff
path: root/target/linux/mvebu/patches-3.10/0123-mtd-nand-pxa3xx-Make-dma-code-dependent-on-dma-capab.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mvebu/patches-3.10/0123-mtd-nand-pxa3xx-Make-dma-code-dependent-on-dma-capab.patch')
-rw-r--r--target/linux/mvebu/patches-3.10/0123-mtd-nand-pxa3xx-Make-dma-code-dependent-on-dma-capab.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/target/linux/mvebu/patches-3.10/0123-mtd-nand-pxa3xx-Make-dma-code-dependent-on-dma-capab.patch b/target/linux/mvebu/patches-3.10/0123-mtd-nand-pxa3xx-Make-dma-code-dependent-on-dma-capab.patch
new file mode 100644
index 0000000..87bec0c
--- /dev/null
+++ b/target/linux/mvebu/patches-3.10/0123-mtd-nand-pxa3xx-Make-dma-code-dependent-on-dma-capab.patch
@@ -0,0 +1,106 @@
+From 085ced2b9e159dbeae029e338958b8c8ae9073b9 Mon Sep 17 00:00:00 2001
+From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
+Date: Mon, 12 Aug 2013 14:14:56 -0300
+Subject: [PATCH 123/203] mtd: nand: pxa3xx: Make dma code dependent on dma
+ capable platforms
+
+This patch adds a macro ARCH_HAS_DMA to compile-out arch specific
+dma code, namely pxa_request_dma() and pxa_free_dma(). These symbols
+are available only in pxa, which makes impossible to build the driver in
+other platforms than ARCH_PXA.
+
+In order to handle non-dma capable platforms, we implement a fallbacks that
+allocate buffers as if 'use_dma=false', putting the dma related code
+under the ARCH_HAS_DMA conditional.
+
+Please note that the correct way to handle this is to migrate the
+dma code to use of the mmp_pdma dmaengine driver. However, currently
+this is not possible because the two dmaengine drivers can't work together.
+
+Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
+Tested-by: Daniel Mack <zonque@gmail.com>
+Signed-off-by: Brian Norris <computersforpeace@gmail.com>
+Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
+---
+ drivers/mtd/nand/pxa3xx_nand.c | 34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+--- a/drivers/mtd/nand/pxa3xx_nand.c
++++ b/drivers/mtd/nand/pxa3xx_nand.c
+@@ -25,7 +25,14 @@
+ #include <linux/of.h>
+ #include <linux/of_device.h>
+
++#if defined(CONFIG_ARCH_PXA) || defined(CONFIG_ARCH_MMP)
++#define ARCH_HAS_DMA
++#endif
++
++#ifdef ARCH_HAS_DMA
+ #include <mach/dma.h>
++#endif
++
+ #include <linux/platform_data/mtd-nand-pxa3xx.h>
+
+ #define CHIP_DELAY_TIMEOUT (2 * HZ/10)
+@@ -381,6 +388,7 @@ static void handle_data_pio(struct pxa3x
+ }
+ }
+
++#ifdef ARCH_HAS_DMA
+ static void start_data_dma(struct pxa3xx_nand_info *info)
+ {
+ struct pxa_dma_desc *desc = info->data_desc;
+@@ -427,6 +435,10 @@ static void pxa3xx_nand_data_dma_irq(int
+ enable_int(info, NDCR_INT_MASK);
+ nand_writel(info, NDSR, NDSR_WRDREQ | NDSR_RDDREQ);
+ }
++#else
++static void start_data_dma(struct pxa3xx_nand_info *info)
++{}
++#endif
+
+ static irqreturn_t pxa3xx_nand_irq(int irq, void *devid)
+ {
+@@ -905,6 +917,7 @@ static int pxa3xx_nand_detect_config(str
+ */
+ #define MAX_BUFF_SIZE PAGE_SIZE
+
++#ifdef ARCH_HAS_DMA
+ static int pxa3xx_nand_init_buff(struct pxa3xx_nand_info *info)
+ {
+ struct platform_device *pdev = info->pdev;
+@@ -950,6 +963,20 @@ static void pxa3xx_nand_free_buff(struct
+ kfree(info->data_buff);
+ }
+ }
++#else
++static int pxa3xx_nand_init_buff(struct pxa3xx_nand_info *info)
++{
++ info->data_buff = kmalloc(MAX_BUFF_SIZE, GFP_KERNEL);
++ if (info->data_buff == NULL)
++ return -ENOMEM;
++ return 0;
++}
++
++static void pxa3xx_nand_free_buff(struct pxa3xx_nand_info *info)
++{
++ kfree(info->data_buff);
++}
++#endif
+
+ static int pxa3xx_nand_sensing(struct pxa3xx_nand_info *info)
+ {
+@@ -1265,6 +1292,13 @@ static int pxa3xx_nand_probe(struct plat
+ struct pxa3xx_nand_info *info;
+ int ret, cs, probe_success;
+
++#ifndef ARCH_HAS_DMA
++ if (use_dma) {
++ use_dma = 0;
++ dev_warn(&pdev->dev,
++ "This platform can't do DMA on this device\n");
++ }
++#endif
+ ret = pxa3xx_nand_probe_dt(pdev);
+ if (ret)
+ return ret;