mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			136 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 0b20c174a17dcfa805ddac1301a5af7298877ec3 Mon Sep 17 00:00:00 2001
 | |
| From: Lars-Peter Clausen <lars@metafoo.de>
 | |
| Date: Wed, 6 Jan 2021 14:36:48 +0100
 | |
| Subject: [PATCH 144/247] ASoC: atmel-pdc: Use managed DMA buffer allocation
 | |
| 
 | |
| Instead of manually managing its DMA buffers using
 | |
| dma_{alloc,free}_coherent() lets the sound core take care of this using
 | |
| managed buffers.
 | |
| 
 | |
| On one hand this reduces the amount of boiler plate code, but the main
 | |
| motivation for the change is to use the shared code where possible. This
 | |
| makes it easier to argue about correctness and that the code does not
 | |
| contain subtle bugs like data leakage or similar.
 | |
| 
 | |
| Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
 | |
| Reviewed-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
 | |
| Link: https://lore.kernel.org/r/20210106133650.13509-1-lars@metafoo.de
 | |
| Signed-off-by: Mark Brown <broonie@kernel.org>
 | |
| ---
 | |
|  sound/soc/atmel/atmel-pcm-pdc.c | 78 ++-------------------------------
 | |
|  1 file changed, 4 insertions(+), 74 deletions(-)
 | |
| 
 | |
| --- a/sound/soc/atmel/atmel-pcm-pdc.c
 | |
| +++ b/sound/soc/atmel/atmel-pcm-pdc.c
 | |
| @@ -34,86 +34,21 @@
 | |
|  #include "atmel-pcm.h"
 | |
|  
 | |
|  
 | |
| -static int atmel_pcm_preallocate_dma_buffer(struct snd_pcm *pcm,
 | |
| -	int stream)
 | |
| -{
 | |
| -	struct snd_pcm_substream *substream = pcm->streams[stream].substream;
 | |
| -	struct snd_dma_buffer *buf = &substream->dma_buffer;
 | |
| -	size_t size = ATMEL_SSC_DMABUF_SIZE;
 | |
| -
 | |
| -	buf->dev.type = SNDRV_DMA_TYPE_DEV;
 | |
| -	buf->dev.dev = pcm->card->dev;
 | |
| -	buf->private_data = NULL;
 | |
| -	buf->area = dma_alloc_coherent(pcm->card->dev, size,
 | |
| -			&buf->addr, GFP_KERNEL);
 | |
| -	pr_debug("atmel-pcm: alloc dma buffer: area=%p, addr=%p, size=%zu\n",
 | |
| -			(void *)buf->area, (void *)(long)buf->addr, size);
 | |
| -
 | |
| -	if (!buf->area)
 | |
| -		return -ENOMEM;
 | |
| -
 | |
| -	buf->bytes = size;
 | |
| -	return 0;
 | |
| -}
 | |
| -
 | |
| -static int atmel_pcm_mmap(struct snd_soc_component *component,
 | |
| -			  struct snd_pcm_substream *substream,
 | |
| -			  struct vm_area_struct *vma)
 | |
| -{
 | |
| -	return remap_pfn_range(vma, vma->vm_start,
 | |
| -		       substream->dma_buffer.addr >> PAGE_SHIFT,
 | |
| -		       vma->vm_end - vma->vm_start, vma->vm_page_prot);
 | |
| -}
 | |
| -
 | |
|  static int atmel_pcm_new(struct snd_soc_component *component,
 | |
|  			 struct snd_soc_pcm_runtime *rtd)
 | |
|  {
 | |
|  	struct snd_card *card = rtd->card->snd_card;
 | |
| -	struct snd_pcm *pcm = rtd->pcm;
 | |
|  	int ret;
 | |
|  
 | |
|  	ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
 | |
|  	if (ret)
 | |
|  		return ret;
 | |
|  
 | |
| -	if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
 | |
| -		pr_debug("atmel-pcm: allocating PCM playback DMA buffer\n");
 | |
| -		ret = atmel_pcm_preallocate_dma_buffer(pcm,
 | |
| -			SNDRV_PCM_STREAM_PLAYBACK);
 | |
| -		if (ret)
 | |
| -			goto out;
 | |
| -	}
 | |
| +	snd_pcm_set_managed_buffer_all(rtd->pcm, SNDRV_DMA_TYPE_DEV,
 | |
| +				       card->dev, ATMEL_SSC_DMABUF_SIZE,
 | |
| +				       ATMEL_SSC_DMABUF_SIZE);
 | |
|  
 | |
| -	if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
 | |
| -		pr_debug("atmel-pcm: allocating PCM capture DMA buffer\n");
 | |
| -		ret = atmel_pcm_preallocate_dma_buffer(pcm,
 | |
| -			SNDRV_PCM_STREAM_CAPTURE);
 | |
| -		if (ret)
 | |
| -			goto out;
 | |
| -	}
 | |
| - out:
 | |
| -	return ret;
 | |
| -}
 | |
| -
 | |
| -static void atmel_pcm_free(struct snd_soc_component *component,
 | |
| -			   struct snd_pcm *pcm)
 | |
| -{
 | |
| -	struct snd_pcm_substream *substream;
 | |
| -	struct snd_dma_buffer *buf;
 | |
| -	int stream;
 | |
| -
 | |
| -	for (stream = 0; stream < 2; stream++) {
 | |
| -		substream = pcm->streams[stream].substream;
 | |
| -		if (!substream)
 | |
| -			continue;
 | |
| -
 | |
| -		buf = &substream->dma_buffer;
 | |
| -		if (!buf->area)
 | |
| -			continue;
 | |
| -		dma_free_coherent(pcm->card->dev, buf->bytes,
 | |
| -				  buf->area, buf->addr);
 | |
| -		buf->area = NULL;
 | |
| -	}
 | |
| +	return 0;
 | |
|  }
 | |
|  
 | |
|  /*--------------------------------------------------------------------------*\
 | |
| @@ -210,9 +145,6 @@ static int atmel_pcm_hw_params(struct sn
 | |
|  	/* this may get called several times by oss emulation
 | |
|  	 * with different params */
 | |
|  
 | |
| -	snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
 | |
| -	runtime->dma_bytes = params_buffer_bytes(params);
 | |
| -
 | |
|  	prtd->params = snd_soc_dai_get_dma_data(asoc_rtd_to_cpu(rtd, 0), substream);
 | |
|  	prtd->params->dma_intr_handler = atmel_pcm_dma_irq;
 | |
|  
 | |
| @@ -384,9 +316,7 @@ static const struct snd_soc_component_dr
 | |
|  	.prepare	= atmel_pcm_prepare,
 | |
|  	.trigger	= atmel_pcm_trigger,
 | |
|  	.pointer	= atmel_pcm_pointer,
 | |
| -	.mmap		= atmel_pcm_mmap,
 | |
|  	.pcm_construct	= atmel_pcm_new,
 | |
| -	.pcm_destruct	= atmel_pcm_free,
 | |
|  };
 | |
|  
 | |
|  int atmel_pcm_pdc_platform_register(struct device *dev)
 |