diff options
author | graysky | 2021-09-26 20:13:58 -0400 |
---|---|---|
committer | graysky | 2021-09-26 20:13:58 -0400 |
commit | 29c70c5b16c42cbaa82e861173550cffd19ef292 (patch) | |
tree | fdcf9e6beecea59979adae6cc83355c6a689c4d6 /0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch | |
parent | df318ab1b01591e475d823fc1b47d2646a9c5204 (diff) | |
download | aur-29c70c5b16c42cbaa82e861173550cffd19ef292.tar.gz |
Update to 5.14.8-1
Diffstat (limited to '0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch')
-rw-r--r-- | 0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch b/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch new file mode 100644 index 000000000000..c7bcc571acd6 --- /dev/null +++ b/0006-ALSA-pci-cs46xx-Fix-set-up-buffer-type-properly.patch @@ -0,0 +1,95 @@ +From a622834a986a0d8819f3de9853a8c2a99ca1a5b4 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai <tiwai@suse.de> +Date: Mon, 9 Aug 2021 09:18:29 +0200 +Subject: [PATCH 6/7] ALSA: pci: cs46xx: Fix set up buffer type properly + +CS46xx driver switches the buffer depending on the number of periods, +and in some cases it switches to the own buffer without updating the +buffer type properly. This may cause a problem with the mmap on +exotic architectures that require the own mmap call for the coherent +DMA buffer. + +This patch addresses the potential breakage by replacing the buffer +setup with the proper macro. It also simplifies the source code, +too. + +Signed-off-by: Takashi Iwai <tiwai@suse.de> +Fixes: https://bugs.archlinux.org/task/72059 +--- + sound/pci/cs46xx/cs46xx_lib.c | 30 ++++++++---------------------- + 1 file changed, 8 insertions(+), 22 deletions(-) + +diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c +index 1e1eb17f8e07..d43927dcd61e 100644 +--- a/sound/pci/cs46xx/cs46xx_lib.c ++++ b/sound/pci/cs46xx/cs46xx_lib.c +@@ -1121,9 +1121,7 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, + if (params_periods(hw_params) == CS46XX_FRAGS) { + if (runtime->dma_area != cpcm->hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = cpcm->hw_buf.area; +- runtime->dma_addr = cpcm->hw_buf.addr; +- runtime->dma_bytes = cpcm->hw_buf.bytes; ++ snd_pcm_set_runtime_buffer(substream, &cpcm->hw_buf); + + + #ifdef CONFIG_SND_CS46XX_NEW_DSP +@@ -1143,11 +1141,8 @@ static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream, + #endif + + } else { +- if (runtime->dma_area == cpcm->hw_buf.area) { +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; +- } ++ if (runtime->dma_area == cpcm->hw_buf.area) ++ snd_pcm_set_runtime_buffer(substream, NULL); + err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); + if (err < 0) { + #ifdef CONFIG_SND_CS46XX_NEW_DSP +@@ -1196,9 +1191,7 @@ static int snd_cs46xx_playback_hw_free(struct snd_pcm_substream *substream) + if (runtime->dma_area != cpcm->hw_buf.area) + snd_pcm_lib_free_pages(substream); + +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; ++ snd_pcm_set_runtime_buffer(substream, NULL); + + return 0; + } +@@ -1287,16 +1280,11 @@ static int snd_cs46xx_capture_hw_params(struct snd_pcm_substream *substream, + if (runtime->periods == CS46XX_FRAGS) { + if (runtime->dma_area != chip->capt.hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = chip->capt.hw_buf.area; +- runtime->dma_addr = chip->capt.hw_buf.addr; +- runtime->dma_bytes = chip->capt.hw_buf.bytes; ++ snd_pcm_set_runtime_buffer(substream, &chip->capt.hw_buf); + substream->ops = &snd_cs46xx_capture_ops; + } else { +- if (runtime->dma_area == chip->capt.hw_buf.area) { +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; +- } ++ if (runtime->dma_area == chip->capt.hw_buf.area) ++ snd_pcm_set_runtime_buffer(substream, NULL); + err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); + if (err < 0) + return err; +@@ -1313,9 +1301,7 @@ static int snd_cs46xx_capture_hw_free(struct snd_pcm_substream *substream) + + if (runtime->dma_area != chip->capt.hw_buf.area) + snd_pcm_lib_free_pages(substream); +- runtime->dma_area = NULL; +- runtime->dma_addr = 0; +- runtime->dma_bytes = 0; ++ snd_pcm_set_runtime_buffer(substream, NULL); + + return 0; + } +-- +2.33.0 + |