[Sound-open-firmware] [PATCH] dma: dw-dma: release spinlock in error path

Liam Girdwood liam.r.girdwood at linux.intel.com
Fri Nov 17 16:56:43 CET 2017


Currently not released on any configuration errors.

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 src/drivers/dw-dma.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c
index 7b97fb8..4a4a14a 100644
--- a/src/drivers/dw-dma.c
+++ b/src/drivers/dw-dma.c
@@ -438,6 +438,7 @@ static int dw_dma_set_config(struct dma *dma, int channel,
 	struct dw_lli2 *lli_desc_tail;
 	uint32_t desc_count = 0;
 	uint32_t flags;
+	int ret = 0;
 
 	spin_lock_irq(&dma->lock, flags);
 
@@ -453,8 +454,9 @@ static int dw_dma_set_config(struct dma *dma, int channel,
 		desc_count++;
 
 	if (desc_count == 0) {
-		trace_dma_error("eDC");
-		return -EINVAL;
+		trace_dma_error("eD0");
+		ret = -EINVAL;
+		goto out;
 	}
 
 	/* do we need to realloc descriptors */
@@ -468,8 +470,9 @@ static int dw_dma_set_config(struct dma *dma, int channel,
 		p->chan[channel].lli = rzalloc(RZONE_RUNTIME, RFLAGS_NONE,
 			sizeof(struct dw_lli2) * p->chan[channel].desc_count);
 		if (p->chan[channel].lli == NULL) {
-			trace_dma_error("eDm");
-			return -ENOMEM;
+			trace_dma_error("eD1");
+			ret = -ENOMEM;
+			goto out;
 		}
 	}
 
@@ -539,14 +542,17 @@ static int dw_dma_set_config(struct dma *dma, int channel,
 			lli_desc->dar = (uint32_t)sg_elem->dest;
 			break;
 		default:
-			trace_dma_error("eDD");
-			break;
+			trace_dma_error("eD4");
+			ret = -EINVAL;
+			goto out;
 		}
 
 		if (sg_elem->size > DW_CTLH_BLOCK_TS_MASK) {
-			trace_dma_error("eDS");
-			return -EINVAL;
+			trace_dma_error("eD5");
+			ret = -EINVAL;
+			goto out;
 		}
+
 		/* set transfer size of element */
 #if defined CONFIG_BAYTRAIL || defined CONFIG_CHERRYTRAIL
 		lli_desc->ctrl_hi = DW_CTLH_CLASS(p->class) |
@@ -578,9 +584,9 @@ static int dw_dma_set_config(struct dma *dma, int channel,
 	}
 
 	p->chan[channel].status = COMP_STATE_PREPARE;
+out:
 	spin_unlock_irq(&dma->lock, flags);
-
-	return 0;
+	return ret;
 }
 
 /* restore DMA conext after leaving D3 */
-- 
2.11.0



More information about the Sound-open-firmware mailing list