summaryrefslogtreecommitdiff
path: root/patches.tizen/0793-dma-pl330-split-off-common-code-to-give-back-descrip.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0793-dma-pl330-split-off-common-code-to-give-back-descrip.patch')
-rw-r--r--patches.tizen/0793-dma-pl330-split-off-common-code-to-give-back-descrip.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/patches.tizen/0793-dma-pl330-split-off-common-code-to-give-back-descrip.patch b/patches.tizen/0793-dma-pl330-split-off-common-code-to-give-back-descrip.patch
new file mode 100644
index 00000000000..bc515b915f2
--- /dev/null
+++ b/patches.tizen/0793-dma-pl330-split-off-common-code-to-give-back-descrip.patch
@@ -0,0 +1,86 @@
+From 74f2b8026727d9333c10ace5c87961d0a0ff02f3 Mon Sep 17 00:00:00 2001
+From: Chanho Park <chanho61.park@samsung.com>
+Date: Fri, 9 Aug 2013 20:11:33 +0900
+Subject: [PATCH 0793/1302] dma: pl330: split off common code to give back
+ descriptors
+
+This patch adds __pl330_giveback_descs which give back descriptors when fails
+allocating descriptors. It requires to eliminate duplication for
+pl330_prep_dma_sg which will be added later.
+
+Signed-off-by: Chanho Park <chanho61.park@samsung.com>
+Acked-by : Jassi Brar <jassisinghbrar@gmail.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/dma/pl330.c | 38 +++++++++++++++++++++++---------------
+ 1 file changed, 23 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
+index 4ad13eb..ebc2af9 100644
+--- a/drivers/dma/pl330.c
++++ b/drivers/dma/pl330.c
+@@ -2814,6 +2814,28 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,
+ return &desc->txd;
+ }
+
++static void __pl330_giveback_desc(struct dma_pl330_dmac *pdmac,
++ struct dma_pl330_desc *first)
++{
++ unsigned long flags;
++ struct dma_pl330_desc *desc;
++
++ if (!first)
++ return;
++
++ spin_lock_irqsave(&pdmac->pool_lock, flags);
++
++ while (!list_empty(&first->node)) {
++ desc = list_entry(first->node.next,
++ struct dma_pl330_desc, node);
++ list_move_tail(&desc->node, &pdmac->desc_pool);
++ }
++
++ list_move_tail(&first->node, &pdmac->desc_pool);
++
++ spin_unlock_irqrestore(&pdmac->pool_lock, flags);
++}
++
+ static struct dma_async_tx_descriptor *
+ pl330_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
+ unsigned int sg_len, enum dma_transfer_direction direction,
+@@ -2822,7 +2844,6 @@ pl330_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
+ struct dma_pl330_desc *first, *desc = NULL;
+ struct dma_pl330_chan *pch = to_pchan(chan);
+ struct scatterlist *sg;
+- unsigned long flags;
+ int i;
+ dma_addr_t addr;
+
+@@ -2842,20 +2863,7 @@ pl330_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
+ dev_err(pch->dmac->pif.dev,
+ "%s:%d Unable to fetch desc\n",
+ __func__, __LINE__);
+- if (!first)
+- return NULL;
+-
+- spin_lock_irqsave(&pdmac->pool_lock, flags);
+-
+- while (!list_empty(&first->node)) {
+- desc = list_entry(first->node.next,
+- struct dma_pl330_desc, node);
+- list_move_tail(&desc->node, &pdmac->desc_pool);
+- }
+-
+- list_move_tail(&first->node, &pdmac->desc_pool);
+-
+- spin_unlock_irqrestore(&pdmac->pool_lock, flags);
++ __pl330_giveback_desc(pdmac, first);
+
+ return NULL;
+ }
+--
+1.8.3.2
+