forked from Minki/linux
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>
This commit is contained in:
parent
657b1989da
commit
9eb4a06788
|
@ -3062,6 +3062,13 @@ static int snd_pcm_mmap_control(struct snd_pcm_substream *substream, struct file
|
||||||
}
|
}
|
||||||
#endif /* coherent mmap */
|
#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
|
* 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;
|
struct snd_pcm_runtime *runtime;
|
||||||
unsigned long offset;
|
unsigned long offset;
|
||||||
struct page * page;
|
struct page * page;
|
||||||
void *vaddr;
|
|
||||||
size_t dma_bytes;
|
size_t dma_bytes;
|
||||||
|
|
||||||
if (substream == NULL)
|
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);
|
dma_bytes = PAGE_ALIGN(runtime->dma_bytes);
|
||||||
if (offset > dma_bytes - PAGE_SIZE)
|
if (offset > dma_bytes - PAGE_SIZE)
|
||||||
return VM_FAULT_SIGBUS;
|
return VM_FAULT_SIGBUS;
|
||||||
if (substream->ops->page) {
|
if (substream->ops->page)
|
||||||
page = substream->ops->page(substream, offset);
|
page = substream->ops->page(substream, offset);
|
||||||
if (!page)
|
else
|
||||||
return VM_FAULT_SIGBUS;
|
page = snd_pcm_default_page_ops(substream, offset);
|
||||||
} else {
|
if (!page)
|
||||||
vaddr = runtime->dma_area + offset;
|
return VM_FAULT_SIGBUS;
|
||||||
page = virt_to_page(vaddr);
|
|
||||||
}
|
|
||||||
get_page(page);
|
get_page(page);
|
||||||
vmf->page = page;
|
vmf->page = page;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user