|
@@ -2855,6 +2855,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)
|
|
|
{
|
|
@@ -2959,6 +2985,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) {
|