123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- From 0b20c174a17dcfa805ddac1301a5af7298877ec3 Mon Sep 17 00:00:00 2001
- From: Lars-Peter Clausen <[email protected]>
- 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 <[email protected]>
- Reviewed-by: Codrin Ciubotariu <[email protected]>
- Link: https://lore.kernel.org/r/[email protected]
- Signed-off-by: Mark Brown <[email protected]>
- ---
- 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)
|