diff options
-rw-r--r-- | sound/core/pcm_native.c | 20 |
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 | ||
3065 | static inline struct page * | ||
3066 | snd_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; |