aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/core/pcm_native.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index f067c5b906e4..c906be26c312 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -3062,6 +3062,13 @@ static int snd_pcm_mmap_control(struct snd_pcm_substream *substream, struct file
3062} 3062}
3063#endif /* coherent mmap */ 3063#endif /* coherent mmap */
3064 3064
3065static inline struct page *
3066snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs)
3067{
3068 void *vaddr = substream->runtime->dma_area + ofs;
3069 return virt_to_page(vaddr);
3070}
3071
3065/* 3072/*
3066 * fault callback for mmapping a RAM page 3073 * fault callback for mmapping a RAM page
3067 */ 3074 */
@@ -3072,7 +3079,6 @@ static int snd_pcm_mmap_data_fault(struct vm_area_struct *area,
3072 struct snd_pcm_runtime *runtime; 3079 struct snd_pcm_runtime *runtime;
3073 unsigned long offset; 3080 unsigned long offset;
3074 struct page * page; 3081 struct page * page;
3075 void *vaddr;
3076 size_t dma_bytes; 3082 size_t dma_bytes;
3077 3083
3078 if (substream == NULL) 3084 if (substream == NULL)
@@ -3082,14 +3088,12 @@ static int snd_pcm_mmap_data_fault(struct vm_area_struct *area,
3082 dma_bytes = PAGE_ALIGN(runtime->dma_bytes); 3088 dma_bytes = PAGE_ALIGN(runtime->dma_bytes);
3083 if (offset > dma_bytes - PAGE_SIZE) 3089 if (offset > dma_bytes - PAGE_SIZE)
3084 return VM_FAULT_SIGBUS; 3090 return VM_FAULT_SIGBUS;
3085 if (substream->ops->page) { 3091 if (substream->ops->page)
3086 page = substream->ops->page(substream, offset); 3092 page = substream->ops->page(substream, offset);
3087 if (!page) 3093 else
3088 return VM_FAULT_SIGBUS; 3094 page = snd_pcm_default_page_ops(substream, offset);
3089 } else { 3095 if (!page)
3090 vaddr = runtime->dma_area + offset; 3096 return VM_FAULT_SIGBUS;
3091 page = virt_to_page(vaddr);
3092 }
3093 get_page(page); 3097 get_page(page);
3094 vmf->page = page; 3098 vmf->page = page;
3095 return 0; 3099 return 0;