Index: /src/linux/xscale/linux-2.6.23/drivers/char/ixp425_gpio.c
===================================================================
--- /src/linux/xscale/linux-2.6.23/drivers/char/ixp425_gpio.c	(revision 11718)
+++ /src/linux/xscale/linux-2.6.23/drivers/char/ixp425_gpio.c	(revision 11719)
@@ -125,5 +125,5 @@
 
 static int
-eeprom_getb()
+eeprom_getb(void)
 {
     int i, j;
@@ -156,7 +156,23 @@
   return (i >> bit) & 0x1;
 }
-
 unsigned int
-pld_read_gpio()
+pld_read_gpio_b2(int bit)
+{
+  unsigned int i;
+  spin_lock(&gpio_lock);
+    eeprom_start(0xaf);
+    i = eeprom_getb();
+    DATA_LO();
+    CLK_HI();
+    DATA_HI();
+    CLK_LO();
+    CLK_HI();
+  spin_unlock(&gpio_lock);
+  return (i >> bit) & 0x1;
+}
+
+
+unsigned int
+pld_read_gpio(void)
 {
   unsigned int i;
@@ -174,5 +190,5 @@
 
 unsigned int
-pld_read_switch_b()
+pld_read_gpio2(void)
 {
   unsigned int i;
@@ -186,22 +202,7 @@
     CLK_HI();
   spin_unlock(&gpio_lock);
-  return (i >> 1) & 0x1;
-}
-
-unsigned int
-pld_read_switch()
-{
-  unsigned int i;
-  spin_lock(&gpio_lock);
-    eeprom_start(0xaf);
-    i = eeprom_getb();
-    DATA_LO();
-    CLK_HI();
-    DATA_HI();
-    CLK_LO();
-    CLK_HI();
-  spin_unlock(&gpio_lock);
   return i;
 }
+
 
 void
@@ -222,10 +223,10 @@
 
 void
-pld_write_switch(int byte)
+pld_write_gpio2(int byte)
 {
   //printk(KERN_INFO "%s: Enabling LED\n", driver_name);
 
   spin_lock(&gpio_lock);
-    eeprom_start(0xac);
+    eeprom_start(0xae);
     eeprom_putb(byte);
     DATA_LO();
@@ -236,4 +237,5 @@
   spin_unlock(&gpio_lock);
 }
+
 
 struct gpio_bit {
@@ -302,7 +304,7 @@
 	bit.state = pld_read_gpio_b(bit.bit - 16);
 }
-else if (bit.bit == 24)
-{
-	bit.state = pld_read_switch_b();
+else if (bit.bit < 32)
+{
+	bit.state = pld_read_gpio_b2(bit.bit - 24);
 }
 		return copy_to_user((void *)arg, &bit, sizeof(bit)) ? -EFAULT : 0;
@@ -325,4 +327,13 @@
 	pld_write_gpio(temp);
 }
+else if (bit.bit < 32)
+{
+	temp = pld_read_gpio();
+	if (bit.state == 1)
+		temp |= (0x1 << (bit.bit - 24));
+	else
+		temp &= ~(0x1 << (bit.bit - 24));
+	pld_write_gpio2(temp);
+}
 		return OK;
 	case GPIO_GET_CONFIG:
@@ -337,4 +348,8 @@
 {
 	bit.state = pld_read_gpio_b(bit.bit - 16);
+}
+else if (bit.bit < 32)
+{
+	bit.state = pld_read_gpio_b2(bit.bit - 24);
 }
 		return copy_to_user((void *)arg, &bit, sizeof(bit)) ? -EFAULT : 0;
@@ -355,4 +370,13 @@
 		temp |= (0x1 << (bit.bit - 16));
 		pld_write_gpio(temp);
+	}
+}
+else if (bit.bit < 32)
+{
+	temp = pld_read_gpio2();
+	if (bit.state == 2)
+	{
+		temp |= (0x1 << (bit.bit - 24));
+		pld_write_gpio2(temp);
 	}
 }
