Patch PCO525 board / Sensicam drivers up to 2.6.38 (tested on Ubuntu linux-2.6.38-8-generic)
  ioctl --> unlocked_ioctl Driver doesn't 'appear' to have a problem with the lack of the big kernel lock.
  nopage --> fault. Changes as per http://lwn.net/Articles/258113/ 
  CFLAGS --> EXTRA_CFLAGS because make told me to! (Could be a Debian/Ubuntu thing)
  pt_regs has gone from interrupt handler params.

Patch PCO525 board / Sensicam drivers up to 3.2.0 (tested on Ubuntu linux-3.2.0-32-generic)
  DMA_32BIT_MASK --> DMA_BIT_MASK(32)  

  Oliver Ford <codes@oliford.co.uk>

diff -ur sen2_02_11/sendrv/Makefile sen2_02_11_patched2/sendrv/Makefile
--- sen2_02_11/sendrv/Makefile	2007-02-23 16:51:18.000000000 +0100
+++ sen2_02_11_patched2/sendrv/Makefile	2012-10-18 14:01:27.782216781 +0200
@@ -18,8 +18,8 @@
   DEBFLAGS = -O2
 endif
 
-CFLAGS += $(DEBFLAG) -Wall -DPROTOKOLL 
-CFLAGS += -I$(LDDINC) 
+EXTRA_CFLAGS += $(DEBFLAG) -Wall -DPROTOKOLL 
+EXTRA_CFLAGS += -I$(LDDINC) 
 #EXTRA_CFLAGS := -I$(HDIR)
 
 HEADER = $(HDIR)/amcc.h $(HDIR)/sencamd.h $(HDIR)/sencamc.h \
@@ -56,7 +56,7 @@
 
 
 depend .depend dep:
-	$(CC) $(CFLAGS) -M *.c > .depend
+	$(CC) $(EXTRA_CFLAGS) -M *.c > .depend
 
 ifeq (.depend,$(wildcard .depend))
 include .depend
diff -ur sen2_02_11/sendrv/sen_buf.c sen2_02_11_patched2/sendrv/sen_buf.c
--- sen2_02_11/sendrv/sen_buf.c	2007-03-26 13:08:54.000000000 +0200
+++ sen2_02_11_patched2/sendrv/sen_buf.c	2012-10-18 14:01:27.782216781 +0200
@@ -490,38 +490,39 @@
 }
 
 //@ver2.01.01 new difinition
-struct page *sen_nopage(struct vm_area_struct *vma,
-                         unsigned long address, int *type)
+static int sen_fault(struct vm_area_struct *vma,
+                        struct vm_fault *vmf)
 {
   unsigned long offset,pageoff;
   struct DEVBUF *devb;
   int numoff;
   unsigned long pageptr;
   struct page *p;
+  unsigned long address = (unsigned long)vmf->virtual_address;
 
   if(vma->vm_file==NULL)
    return 0;
 
   devb=vma->vm_file->private_data;
 
-  write_proto(ALL_BUFFER,"_nopage() devb = p%p address 0x%x",devb,address);
-  write_proto(ALL_BUFFER,"_nopage() vm_start = 0x%x",vma->vm_start);
-  write_proto(ALL_BUFFER,"_nopage() vm_pgoff = 0x%x",vma->vm_pgoff);
+  write_proto(ALL_BUFFER,"_fault() devb = p%p pgoff = %ld",devb,address);
+  write_proto(ALL_BUFFER,"_fault() vm_start = 0x%x",vma->vm_start);
+  write_proto(ALL_BUFFER,"_fault() vm_pgoff = 0x%x",vma->vm_pgoff);
 
 
   if(devb==NULL)
    return 0;
 
   offset=address-vma->vm_start+vma->vm_pgoff*PAGE_SIZE;
-  write_proto(ALL_BUFFER,"_nopage() offset = %d",offset);
+  write_proto(ALL_BUFFER,"_fault() offset = %d",offset);
 
   if(offset>devb->pagesize*devb->pagenum)
    return 0;
 
   if(offset<5000)
-   write_proto(BUFFER,"_nopage() devb p%p address 0x%x offset 0x%x",devb,address,offset);
+   write_proto(BUFFER,"_fault() devb p%p address 0x%x offset 0x%x",devb,address,offset);
   else
-   write_proto(ALL_BUFFER,"_nopage() devb p%p address 0x%x offset 0x%x",devb,address,offset);
+   write_proto(ALL_BUFFER,"_fault() devb p%p address 0x%x offset 0x%x",devb,address,offset);
 
 
 // calculate page for offset
@@ -532,7 +533,7 @@
   pageptr=(unsigned long)devb->pagetab[numoff].virt;
   pageptr+=pageoff;
 
-  write_proto(ALL_BUFFER,"_nopage() pageptr p%p pageoff %d numoff %d",pageptr,pageoff,numoff);
+  write_proto(ALL_BUFFER,"_fault() pageptr p%p pageoff %d numoff %d",pageptr,pageoff,numoff);
 
   p = virt_to_page(pageptr);
 //@ver2.01.01 VALID_PAGE not defined check fo NULL_POINTER instead
@@ -545,26 +546,25 @@
 //!chck reserved flag, if not set, do a get_page
    if(!PageReserved(p))
    {
-    write_proto(ALL_BUFFER,"_nopage() page p%p is valid and not reserved increase count %d",
+    write_proto(ALL_BUFFER,"_fault() page p%p is valid and not reserved increase count %d",
                            p,page_count(p));
     get_page(p);
+    vmf->page = p;
    }
    else
-    write_proto(ALL_BUFFER,"_nopage() page p%p is valid and reserved do nothing",p);
+    write_proto(ALL_BUFFER,"_fault() page p%p is valid and reserved do nothing",p);
 
-   if(type)
-    *type=VM_FAULT_MINOR;
-   return p;
+   return 0;
   }
   else
-   return NOPAGE_SIGBUS;
+   return VM_FAULT_SIGBUS;
 }
 
 struct vm_operations_struct sen_vm_ops =
 {
   sen_vma_open,
   sen_vma_close,
-  sen_nopage,
+  .fault = sen_fault,
 };
 
 int senb_mmap(struct file *filp,struct vm_area_struct *vma)
diff -ur sen2_02_11/sendrv/sen_int.c sen2_02_11_patched2/sendrv/sen_int.c
--- sen2_02_11/sendrv/sen_int.c	2007-03-15 11:33:48.000000000 +0100
+++ sen2_02_11_patched2/sendrv/sen_int.c	2012-10-18 14:01:27.782216781 +0200
@@ -348,7 +348,7 @@
 }
 
 // interrupts lower half
-irqreturn_t sen_Int_Handler(int irq,void *dev_id,struct pt_regs* regs)
+irqreturn_t sen_Int_Handler(int irq,void *dev_id)
 {
   dword Intreg_AMCCi;
   VXDBOARDVAL *sen_actdev;
diff -ur sen2_02_11/sendrv/sen_int.h sen2_02_11_patched2/sendrv/sen_int.h
--- sen2_02_11/sendrv/sen_int.h	2007-03-13 17:11:41.000000000 +0100
+++ sen2_02_11_patched2/sendrv/sen_int.h	2012-10-18 14:01:27.782216781 +0200
@@ -8,6 +8,6 @@
 void sen_headtimeout(unsigned long refdata);
 void sen_headinit(void *dev);
 void sen_picdone(unsigned long refdata);
-irqreturn_t sen_Int_Handler(int irq,void *dev_id,struct pt_regs* regs);
+irqreturn_t sen_Int_Handler(int irq,void *dev_id);
 
 #endif
diff -ur sen2_02_11/sendrv/sen_main.c sen2_02_11_patched2/sendrv/sen_main.c
--- sen2_02_11/sendrv/sen_main.c	2007-04-17 11:43:49.000000000 +0200
+++ sen2_02_11_patched2/sendrv/sen_main.c	2012-10-18 14:03:38.822214881 +0200
@@ -36,7 +36,6 @@
 /* The necessary header files */
 
 /* Standard in kernel modules */
-#include <linux/config.h>   /* We're doing kernel work */
 #include <linux/module.h>   /* Specifically, a module */
 #include <linux/moduleparam.h>   /* Specifically, a module */
 #include <linux/init.h>   /* We're doing kernel work */
@@ -78,8 +77,7 @@
 /* local functions */
 static int sen_open(struct inode *inode, struct file *filp);
 int sen_release(struct inode *inode, struct file *file);
-static int sen_ioctl(struct inode *inode,
-              struct file *file,
+static long sen_ioctl(struct file *file,
               unsigned int ioctl_num,
               unsigned long ioctl_param);
 
@@ -158,7 +156,7 @@
   owner   : THIS_MODULE,
   read    :  sen_read,
   poll    :  sen_select,   /* select */   //new ver1.12.04
-  ioctl   :  sen_ioctl,    /* ioctl */
+  unlocked_ioctl   :  sen_ioctl,    /* ioctl */
   mmap    :  senb_mmap,    /* mmap */
   open    :  sen_open,
   release :  sen_release,   /* a.k.a. close */
@@ -169,7 +167,7 @@
   read    :  senb_read,
   write   :  senb_write,
   poll    :  senb_select,  /* select */
-  ioctl   :  sen_ioctl,    /* ioctl */  //@ver1.14.04
+  unlocked_ioctl   :  sen_ioctl,    /* ioctl */  //@ver1.14.04
   mmap    :  senb_mmap,    /* mmap */
   open    :  senb_open,
   release :  senb_release,  /* a.k.a. close */
@@ -337,14 +335,14 @@
   if(sen_process==0)
   {
    if((sen_actdev->hdevice)&&
-     (sen_actdev->process!=current->uid)&&
-     (sen_actdev->process!=current->euid))
+     (sen_actdev->process!=current->cred->uid)&&
+     (sen_actdev->process!=current->cred->euid))
      {
-      write_proto(ERROR,"_open(): error other user %d, allow %d",current->uid,sen_actdev->process);
+      write_proto(ERROR,"_open(): error other user %d, allow %d",current->cred->uid,sen_actdev->process);
       return -EBUSY;
      }
    if(sen_actdev->hdevice==0)
-    sen_actdev->process=current->uid;
+    sen_actdev->process=current->cred->uid;
   }
 
 // If sen_process==1 device can be opened only from one user
@@ -355,7 +353,7 @@
     write_proto(ERROR,"_open(): error hdevice was open %d",sen_actdev->hdevice);
     return -EBUSY;
    }
-   sen_actdev->process=current->uid;
+   sen_actdev->process=current->cred->uid;
   }
 // If sen_process==2 device all processes must have same pid
   if(sen_process==2)
@@ -372,7 +370,7 @@
   if(sen_process==3)
   {
    if(sen_actdev->hdevice==0)
-    sen_actdev->process=current->uid;
+    sen_actdev->process=current->cred->uid;
   }
 
 //boardnumber into low bits of dev->hold
@@ -672,8 +670,7 @@
  * the calling process), the ioctl call returns the output of this
  * function.
  */
-static int sen_ioctl(struct inode *inode,
-              struct file *file,
+static long sen_ioctl(struct file *file,
               unsigned int ioctl_num,    /* The number of the ioctl */
               unsigned long ioctl_param) /* The parameter to it */
 {
@@ -696,8 +693,8 @@
   }
 
 // get board number  allow maximal 5 devices
-  board=sen_getboard_nr(inode);
-  buffer=sen_getbuffer_nr(inode);
+  board=sen_getboard_nr(file->f_dentry->d_inode);
+  buffer=sen_getbuffer_nr(file->f_dentry->d_inode);
   if((board<0)||(buffer<0))
   {
    write_proto(ERROR,"_ioctl() no board or buffer found");
@@ -909,14 +906,14 @@
    sen_device[sen_devnum]=NULL;
    return -EIO;
   }
-  if(pci_set_dma_mask(dev,DMA_32BIT_MASK))
+  if(pci_set_dma_mask(dev,DMA_BIT_MASK(32)))
   {
    write_proto(ERROR,"_probe() set_dma_mask failed");
    kfree(sen_actdev);
    sen_device[sen_devnum]=NULL;
    return -EIO;
   }
-  pci_set_consistent_dma_mask(dev,DMA_32BIT_MASK);
+  pci_set_consistent_dma_mask(dev,DMA_BIT_MASK(32));
   pci_set_master(dev);
 
   pci_read_config_dword(dev, PCI_BASE_ADDRESS_0,&base);
@@ -980,7 +977,7 @@
   sen_actdev->pci_int=(word)dev->irq;
   result=request_irq(sen_actdev->pci_int,
                sen_Int_Handler,
-               SA_INTERRUPT|SA_SHIRQ,
+               IRQF_DISABLED|IRQF_SHARED,
                "pco52x",sen_actdev);
   if(result!=0)
   {
@@ -1612,12 +1609,12 @@
     int major,minor;
     major=MAJOR(sen_device[x]->dev_number);
     minor=MINOR(sen_device[x]->dev_number); 
-    write_proto(INIT,"_init() class_device_create %s with major 0x%x and minor 0x%x done"
+    write_proto(INIT,"_init() device_create %s with major 0x%x and minor 0x%x done"
                     ,sen_device[x]->name,major,minor);
 #if LINUX_VERSION_CODE >= 0x02060F
-    class_device_create(pco_class,NULL,MKDEV(major,minor),NULL,"%s",sen_device[x]->name);
+    device_create(pco_class,NULL,MKDEV(major,minor),"%s",sen_device[x]->name);
 #else
-    class_device_create(pco_class,MKDEV(major,minor),NULL,"%s",sen_device[x]->name);
+    device_create(pco_class,MKDEV(major,minor),"%s",sen_device[x]->name);
 #endif
    }
   }
@@ -1673,7 +1670,7 @@
 */
     write_proto(INIT,"_cleanup() class_device_destroy %s with major 0x%x and minor 0x%x done"
                     ,sen_device[x]->name,major,minor);
-    class_device_destroy(pco_class,MKDEV(major,minor));
+    device_destroy(pco_class,MKDEV(major,minor));
    }
    class_destroy(pco_class);
   }
