All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Mack <zonque@gmail.com>
To: haojian.zhuang@linaro.org, eric.y.miao@gmail.com,
	linux-arm-kernel@lists.infradead.org
Cc: mark.rutland@arm.com, s.neumann@raumfeld.com,
	linux-mtd@lists.infradead.org, Daniel Mack <zonque@gmail.com>,
	cxie4@marvell.com, lars@metafoo.de, nico@linaro.org,
	vinod.koul@intel.com, marek.vasut@gmail.com,
	ezequiel.garcia@free-electrons.com, rmk+kernel@arm.linux.org.uk,
	devicetree@vger.kernel.org, samuel@sortiz.org, arnd@arndb.de,
	broonie@kernel.org, mika.westerberg@linux.intel.com,
	thomas.petazzoni@free-electrons.com, gregkh@linuxfoundation.org,
	g.liakhovetski@gmx.de, sachin.kamat@linaro.org,
	kernel@pengutronix.de, djbw@fb.com, davem@davemloft.net
Subject: [PATCH 12/20] net: smc911x.c: switch to dmaengine API
Date: Wed,  7 Aug 2013 17:34:01 +0200	[thread overview]
Message-ID: <1375889649-14638-13-git-send-email-zonque@gmail.com> (raw)
In-Reply-To: <1375889649-14638-1-git-send-email-zonque@gmail.com>

Drop all PXA-DMA specific implementation details and switch over to
generic dmaengine usage.

This patch is only compile-tested.

Signed-off-by: Daniel Mack <zonque@gmail.com>
---
 drivers/net/ethernet/smsc/smc911x.c | 80 ++++++++++++++++++++++-------------
 drivers/net/ethernet/smsc/smc911x.h | 83 ++++++++++++++++++++-----------------
 2 files changed, 98 insertions(+), 65 deletions(-)

diff --git a/drivers/net/ethernet/smsc/smc911x.c b/drivers/net/ethernet/smsc/smc911x.c
index 345558f..19cdf8f 100644
--- a/drivers/net/ethernet/smsc/smc911x.c
+++ b/drivers/net/ethernet/smsc/smc911x.c
@@ -1178,9 +1178,9 @@ static irqreturn_t smc911x_interrupt(int irq, void *dev_id)
 
 #ifdef SMC_USE_DMA
 static void
-smc911x_tx_dma_irq(int dma, void *data)
+smc911x_tx_dma_irq(void *param)
 {
-	struct net_device *dev = (struct net_device *)data;
+	struct net_device *dev = (struct net_device *) param;
 	struct smc911x_local *lp = netdev_priv(dev);
 	struct sk_buff *skb = lp->current_tx_skb;
 	unsigned long flags;
@@ -1189,7 +1189,6 @@ smc911x_tx_dma_irq(int dma, void *data)
 
 	DBG(SMC_DEBUG_TX | SMC_DEBUG_DMA, "%s: TX DMA irq handler\n", dev->name);
 	/* Clear the DMA interrupt sources */
-	SMC_DMA_ACK_IRQ(dev, dma);
 	BUG_ON(skb == NULL);
 	dma_unmap_single(NULL, tx_dmabuf, tx_dmalen, DMA_TO_DEVICE);
 	dev->trans_start = jiffies;
@@ -1212,10 +1211,9 @@ smc911x_tx_dma_irq(int dma, void *data)
 		"%s: TX DMA irq completed\n", dev->name);
 }
 static void
-smc911x_rx_dma_irq(int dma, void *data)
+smc911x_rx_dma_irq(void *param)
 {
-	struct net_device *dev = (struct net_device *)data;
-	unsigned long ioaddr = dev->base_addr;
+	struct net_device *dev = (struct net_device *) param;
 	struct smc911x_local *lp = netdev_priv(dev);
 	struct sk_buff *skb = lp->current_rx_skb;
 	unsigned long flags;
@@ -1224,7 +1222,6 @@ smc911x_rx_dma_irq(int dma, void *data)
 	DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __func__);
 	DBG(SMC_DEBUG_RX | SMC_DEBUG_DMA, "%s: RX DMA irq handler\n", dev->name);
 	/* Clear the DMA interrupt sources */
-	SMC_DMA_ACK_IRQ(dev, dma);
 	dma_unmap_single(NULL, rx_dmabuf, rx_dmalen, DMA_FROM_DEVICE);
 	BUG_ON(skb == NULL);
 	lp->current_rx_skb = NULL;
@@ -1754,6 +1751,37 @@ static int smc911x_findirq(struct net_device *dev)
 	return probe_irq_off(cookie);
 }
 
+#ifdef SMC_USE_DMA
+static void smc_alloc_dma(struct net_device *dev,
+			  struct smc911x_local *lp)
+{
+	dma_cap_mask_t mask;
+
+	dma_cap_zero(mask);
+	dma_cap_set(DMA_MEMCPY, mask);
+
+	lp->rxdma = dma_request_channel(mask, NULL, NULL);
+	if (!lp->rxdma) {
+		printk("%s(): unable to allocate RX channel\n", __func__);
+		return;
+	}
+
+	lp->txdma = dma_request_channel(mask, NULL, NULL);
+	if (!lp->txdma) {
+		printk("%s(): unable to allocate TX channel\n", __func__);
+		return;
+	}
+
+	lp->rxdma_active = 0;
+	lp->txdma_active = 0;
+}
+#else
+static inline void smc_alloc_dma(struct net_device *dev,
+				 struct smc911x_local *lp)
+{
+}
+#endif
+
 static const struct net_device_ops smc911x_netdev_ops = {
 	.ndo_open		= smc911x_open,
 	.ndo_stop		= smc911x_close,
@@ -1969,13 +1997,7 @@ static int smc911x_probe(struct net_device *dev)
 	if (retval)
 		goto err_out;
 
-#ifdef SMC_USE_DMA
-	lp->rxdma = SMC_DMA_REQUEST(dev, smc911x_rx_dma_irq);
-	lp->txdma = SMC_DMA_REQUEST(dev, smc911x_tx_dma_irq);
-	lp->rxdma_active = 0;
-	lp->txdma_active = 0;
-	dev->dma = lp->rxdma;
-#endif
+	smc_alloc_dma(dev, lp);
 
 	retval = register_netdev(dev);
 	if (retval == 0) {
@@ -1985,11 +2007,11 @@ static int smc911x_probe(struct net_device *dev)
 			dev->base_addr, dev->irq);
 
 #ifdef SMC_USE_DMA
-		if (lp->rxdma != -1)
-			printk(" RXDMA %d ", lp->rxdma);
+		if (lp->rxdma)
+			printk(" RXDMA %p", lp->rxdma);
 
-		if (lp->txdma != -1)
-			printk("TXDMA %d", lp->txdma);
+		if (lp->txdma)
+			printk("TXDMA %p", lp->txdma);
 #endif
 		printk("\n");
 		if (!is_valid_ether_addr(dev->dev_addr)) {
@@ -2013,11 +2035,14 @@ static int smc911x_probe(struct net_device *dev)
 err_out:
 #ifdef SMC_USE_DMA
 	if (retval) {
-		if (lp->rxdma != -1) {
-			SMC_DMA_FREE(dev, lp->rxdma);
+		if (lp->rxdma) {
+			dmaengine_terminate_all(lp->rxdma);
+			dma_release_channel(lp->rxdma);
 		}
-		if (lp->txdma != -1) {
-			SMC_DMA_FREE(dev, lp->txdma);
+
+		if (lp->txdma) {
+			dmaengine_terminate_all(lp->txdma);
+			dma_release_channel(lp->txdma);
 		}
 	}
 #endif
@@ -2119,12 +2144,11 @@ static int smc911x_drv_remove(struct platform_device *pdev)
 
 #ifdef SMC_USE_DMA
 	{
-		if (lp->rxdma != -1) {
-			SMC_DMA_FREE(dev, lp->rxdma);
-		}
-		if (lp->txdma != -1) {
-			SMC_DMA_FREE(dev, lp->txdma);
-		}
+		if (lp->rxdma)
+			dma_release_channel(lp->rxdma);
+
+		if (lp->txdma)
+			dma_release_channel(lp->txdma);
 	}
 #endif
 	iounmap(lp->base);
diff --git a/drivers/net/ethernet/smsc/smc911x.h b/drivers/net/ethernet/smsc/smc911x.h
index d51261b..9323f1d 100644
--- a/drivers/net/ethernet/smsc/smc911x.h
+++ b/drivers/net/ethernet/smsc/smc911x.h
@@ -29,6 +29,7 @@
 #ifndef _SMC911X_H_
 #define _SMC911X_H_
 
+#include <linux/dmaengine.h>
 #include <linux/smc911x.h>
 /*
  * Use the DMA feature on PXA chips
@@ -102,8 +103,8 @@ struct smc911x_local {
 #ifdef SMC_USE_DMA
 	/* DMA needs the physical address of the chip */
 	u_long physaddr;
-	int rxdma;
-	int txdma;
+	struct dma_chan	*rxdma;
+	struct dma_chan *txdma;
 	int rxdma_active;
 	int txdma_active;
 	struct sk_buff *current_rx_skb;
@@ -211,27 +212,6 @@ static inline void SMC_outsl(struct smc911x_local *lp, int reg,
 
 #ifdef SMC_USE_PXA_DMA
 
-#include <mach/dma.h>
-
-/*
- * Define the request and free functions
- * These are unfortunately architecture specific as no generic allocation
- * mechanism exits
- */
-#define SMC_DMA_REQUEST(dev, handler) \
-	 pxa_request_dma(dev->name, DMA_PRIO_LOW, handler, dev)
-
-#define SMC_DMA_FREE(dev, dma) \
-	 pxa_free_dma(dma)
-
-#define SMC_DMA_ACK_IRQ(dev, dma)					\
-{									\
-	if (DCSR(dma) & DCSR_BUSERR) {					\
-		printk("%s: DMA %d bus error!\n", dev->name, dma);	\
-	}								\
-	DCSR(dma) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR;		\
-}
-
 /*
  * Use a DMA for RX and TX packets.
  */
@@ -240,6 +220,9 @@ static inline void SMC_outsl(struct smc911x_local *lp, int reg,
 static dma_addr_t rx_dmabuf, tx_dmabuf;
 static int rx_dmalen, tx_dmalen;
 
+static void smc911x_tx_dma_irq(void *param);
+static void smc911x_rx_dma_irq(void *param);
+
 #ifdef SMC_insl
 #undef SMC_insl
 #define SMC_insl(lp, r, p, l) \
@@ -247,8 +230,17 @@ static int rx_dmalen, tx_dmalen;
 
 static inline void
 smc_pxa_dma_insl(struct smc911x_local *lp, u_long physaddr,
-		int reg, int dma, u_char *buf, int len)
+		int reg, struct dma_chan *chan, u_char *buf, int len)
 {
+	struct dma_async_tx_descriptor *tx;
+	struct dma_slave_config conf;
+
+	memset(&conf, 0, sizeof(conf));
+
+	conf.direction = DMA_DEV_TO_MEM;
+	conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	conf.src_maxburst = 32;
+
 	/* 64 bit alignment is required for memory to memory DMA */
 	if ((long)buf & 4) {
 		*((u32 *)buf) = SMC_inl(lp, reg);
@@ -259,12 +251,16 @@ smc_pxa_dma_insl(struct smc911x_local *lp, u_long physaddr,
 	len *= 4;
 	rx_dmabuf = dma_map_single(lp->dev, buf, len, DMA_FROM_DEVICE);
 	rx_dmalen = len;
-	DCSR(dma) = DCSR_NODESC;
-	DTADR(dma) = rx_dmabuf;
-	DSADR(dma) = physaddr + reg;
-	DCMD(dma) = (DCMD_INCTRGADDR | DCMD_BURST32 |
-		DCMD_WIDTH4 | DCMD_ENDIRQEN | (DCMD_LENGTH & rx_dmalen));
-	DCSR(dma) = DCSR_NODESC | DCSR_RUN;
+
+	dmaengine_slave_config(chan, &conf);
+	tx = chan->device->device_prep_dma_memcpy(chan, rx_dmabuf,
+						  physaddr + reg, len, 0);
+
+	tx->callback = smc911x_rx_dma_irq;
+	tx->callback_param = lp->netdev;
+
+	dmaengine_submit(tx);
+	dma_async_issue_pending(chan);
 }
 #endif
 
@@ -275,8 +271,17 @@ smc_pxa_dma_insl(struct smc911x_local *lp, u_long physaddr,
 
 static inline void
 smc_pxa_dma_outsl(struct smc911x_local *lp, u_long physaddr,
-		int reg, int dma, u_char *buf, int len)
+		int reg, struct dma_chan *chan, u_char *buf, int len)
 {
+	struct dma_async_tx_descriptor *tx;
+	struct dma_slave_config conf;
+
+	memset(&conf, 0, sizeof(conf));
+
+	conf.direction = DMA_MEM_TO_DEV;
+	conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	conf.dst_maxburst = 32;
+
 	/* 64 bit alignment is required for memory to memory DMA */
 	if ((long)buf & 4) {
 		SMC_outl(*((u32 *)buf), lp, reg);
@@ -287,12 +292,16 @@ smc_pxa_dma_outsl(struct smc911x_local *lp, u_long physaddr,
 	len *= 4;
 	tx_dmabuf = dma_map_single(lp->dev, buf, len, DMA_TO_DEVICE);
 	tx_dmalen = len;
-	DCSR(dma) = DCSR_NODESC;
-	DSADR(dma) = tx_dmabuf;
-	DTADR(dma) = physaddr + reg;
-	DCMD(dma) = (DCMD_INCSRCADDR | DCMD_BURST32 |
-		DCMD_WIDTH4 | DCMD_ENDIRQEN | (DCMD_LENGTH & tx_dmalen));
-	DCSR(dma) = DCSR_NODESC | DCSR_RUN;
+
+	dmaengine_slave_config(chan, &conf);
+	tx = chan->device->device_prep_dma_memcpy(chan, physaddr + reg,
+						  tx_dmabuf, len, 0);
+
+	tx->callback = smc911x_tx_dma_irq;
+	tx->callback_param = lp->netdev;
+
+	dmaengine_submit(tx);
+	dma_async_issue_pending(chan);
 }
 #endif
 #endif	 /* SMC_USE_PXA_DMA */
-- 
1.8.3.1

WARNING: multiple messages have this Message-ID (diff)
From: zonque@gmail.com (Daniel Mack)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 12/20] net: smc911x.c: switch to dmaengine API
Date: Wed,  7 Aug 2013 17:34:01 +0200	[thread overview]
Message-ID: <1375889649-14638-13-git-send-email-zonque@gmail.com> (raw)
In-Reply-To: <1375889649-14638-1-git-send-email-zonque@gmail.com>

Drop all PXA-DMA specific implementation details and switch over to
generic dmaengine usage.

This patch is only compile-tested.

Signed-off-by: Daniel Mack <zonque@gmail.com>
---
 drivers/net/ethernet/smsc/smc911x.c | 80 ++++++++++++++++++++++-------------
 drivers/net/ethernet/smsc/smc911x.h | 83 ++++++++++++++++++++-----------------
 2 files changed, 98 insertions(+), 65 deletions(-)

diff --git a/drivers/net/ethernet/smsc/smc911x.c b/drivers/net/ethernet/smsc/smc911x.c
index 345558f..19cdf8f 100644
--- a/drivers/net/ethernet/smsc/smc911x.c
+++ b/drivers/net/ethernet/smsc/smc911x.c
@@ -1178,9 +1178,9 @@ static irqreturn_t smc911x_interrupt(int irq, void *dev_id)
 
 #ifdef SMC_USE_DMA
 static void
-smc911x_tx_dma_irq(int dma, void *data)
+smc911x_tx_dma_irq(void *param)
 {
-	struct net_device *dev = (struct net_device *)data;
+	struct net_device *dev = (struct net_device *) param;
 	struct smc911x_local *lp = netdev_priv(dev);
 	struct sk_buff *skb = lp->current_tx_skb;
 	unsigned long flags;
@@ -1189,7 +1189,6 @@ smc911x_tx_dma_irq(int dma, void *data)
 
 	DBG(SMC_DEBUG_TX | SMC_DEBUG_DMA, "%s: TX DMA irq handler\n", dev->name);
 	/* Clear the DMA interrupt sources */
-	SMC_DMA_ACK_IRQ(dev, dma);
 	BUG_ON(skb == NULL);
 	dma_unmap_single(NULL, tx_dmabuf, tx_dmalen, DMA_TO_DEVICE);
 	dev->trans_start = jiffies;
@@ -1212,10 +1211,9 @@ smc911x_tx_dma_irq(int dma, void *data)
 		"%s: TX DMA irq completed\n", dev->name);
 }
 static void
-smc911x_rx_dma_irq(int dma, void *data)
+smc911x_rx_dma_irq(void *param)
 {
-	struct net_device *dev = (struct net_device *)data;
-	unsigned long ioaddr = dev->base_addr;
+	struct net_device *dev = (struct net_device *) param;
 	struct smc911x_local *lp = netdev_priv(dev);
 	struct sk_buff *skb = lp->current_rx_skb;
 	unsigned long flags;
@@ -1224,7 +1222,6 @@ smc911x_rx_dma_irq(int dma, void *data)
 	DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __func__);
 	DBG(SMC_DEBUG_RX | SMC_DEBUG_DMA, "%s: RX DMA irq handler\n", dev->name);
 	/* Clear the DMA interrupt sources */
-	SMC_DMA_ACK_IRQ(dev, dma);
 	dma_unmap_single(NULL, rx_dmabuf, rx_dmalen, DMA_FROM_DEVICE);
 	BUG_ON(skb == NULL);
 	lp->current_rx_skb = NULL;
@@ -1754,6 +1751,37 @@ static int smc911x_findirq(struct net_device *dev)
 	return probe_irq_off(cookie);
 }
 
+#ifdef SMC_USE_DMA
+static void smc_alloc_dma(struct net_device *dev,
+			  struct smc911x_local *lp)
+{
+	dma_cap_mask_t mask;
+
+	dma_cap_zero(mask);
+	dma_cap_set(DMA_MEMCPY, mask);
+
+	lp->rxdma = dma_request_channel(mask, NULL, NULL);
+	if (!lp->rxdma) {
+		printk("%s(): unable to allocate RX channel\n", __func__);
+		return;
+	}
+
+	lp->txdma = dma_request_channel(mask, NULL, NULL);
+	if (!lp->txdma) {
+		printk("%s(): unable to allocate TX channel\n", __func__);
+		return;
+	}
+
+	lp->rxdma_active = 0;
+	lp->txdma_active = 0;
+}
+#else
+static inline void smc_alloc_dma(struct net_device *dev,
+				 struct smc911x_local *lp)
+{
+}
+#endif
+
 static const struct net_device_ops smc911x_netdev_ops = {
 	.ndo_open		= smc911x_open,
 	.ndo_stop		= smc911x_close,
@@ -1969,13 +1997,7 @@ static int smc911x_probe(struct net_device *dev)
 	if (retval)
 		goto err_out;
 
-#ifdef SMC_USE_DMA
-	lp->rxdma = SMC_DMA_REQUEST(dev, smc911x_rx_dma_irq);
-	lp->txdma = SMC_DMA_REQUEST(dev, smc911x_tx_dma_irq);
-	lp->rxdma_active = 0;
-	lp->txdma_active = 0;
-	dev->dma = lp->rxdma;
-#endif
+	smc_alloc_dma(dev, lp);
 
 	retval = register_netdev(dev);
 	if (retval == 0) {
@@ -1985,11 +2007,11 @@ static int smc911x_probe(struct net_device *dev)
 			dev->base_addr, dev->irq);
 
 #ifdef SMC_USE_DMA
-		if (lp->rxdma != -1)
-			printk(" RXDMA %d ", lp->rxdma);
+		if (lp->rxdma)
+			printk(" RXDMA %p", lp->rxdma);
 
-		if (lp->txdma != -1)
-			printk("TXDMA %d", lp->txdma);
+		if (lp->txdma)
+			printk("TXDMA %p", lp->txdma);
 #endif
 		printk("\n");
 		if (!is_valid_ether_addr(dev->dev_addr)) {
@@ -2013,11 +2035,14 @@ static int smc911x_probe(struct net_device *dev)
 err_out:
 #ifdef SMC_USE_DMA
 	if (retval) {
-		if (lp->rxdma != -1) {
-			SMC_DMA_FREE(dev, lp->rxdma);
+		if (lp->rxdma) {
+			dmaengine_terminate_all(lp->rxdma);
+			dma_release_channel(lp->rxdma);
 		}
-		if (lp->txdma != -1) {
-			SMC_DMA_FREE(dev, lp->txdma);
+
+		if (lp->txdma) {
+			dmaengine_terminate_all(lp->txdma);
+			dma_release_channel(lp->txdma);
 		}
 	}
 #endif
@@ -2119,12 +2144,11 @@ static int smc911x_drv_remove(struct platform_device *pdev)
 
 #ifdef SMC_USE_DMA
 	{
-		if (lp->rxdma != -1) {
-			SMC_DMA_FREE(dev, lp->rxdma);
-		}
-		if (lp->txdma != -1) {
-			SMC_DMA_FREE(dev, lp->txdma);
-		}
+		if (lp->rxdma)
+			dma_release_channel(lp->rxdma);
+
+		if (lp->txdma)
+			dma_release_channel(lp->txdma);
 	}
 #endif
 	iounmap(lp->base);
diff --git a/drivers/net/ethernet/smsc/smc911x.h b/drivers/net/ethernet/smsc/smc911x.h
index d51261b..9323f1d 100644
--- a/drivers/net/ethernet/smsc/smc911x.h
+++ b/drivers/net/ethernet/smsc/smc911x.h
@@ -29,6 +29,7 @@
 #ifndef _SMC911X_H_
 #define _SMC911X_H_
 
+#include <linux/dmaengine.h>
 #include <linux/smc911x.h>
 /*
  * Use the DMA feature on PXA chips
@@ -102,8 +103,8 @@ struct smc911x_local {
 #ifdef SMC_USE_DMA
 	/* DMA needs the physical address of the chip */
 	u_long physaddr;
-	int rxdma;
-	int txdma;
+	struct dma_chan	*rxdma;
+	struct dma_chan *txdma;
 	int rxdma_active;
 	int txdma_active;
 	struct sk_buff *current_rx_skb;
@@ -211,27 +212,6 @@ static inline void SMC_outsl(struct smc911x_local *lp, int reg,
 
 #ifdef SMC_USE_PXA_DMA
 
-#include <mach/dma.h>
-
-/*
- * Define the request and free functions
- * These are unfortunately architecture specific as no generic allocation
- * mechanism exits
- */
-#define SMC_DMA_REQUEST(dev, handler) \
-	 pxa_request_dma(dev->name, DMA_PRIO_LOW, handler, dev)
-
-#define SMC_DMA_FREE(dev, dma) \
-	 pxa_free_dma(dma)
-
-#define SMC_DMA_ACK_IRQ(dev, dma)					\
-{									\
-	if (DCSR(dma) & DCSR_BUSERR) {					\
-		printk("%s: DMA %d bus error!\n", dev->name, dma);	\
-	}								\
-	DCSR(dma) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR;		\
-}
-
 /*
  * Use a DMA for RX and TX packets.
  */
@@ -240,6 +220,9 @@ static inline void SMC_outsl(struct smc911x_local *lp, int reg,
 static dma_addr_t rx_dmabuf, tx_dmabuf;
 static int rx_dmalen, tx_dmalen;
 
+static void smc911x_tx_dma_irq(void *param);
+static void smc911x_rx_dma_irq(void *param);
+
 #ifdef SMC_insl
 #undef SMC_insl
 #define SMC_insl(lp, r, p, l) \
@@ -247,8 +230,17 @@ static int rx_dmalen, tx_dmalen;
 
 static inline void
 smc_pxa_dma_insl(struct smc911x_local *lp, u_long physaddr,
-		int reg, int dma, u_char *buf, int len)
+		int reg, struct dma_chan *chan, u_char *buf, int len)
 {
+	struct dma_async_tx_descriptor *tx;
+	struct dma_slave_config conf;
+
+	memset(&conf, 0, sizeof(conf));
+
+	conf.direction = DMA_DEV_TO_MEM;
+	conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	conf.src_maxburst = 32;
+
 	/* 64 bit alignment is required for memory to memory DMA */
 	if ((long)buf & 4) {
 		*((u32 *)buf) = SMC_inl(lp, reg);
@@ -259,12 +251,16 @@ smc_pxa_dma_insl(struct smc911x_local *lp, u_long physaddr,
 	len *= 4;
 	rx_dmabuf = dma_map_single(lp->dev, buf, len, DMA_FROM_DEVICE);
 	rx_dmalen = len;
-	DCSR(dma) = DCSR_NODESC;
-	DTADR(dma) = rx_dmabuf;
-	DSADR(dma) = physaddr + reg;
-	DCMD(dma) = (DCMD_INCTRGADDR | DCMD_BURST32 |
-		DCMD_WIDTH4 | DCMD_ENDIRQEN | (DCMD_LENGTH & rx_dmalen));
-	DCSR(dma) = DCSR_NODESC | DCSR_RUN;
+
+	dmaengine_slave_config(chan, &conf);
+	tx = chan->device->device_prep_dma_memcpy(chan, rx_dmabuf,
+						  physaddr + reg, len, 0);
+
+	tx->callback = smc911x_rx_dma_irq;
+	tx->callback_param = lp->netdev;
+
+	dmaengine_submit(tx);
+	dma_async_issue_pending(chan);
 }
 #endif
 
@@ -275,8 +271,17 @@ smc_pxa_dma_insl(struct smc911x_local *lp, u_long physaddr,
 
 static inline void
 smc_pxa_dma_outsl(struct smc911x_local *lp, u_long physaddr,
-		int reg, int dma, u_char *buf, int len)
+		int reg, struct dma_chan *chan, u_char *buf, int len)
 {
+	struct dma_async_tx_descriptor *tx;
+	struct dma_slave_config conf;
+
+	memset(&conf, 0, sizeof(conf));
+
+	conf.direction = DMA_MEM_TO_DEV;
+	conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	conf.dst_maxburst = 32;
+
 	/* 64 bit alignment is required for memory to memory DMA */
 	if ((long)buf & 4) {
 		SMC_outl(*((u32 *)buf), lp, reg);
@@ -287,12 +292,16 @@ smc_pxa_dma_outsl(struct smc911x_local *lp, u_long physaddr,
 	len *= 4;
 	tx_dmabuf = dma_map_single(lp->dev, buf, len, DMA_TO_DEVICE);
 	tx_dmalen = len;
-	DCSR(dma) = DCSR_NODESC;
-	DSADR(dma) = tx_dmabuf;
-	DTADR(dma) = physaddr + reg;
-	DCMD(dma) = (DCMD_INCSRCADDR | DCMD_BURST32 |
-		DCMD_WIDTH4 | DCMD_ENDIRQEN | (DCMD_LENGTH & tx_dmalen));
-	DCSR(dma) = DCSR_NODESC | DCSR_RUN;
+
+	dmaengine_slave_config(chan, &conf);
+	tx = chan->device->device_prep_dma_memcpy(chan, physaddr + reg,
+						  tx_dmabuf, len, 0);
+
+	tx->callback = smc911x_tx_dma_irq;
+	tx->callback_param = lp->netdev;
+
+	dmaengine_submit(tx);
+	dma_async_issue_pending(chan);
 }
 #endif
 #endif	 /* SMC_USE_PXA_DMA */
-- 
1.8.3.1

  parent reply	other threads:[~2013-08-07 15:34 UTC|newest]

Thread overview: 126+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-07 15:33 [PATCH 00/20] ARM: pxa: move core and drivers to dmaengine Daniel Mack
2013-08-07 15:33 ` Daniel Mack
2013-08-07 15:33 ` [PATCH 01/20] mtd: pxa3xx-nand: replace pxa_request_dma with dmaengine Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-07 17:46   ` Ezequiel Garcia
2013-08-07 17:46     ` Ezequiel Garcia
2013-08-08  6:42     ` Daniel Mack
2013-08-08  6:42       ` Daniel Mack
2013-08-08 10:12       ` Ezequiel Garcia
2013-08-08 10:12         ` Ezequiel Garcia
2013-08-08 10:14         ` Daniel Mack
2013-08-08 10:14           ` Daniel Mack
2013-08-07 15:33 ` [PATCH 02/20] mtd: pxa3xx-nand: use mmp_pdma_filter_fn and dma_request_slave_channel_compat Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-07 15:33 ` [PATCH 03/20] ARM: pxa: ssp: add shortcut for &pdev->dev Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-08  7:32   ` Brian Norris
2013-08-08  7:32     ` Brian Norris
2013-08-08  7:52     ` Artem Bityutskiy
2013-08-08  7:52       ` Artem Bityutskiy
2013-08-08  8:20       ` Daniel Mack
2013-08-08  8:20         ` Daniel Mack
2013-08-07 15:33 ` [PATCH 04/20] ARM: pxa: ssp: add DT bindings Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-07 15:54   ` Arnd Bergmann
2013-08-07 15:54     ` Arnd Bergmann
2013-08-07 15:33 ` [PATCH 05/20] ARM: pxa: ssp: use devm_ functions Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-07 15:33 ` [PATCH 06/20] tty: serial: pxa: remove old cruft Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-12  8:19   ` Daniel Mack
2013-08-12 18:08     ` Greg KH
2013-08-07 15:33 ` [PATCH 07/20] spi: spi-pxa2xx: remove legacy PXA DMA bits Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-07 15:55   ` Mark Brown
2013-08-07 15:55     ` Mark Brown
2013-08-07 15:59     ` Daniel Mack
2013-08-07 15:59       ` Daniel Mack
2013-08-07 16:41       ` Mark Brown
2013-08-07 16:41         ` Mark Brown
2013-08-07 15:33 ` [PATCH 08/20] mmc: host: pxamci: switch over to dmaengine use Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2014-10-15 18:32   ` Vasily Khoruzhick
2014-10-15 18:32     ` Vasily Khoruzhick
2014-10-15 18:32     ` Vasily Khoruzhick
2014-10-16 17:57     ` Vasily Khoruzhick
2014-10-16 17:57       ` Vasily Khoruzhick
2014-10-16 17:57       ` Vasily Khoruzhick
2013-08-07 15:33 ` [PATCH 09/20] ata: pdata_pxa: migrate over to dmaengine usage Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-07 15:59   ` Arnd Bergmann
2013-08-07 15:59     ` Arnd Bergmann
2013-08-07 15:33 ` [PATCH 10/20] net: irda: pxaficp_ir: switch to dmaengine Daniel Mack
2013-08-07 15:33   ` Daniel Mack
2013-08-07 15:34 ` [PATCH 11/20] net: smc91x.c: switch to generic buf-to-buf DMA offload Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 15:34 ` Daniel Mack [this message]
2013-08-07 15:34   ` [PATCH 12/20] net: smc911x.c: switch to dmaengine API Daniel Mack
2013-08-07 15:34 ` [PATCH 13/20] ASoC: pxa: pxa-ssp: add DT bindings Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 16:40   ` Mark Brown
2013-08-07 16:40     ` Mark Brown
2013-08-08  9:39     ` Daniel Mack
2013-08-08  9:39       ` Daniel Mack
2013-08-08 13:20       ` Mark Brown
2013-08-08 13:20         ` Mark Brown
2013-08-09 13:03         ` Daniel Mack
2013-08-09 13:03           ` Daniel Mack
2013-08-07 15:34 ` [PATCH 14/20] ASoC: pxa: use snd_dmaengine_dai_dma_data Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 15:57   ` Mark Brown
2013-08-07 15:57     ` Mark Brown
2013-08-07 15:34 ` [PATCH 15/20] ASoC: pxa: pxa-ssp: set dma filter data from startup hook Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 15:58   ` Mark Brown
2013-08-07 15:58     ` Mark Brown
2013-08-07 15:34 ` [PATCH 16/20] ASoC: pxa: add DT bindings for pxa2xx-pcm Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 16:06   ` Mark Brown
2013-08-07 16:06     ` Mark Brown
2013-08-07 15:34 ` [PATCH 17/20] ASoC: pxa: pxa-pcm-lib: switch over to snd-soc-dmaengine-pcm Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 16:07   ` Mark Brown
2013-08-07 16:07     ` Mark Brown
2013-08-07 16:10     ` Daniel Mack
2013-08-07 16:10       ` Daniel Mack
2013-08-07 16:32       ` Mark Brown
2013-08-07 16:32         ` Mark Brown
2013-08-08  8:18         ` Daniel Mack
2013-08-08  8:18           ` Daniel Mack
2013-08-08  8:44           ` Lars-Peter Clausen
2013-08-08  8:44             ` Lars-Peter Clausen
2013-08-08  9:03             ` Daniel Mack
2013-08-08  9:03               ` Daniel Mack
2013-08-08  9:36               ` Mark Brown
2013-08-08  9:36                 ` Mark Brown
2013-08-08  9:43                 ` Daniel Mack
2013-08-08  9:43                   ` Daniel Mack
2013-08-08 10:35                   ` Mark Brown
2013-08-08 10:35                     ` Mark Brown
2013-08-08 10:39                     ` Daniel Mack
2013-08-08 10:39                       ` Daniel Mack
2013-08-08 11:03                       ` Mark Brown
2013-08-08 11:03                         ` Mark Brown
2013-08-08 10:25                 ` Russell King - ARM Linux
2013-08-08 10:25                   ` Russell King - ARM Linux
2013-08-07 15:34 ` [PATCH 18/20] ARM: pxa: register static mmp_pdma device Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 15:34 ` [PATCH 19/20] ARM: mmp: " Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 15:34 ` [PATCH 20/20] ARM: pxa: remove old DMA implementation Daniel Mack
2013-08-07 15:34   ` Daniel Mack
2013-08-07 16:08 ` [PATCH 00/20] ARM: pxa: move core and drivers to dmaengine Arnd Bergmann
2013-08-07 16:08   ` Arnd Bergmann
2013-08-09 22:50 ` Robert Jarzmik
2013-08-09 22:50   ` Robert Jarzmik
2013-08-10 10:56   ` Daniel Mack
2013-08-10 10:56     ` Daniel Mack
2013-08-11 20:05     ` Robert Jarzmik
2013-08-11 20:05       ` Robert Jarzmik
2013-08-14 10:00     ` Vinod Koul
2013-08-14 10:00       ` Vinod Koul
2013-08-15 15:22       ` Robert Jarzmik
2013-08-15 15:22         ` Robert Jarzmik
2013-08-15 15:30         ` Daniel Mack
2013-08-15 15:30           ` Daniel Mack

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1375889649-14638-13-git-send-email-zonque@gmail.com \
    --to=zonque@gmail.com \
    --cc=arnd@arndb.de \
    --cc=broonie@kernel.org \
    --cc=cxie4@marvell.com \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=djbw@fb.com \
    --cc=eric.y.miao@gmail.com \
    --cc=ezequiel.garcia@free-electrons.com \
    --cc=g.liakhovetski@gmx.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=haojian.zhuang@linaro.org \
    --cc=kernel@pengutronix.de \
    --cc=lars@metafoo.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=marek.vasut@gmail.com \
    --cc=mark.rutland@arm.com \
    --cc=mika.westerberg@linux.intel.com \
    --cc=nico@linaro.org \
    --cc=rmk+kernel@arm.linux.org.uk \
    --cc=s.neumann@raumfeld.com \
    --cc=sachin.kamat@linaro.org \
    --cc=samuel@sortiz.org \
    --cc=thomas.petazzoni@free-electrons.com \
    --cc=vinod.koul@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.