diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-11-26 12:43:39 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-11-26 15:07:21 +0100 |
commit | 9eb4a06788a598573c751af1a7e46639afc89513 (patch) | |
tree | d82ea448a63dc6972995a85d4037f8318c76f869 /sound/core | |
parent | ALSA: pcm - Use dma_mmap_coherent() if available (diff) | |
download | linux-9eb4a06788a598573c751af1a7e46639afc89513.tar.xz linux-9eb4a06788a598573c751af1a7e46639afc89513.zip |
ALSA: pcm - define snd_pcm_default_page_ops()
Add a helper (inline) function as the default page ops. Any hacks wrt
the page address conversion will be applied in this function.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core')
-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 } #endif /* coherent mmap */ +static inline struct page * +snd_pcm_default_page_ops(struct snd_pcm_substream *substream, unsigned long ofs) +{ + void *vaddr = substream->runtime->dma_area + ofs; + return virt_to_page(vaddr); +} + /* * fault callback for mmapping a RAM page */ @@ -3072,7 +3079,6 @@ static int snd_pcm_mmap_data_fault(struct vm_area_struct *area, struct snd_pcm_runtime *runtime; unsigned long offset; struct page * page; - void *vaddr; size_t dma_bytes; if (substream == NULL) @@ -3082,14 +3088,12 @@ static int snd_pcm_mmap_data_fault(struct vm_area_struct *area, dma_bytes = PAGE_ALIGN(runtime->dma_bytes); if (offset > dma_bytes - PAGE_SIZE) return VM_FAULT_SIGBUS; - if (substream->ops->page) { + if (substream->ops->page) page = substream->ops->page(substream, offset); - if (!page) - return VM_FAULT_SIGBUS; - } else { - vaddr = runtime->dma_area + offset; - page = virt_to_page(vaddr); - } + else + page = snd_pcm_default_page_ops(substream, offset); + if (!page) + return VM_FAULT_SIGBUS; get_page(page); vmf->page = page; return 0; |