diff options
author | Luka Perkov <luka@openwrt.org> | 2014-02-11 02:07:41 +0000 |
---|---|---|
committer | Luka Perkov <luka@openwrt.org> | 2014-02-11 02:07:41 +0000 |
commit | 3af779eb172b0438f77e8a01a97dd0eb9a146076 (patch) | |
tree | 23838dbde109e79f4c4763dbf78a983aeeefafe1 /target/linux/mvebu/patches-3.10/0123-mtd-nand-pxa3xx-Make-dma-code-dependent-on-dma-capab.patch | |
parent | 69d323f23119ce6986c2803f34d95869144a00e6 (diff) | |
download | upstream-3af779eb172b0438f77e8a01a97dd0eb9a146076.tar.gz upstream-3af779eb172b0438f77e8a01a97dd0eb9a146076.tar.bz2 upstream-3af779eb172b0438f77e8a01a97dd0eb9a146076.zip |
mvebu: backport mainline patches from kernel 3.12
This is a backport of the patches accepted to the Linux mainline related to
mvebu SoC (Armada XP and Armada 370) between Linux v3.11, and Linux v3.12.
This work mainly covers:
* Ground work for sharing the pxa nand driver(drivers/mtd/nand/pxa3xx_nand.c)
between the PXA family,and the Armada family.
* Further updates to the mvebu MBus.
* Work and ground work for enabling MSI on the Armada family.
* some phy / mdio bus initialization related work.
* Device tree binding documentation update.
Signed-off-by: Seif Mazareeb <seif.mazareeb@gmail.com>
CC: Luka Perkov <luka@openwrt.org>
SVN-Revision: 39565
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.patch | 106 |
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 0000000000..87bec0cd10 --- /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; |