[ALSA] alsa: usx2y nopage
Convert alsa usx2y driver from nopage to fault. Signed-off-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Родитель
3ad5afcd5f
Коммит
eb415b8f6d
|
@ -34,34 +34,31 @@
|
||||||
int usX2Y_hwdep_pcm_new(struct snd_card *card);
|
int usX2Y_hwdep_pcm_new(struct snd_card *card);
|
||||||
|
|
||||||
|
|
||||||
static struct page * snd_us428ctls_vm_nopage(struct vm_area_struct *area, unsigned long address, int *type)
|
static int snd_us428ctls_vm_fault(struct vm_area_struct *area,
|
||||||
|
struct vm_fault *vmf)
|
||||||
{
|
{
|
||||||
unsigned long offset;
|
unsigned long offset;
|
||||||
struct page * page;
|
struct page * page;
|
||||||
void *vaddr;
|
void *vaddr;
|
||||||
|
|
||||||
snd_printdd("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh\n",
|
snd_printdd("ENTER, start %lXh, pgoff %ld\n",
|
||||||
area->vm_start,
|
area->vm_start,
|
||||||
address - area->vm_start,
|
vmf->pgoff);
|
||||||
(address - area->vm_start) >> PAGE_SHIFT,
|
|
||||||
address);
|
|
||||||
|
|
||||||
offset = area->vm_pgoff << PAGE_SHIFT;
|
offset = vmf->pgoff << PAGE_SHIFT;
|
||||||
offset += address - area->vm_start;
|
|
||||||
snd_assert((offset % PAGE_SIZE) == 0, return NOPAGE_SIGBUS);
|
|
||||||
vaddr = (char*)((struct usX2Ydev *)area->vm_private_data)->us428ctls_sharedmem + offset;
|
vaddr = (char*)((struct usX2Ydev *)area->vm_private_data)->us428ctls_sharedmem + offset;
|
||||||
page = virt_to_page(vaddr);
|
page = virt_to_page(vaddr);
|
||||||
get_page(page);
|
get_page(page);
|
||||||
snd_printdd( "vaddr=%p made us428ctls_vm_nopage() return %p; offset=%lX\n", vaddr, page, offset);
|
vmf->page = page;
|
||||||
|
|
||||||
if (type)
|
snd_printdd("vaddr=%p made us428ctls_vm_fault() page %p\n",
|
||||||
*type = VM_FAULT_MINOR;
|
vaddr, page);
|
||||||
|
|
||||||
return page;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct vm_operations_struct us428ctls_vm_ops = {
|
static struct vm_operations_struct us428ctls_vm_ops = {
|
||||||
.nopage = snd_us428ctls_vm_nopage,
|
.fault = snd_us428ctls_vm_fault,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int snd_us428ctls_mmap(struct snd_hwdep * hw, struct file *filp, struct vm_area_struct *area)
|
static int snd_us428ctls_mmap(struct snd_hwdep * hw, struct file *filp, struct vm_area_struct *area)
|
||||||
|
|
|
@ -683,30 +683,24 @@ static void snd_usX2Y_hwdep_pcm_vm_close(struct vm_area_struct *area)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct page * snd_usX2Y_hwdep_pcm_vm_nopage(struct vm_area_struct *area, unsigned long address, int *type)
|
static int snd_usX2Y_hwdep_pcm_vm_fault(struct vm_area_struct *area,
|
||||||
|
struct vm_fault *vmf)
|
||||||
{
|
{
|
||||||
unsigned long offset;
|
unsigned long offset;
|
||||||
struct page *page;
|
|
||||||
void *vaddr;
|
void *vaddr;
|
||||||
|
|
||||||
offset = area->vm_pgoff << PAGE_SHIFT;
|
offset = vmf->pgoff << PAGE_SHIFT;
|
||||||
offset += address - area->vm_start;
|
|
||||||
snd_assert((offset % PAGE_SIZE) == 0, return NOPAGE_OOM);
|
|
||||||
vaddr = (char*)((struct usX2Ydev *)area->vm_private_data)->hwdep_pcm_shm + offset;
|
vaddr = (char*)((struct usX2Ydev *)area->vm_private_data)->hwdep_pcm_shm + offset;
|
||||||
page = virt_to_page(vaddr);
|
vmf->page = virt_to_page(vaddr);
|
||||||
get_page(page);
|
get_page(vmf->page);
|
||||||
|
return 0;
|
||||||
if (type)
|
|
||||||
*type = VM_FAULT_MINOR;
|
|
||||||
|
|
||||||
return page;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct vm_operations_struct snd_usX2Y_hwdep_pcm_vm_ops = {
|
static struct vm_operations_struct snd_usX2Y_hwdep_pcm_vm_ops = {
|
||||||
.open = snd_usX2Y_hwdep_pcm_vm_open,
|
.open = snd_usX2Y_hwdep_pcm_vm_open,
|
||||||
.close = snd_usX2Y_hwdep_pcm_vm_close,
|
.close = snd_usX2Y_hwdep_pcm_vm_close,
|
||||||
.nopage = snd_usX2Y_hwdep_pcm_vm_nopage,
|
.fault = snd_usX2Y_hwdep_pcm_vm_fault,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче