summaryrefslogtreecommitdiff
path: root/patches.tizen/0791-dma-pl330-Implement-device_slave_caps.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0791-dma-pl330-Implement-device_slave_caps.patch')
-rw-r--r--patches.tizen/0791-dma-pl330-Implement-device_slave_caps.patch70
1 files changed, 70 insertions, 0 deletions
diff --git a/patches.tizen/0791-dma-pl330-Implement-device_slave_caps.patch b/patches.tizen/0791-dma-pl330-Implement-device_slave_caps.patch
new file mode 100644
index 00000000000..75d1e9ac154
--- /dev/null
+++ b/patches.tizen/0791-dma-pl330-Implement-device_slave_caps.patch
@@ -0,0 +1,70 @@
+From 6fec572c1415a90551592331128ab310adb29194 Mon Sep 17 00:00:00 2001
+From: Lars-Peter Clausen <lars@metafoo.de>
+Date: Mon, 15 Jul 2013 17:53:08 +0200
+Subject: [PATCH 0791/1302] dma: pl330: Implement device_slave_caps
+
+Implement the device_slave_caps() callback for the pl330 driver. This allows
+dmaengine users like the generic ALSA dmaengine PCM driver to query the
+capabilities of the driver. The PL330 supports all buswidths and both
+mem-to-dev as well as dev-to-mem transfers. In theory there is no limit on the
+number of segments that can be transferred (in practice you'll run out of memory
+eventually) and the number of bytes per segment is limited by the size of the
+PL330 program buffer. Due to the nature of the PL330 the maximum number of bytes
+per segment depends on the burstsize, the driver sets it to the value for a
+1-byte burstsize, since it is the smallest.
+
+Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/dma/pl330.c | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
+index fa645d8..4ad13eb 100644
+--- a/drivers/dma/pl330.c
++++ b/drivers/dma/pl330.c
+@@ -2896,6 +2896,32 @@ static irqreturn_t pl330_irq_handler(int irq, void *data)
+ return IRQ_NONE;
+ }
+
++#define PL330_DMA_BUSWIDTHS \
++ BIT(DMA_SLAVE_BUSWIDTH_UNDEFINED) | \
++ BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \
++ BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \
++ BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | \
++ BIT(DMA_SLAVE_BUSWIDTH_8_BYTES)
++
++static int pl330_dma_device_slave_caps(struct dma_chan *dchan,
++ struct dma_slave_caps *caps)
++{
++ caps->src_addr_widths = PL330_DMA_BUSWIDTHS;
++ caps->dstn_addr_widths = PL330_DMA_BUSWIDTHS;
++ caps->directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
++ caps->cmd_pause = false;
++ caps->cmd_terminate = true;
++
++ /*
++ * This is the limit for transfers with a buswidth of 1, larger
++ * buswidths will have larger limits.
++ */
++ caps->max_sg_len = 1900800;
++ caps->max_sg_nr = 0;
++
++ return 0;
++}
++
+ static int
+ pl330_probe(struct amba_device *adev, const struct amba_id *id)
+ {
+@@ -3000,6 +3026,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
+ pd->device_prep_slave_sg = pl330_prep_slave_sg;
+ pd->device_control = pl330_control;
+ pd->device_issue_pending = pl330_issue_pending;
++ pd->device_slave_caps = pl330_dma_device_slave_caps;
+
+ ret = dma_async_device_register(pd);
+ if (ret) {
+--
+1.8.3.2
+