aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq806x/patches-4.9/862-dmaengine-qcom-bam_dma-Add-custom-data-mapping.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ipq806x/patches-4.9/862-dmaengine-qcom-bam_dma-Add-custom-data-mapping.patch')
-rw-r--r--target/linux/ipq806x/patches-4.9/862-dmaengine-qcom-bam_dma-Add-custom-data-mapping.patch209
1 files changed, 0 insertions, 209 deletions
diff --git a/target/linux/ipq806x/patches-4.9/862-dmaengine-qcom-bam_dma-Add-custom-data-mapping.patch b/target/linux/ipq806x/patches-4.9/862-dmaengine-qcom-bam_dma-Add-custom-data-mapping.patch
deleted file mode 100644
index 796938f2d0..0000000000
--- a/target/linux/ipq806x/patches-4.9/862-dmaengine-qcom-bam_dma-Add-custom-data-mapping.patch
+++ /dev/null
@@ -1,209 +0,0 @@
-From 5a7ccdf845d64b385affdcffaf2defbe9848be15 Mon Sep 17 00:00:00 2001
-From: Ram Chandra Jangir <rjangir@codeaurora.org>
-Date: Thu, 20 Apr 2017 10:39:00 +0530
-Subject: [PATCH] dmaengine: qcom: bam_dma: Add custom data mapping
-
-Add a new function to support for preparing DMA descriptor
-for custom data.
-
-Signed-off-by: Abhishek Sahu <absahu@codeaurora.org>
-Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
----
- drivers/dma/qcom/bam_dma.c | 97 +++++++++++++++++++++++++++++++++++++---
- include/linux/dma/qcom_bam_dma.h | 14 ++++++
- include/linux/dmaengine.h | 14 ++++++
- 3 files changed, 119 insertions(+), 6 deletions(-)
-
---- a/drivers/dma/qcom/bam_dma.c
-+++ b/drivers/dma/qcom/bam_dma.c
-@@ -49,6 +49,7 @@
- #include <linux/clk.h>
- #include <linux/dmaengine.h>
- #include <linux/pm_runtime.h>
-+#include <linux/dma/qcom_bam_dma.h>
-
- #include "../dmaengine.h"
- #include "../virt-dma.h"
-@@ -61,11 +62,6 @@ struct bam_desc_hw {
-
- #define BAM_DMA_AUTOSUSPEND_DELAY 100
-
--#define DESC_FLAG_INT BIT(15)
--#define DESC_FLAG_EOT BIT(14)
--#define DESC_FLAG_EOB BIT(13)
--#define DESC_FLAG_NWD BIT(12)
--
- struct bam_async_desc {
- struct virt_dma_desc vd;
-
-@@ -670,6 +666,93 @@ err_out:
- }
-
- /**
-+ * bam_prep_dma_custom_mapping - Prep DMA descriptor from custom data
-+ *
-+ * @chan: dma channel
-+ * @data: custom data
-+ * @flags: DMA flags
-+ */
-+static struct dma_async_tx_descriptor *bam_prep_dma_custom_mapping(
-+ struct dma_chan *chan,
-+ void *data, unsigned long flags)
-+{
-+ struct bam_chan *bchan = to_bam_chan(chan);
-+ struct bam_device *bdev = bchan->bdev;
-+ struct bam_async_desc *async_desc;
-+ struct qcom_bam_custom_data *desc_data = data;
-+ u32 i;
-+ struct bam_desc_hw *desc;
-+ unsigned int num_alloc = 0;
-+
-+
-+ if (!is_slave_direction(desc_data->dir)) {
-+ dev_err(bdev->dev, "invalid dma direction\n");
-+ return NULL;
-+ }
-+
-+ /* calculate number of required entries */
-+ for (i = 0; i < desc_data->sgl_cnt; i++)
-+ num_alloc += DIV_ROUND_UP(
-+ sg_dma_len(&desc_data->bam_sgl[i].sgl), BAM_FIFO_SIZE);
-+
-+ /* allocate enough room to accommodate the number of entries */
-+ async_desc = kzalloc(sizeof(*async_desc) +
-+ (num_alloc * sizeof(struct bam_desc_hw)), GFP_NOWAIT);
-+
-+ if (!async_desc)
-+ goto err_out;
-+
-+ if (flags & DMA_PREP_FENCE)
-+ async_desc->flags |= DESC_FLAG_NWD;
-+
-+ if (flags & DMA_PREP_INTERRUPT)
-+ async_desc->flags |= DESC_FLAG_EOT;
-+ else
-+ async_desc->flags |= DESC_FLAG_INT;
-+
-+ async_desc->num_desc = num_alloc;
-+ async_desc->curr_desc = async_desc->desc;
-+ async_desc->dir = desc_data->dir;
-+
-+ /* fill in temporary descriptors */
-+ desc = async_desc->desc;
-+ for (i = 0; i < desc_data->sgl_cnt; i++) {
-+ unsigned int remainder;
-+ unsigned int curr_offset = 0;
-+
-+ remainder = sg_dma_len(&desc_data->bam_sgl[i].sgl);
-+
-+ do {
-+ desc->addr = cpu_to_le32(
-+ sg_dma_address(&desc_data->bam_sgl[i].sgl) +
-+ curr_offset);
-+
-+ if (desc_data->bam_sgl[i].dma_flags)
-+ desc->flags |= cpu_to_le16(
-+ desc_data->bam_sgl[i].dma_flags);
-+
-+ if (remainder > BAM_FIFO_SIZE) {
-+ desc->size = cpu_to_le16(BAM_FIFO_SIZE);
-+ remainder -= BAM_FIFO_SIZE;
-+ curr_offset += BAM_FIFO_SIZE;
-+ } else {
-+ desc->size = cpu_to_le16(remainder);
-+ remainder = 0;
-+ }
-+
-+ async_desc->length += desc->size;
-+ desc++;
-+ } while (remainder > 0);
-+ }
-+
-+ return vchan_tx_prep(&bchan->vc, &async_desc->vd, flags);
-+
-+err_out:
-+ kfree(async_desc);
-+ return NULL;
-+}
-+
-+/**
- * bam_dma_terminate_all - terminate all transactions on a channel
- * @bchan: bam dma channel
- *
-@@ -960,7 +1043,7 @@ static void bam_start_dma(struct bam_cha
-
- /* set any special flags on the last descriptor */
- if (async_desc->num_desc == async_desc->xfer_len)
-- desc[async_desc->xfer_len - 1].flags =
-+ desc[async_desc->xfer_len - 1].flags |=
- cpu_to_le16(async_desc->flags);
- else
- desc[async_desc->xfer_len - 1].flags |=
-@@ -1237,6 +1320,8 @@ static int bam_dma_probe(struct platform
- bdev->common.device_alloc_chan_resources = bam_alloc_chan;
- bdev->common.device_free_chan_resources = bam_free_chan;
- bdev->common.device_prep_slave_sg = bam_prep_slave_sg;
-+ bdev->common.device_prep_dma_custom_mapping =
-+ bam_prep_dma_custom_mapping;
- bdev->common.device_config = bam_slave_config;
- bdev->common.device_pause = bam_pause;
- bdev->common.device_resume = bam_resume;
---- a/include/linux/dma/qcom_bam_dma.h
-+++ b/include/linux/dma/qcom_bam_dma.h
-@@ -65,6 +65,19 @@ enum bam_command_type {
- };
-
- /*
-+ * QCOM BAM DMA custom data
-+ *
-+ * @sgl_cnt: number of sgl in bam_sgl
-+ * @dir: DMA data transfer direction
-+ * @bam_sgl: BAM SGL pointer
-+ */
-+struct qcom_bam_custom_data {
-+ u32 sgl_cnt;
-+ enum dma_transfer_direction dir;
-+ struct qcom_bam_sgl *bam_sgl;
-+};
-+
-+/*
- * qcom_bam_sg_init_table - Init QCOM BAM SGL
- * @bam_sgl: bam sgl
- * @nents: number of entries in bam sgl
---- a/include/linux/dmaengine.h
-+++ b/include/linux/dmaengine.h
-@@ -692,6 +692,8 @@ struct dma_filter {
- * be called after period_len bytes have been transferred.
- * @device_prep_interleaved_dma: Transfer expression in a generic way.
- * @device_prep_dma_imm_data: DMA's 8 byte immediate data to the dst address
-+ * @device_prep_dma_custom_mapping: prepares a dma operation from dma driver
-+ * specific custom data
- * @device_config: Pushes a new configuration to a channel, return 0 or an error
- * code
- * @device_pause: Pauses any transfer happening on a channel. Returns
-@@ -783,6 +785,9 @@ struct dma_device {
- struct dma_async_tx_descriptor *(*device_prep_dma_imm_data)(
- struct dma_chan *chan, dma_addr_t dst, u64 data,
- unsigned long flags);
-+ struct dma_async_tx_descriptor *(*device_prep_dma_custom_mapping)(
-+ struct dma_chan *chan, void *data,
-+ unsigned long flags);
-
- int (*device_config)(struct dma_chan *chan,
- struct dma_slave_config *config);
-@@ -899,6 +904,15 @@ static inline struct dma_async_tx_descri
- src_sg, src_nents, flags);
- }
-
-+static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_custom_mapping(
-+ struct dma_chan *chan,
-+ void *data,
-+ unsigned long flags)
-+{
-+ return chan->device->device_prep_dma_custom_mapping(chan, data,
-+ flags);
-+}
-+
- /**
- * dmaengine_terminate_all() - Terminate all active DMA transfers
- * @chan: The channel for which to terminate the transfers