aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch
diff options
context:
space:
mode:
authorClaudiu Beznea <claudiu.beznea@microchip.com>2022-02-04 15:57:50 +0200
committerPetr Štetiar <ynezz@true.cz>2022-02-24 19:05:28 +0100
commite58cd453d58b20c6a6f34d3591640aa19aa14d25 (patch)
treea4fef5f5d79575a7a60b516482ee114c1dbc932e /target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch
parent3ed992a99630457f660761ce199e3d2a00f06168 (diff)
downloadupstream-e58cd453d58b20c6a6f34d3591640aa19aa14d25.tar.gz
upstream-e58cd453d58b20c6a6f34d3591640aa19aa14d25.tar.bz2
upstream-e58cd453d58b20c6a6f34d3591640aa19aa14d25.zip
at91: add kernel support for sama7g5 soc
Add kernel support for SAMA7G5 by back-porting mainline kernel patches. Among SAMA7G5 features could be remembered: - ARM Cortex-A7 - double data rate multi-port dynamic RAM controller supporting DDR2, DDR3, DDR3L, LPDDR2, LPDDR3 up to 533MHz - peripherals for audio, video processing - 1 gigabit + 1 megabit Ethernet controllers - 6 CAN controllers - trust zone support - DVFS for CPU - criptography IPs Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Diffstat (limited to 'target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch')
-rw-r--r--target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch140
1 files changed, 140 insertions, 0 deletions
diff --git a/target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch b/target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch
new file mode 100644
index 0000000000..1cb43ca20c
--- /dev/null
+++ b/target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch
@@ -0,0 +1,140 @@
+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(-)
+
+diff --git a/sound/soc/atmel/atmel-pcm-pdc.c b/sound/soc/atmel/atmel-pcm-pdc.c
+index 704f700013d3..3e7ea2021b46 100644
+--- 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 snd_soc_component *component,
+ /* 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_driver atmel_soc_platform = {
+ .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)
+--
+2.32.0
+