[PATCH 3/3] dmaengine: at_hdmac: add slave config operation
Nicolas Ferre
nicolas.ferre at atmel.com
Tue Jun 28 07:17:57 EDT 2011
Only change source/destination peripheral register access width.
Signed-off-by: Nicolas Ferre <nicolas.ferre at atmel.com>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
---
drivers/dma/at_hdmac.c | 29 +++++++++++++++++++++++++++++
1 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
index 7096adb..9cb8044 100644
--- a/drivers/dma/at_hdmac.c
+++ b/drivers/dma/at_hdmac.c
@@ -954,6 +954,35 @@ static int atc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
clear_bit(ATC_IS_PAUSED, &atchan->status);
spin_unlock_irqrestore(&atchan->lock, flags);
+ } else if (cmd == DMA_SLAVE_CONFIG) {
+ struct dma_slave_config *dmaengine_cfg = (void *)arg;
+ struct at_dma_slave *atslave = chan->private;
+ enum dma_slave_buswidth sdma_width;
+ enum at_dma_slave_width atdma_width;
+
+ /* only modify transfer size width */
+ if (!atslave)
+ return -ENXIO;
+
+ if (dmaengine_cfg->direction == DMA_FROM_DEVICE)
+ sdma_width = dmaengine_cfg->src_addr_width;
+ else
+ sdma_width = dmaengine_cfg->dst_addr_width;
+
+ switch (sdma_width) {
+ case DMA_SLAVE_BUSWIDTH_1_BYTE:
+ atdma_width = AT_DMA_SLAVE_WIDTH_8BIT;
+ break;
+ case DMA_SLAVE_BUSWIDTH_2_BYTES:
+ atdma_width = AT_DMA_SLAVE_WIDTH_16BIT;
+ break;
+ case DMA_SLAVE_BUSWIDTH_4_BYTES:
+ atdma_width = AT_DMA_SLAVE_WIDTH_32BIT;
+ break;
+ default:
+ return -EINVAL;
+ }
+ atslave->reg_width = atdma_width;
} else if (cmd == DMA_TERMINATE_ALL) {
struct at_desc *desc, *_desc;
/*
--
1.7.3
More information about the linux-arm-kernel
mailing list