#include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/platform_device.h>
+#include <linux/platform_data/gpio-em.h>
 #include <linux/delay.h>
 #include <linux/input.h>
 #include <linux/io.h>
        .num_resources  = ARRAY_SIZE(sti_resources),
 };
 
+
+/* GIO */
+static struct gpio_em_config gio0_config = {
+       .gpio_base = 0,
+       .irq_base = EMEV2_GPIO_IRQ(0),
+       .number_of_pins = 32,
+};
+
+static struct resource gio0_resources[] = {
+       [0] = {
+               .name   = "GIO_000",
+               .start  = 0xe0050000,
+               .end    = 0xe005002b,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .name   = "GIO_000",
+               .start  = 0xe0050040,
+               .end    = 0xe005005f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = 99,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = 100,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device gio0_device = {
+       .name           = "em_gio",
+       .id             = 0,
+       .resource       = gio0_resources,
+       .num_resources  = ARRAY_SIZE(gio0_resources),
+       .dev            = {
+               .platform_data  = &gio0_config,
+       },
+};
+
+static struct gpio_em_config gio1_config = {
+       .gpio_base = 32,
+       .irq_base = EMEV2_GPIO_IRQ(32),
+       .number_of_pins = 32,
+};
+
+static struct resource gio1_resources[] = {
+       [0] = {
+               .name   = "GIO_032",
+               .start  = 0xe0050080,
+               .end    = 0xe00500ab,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .name   = "GIO_032",
+               .start  = 0xe00500c0,
+               .end    = 0xe00500df,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = 101,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = 102,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device gio1_device = {
+       .name           = "em_gio",
+       .id             = 1,
+       .resource       = gio1_resources,
+       .num_resources  = ARRAY_SIZE(gio1_resources),
+       .dev            = {
+               .platform_data  = &gio1_config,
+       },
+};
+
+static struct gpio_em_config gio2_config = {
+       .gpio_base = 64,
+       .irq_base = EMEV2_GPIO_IRQ(64),
+       .number_of_pins = 32,
+};
+
+static struct resource gio2_resources[] = {
+       [0] = {
+               .name   = "GIO_064",
+               .start  = 0xe0050100,
+               .end    = 0xe005012b,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .name   = "GIO_064",
+               .start  = 0xe0050140,
+               .end    = 0xe005015f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = 103,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = 104,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device gio2_device = {
+       .name           = "em_gio",
+       .id             = 2,
+       .resource       = gio2_resources,
+       .num_resources  = ARRAY_SIZE(gio2_resources),
+       .dev            = {
+               .platform_data  = &gio2_config,
+       },
+};
+
+static struct gpio_em_config gio3_config = {
+       .gpio_base = 96,
+       .irq_base = EMEV2_GPIO_IRQ(96),
+       .number_of_pins = 32,
+};
+
+static struct resource gio3_resources[] = {
+       [0] = {
+               .name   = "GIO_096",
+               .start  = 0xe0050100,
+               .end    = 0xe005012b,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .name   = "GIO_096",
+               .start  = 0xe0050140,
+               .end    = 0xe005015f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = 105,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = 106,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device gio3_device = {
+       .name           = "em_gio",
+       .id             = 3,
+       .resource       = gio3_resources,
+       .num_resources  = ARRAY_SIZE(gio3_resources),
+       .dev            = {
+               .platform_data  = &gio3_config,
+       },
+};
+
+static struct gpio_em_config gio4_config = {
+       .gpio_base = 128,
+       .irq_base = EMEV2_GPIO_IRQ(128),
+       .number_of_pins = 31,
+};
+
+static struct resource gio4_resources[] = {
+       [0] = {
+               .name   = "GIO_128",
+               .start  = 0xe0050200,
+               .end    = 0xe005022b,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .name   = "GIO_128",
+               .start  = 0xe0050240,
+               .end    = 0xe005025f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = 107,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = 108,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device gio4_device = {
+       .name           = "em_gio",
+       .id             = 4,
+       .resource       = gio4_resources,
+       .num_resources  = ARRAY_SIZE(gio4_resources),
+       .dev            = {
+               .platform_data  = &gio4_config,
+       },
+};
+
 static struct platform_device *emev2_early_devices[] __initdata = {
        &uart0_device,
        &uart1_device,
 
 static struct platform_device *emev2_late_devices[] __initdata = {
        &sti_device,
+       &gio0_device,
+       &gio1_device,
+       &gio2_device,
+       &gio3_device,
+       &gio4_device,
 };
 
 void __init emev2_add_standard_devices(void)