diff -Naur linux-2.6.25.at91/drivers/ioex/ecoreex.c linux-2.6/drivers/ioex/ecoreex.c
--- linux-2.6.25.at91/drivers/ioex/ecoreex.c	2009-02-12 12:26:57.000000000 -0600
+++ linux-2.6/drivers/ioex/ecoreex.c	2009-02-04 17:39:31.000000000 -0600
@@ -1,13 +1,13 @@
 /***************************************************************************
-                          		ecoreex.c    
-					EMAC soft cores device registration             
-                             -------------------
-	author				 : NZG
-    rewrite              : Tue May 15 2007
-    copyright          	 : (C) 2007 by EMAC.Inc
-    email                : support@emacinc.com
+  ecoreex.c    
+  EMAC soft cores device registration             
+  -------------------
+author				 : NZG
+rewrite              : Tue May 15 2007
+copyright          	 : (C) 2007 by EMAC.Inc
+email                : support@emacinc.com
  ***************************************************************************/
- 
+
 #include <linux/kernel.h>
 #include <linux/autoconf.h>
 #include <linux/ioport.h>
@@ -32,144 +32,202 @@
  * handler currently just indicates the that interrupt was handled and returns
  */
 static irqreturn_t hwms_interrupt(int irq, void *na){
-    return IRQ_HANDLED;
+	return IRQ_HANDLED;
 }
 
 static inline int CPLD_HWMS_map(unsigned long phys_addr, u8 *virt_addr, 
-        unsigned long size, const char *name, struct ecoreex_data *data)
+		unsigned long size, const char *name, struct ecoreex_data *data)
 {   
-    gpio_t *gpio_counter;
-    gpio_t *gpio_control;
-    
-    if (request_mem_region(phys_addr, size, name) == NULL) {
-        printk("Could not obtain physical memory at %lx for EMAC core\n", phys_addr);
-        iounmap(virt_addr);
-    }
-    gpio_declare();
-    
-    gpio_control = gpio_device_create_unregistered(&virt_addr[0], NULL, "control");
-    ecoreex_setup_data_access(data->e_access, gpio_control);
-    /* no index read or write for the control -- only one register */
-    gpio_control->index_write = NULL;
-    gpio_control->index_read = NULL; 
-    
-    gpio_counter = gpio_device_create_unregistered(&virt_addr[1], NULL, "counter");
-    gpio_counter->index_write = gpio_index_write;
-    gpio_counter->index_read = gpio_index_read;
-    gpio_counter->range = 1;
-    ecoreex_setup_data_access(data->e_access, gpio_counter);
-    
-    gpio_register_class_device(gpio_control);
-    gpio_register_class_device(gpio_counter);
-    
-    /*
-     * Allocate the IRQ
-     */
-    if(data->irq){
-        int err = request_irq(data->irq, hwms_interrupt,IRQT_RISING,name, NULL);
-        if(err<0)
-            printk("ecoreex request for irq %d failed with %d\n",data->irq,err);
-        //printk("ecoreex request for irq %d failed\n",e->irq);
+	gpio_t *gpio_counter;
+	gpio_t *gpio_control;
+
+	if (request_mem_region(phys_addr, size, name) == NULL) {
+		printk("Could not obtain physical memory at %lx for EMAC core\n", phys_addr);
+		iounmap(virt_addr);
+	}
+	gpio_declare();
 
-        else set_irq_wake(data->irq,1);//if the board provides an irq, register it to wake up pm.
-    }
+	gpio_control = gpio_device_create_unregistered(&virt_addr[0], NULL, "control");
+	ecoreex_setup_data_access(data->e_access, gpio_control);
+	/* no index read or write for the control -- only one register */
+	gpio_control->index_write = NULL;
+	gpio_control->index_read = NULL; 
+
+	gpio_counter = gpio_device_create_unregistered(&virt_addr[1], NULL, "counter");
+	gpio_counter->index_write = gpio_index_write;
+	gpio_counter->index_read = gpio_index_read;
+	gpio_counter->range = 1;
+	ecoreex_setup_data_access(data->e_access, gpio_counter);
+
+	gpio_register_class_device(gpio_control);
+	gpio_register_class_device(gpio_counter);
+
+	/*
+	 * Allocate the IRQ
+	 */
+	if(data->irq){
+		int err = request_irq(data->irq, hwms_interrupt,IRQT_RISING,name, NULL);
+		if(err<0)
+			printk("ecoreex request for irq %d failed with %d\n",data->irq,err);
+		//printk("ecoreex request for irq %d failed\n",e->irq);
+
+		else set_irq_wake(data->irq,1);//if the board provides an irq, register it to wake up pm.
+	}
 
-    return 0;
+	return 0;
 }
 
 #endif /* CONFIG_ECOREEX_HWMS */
 
-
 #ifdef CONFIG_ECOREEX_SOM150
-#define CPLD_SOM150_NAME "EMAC SoM-150ES GPI/O expansion R1.0"
-#define CPLD_SOM150 0xC0
 
 /**
  * handler currently just indicates the that interrupt was handled and returns
  */
 static irqreturn_t som150_interrupt(int irq, void *na){
-    return IRQ_HANDLED;
+	return IRQ_HANDLED;
+}
+
+#ifdef CONFIG_SOM_150ES_REV1
+
+#define CPLD_SOM150_NAME "EMAC SoM-150ES GPI/O expansion R1.0"
+#define CPLD_SOM150 0xC0
+
+static inline int CPLD_SOM150_map(unsigned long phys_addr, u8 *virt_addr, 
+		unsigned long size, const char *name, struct ecoreex_data *data)
+{   
+	gpio_t *gpio_porta;
+	gpio_t *gpio_portb;
+	gpio_t *gpio_portc;
+	gpio_t *gpio_gpout;
+	gpio_t *gpio_gpin;    
+
+	if (request_mem_region(phys_addr, size, name) == NULL) {
+		printk("Could not obtain physical memory at %lx for EMAC core\n", phys_addr);
+		iounmap(virt_addr);
+	}
+	gpio_declare();
+
+	gpio_porta = gpio_device_create_unregistered(&virt_addr[2], &virt_addr[3], "porta");
+	gpio_porta->index_write = NULL;
+	gpio_porta->index_read = NULL;
+	gpio_porta->range = 1;
+	ecoreex_setup_data_access(data->e_access, gpio_porta);
+
+	gpio_portb = gpio_device_create_unregistered(&virt_addr[4], &virt_addr[5], "portb");
+	gpio_portb->index_write = NULL;
+	gpio_portb->index_read = NULL;
+	gpio_portb->range = 1;
+	ecoreex_setup_data_access(data->e_access, gpio_portb);
+
+	gpio_portc = gpio_device_create_unregistered(&virt_addr[6], &virt_addr[7], "portc");
+	gpio_portc->index_write = NULL;
+	gpio_portc->index_read = NULL;
+	gpio_portc->range = 1;
+	ecoreex_setup_data_access(data->e_access, gpio_portc);
+
+	gpio_gpout = gpio_device_create_unregistered(&virt_addr[9], NULL, "gpout");
+	gpio_gpout->index_write = NULL;
+	gpio_gpout->index_read = NULL;
+	ecoreex_setup_data_access(data->e_access, gpio_gpout);
+
+	gpio_gpin = gpio_device_create_unregistered(&virt_addr[10], NULL, "gpin");
+	gpio_gpin->index_write = NULL;
+	gpio_gpin->index_read = NULL;
+	ecoreex_setup_data_access(data->e_access, gpio_gpin);
+
+	gpio_register_class_device(gpio_porta);
+	gpio_register_class_device(gpio_portb);
+	gpio_register_class_device(gpio_portc);
+	gpio_register_class_device(gpio_gpout);
+	gpio_register_class_device(gpio_gpin);
+
+	/*
+	 * Allocate the IRQ
+	 */
+	if(data->irq){
+		int err = request_irq(data->irq, som150_interrupt,IRQT_RISING,name, NULL);
+		if(err<0)
+			printk("ecoreex request for irq %d failed with %d\n",data->irq,err);
+		else set_irq_wake(data->irq,1); //if the board provides an irq, register it to wake up pm.
+	}
+
+	return 0;
 }
 
+#else /* REV2 */
+#define CPLD_SOM150_NAME "EMAC SoM-150ES GPI/O expansion R2.0"
+#define CPLD_SOM150 0xC1
+
+/* This version re-enumerates some of the gpout lines (and removes SPI_CS)
+ * and adds a register of 6 GPIO_HNDY lines */
 static inline int CPLD_SOM150_map(unsigned long phys_addr, u8 *virt_addr, 
-        unsigned long size, const char *name, struct ecoreex_data *data)
+		unsigned long size, const char *name, struct ecoreex_data *data)
 {   
-    gpio_t *gpio_lcd;
-    gpio_t *gpio_porta;
-    gpio_t *gpio_portb;
-    gpio_t *gpio_portc;
-    gpio_t *gpio_keypad;
-    gpio_t *gpio_gpout;
-    gpio_t *gpio_gpin;    
-
-    if (request_mem_region(phys_addr, size, name) == NULL) {
-        printk("Could not obtain physical memory at %lx for EMAC core\n", phys_addr);
-        iounmap(virt_addr);
-    }
-    gpio_declare();
-    
-    
-    
-    gpio_lcd = gpio_device_create_unregistered(&virt_addr[0], NULL, "lcd");
-    gpio_lcd->index_write = gpio_index_write;
-    gpio_lcd->index_read = gpio_index_read;
-    gpio_lcd->range = 1;
-    ecoreex_setup_data_access(data->e_access, gpio_lcd);
-    
-  
-    gpio_porta = gpio_device_create_unregistered(&virt_addr[2], NULL, "porta");
-    gpio_porta->index_write = gpio_index_write;
-    gpio_porta->index_read = gpio_index_read;
-    gpio_porta->range = 1;
-    ecoreex_setup_data_access(data->e_access, gpio_porta);
-    
-    gpio_portb = gpio_device_create_unregistered(&virt_addr[4], NULL, "portb");
-    gpio_portb->index_write = gpio_index_write;
-    gpio_portb->index_read = gpio_index_read;
-    gpio_portb->range = 1;
-    ecoreex_setup_data_access(data->e_access, gpio_portb);
-       
-    gpio_portc = gpio_device_create_unregistered(&virt_addr[6], NULL, "portc");
-    gpio_portc->index_write = gpio_index_write;
-    gpio_portc->index_read = gpio_index_read;
-    gpio_portc->range = 1;
-    ecoreex_setup_data_access(data->e_access, gpio_portc);
-    
-    gpio_keypad = gpio_device_create_unregistered(&virt_addr[8], NULL, "keypad");
-    gpio_keypad->index_write = NULL;
-    gpio_keypad->index_read = NULL;
-    ecoreex_setup_data_access(data->e_access, gpio_keypad);
-    
-    gpio_gpout = gpio_device_create_unregistered(&virt_addr[9], NULL, "gpout");
-    gpio_gpout->index_write = NULL;
-    gpio_gpout->index_read = NULL;
-    ecoreex_setup_data_access(data->e_access, gpio_gpout);
-    
-    gpio_gpin = gpio_device_create_unregistered(&virt_addr[10], NULL, "gpin");
-    gpio_gpin->index_write = NULL;
-    gpio_gpin->index_read = NULL;
-    ecoreex_setup_data_access(data->e_access, gpio_gpin);
-    
-    gpio_register_class_device(gpio_lcd);
-    gpio_register_class_device(gpio_porta);
-    gpio_register_class_device(gpio_portb);
-    gpio_register_class_device(gpio_portc);
-    gpio_register_class_device(gpio_keypad);
-    gpio_register_class_device(gpio_gpout);
-    gpio_register_class_device(gpio_gpin);
-
-    /*
-     * Allocate the IRQ
-     */
-    if(data->irq){
-        int err = request_irq(data->irq, som150_interrupt,IRQT_RISING,name, NULL);
-        if(err<0)
-            printk("ecoreex request for irq %d failed with %d\n",data->irq,err);
-        else set_irq_wake(data->irq,1);//if the board provides an irq, register it to wake up pm.
-    }
+	gpio_t *gpio_porta;
+	gpio_t *gpio_portb;
+	gpio_t *gpio_portc;
+	gpio_t *gpio_control;
+	gpio_t *gpio_gpin;
+	gpio_t *gpio_hndy;
+
+	if (request_mem_region(phys_addr, size, name) == NULL) {
+		printk("Could not obtain physical memory at %lx for EMAC core\n", phys_addr);
+		iounmap(virt_addr);
+	}
+	gpio_declare();
+
+	gpio_porta = gpio_device_create_unregistered(&virt_addr[2], &virt_addr[3], "porta");
+	gpio_porta->index_write = NULL;
+	gpio_porta->index_read = NULL;
+	ecoreex_setup_data_access(data->e_access, gpio_porta);
+
+	gpio_portb = gpio_device_create_unregistered(&virt_addr[4], &virt_addr[5], "portb");
+	gpio_portb->index_write = NULL;
+	gpio_portb->index_read = NULL;
+	ecoreex_setup_data_access(data->e_access, gpio_portb);
+
+	/* High Drive */
+	gpio_portc = gpio_device_create_unregistered(&virt_addr[6], NULL, "portc");
+	gpio_portc->index_write = NULL;
+	gpio_portc->index_read = NULL;
+	ecoreex_setup_data_access(data->e_access, gpio_portc);
+
+	gpio_control = gpio_device_create_unregistered(&virt_addr[8], NULL, "control");
+	gpio_control->index_write = NULL;
+	gpio_control->index_read = NULL;
+	ecoreex_setup_data_access(data->e_access, gpio_control);
+
+	gpio_gpin = gpio_device_create_unregistered(&virt_addr[9], NULL, "gpin");
+	gpio_gpin->index_write = NULL;
+	gpio_gpin->index_read = NULL;
+	ecoreex_setup_data_access(data->e_access, gpio_gpin);
+
+	gpio_hndy = gpio_device_create_unregistered(&virt_addr[10], &virt_addr[11], "handy");
+	gpio_hndy->index_write = NULL;
+	gpio_hndy->index_read = NULL;
+	ecoreex_setup_data_access(data->e_access, gpio_hndy);
+
+	gpio_register_class_device(gpio_porta);
+	gpio_register_class_device(gpio_portb);
+	gpio_register_class_device(gpio_portc);
+	gpio_register_class_device(gpio_control);
+	gpio_register_class_device(gpio_gpin);
+	gpio_register_class_device(gpio_hndy);
 
-    return 0;
+	/*
+	 * Allocate the IRQ
+	 */
+	if(data->irq){
+		int err = request_irq(data->irq, som150_interrupt,IRQT_RISING,name, NULL);
+		if(err<0)
+			printk("ecoreex request for irq %d failed with %d\n",data->irq,err);
+		else set_irq_wake(data->irq,1);//if the board provides an irq, register it to wake up pm.
+	}
+
+	return 0;
 }
+#endif /* CONFIG_SOM_150ES_REV# */
 
 #endif /* CONFIG_ECOREEX_SOM150 */
 
@@ -182,12 +240,12 @@
 #define CPLD_BASE_11 0xA3
 
 static inline int CPLD_BASE_map(unsigned long phys_addr,u8 *virt_addr,unsigned long size,const char *name){
-	
+
 	if(request_mem_region(phys_addr,size,name)==NULL){
 		printk("could not obtain physical memory at %lx for EMAC core\n",phys_addr);
 		iounmap(virt_addr);
 		return -1;
-		}			
+	}			
 	//add appropriate class devices for this version to the system
 	printk("%s detected at %lx\n",name,phys_addr);
 
@@ -198,8 +256,8 @@
 	gpio_device_create(&virt_addr[4], &virt_addr[5],"porty");
 	gpio_device_create(&virt_addr[6], &virt_addr[7],"portz");
 #endif
-				
-return 0;
+
+	return 0;
 }
 #endif //CONFIG_ECOREEX_TGPIO
 //---------------------------------------------------------------------------------
@@ -228,26 +286,26 @@
 		printk("could not obtain physical memory at %lx for EMAC core\n",phys_addr);
 		iounmap(virt_addr);
 		return -1;
-		}
-	
+	}
+
 	printk("%s detected at %lx\n",name,phys_addr);			
 	//add appropriate class devices for this version to the system
 
 #ifdef CONFIG_GPIOCLASS	
-{
-	struct class_device *status = gpi_device_create(&virt_addr[6],"status");
-	gpi_device_create(&virt_addr[0],"portw");
-	gpo_device_create(&virt_addr[1],"portx");
-	gpo_device_create(&virt_addr[2],"porty");
-	gpi_device_create(&virt_addr[3],"portz");
-	gpo_device_create(&virt_addr[7],"control");
-	 
-	if(e->mmcslot){//implement MMC CD and WP functions
-		e->mmcslot->carddetect = gpwm_carddetect;
-		e->mmcslot->writeprotect = gpwm_writeprotect;
-		e->mmcslot->pd[MMCWP]=e->mmcslot->pd[MMCCD]=status->class_data;//pass back gpio class structures
+	{
+		struct class_device *status = gpi_device_create(&virt_addr[6],"status");
+		gpi_device_create(&virt_addr[0],"portw");
+		gpo_device_create(&virt_addr[1],"portx");
+		gpo_device_create(&virt_addr[2],"porty");
+		gpi_device_create(&virt_addr[3],"portz");
+		gpo_device_create(&virt_addr[7],"control");
+
+		if(e->mmcslot){//implement MMC CD and WP functions
+			e->mmcslot->carddetect = gpwm_carddetect;
+			e->mmcslot->writeprotect = gpwm_writeprotect;
+			e->mmcslot->pd[MMCWP]=e->mmcslot->pd[MMCCD]=status->class_data;//pass back gpio class structures
+		}
 	}
-}
 #endif	//CONFIG_GPIOCLASS
 
 #ifdef CONFIG_PWMCLASS
@@ -257,7 +315,7 @@
 
 
 
-return 0;
+	return 0;
 }
 
 #endif //CONFIG_ECOREEX_SGPWM
@@ -268,13 +326,13 @@
 #define CPLD_GCMB 0xB0
 
 static inline int CPLD_GCMB_map(unsigned long phys_addr,u8 *virt_addr,unsigned long size,const char *name){
-	
+
 	if(request_mem_region(phys_addr,size,name)==NULL){
 		printk("could not obtain physical memory at %lx for EMAC core\n",phys_addr);
 		iounmap(virt_addr);
 		return -1;
-		}
-	
+	}
+
 	printk("%s detected at %lx\n",name,phys_addr);			
 	//add appropriate class devices for this version to the system
 
@@ -285,36 +343,38 @@
 	gpio_device_create(&virt_addr[2], NULL,"spi_7730");
 #endif	//CONFIG_GPIOCLASS
 
-return 0;
+	return 0;
 }
 
 #endif //CONFIG_ECOREEX_GCMB
 
 //---------------------------------------------------------------------------------
 #ifdef CONFIG_ECOREEX_DENM
-#define CPLD_DENM_NAME_12 "DENM CPLD expansion R1.2/R1.3"
-#define CPLD_DENM_NAME_14 "DENM CPLD expansion R1.4"
-#define CPLD_DENM_NAME_15 "DENM CPLD expansion R1.5"
-#define CPLD_DENM_NAME_16 "DENM CPLD expansion R1.6"
-#define CPLD_DENM_NAME_17 "DENM CPLD expansion R1.7"
-#define CPLD_DENM_NAME_18 "DENM CPLD expansion R1.8"
-#define CPLD_DENM_NAME_19 "DENM CPLD expansion R1.9"
-#define CPLD_DENM 0x92
-#define CPLD_DENM14 0x93
-#define CPLD_DENM15 0x94
-#define CPLD_DENM16 0x95
-#define CPLD_DENM17 0x98
-#define CPLD_DENM18 0x99
-#define CPLD_DENM19 0x9A
+#define CPLD_DENM_NAME_12  "DENM CPLD expansion R1.2/R1.3"
+#define CPLD_DENM_NAME_14  "DENM CPLD expansion R1.4"
+#define CPLD_DENM_NAME_15  "DENM CPLD expansion R1.5"
+#define CPLD_DENM_NAME_16  "DENM CPLD expansion R1.6"
+#define CPLD_DENM_NAME_17  "DENM CPLD expansion R1.7"
+#define CPLD_DENM_NAME_18  "DENM CPLD expansion R1.8"
+#define CPLD_DENM_NAME_19  "DENM CPLD expansion R1.9"
+#define CPLD_DENM_NAME_110 "DENM CPLD expansion R1.10"
+#define CPLD_DENM    0x92
+#define CPLD_DENM14  0x93
+#define CPLD_DENM15  0x94
+#define CPLD_DENM16  0x95
+#define CPLD_DENM17  0x98
+#define CPLD_DENM18  0x99
+#define CPLD_DENM19  0x9A
+#define CPLD_DENM110 0x9B
 
 static inline int CPLD_DENM_map(unsigned long phys_addr,u8 *virt_addr,unsigned long size,const char *name){
-	
+
 	if(request_mem_region(phys_addr,size,name)==NULL){
 		printk("could not obtain physical memory at %lx for EMAC core\n",phys_addr);
 		iounmap(virt_addr);
 		return -1;
-		}
-	
+	}
+
 	printk("%s detected at %lx\n",name,phys_addr);			
 	//add appropriate class devices for this version to the system
 
@@ -327,24 +387,24 @@
 	gpi_device_create(&virt_addr[10],"counter4");
 	gpi_device_create(&virt_addr[12],"counter5");
 	gpi_device_create(&virt_addr[14],"ct543210");
-	
+
 	gpo_device_create(&virt_addr[16],"oxrs4321");
 	gpo_device_create(&virt_addr[17],"xxrt321b");
-	
+
 	gpio_device_create(&virt_addr[3], NULL,"rollover");
 #endif	//CONFIG_GPIOCLASS
 
-return 0;
+	return 0;
 }
 
 static inline int CPLD_DENM14_map(unsigned long phys_addr,u8 *virt_addr,unsigned long size,const char *name){
-	
+
 	if(request_mem_region(phys_addr,size,name)==NULL){
 		printk("could not obtain physical memory at %lx for EMAC core\n",phys_addr);
 		iounmap(virt_addr);
 		return -1;
-		}
-	
+	}
+
 	printk("%s detected at %lx\n",name,phys_addr);			
 	//add appropriate class devices for this version to the system
 
@@ -357,15 +417,15 @@
 	gpi_device_create(&virt_addr[10],"counter4");
 	gpi_device_create(&virt_addr[12],"counter5");
 	gpi_device_create(&virt_addr[14],"ct543210");
-	
+
 	gpio_device_create(&virt_addr[16],NULL,"oxrs4321");
 	gpio_device_create(&virt_addr[17],NULL,"xxrt321b");
 	gpio_device_create(&virt_addr[3], NULL,"rollover");
 	gpo_device_create(&virt_addr[1],"debounce");
-	
+
 #endif	//CONFIG_GPIOCLASS
 
-return 0;
+	return 0;
 }
 
 /**
@@ -378,13 +438,13 @@
 
 
 static inline int CPLD_DENM15_map(unsigned long phys_addr,u8 *virt_addr,unsigned long size,const char *name,struct ecoreex_data *e){
-	
+
 	if(request_mem_region(phys_addr,size,name)==NULL){
 		printk("could not obtain physical memory at %lx for EMAC core\n",phys_addr);
 		iounmap(virt_addr);
 		return -1;
-		}
-	
+	}
+
 	printk("%s detected at %lx\n",name,phys_addr);			
 	//add appropriate class devices for this version to the system
 
@@ -397,27 +457,27 @@
 	gpi_device_create(&virt_addr[10],"counter4");
 	gpi_device_create(&virt_addr[12],"counter5");
 	gpi_device_create(&virt_addr[14],"ct543210");
-	
+
 	gpio_device_create(&virt_addr[16],NULL,"oxrs4321");
 	gpio_device_create(&virt_addr[17],NULL,"xxrt321b");
 	gpio_device_create(&virt_addr[3], NULL,"rollover");
 	gpio_device_create(&virt_addr[1],NULL,"debounce");
-	
+
 	/*
-		 * Allocate the IRQ
-		 */
+	 * Allocate the IRQ
+	 */
 	if(e->irq){
 		int err = request_irq(e->irq, denm_interrupt,IRQT_RISING,name, NULL);
 		if(err<0)
 			printk("ecoreex request for irq %d failed with %d\n",e->irq,err);
-			//printk("ecoreex request for irq %d failed\n",e->irq);
-		
+		//printk("ecoreex request for irq %d failed\n",e->irq);
+
 		else set_irq_wake(e->irq,1);//if the board provides an irq, register it to wake up pm.
 	}
-	
+
 #endif	//CONFIG_GPIOCLASS
 
-return 0;
+	return 0;
 }
 
 #endif //CONFIG_ECOREEX_DENM
@@ -427,84 +487,87 @@
  */
 static inline void map_core(unsigned long phys_addr, unsigned long size, struct ecoreex_data *data)
 {
-    u8 *virt_addr = ioremap_nocache(phys_addr,size);
-    int version = VERSION_KEY;
-    
-    if(virt_addr==NULL)printk("could not remap physical memory at %lx for EMAC core\n",phys_addr);
-    else{
-        if (VERSION_KEY == -1)
-            version =ioread8(&virt_addr[data->key_offset]);
-        //    version = data->e_access->ecoreex_key_read(data->key_offset, virt_addr);
-        /* else the version is predefined */
+	u8 *virt_addr = ioremap_nocache(phys_addr,size);
+	int version = VERSION_KEY;
+
+	if(virt_addr==NULL)printk("could not remap physical memory at %lx for EMAC core\n",phys_addr);
+	else{
+		if (VERSION_KEY == -1)
+			version =ioread8(&virt_addr[data->key_offset]);
+		//    version = data->e_access->ecoreex_key_read(data->key_offset, virt_addr);
+		/* else the version is predefined */
 		printk("EMAC core version %x detected at %lx\n",version,phys_addr+data->key_offset );
 		switch(version){
 #ifdef CONFIG_ECOREEX_HWMS
-        case CPLD_HWMS:
-            CPLD_HWMS_map(phys_addr, virt_addr, size, CPLD_HWMS_NAME, data);
-        break;
+			case CPLD_HWMS:
+				CPLD_HWMS_map(phys_addr, virt_addr, size, CPLD_HWMS_NAME, data);
+				break;
 #endif
 #ifdef CONFIG_ECOREEX_SOM150
-        case CPLD_SOM150:
-            CPLD_SOM150_map(phys_addr, virt_addr, size, CPLD_SOM150_NAME, data);
-        break;
+			case CPLD_SOM150:
+				CPLD_SOM150_map(phys_addr, virt_addr, size, CPLD_SOM150_NAME, data);
+				break;
 #endif
-			//-----------------------------------------------------------
-			#ifdef CONFIG_ECOREEX_TGPIO
+				//-----------------------------------------------------------
+#ifdef CONFIG_ECOREEX_TGPIO
 			case CPLD_BASE:
 				CPLD_BASE_map(phys_addr,virt_addr,size,CPLD_BASE_NAME);
-			break;
+				break;
 			case CPLD_BASE_11:
 				CPLD_BASE_map(phys_addr,virt_addr,size,CPLD_BASE_NAME_11);
-			break;
-			#endif //CONFIG_ECOREEX_TGPIO
-			//-----------------------------------------------------------
-			#ifdef CONFIG_ECOREEX_SGPWM
+				break;
+#endif //CONFIG_ECOREEX_TGPIO
+				//-----------------------------------------------------------
+#ifdef CONFIG_ECOREEX_SGPWM
 			case CPLD_GPWM:
 				CPLD_GPWM_map(phys_addr,virt_addr,size,CPLD_GPWM_NAME,data);
-			break;
+				break;
 			case CPLD_GPWM_11:
 				CPLD_GPWM_map(phys_addr,virt_addr,size,CPLD_GPWM_NAME_11,data);
-			break;
+				break;
 			case CPLD_GPWM_12:
 				CPLD_GPWM_map(phys_addr,virt_addr,size,CPLD_GPWM_NAME_12,data);
-			break;
-			#endif //CONFIG_ECOREEX_SGPWM
-			//-----------------------------------------------------------
-			#ifdef CONFIG_ECOREEX_GCMB
+				break;
+#endif //CONFIG_ECOREEX_SGPWM
+				//-----------------------------------------------------------
+#ifdef CONFIG_ECOREEX_GCMB
 			case CPLD_GCMB:
 				CPLD_GCMB_map(phys_addr,virt_addr,size,CPLD_GCMB_NAME_10);
-			break;
-			#endif //CONFIG_ECOREEX_GCMB
-			//-----------------------------------------------------------			
-			#ifdef CONFIG_ECOREEX_DENM
+				break;
+#endif //CONFIG_ECOREEX_GCMB
+				//-----------------------------------------------------------			
+#ifdef CONFIG_ECOREEX_DENM
 			case CPLD_DENM:
 				CPLD_DENM_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_12);
-			break;
+				break;
 			case CPLD_DENM14:
 				CPLD_DENM14_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_14);
-			break;
+				break;
 			case CPLD_DENM15:
 				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_15,data);
-			break;
+				break;
 			case CPLD_DENM16:
-				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_16,data);	
-			break;
+				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_16,data);
+				break;
 			case CPLD_DENM17:
-				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_17,data);	
-			break;
+				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_17,data);
+				break;
 			case CPLD_DENM18:
-				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_18,data);	
-			break;
+				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_18,data);
+				break;
 			case CPLD_DENM19:
-				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_19,data);	
-			break;			
-			#endif //CONFIG_ECOREEX_DENM
-			//--------------------------------------------------------
-			
-			default://unrecognized CPLD or no CPLD available, silently fail and the physical memory region
+				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_19,data);
+				break;
+			case CPLD_DENM110:
+				CPLD_DENM15_map(phys_addr,virt_addr,size,CPLD_DENM_NAME_110,data);
+				break;
+#endif //CONFIG_ECOREEX_DENM
+				//--------------------------------------------------------
+
+			default://unrecognized CPLD or no CPLD available, silently fail and the release physical memory region
 				iounmap(virt_addr);
-			}
 		}
+	}
 }
 
 static int ecoreex_probe(struct platform_device *pdev){
diff -Naur linux-2.6.25.at91/drivers/misc/classes/Kconfig linux-2.6/drivers/misc/classes/Kconfig
--- linux-2.6.25.at91/drivers/misc/classes/Kconfig	2009-02-12 12:26:57.000000000 -0600
+++ linux-2.6/drivers/misc/classes/Kconfig	2008-12-30 10:38:39.000000000 -0600
@@ -13,22 +13,22 @@
 	  which sets the pin to input or output, 0 or 1 respectively 
 
 config GPIOCLASS_SYSFS
-		depends on SYSFS && GPIOCLASS
+	depends on SYSFS && GPIOCLASS
         bool "sysfs interface"
         ---help---
-	  enables a sysfs interface to the gpio class
+	  Enables a sysfs interface to the gpio class
 
 config GPIOCLASS_RTDM 
-		depends on XENO_SKIN_RTDM && GPIOCLASS
+	depends on XENO_SKIN_RTDM && GPIOCLASS
         bool "rtdm interface"
         ---help---
-	  enables a Xenomai RTDM interface to the gpio class
+	  Enables a Xenomai RTDM interface to the gpio class
 	  
 config GPIOCLASS_CHAR
-		depends on GPIOCLASS
-		bool "char interface"
-		---help---
-		Enables a character device interface to the GPIO class.
+	depends on GPIOCLASS
+	bool "char interface"
+	---help---
+	  Enables a character device interface to the GPIO class.
 
 config PWMCLASS
         bool "PWM class"
@@ -39,13 +39,13 @@
 	  duty and frequency configuration register.
 	  
 config PWMCLASS_SYSFS
-		depends on SYSFS && PWMCLASS
+	depends on SYSFS && PWMCLASS
         bool "sysfs interface"
         ---help---
 	  enables a sysfs interface to the pwm class
 
 config PWMCLASS_RTDM 
-		depends on XENO_SKIN_RTDM && PWMCLASS
+	depends on XENO_SKIN_RTDM && PWMCLASS
         bool "rtdm interface"
         ---help---
 	  enables a Xenomai RTDM interface to the pwm class	  
@@ -65,28 +65,38 @@
 	  It allows the creation of spi classes which can be configured
 	  through sysfs.SPI devices typically contain a 
 	  speed and flags register, a method for locking the bus, 
-	  and a bidirectional "xmit" method     
+	  and a bidirectional "xmit" method.
 
 config SPICLASS_SYSFS
-		depends on SYSFS && SPICLASS
+	depends on SYSFS && SPICLASS
         bool "sysfs interface"
         ---help---
-	  enables a sysfs interface to the spi class
+	  Enables a sysfs interface to the spi class
 
 config SPICLASS_CHAR
-		depends on SPICLASS
-		bool "char interface"
-		---help---
-		Enables a character device interface to the spi class.
+	depends on SPICLASS
+	bool "char interface"
+	---help---
+	  Enables a character device interface to the spi class.
 
 config LSI2ESC
-        depends on SPICLASS
+        depends on SPICLASS && SPI_MASTER
         bool "Linux SPI Interface to EMAC SPI Class interface"
         ---help---
-        Enables a generic interface between the Linux SPI
-        driver and the EMAC SPI Class. Boards with an SPI controller
-        driver can use this to define generic access to a device
-        through the EMAC SPI class.
+          Enables a generic interface between the Linux SPI
+          driver and the EMAC SPI Class. Boards with an SPI controller
+          driver can use this to define generic access to a device
+          through the EMAC SPI class.
+
+config LSI2ESC_MCP3208
+	depends on LSI2ESC && GPIOCLASS
+	bool "MCP3208 ADC GPIO Interface"
+	---help---
+	  Enables an extension to the LSI2ESC to allow use of the SPI-based
+	  MCP3208 ADC through the GPIO Class. The LSI2ESC interface for this
+	  device must first be setup and registered in the board specific 
+	  initialization code followed by a call to the class creation 
+	  function in this driver.
         
 endmenu

