mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 10:08:59 +00:00
05ed7dc50d
Patches automatically rebased. Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
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)
|