mtd: lpc32xx_mlc: Make driver independent of AMBA DMA engine driver
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>
This commit is contained in:
parent
de20c22d2b
commit
9c6f62a7ef
2 changed files with 31 additions and 2 deletions
|
@ -37,7 +37,7 @@
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_mtd.h>
|
#include <linux/of_mtd.h>
|
||||||
#include <linux/of_gpio.h>
|
#include <linux/of_gpio.h>
|
||||||
#include <linux/amba/pl08x.h>
|
#include <linux/mtd/lpc32xx_mlc.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
|
@ -171,6 +171,7 @@ static struct nand_bbt_descr lpc32xx_nand_bbt_mirror = {
|
||||||
|
|
||||||
struct lpc32xx_nand_host {
|
struct lpc32xx_nand_host {
|
||||||
struct nand_chip nand_chip;
|
struct nand_chip nand_chip;
|
||||||
|
struct lpc32xx_mlc_platform_data *pdata;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct mtd_info mtd;
|
struct mtd_info mtd;
|
||||||
void __iomem *io_base;
|
void __iomem *io_base;
|
||||||
|
@ -581,9 +582,15 @@ static int lpc32xx_dma_setup(struct lpc32xx_nand_host *host)
|
||||||
struct mtd_info *mtd = &host->mtd;
|
struct mtd_info *mtd = &host->mtd;
|
||||||
dma_cap_mask_t mask;
|
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_zero(mask);
|
||||||
dma_cap_set(DMA_SLAVE, 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) {
|
if (!host->dma_chan) {
|
||||||
dev_err(mtd->dev.parent, "Failed to request DMA channel\n");
|
dev_err(mtd->dev.parent, "Failed to request DMA channel\n");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -703,6 +710,8 @@ static int __devinit lpc32xx_nand_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
lpc32xx_wp_disable(host);
|
lpc32xx_wp_disable(host);
|
||||||
|
|
||||||
|
host->pdata = pdev->dev.platform_data;
|
||||||
|
|
||||||
nand_chip->priv = host; /* link the private data structures */
|
nand_chip->priv = host; /* link the private data structures */
|
||||||
mtd->priv = nand_chip;
|
mtd->priv = nand_chip;
|
||||||
mtd->owner = THIS_MODULE;
|
mtd->owner = THIS_MODULE;
|
||||||
|
|
20
include/linux/mtd/lpc32xx_mlc.h
Normal file
20
include/linux/mtd/lpc32xx_mlc.h
Normal file
|
@ -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 */
|
Loading…
Reference in a new issue