diff options
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.patch | 70 |
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 + |