diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-4.19/950-0396-staging-bcm2835-audio-Use-coherent-device-buffers.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-4.19/950-0396-staging-bcm2835-audio-Use-coherent-device-buffers.patch | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-4.19/950-0396-staging-bcm2835-audio-Use-coherent-device-buffers.patch b/target/linux/bcm27xx/patches-4.19/950-0396-staging-bcm2835-audio-Use-coherent-device-buffers.patch new file mode 100644 index 0000000000..dfd4b975f9 --- /dev/null +++ b/target/linux/bcm27xx/patches-4.19/950-0396-staging-bcm2835-audio-Use-coherent-device-buffers.patch @@ -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); + |