Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb415b8f authored by Nick Piggin's avatar Nick Piggin Committed by Jaroslav Kysela
Browse files

[ALSA] alsa: usx2y nopage



Convert alsa usx2y driver from nopage to fault.

Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent 3ad5afcd
Loading
Loading
Loading
Loading
+10 −13
Original line number Diff line number Diff line
@@ -34,34 +34,31 @@
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;
	struct page * page;
	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,
		   address - area->vm_start,
		   (address - area->vm_start) >> PAGE_SHIFT,
		   address);
		   vmf->pgoff);
	
	offset = area->vm_pgoff << PAGE_SHIFT;
	offset += address - area->vm_start;
	snd_assert((offset % PAGE_SIZE) == 0, return NOPAGE_SIGBUS);
	offset = vmf->pgoff << PAGE_SHIFT;
	vaddr = (char*)((struct usX2Ydev *)area->vm_private_data)->us428ctls_sharedmem + offset;
	page = virt_to_page(vaddr);
	get_page(page);
	snd_printdd( "vaddr=%p made us428ctls_vm_nopage() return %p; offset=%lX\n", vaddr, page, offset);
	vmf->page = page;

	if (type)
		*type = VM_FAULT_MINOR;
	snd_printdd("vaddr=%p made us428ctls_vm_fault() page %p\n",
		    vaddr, page);

	return page;
	return 0;
}

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)
+7 −13
Original line number Diff line number Diff line
@@ -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;
	struct page *page;
	void *vaddr;

	offset = area->vm_pgoff << PAGE_SHIFT;
	offset += address - area->vm_start;
	snd_assert((offset % PAGE_SIZE) == 0, return NOPAGE_OOM);
	offset = vmf->pgoff << PAGE_SHIFT;
	vaddr = (char*)((struct usX2Ydev *)area->vm_private_data)->hwdep_pcm_shm + offset;
	page = virt_to_page(vaddr);
	get_page(page);

	if (type)
		*type = VM_FAULT_MINOR;

	return page;
	vmf->page = virt_to_page(vaddr);
	get_page(vmf->page);
	return 0;
}


static struct vm_operations_struct snd_usX2Y_hwdep_pcm_vm_ops = {
	.open = snd_usX2Y_hwdep_pcm_vm_open,
	.close = snd_usX2Y_hwdep_pcm_vm_close,
	.nopage = snd_usX2Y_hwdep_pcm_vm_nopage,
	.fault = snd_usX2Y_hwdep_pcm_vm_fault,
};