brcm2708: update to latest patches from RPi foundation
[openwrt/openwrt.git] / target / linux / brcm2708 / patches-4.19 / 950-0396-staging-bcm2835-audio-Use-coherent-device-buffers.patch
diff --git a/target/linux/brcm2708/patches-4.19/950-0396-staging-bcm2835-audio-Use-coherent-device-buffers.patch b/target/linux/brcm2708/patches-4.19/950-0396-staging-bcm2835-audio-Use-coherent-device-buffers.patch
new file mode 100644 (file)
index 0000000..dfd4b97
--- /dev/null
@@ -0,0 +1,61 @@
+From 8a01a25d0ad7e9d06f64fddae871deb91c3988ac Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 4 Sep 2018 17:58:54 +0200
+Subject: [PATCH] staging: bcm2835-audio: Use coherent device buffers
+
+commit ad29c6e6cbf6f2af7362b043adad51a3be3d39c7 upstream.
+
+The memory access to the pages allocated with
+SNDRV_DMA_TYPE_CONTINUOUS are basically non-coherent, and it becomes a
+problem when a process accesses via mmap.
+
+For the more consistent access, use the device coherent memory, just
+by replacing the call pattern in the allocator helpers.
+
+The only point we need to be careful for is the device object passed
+there; since bcm2835-audio driver creates fake devices and each card
+is created on top of that, we need to pass its parent device as the
+real device object.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ .../vc04_services/bcm2835-audio/bcm2835-pcm.c        | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c
++++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c
+@@ -345,8 +345,8 @@ int snd_bcm2835_new_pcm(struct bcm2835_c
+       /* pre-allocation of buffers */
+       /* NOTE: this may fail */
+-      snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
+-                                            snd_dma_continuous_data(GFP_KERNEL),
++      snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
++                                            chip->card->dev->parent,
+                                             snd_bcm2835_playback_hw.buffer_bytes_max,
+                                             snd_bcm2835_playback_hw.buffer_bytes_max);
+@@ -371,8 +371,8 @@ int snd_bcm2835_new_spdif_pcm(struct bcm
+       /* pre-allocation of buffers */
+       /* NOTE: this may fail */
+-      snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
+-              snd_dma_continuous_data(GFP_KERNEL),
++      snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
++              chip->card->dev->parent,
+               snd_bcm2835_playback_spdif_hw.buffer_bytes_max, snd_bcm2835_playback_spdif_hw.buffer_bytes_max);
+       return 0;
+@@ -404,8 +404,8 @@ int snd_bcm2835_new_simple_pcm(struct bc
+       snd_pcm_lib_preallocate_pages_for_all(
+               pcm,
+-              SNDRV_DMA_TYPE_CONTINUOUS,
+-              snd_dma_continuous_data(GFP_KERNEL),
++              SNDRV_DMA_TYPE_DEV,
++              chip->card->dev->parent,
+               snd_bcm2835_playback_hw.buffer_bytes_max,
+               snd_bcm2835_playback_hw.buffer_bytes_max);