[ALSA] alsa: usx2y nopage
authorNick Piggin <npiggin@suse.de>
Thu, 13 Dec 2007 15:16:40 +0000 (16:16 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 31 Jan 2008 16:29:32 +0000 (17:29 +0100)
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>
sound/usb/usx2y/usX2Yhwdep.c
sound/usb/usx2y/usx2yhwdeppcm.c

index b76b3dd9df25d48d878548238f040018c443b075..a1dca3441319520bd04c26c53721fa7103636fa2 100644 (file)
 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)
index a5e7bcd7ca2ec0c5b486ba0b56c5f8e8f9d41a75..800b5cecfc8054ce38026e954a17f67b481ebfc8 100644 (file)
@@ -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,
 };