Browse Source

DMA: PL330: Update PL330 DMA API driver

This patch updates following 3 items.
1. Removes unneccessary code.
2. Add AMBA, PL330 configuration
3. Change the meaning of 'peri_id' variable
   from PL330 event number to specific dma id by user.

Signed-off-by: Boojin Kim <boojin.kim@samsung.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Vinod Koul <vinod.koul@intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Boojin Kim 14 years ago
parent
commit
1b9bb715e7
3 changed files with 12 additions and 11 deletions
  1. 2 1
      drivers/dma/Kconfig
  2. 9 5
      drivers/dma/pl330.c
  3. 1 5
      include/linux/amba/pl330.h

+ 2 - 1
drivers/dma/Kconfig

@@ -193,7 +193,8 @@ config ARCH_HAS_ASYNC_TX_FIND_CHANNEL
 config PL330_DMA
 config PL330_DMA
 	tristate "DMA API Driver for PL330"
 	tristate "DMA API Driver for PL330"
 	select DMA_ENGINE
 	select DMA_ENGINE
-	depends on PL330
+	depends on ARM_AMBA
+	select PL330
 	help
 	help
 	  Select if your platform has one or more PL330 DMACs.
 	  Select if your platform has one or more PL330 DMACs.
 	  You need to provide platform specific settings via
 	  You need to provide platform specific settings via

+ 9 - 5
drivers/dma/pl330.c

@@ -18,6 +18,7 @@
 #include <linux/amba/bus.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/pl330.h>
 #include <linux/amba/pl330.h>
 #include <linux/pm_runtime.h>
 #include <linux/pm_runtime.h>
+#include <linux/scatterlist.h>
 
 
 #define NR_DEFAULT_DESC	16
 #define NR_DEFAULT_DESC	16
 
 
@@ -69,6 +70,10 @@ struct dma_pl330_chan {
 	 * NULL if the channel is available to be acquired.
 	 * NULL if the channel is available to be acquired.
 	 */
 	 */
 	void *pl330_chid;
 	void *pl330_chid;
+
+	/* For D-to-M and M-to-D channels */
+	int burst_sz; /* the peripheral fifo width */
+	dma_addr_t fifo_addr;
 };
 };
 
 
 struct dma_pl330_dmac {
 struct dma_pl330_dmac {
@@ -456,7 +461,7 @@ static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan *pch)
 
 
 	if (peri) {
 	if (peri) {
 		desc->req.rqtype = peri->rqtype;
 		desc->req.rqtype = peri->rqtype;
-		desc->req.peri = peri->peri_id;
+		desc->req.peri = pch->chan.chan_id;
 	} else {
 	} else {
 		desc->req.rqtype = MEMTOMEM;
 		desc->req.rqtype = MEMTOMEM;
 		desc->req.peri = 0;
 		desc->req.peri = 0;
@@ -582,7 +587,7 @@ pl330_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 	struct dma_pl330_peri *peri = chan->private;
 	struct dma_pl330_peri *peri = chan->private;
 	struct scatterlist *sg;
 	struct scatterlist *sg;
 	unsigned long flags;
 	unsigned long flags;
-	int i, burst_size;
+	int i;
 	dma_addr_t addr;
 	dma_addr_t addr;
 
 
 	if (unlikely(!pch || !sgl || !sg_len || !peri))
 	if (unlikely(!pch || !sgl || !sg_len || !peri))
@@ -598,8 +603,7 @@ pl330_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 		return NULL;
 		return NULL;
 	}
 	}
 
 
-	addr = peri->fifo_addr;
-	burst_size = peri->burst_sz;
+	addr = pch->fifo_addr;
 
 
 	first = NULL;
 	first = NULL;
 
 
@@ -647,7 +651,7 @@ pl330_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
 				sg_dma_address(sg), addr, sg_dma_len(sg));
 				sg_dma_address(sg), addr, sg_dma_len(sg));
 		}
 		}
 
 
-		desc->rqcfg.brst_size = burst_size;
+		desc->rqcfg.brst_size = pch->burst_sz;
 		desc->rqcfg.brst_len = 1;
 		desc->rqcfg.brst_len = 1;
 	}
 	}
 
 

+ 1 - 5
include/linux/amba/pl330.h

@@ -19,12 +19,8 @@ struct dma_pl330_peri {
 	 * Peri_Req i/f of the DMAC that is
 	 * Peri_Req i/f of the DMAC that is
 	 * peripheral could be reached from.
 	 * peripheral could be reached from.
 	 */
 	 */
-	u8 peri_id; /* {0, 31} */
+	u8 peri_id; /* specific dma id */
 	enum pl330_reqtype rqtype;
 	enum pl330_reqtype rqtype;
-
-	/* For M->D and D->M Channels */
-	int burst_sz; /* in power of 2 */
-	dma_addr_t fifo_addr;
 };
 };
 
 
 struct dma_pl330_platdata {
 struct dma_pl330_platdata {