Index: linux-2.6.30.10/drivers/gpio/Kconfig
===================================================================
--- linux-2.6.30.10.orig/drivers/gpio/Kconfig	2010-03-24 21:55:56.000000000 +0100
+++ linux-2.6.30.10/drivers/gpio/Kconfig	2010-03-24 21:56:36.000000000 +0100
@@ -176,4 +176,12 @@
 	  SPI driver for Microchip MCP23S08 I/O expander.  This provides
 	  a GPIO interface supporting inputs and outputs.
 
+comment "EBU GPIO expanders:"
+
+config GPIO_IFXMIPS_EBU
+	boolean "IFXMIPS EBU attached I/O expander"
+	depends on IFXMIPS
+	help
+	  This driver allows you to drive latches attached to the SoCc External Bus Unit
+
 endif
Index: linux-2.6.30.10/drivers/gpio/Makefile
===================================================================
--- linux-2.6.30.10.orig/drivers/gpio/Makefile	2010-03-24 21:55:56.000000000 +0100
+++ linux-2.6.30.10/drivers/gpio/Makefile	2010-03-24 21:56:36.000000000 +0100
@@ -12,3 +12,4 @@
 obj-$(CONFIG_GPIO_TWL4030)	+= twl4030-gpio.o
 obj-$(CONFIG_GPIO_XILINX)	+= xilinx_gpio.o
 obj-$(CONFIG_GPIO_BT8XX)	+= bt8xxgpio.o
+obj-$(CONFIG_GPIO_IFXMIPS_EBU)	+= ifxmips_ebu_gpio.o
Index: linux-2.6.30.10/arch/mips/ifxmips/board.c
===================================================================
--- linux-2.6.30.10.orig/arch/mips/ifxmips/board.c	2010-03-25 10:43:06.000000000 +0100
+++ linux-2.6.30.10/arch/mips/ifxmips/board.c	2010-03-25 12:40:54.000000000 +0100
@@ -111,6 +111,11 @@
 	.name = "ifxmips_wdt",
 };
 
+static struct platform_device ifxmips_ebu = {
+	.id = 0,
+	.name = "ifxmips_ebu",
+};
+
 static struct resource ifxmips_mtd_resource = {
 	.start  = IFXMIPS_FLASH_START,
 	.end    = IFXMIPS_FLASH_START + IFXMIPS_FLASH_MAX - 1,
@@ -145,10 +150,18 @@
 static struct gpio_led arv452_gpio_leds[] = {
 	{ .name = "ifx:blue:power", .gpio = 3, .active_low = 1, },
 	{ .name = "ifx:blue:adsl", .gpio = 4, .active_low = 1, },
-	{ .name = "ifx:pink:internet", .gpio = 5, .active_low = 1, },
+	{ .name = "ifx:blue:internet", .gpio = 5, .active_low = 1, },
 	{ .name = "ifx:red:power", .gpio = 6, .active_low = 1, },
 	{ .name = "ifx:yello:wps", .gpio = 7, .active_low = 1, },
 	{ .name = "ifx:red:wps", .gpio = 9, .active_low = 1, },
+	{ .name = "ifx:blue:voip", .gpio = 32, .active_low = 1, },
+	{ .name = "ifx:blue:fxs1", .gpio = 33, .active_low = 1, },
+	{ .name = "ifx:blue:fxs2", .gpio = 34, .active_low = 1, },
+	{ .name = "ifx:blue:fxo", .gpio = 35, .active_low = 1, },
+	{ .name = "ifx:blue:voice", .gpio = 36, .active_low = 1, },
+	{ .name = "ifx:blue:usb", .gpio = 37, .active_low = 1, },
+	{ .name = "ifx:blue:wlan", .gpio = 38, .active_low = 1, },
+	{ .name = "ifx:red:internet", .gpio = 41, .active_low = 1, },
 };
 
 static struct gpio_led_platform_data ifxmips_gpio_led_data;
@@ -205,6 +218,7 @@
 struct platform_device *arv452_devs[] = {
 	&ifxmips_gpio, &ifxmips_mii, &ifxmips_mtd,
 	&ifxmips_gpio_dev, &ifxmips_wdt, &dwc_usb,
+	&ifxmips_ebu,
 #ifdef CONFIG_LEDS_GPIO
 	&ifxmips_gpio_leds,
 #endif
Index: linux-2.6.30.10/drivers/gpio/ifxmips_ebu_gpio.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.30.10/drivers/gpio/ifxmips_ebu_gpio.c	2010-03-25 12:47:07.000000000 +0100
@@ -0,0 +1,121 @@
+/*
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *   Copyright (C) 2010 John Crispin <blogic@openwrt.org>
+ */
+
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/mutex.h>
+#include <linux/gpio.h>
+#include <ifxmips.h>
+
+#define IFXMIPS_EBU_START	0x14000000
+#define IFXMIPS_EBU_MAX		0x00001000
+#define IFXMIPS_EBU_BUSCON	0x1e7ff
+#define IFXMIPS_EBU_WP		0x80000000
+
+static int shadow = (1 << 10) | (1 << 8);
+static void __iomem *virt;
+
+static int
+ifxmips_ebu_direction_input(struct gpio_chip *chip, unsigned offset)
+{
+	return -EINVAL;
+}
+
+static int
+ifxmips_ebu_direction_output(struct gpio_chip *chip, unsigned offset, int value)
+{
+	return 0;
+}
+
+static int
+ifxmips_ebu_get(struct gpio_chip *chip, unsigned offset)
+{
+	return -EINVAL;
+}
+
+static void
+ifxmips_ebu_set(struct gpio_chip *chip, unsigned offset, int value)
+{
+	if(value)
+		shadow |= (1 << offset);
+	else
+		shadow &= ~(1 << offset);
+	ifxmips_w32(IFXMIPS_EBU_BUSCON, IFXMIPS_EBU_BUSCON1);
+	*((__u16*)virt) = shadow;
+	ifxmips_w32(IFXMIPS_EBU_BUSCON | IFXMIPS_EBU_WP, IFXMIPS_EBU_BUSCON1);
+}
+
+static struct gpio_chip
+ifxmips_ebu_chip =
+{
+	.label = "ifxmips_ebu",
+	.direction_input = ifxmips_ebu_direction_input,
+	.direction_output = ifxmips_ebu_direction_output,
+	.set = ifxmips_ebu_set,
+	.get = ifxmips_ebu_get,
+	.base = 32,
+	.ngpio = 16,
+	.can_sleep = 1,
+	.owner = THIS_MODULE,
+};
+
+static int __devinit
+ifxmips_ebu_probe(struct platform_device *dev)
+{
+	ifxmips_w32(IFXMIPS_EBU_START | 0x1, IFXMIPS_EBU_ADDRSEL1);
+	ifxmips_w32(IFXMIPS_EBU_BUSCON | IFXMIPS_EBU_WP, IFXMIPS_EBU_BUSCON1);
+	virt = ioremap_nocache(IFXMIPS_EBU_START, IFXMIPS_EBU_MAX);
+	if(gpiochip_add(&ifxmips_ebu_chip))
+		return -EINVAL;
+	return 0;
+}
+
+static int
+ifxmips_ebu_remove(struct platform_device *dev)
+{
+	return gpiochip_remove(&ifxmips_ebu_chip);
+}
+
+static struct platform_driver
+ifxmips_ebu_driver = {
+	.probe = ifxmips_ebu_probe,
+	.remove = ifxmips_ebu_remove,
+	.driver = {
+		.name = "ifxmips_ebu",
+		.owner = THIS_MODULE,
+	},
+};
+
+static int __init
+ifxmips_ebu_init(void)
+{
+	return platform_driver_register(&ifxmips_ebu_driver);
+}
+
+static void __exit
+ifxmips_ebu_exit(void)
+{
+	platform_driver_unregister(&ifxmips_ebu_driver);
+}
+
+module_init(ifxmips_ebu_init);
+module_exit(ifxmips_ebu_exit);
+
+MODULE_AUTHOR("John Crispin <blogic@openwrt.org>");
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("ifxmips - EBU Latch GPIO-Expander");
