mtd: lpc32xx_mlc: Make driver independent of AMBA DMA engine driver
authorRoland Stigge <stigge@antcom.de>
Thu, 16 Aug 2012 13:15:35 +0000 (15:15 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Sat, 29 Sep 2012 13:53:08 +0000 (14:53 +0100)
This patch makes the MLC NAND driver independent of the single AMBA DMA engine
driver by using the platform data provided dma_filter callback.

Signed-off-by: Roland Stigge <stigge@antcom.de>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/lpc32xx_mlc.c
include/linux/mtd/lpc32xx_mlc.h [new file with mode: 0644]

index 1cf35932a4d5c7b987672f2aa129c5c38f78dfe2..5da31795b693552f4fd39bfaf4c4ffb271026808 100644 (file)
@@ -37,7 +37,7 @@
 #include <linux/of.h>
 #include <linux/of_mtd.h>
 #include <linux/of_gpio.h>
-#include <linux/amba/pl08x.h>
+#include <linux/mtd/lpc32xx_mlc.h>
 #include <linux/io.h>
 #include <linux/mm.h>
 #include <linux/dma-mapping.h>
@@ -171,6 +171,7 @@ static struct nand_bbt_descr lpc32xx_nand_bbt_mirror = {
 
 struct lpc32xx_nand_host {
        struct nand_chip        nand_chip;
+       struct lpc32xx_mlc_platform_data *pdata;
        struct clk              *clk;
        struct mtd_info         mtd;
        void __iomem            *io_base;
@@ -581,9 +582,15 @@ static int lpc32xx_dma_setup(struct lpc32xx_nand_host *host)
        struct mtd_info *mtd = &host->mtd;
        dma_cap_mask_t mask;
 
+       if (!host->pdata || !host->pdata->dma_filter) {
+               dev_err(mtd->dev.parent, "no DMA platform data\n");
+               return -ENOENT;
+       }
+
        dma_cap_zero(mask);
        dma_cap_set(DMA_SLAVE, mask);
-       host->dma_chan = dma_request_channel(mask, pl08x_filter_id, "nand-mlc");
+       host->dma_chan = dma_request_channel(mask, host->pdata->dma_filter,
+                                            "nand-mlc");
        if (!host->dma_chan) {
                dev_err(mtd->dev.parent, "Failed to request DMA channel\n");
                return -EBUSY;
@@ -703,6 +710,8 @@ static int __devinit lpc32xx_nand_probe(struct platform_device *pdev)
        }
        lpc32xx_wp_disable(host);
 
+       host->pdata = pdev->dev.platform_data;
+
        nand_chip->priv = host;         /* link the private data structures */
        mtd->priv = nand_chip;
        mtd->owner = THIS_MODULE;
diff --git a/include/linux/mtd/lpc32xx_mlc.h b/include/linux/mtd/lpc32xx_mlc.h
new file mode 100644 (file)
index 0000000..d91b1e3
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Platform data for LPC32xx SoC MLC NAND controller
+ *
+ * Copyright © 2012 Roland Stigge
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __LINUX_MTD_LPC32XX_MLC_H
+#define __LINUX_MTD_LPC32XX_MLC_H
+
+#include <linux/dmaengine.h>
+
+struct lpc32xx_mlc_platform_data {
+       bool (*dma_filter)(struct dma_chan *chan, void *filter_param);
+};
+
+#endif  /* __LINUX_MTD_LPC32XX_MLC_H */