From e58cd453d58b20c6a6f34d3591640aa19aa14d25 Mon Sep 17 00:00:00 2001 From: Claudiu Beznea Date: Fri, 4 Feb 2022 15:57:50 +0200 Subject: 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 --- ...mel-pdc-Use-managed-DMA-buffer-allocation.patch | 140 +++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch (limited to 'target/linux/at91/patches-5.10/144-ASoC-atmel-pdc-Use-managed-DMA-buffer-allocation.patch') 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 +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 +Reviewed-by: Codrin Ciubotariu +Link: https://lore.kernel.org/r/20210106133650.13509-1-lars@metafoo.de +Signed-off-by: Mark Brown +--- + 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 + -- cgit v1.2.3