diff options
author | Takashi Iwai <tiwai@suse.de> | 2021-08-02 09:04:48 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2021-08-02 09:04:48 +0200 |
commit | 01099b1ad9101ca3f41071a87b9c496d9ea1d2ad (patch) | |
tree | 0fe7a9b87fd8dea482089c49ce65c4b5b4a9a135 /sound/core | |
parent | ALSA: core: Fix double calls of snd_card_free() via devres (diff) | |
parent | ALSA: memalloc: Fix regression with SNDRV_DMA_TYPE_CONTINUOUS (diff) | |
download | linux-01099b1ad9101ca3f41071a87b9c496d9ea1d2ad.tar.xz linux-01099b1ad9101ca3f41071a87b9c496d9ea1d2ad.zip |
Merge branch 'for-linus' into for-next
Diffstat (limited to 'sound/core')
-rw-r--r-- | sound/core/memalloc.c | 2 | ||||
-rw-r--r-- | sound/core/pcm_native.c | 16 |
2 files changed, 13 insertions, 5 deletions
diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c index 3a78fdad1ab4..da5c8be84a82 100644 --- a/sound/core/memalloc.c +++ b/sound/core/memalloc.c @@ -261,7 +261,7 @@ static int snd_dma_continuous_mmap(struct snd_dma_buffer *dmab, struct vm_area_struct *area) { return remap_pfn_range(area, area->vm_start, - dmab->addr >> PAGE_SHIFT, + page_to_pfn(virt_to_page(dmab->area)), area->vm_end - area->vm_start, area->vm_page_prot); } diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index c88c4316c417..09c0e2a6489c 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -246,12 +246,18 @@ static bool hw_support_mmap(struct snd_pcm_substream *substream) if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) return false; - if (substream->ops->mmap || - (substream->dma_buffer.dev.type != SNDRV_DMA_TYPE_DEV && - substream->dma_buffer.dev.type != SNDRV_DMA_TYPE_DEV_UC)) + if (substream->ops->mmap || substream->ops->page) return true; - return dma_can_mmap(substream->dma_buffer.dev.dev); + switch (substream->dma_buffer.dev.type) { + case SNDRV_DMA_TYPE_UNKNOWN: + return false; + case SNDRV_DMA_TYPE_CONTINUOUS: + case SNDRV_DMA_TYPE_VMALLOC: + return true; + default: + return dma_can_mmap(substream->dma_buffer.dev.dev); + } } static int constrain_mask_params(struct snd_pcm_substream *substream, @@ -3669,6 +3675,8 @@ static vm_fault_t snd_pcm_mmap_data_fault(struct vm_fault *vmf) return VM_FAULT_SIGBUS; if (substream->ops->page) page = substream->ops->page(substream, offset); + else if (!snd_pcm_get_dma_buf(substream)) + page = virt_to_page(runtime->dma_area + offset); else page = snd_sgbuf_get_page(snd_pcm_get_dma_buf(substream), offset); if (!page) |