Browse Source

asoc: msm-cpe-lsm: use kmalloc for slim_port_xfer buffers

Use kmalloc instead of dma_alloc_coherent for slim buffers
to support dma_mapping api in interrupt context.

Change-Id: Idf06832b6a3bb30f6a16c168b4e5e5f13ad0a0ab
Signed-off-by: Rohit kumar <[email protected]>
Signed-off-by: Meng Wang <[email protected]>
Rohit kumar 7 years ago
parent
commit
42121f7e09
1 changed files with 23 additions and 19 deletions
  1. 23 19
      asoc/msm-cpe-lsm.c

+ 23 - 19
asoc/msm-cpe-lsm.c

@@ -478,18 +478,21 @@ static int msm_cpe_lab_buf_alloc(struct snd_pcm_substream *substream,
 	lab_d->pcm_buf = pcm_buf;
 	dma_alloc = bufsz * bufcnt;
 	pcm_buf->mem = NULL;
-	pcm_buf->mem = dma_alloc_coherent(dma_data->sdev->dev.parent,
-					  dma_alloc,
-					  &(pcm_buf->phys),
-					  GFP_KERNEL);
+	pcm_buf->mem = kzalloc(dma_alloc, GFP_DMA);
 	if (!pcm_buf->mem) {
-		dev_err(rtd->dev,
-			"%s:DMA alloc failed size = %x\n",
-			__func__, dma_alloc);
 		rc = -ENOMEM;
 		goto fail;
 	}
 
+	pcm_buf->phys = dma_map_single(dma_data->sdev->dev.parent,
+			pcm_buf->mem, dma_alloc, DMA_BIDIRECTIONAL);
+	if (dma_mapping_error(dma_data->sdev->dev.parent, pcm_buf->phys)) {
+		dev_err(rtd->dev, "%s Error mapping DMA buffers\n", __func__);
+		pcm_buf->phys = (phys_addr_t)NULL;
+		rc = -EFAULT;
+		goto fail;
+	}
+
 	count = 0;
 	while (count < bufcnt) {
 		pcm_buf[count].mem = pcm_buf[0].mem + (count * bufsz);
@@ -504,13 +507,10 @@ static int msm_cpe_lab_buf_alloc(struct snd_pcm_substream *substream,
 
 	return 0;
 fail:
-	if (pcm_buf) {
-		if (pcm_buf->mem)
-			dma_free_coherent(dma_data->sdev->dev.parent, dma_alloc,
-					  pcm_buf->mem, pcm_buf->phys);
-		kfree(pcm_buf);
-		lab_d->pcm_buf = NULL;
-	}
+	if (pcm_buf && pcm_buf->mem)
+		kfree(pcm_buf->mem);
+	kfree(pcm_buf);
+	lab_d->pcm_buf = NULL;
 exit:
 	return rc;
 }
@@ -544,8 +544,12 @@ static int msm_cpe_lab_buf_dealloc(struct snd_pcm_substream *substream,
 	pcm_buf = lab_d->pcm_buf;
 	dma_alloc = bufsz * bufcnt;
 	if (dma_data && pcm_buf)
-		dma_free_coherent(dma_data->sdev->dev.parent, dma_alloc,
-				  pcm_buf->mem, pcm_buf->phys);
+		if (pcm_buf->phys)
+			dma_unmap_single(dma_data->sdev->dev.parent,
+				pcm_buf->phys, dma_alloc, DMA_BIDIRECTIONAL);
+	if (pcm_buf)
+		kfree(pcm_buf->mem);
+
 	kfree(pcm_buf);
 	lab_d->pcm_buf = NULL;
 	return rc;
@@ -633,7 +637,7 @@ static int msm_cpe_lab_thread(void *data)
 	memset(lab_d->pcm_buf[0].mem, 0, lab_d->pcm_size);
 
 	rc = slim_port_xfer(dma_data->sdev, dma_data->ph,
-			    lab_d->pcm_buf[0].phys,
+			    lab_d->pcm_buf[0].mem,
 			    hw_params->buf_sz, &lab_d->comp);
 	if (rc) {
 		dev_err(rtd->dev,
@@ -643,7 +647,7 @@ static int msm_cpe_lab_thread(void *data)
 	}
 
 	rc = slim_port_xfer(dma_data->sdev, dma_data->ph,
-			    lab_d->pcm_buf[1].phys,
+			    lab_d->pcm_buf[1].mem,
 			    hw_params->buf_sz, &lab_d->comp);
 	if (rc) {
 		dev_err(rtd->dev,
@@ -678,7 +682,7 @@ static int msm_cpe_lab_thread(void *data)
 	       lab_d->thread_status != MSM_LSM_LAB_THREAD_ERROR) {
 
 		rc = slim_port_xfer(dma_data->sdev, dma_data->ph,
-				    next_buf->phys,
+				    next_buf->mem,
 				    hw_params->buf_sz, &lab_d->comp);
 		if (rc) {
 			dev_err(rtd->dev,