|
@@ -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;
|
|
|
}
|