--- a/arch/arm/mach-ixp4xx/cambria-setup.c
+++ b/arch/arm/mach-ixp4xx/cambria-setup.c
@@ -12,11 +12,14 @@
  */
 
 #include <linux/device.h>
+#include <linux/gpio_buttons.h>
 #include <linux/i2c.h>
 #include <linux/i2c-gpio.h>
 #include <linux/i2c/at24.h>
+#include <linux/i2c/gw_i2c_pld.h>
 #include <linux/if_ether.h>
 #include <linux/init.h>
+#include <linux/input.h>
 #include <linux/kernel.h>
 #include <linux/leds.h>
 #include <linux/memory.h>
@@ -323,6 +326,39 @@ static struct platform_device cambria_us
 	},
 };
 
+static struct gw_i2c_pld_platform_data gw_i2c_pld_data0 = {
+	.gpio_base	= 16,
+	.nr_gpio	= 8,
+};
+
+static struct gw_i2c_pld_platform_data gw_i2c_pld_data1 = {
+	.gpio_base	= 24,
+	.nr_gpio	= 2,
+};
+
+
+static struct gpio_button cambria_gpio_buttons[] = {
+	{
+		.desc		= "user",
+		.type		= EV_KEY,
+		.code		= BTN_0,
+		.threshold	= 2,
+		.gpio		= 25,
+	}
+};
+
+static struct gpio_buttons_platform_data cambria_gpio_buttons_data = {
+	.poll_interval	= 500,
+	.nbuttons	= 1,
+	.buttons	= cambria_gpio_buttons,	
+};
+
+static struct platform_device cambria_gpio_buttons_device = {
+	.name			= "gpio-buttons",
+	.id			= -1,
+	.dev.platform_data	= &cambria_gpio_buttons_data,
+};
+
 static struct platform_device *cambria_devices[] __initdata = {
 	&cambria_i2c_gpio,
 	&cambria_flash,
@@ -331,6 +367,11 @@ static struct platform_device *cambria_d
 
 static void __init cambria_gw23xx_setup(void)
 {
+	cambria_gpio_resources[0].start = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) |\
+																		(1 << 5) | (1 << 8) | (1 << 9) | (1 << 12);
+	cambria_gpio_resources[0].end = cambria_gpio_resources[0].start;
+
+	platform_device_register(&cambria_gpio);
 	platform_device_register(&cambria_npec_device);
 	platform_device_register(&cambria_npea_device);
 }
@@ -377,7 +418,8 @@ static void __init cambria_gw2358_setup(
 	cambria_optional_uart_data[1].membase	= (void __iomem *)ioremap(0x53F80000, 0x0fff);
 	cambria_optional_uart_data[1].irq		= IRQ_IXP4XX_GPIO4;
 
-	cambria_gpio_resources[0].start = (1 << 14);
+	cambria_gpio_resources[0].start = (1 << 14) | (1 << 16) | (1 << 17) | (1 << 18) |\
+																		(1 << 19) | (1 << 20) | (1 << 24) | (1 << 25);
 	cambria_gpio_resources[0].end = cambria_gpio_resources[0].start;
 
 	platform_device_register(&cambria_gpio);
@@ -391,7 +433,12 @@ static void __init cambria_gw2358_setup(
 
 	platform_device_register(&cambria_pata);
 
+	cambria_gpio_leds[0].gpio = 24;
+	platform_device_register(&cambria_gpio_leds_device);
+
 	platform_device_register(&cambria_latch_leds_device);
+
+	platform_device_register(&cambria_gpio_buttons_device);
 }
 
 static struct cambria_board_info cambria_boards[] __initdata = {
@@ -460,6 +507,14 @@ static struct i2c_board_info __initdata 
 		I2C_BOARD_INFO("24c08", 0x51),
 		.platform_data	= &cambria_eeprom_info
 	},
+	{
+		I2C_BOARD_INFO("gw_i2c_pld", 0x56),
+		.platform_data	= &gw_i2c_pld_data0,
+	},
+	{
+		I2C_BOARD_INFO("gw_i2c_pld", 0x57),
+		.platform_data	= &gw_i2c_pld_data1,
+	},
 };
 
 static void __init cambria_init(void)