[PATCH 2/2 RFC]OMAP3430: hwmod: Adapt GPIO to use HWMOD FW

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Charulatha V <charu@xxxxxx>

HWmod framework is used for OMAP3430 GPIO driver.

Signed-off-by: Charulatha V <charu@xxxxxx>
---
 arch/arm/mach-omap2/gpio.c             |  901 ++++----------------------------
 arch/arm/plat-omap/include/plat/gpio.h |   25 +-
 2 files changed, 123 insertions(+), 803 deletions(-)

diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c
index f28900f..7b00a1e 100644
--- a/arch/arm/mach-omap2/gpio.c
+++ b/arch/arm/mach-omap2/gpio.c
@@ -31,689 +31,15 @@
 #include <asm/mach/irq.h>
 #include <plat/powerdomain.h>
 #include <plat/mux.h>
+#include <plat/omap_hwmod.h>
+#include <plat/omap_device.h>
 
-/*
- * OMAP242X GPIO1 interface data
- */
-static struct __initdata resource omap242x_gpio1_resources[] = {
-	{
-		.start	= OMAP242X_GPIO1_BASE,
-		.end	= OMAP242X_GPIO1_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK1,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap242x_gpio1_config = {
-	.ick_name = "gpios_ick",
-	.fck_name = "gpios_fck",
-	.virtual_irq_start = IH_GPIO_BASE,
-};
-
-static struct __initdata platform_device omap242x_gpio1 = {
-	.name           = "omap-gpio",
-	.id             = 0,
-	.dev            = {
-		.platform_data = &omap242x_gpio1_config,
-	},
-	.num_resources = ARRAY_SIZE(omap242x_gpio1_resources),
-	.resource = omap242x_gpio1_resources,
-};
-
-/*
- * OMAP242X GPIO2 interface data
- */
-static struct __initdata resource omap242x_gpio2_resources[] = {
-	{
-		.start	= OMAP242X_GPIO2_BASE,
-		.end	= OMAP242X_GPIO2_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK2,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap242x_gpio2_config = {
-	.ick_name = "gpios_ick",
-	.fck_name = "gpios_fck",
-	.virtual_irq_start = IH_GPIO_BASE + 32,
-};
-
-static struct __initdata platform_device omap242x_gpio2 = {
-	.name           = "omap-gpio",
-	.id             = 1,
-	.dev            = {
-		.platform_data = &omap242x_gpio2_config,
-	},
-	.num_resources = ARRAY_SIZE(omap242x_gpio2_resources),
-	.resource = omap242x_gpio2_resources,
-};
-
-/*
- * OMAP242X GPIO3 interface data
- */
-static struct __initdata resource omap242x_gpio3_resources[] = {
-	{
-		.start	= OMAP242X_GPIO3_BASE,
-		.end	= OMAP242X_GPIO3_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK3,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap242x_gpio3_config = {
-	.ick_name = "gpios_ick",
-	.fck_name = "gpios_fck",
-	.virtual_irq_start = IH_GPIO_BASE + 64,
-};
-
-static struct __initdata platform_device omap242x_gpio3 = {
-	.name           = "omap-gpio",
-	.id             = 2,
-	.dev            = {
-		.platform_data = &omap242x_gpio3_config,
+struct omap_device_pm_latency omap_gpio_latency[] = {
+	[0] = {
+		.deactivate_func = omap_device_idle_hwmods,
+		.activate_func   = omap_device_enable_hwmods,
+		.flags		 = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
 	},
-	.num_resources = ARRAY_SIZE(omap242x_gpio3_resources),
-	.resource = omap242x_gpio3_resources,
-};
-
-/*
- * OMAP242X GPIO4 interface data
- */
-static struct __initdata resource omap242x_gpio4_resources[] = {
-	{
-		.start	= OMAP242X_GPIO4_BASE,
-		.end	= OMAP242X_GPIO4_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK4,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap242x_gpio4_config = {
-	.ick_name = "gpios_ick",
-	.fck_name = "gpios_fck",
-	.virtual_irq_start = IH_GPIO_BASE + 96,
-};
-
-static struct __initdata platform_device omap242x_gpio4 = {
-	.name           = "omap-gpio",
-	.id             = 3,
-	.dev            = {
-		.platform_data = &omap242x_gpio4_config,
-	},
-	.num_resources = ARRAY_SIZE(omap242x_gpio4_resources),
-	.resource = omap242x_gpio4_resources,
-};
-
-/*
- * OMAP243X GPIO1 interface data
- */
-static struct __initdata resource omap243x_gpio1_resources[] = {
-	{
-		.start	= OMAP243X_GPIO1_BASE,
-		.end	= OMAP243X_GPIO1_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK1,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap243x_gpio1_config = {
-	.ick_name = "gpios_ick",
-	.fck_name = "gpios_fck",
-	.virtual_irq_start = IH_GPIO_BASE,
-};
-
-static struct __initdata platform_device omap243x_gpio1 = {
-	.name           = "omap-gpio",
-	.id             = 0,
-	.dev            = {
-		.platform_data = &omap243x_gpio1_config,
-	},
-	.num_resources = ARRAY_SIZE(omap243x_gpio1_resources),
-	.resource = omap243x_gpio1_resources,
-};
-
-/*
- * OMAP243X GPIO2 interface data
- */
-static struct __initdata resource omap243x_gpio2_resources[] = {
-	{
-		.start	= OMAP243X_GPIO2_BASE,
-		.end	= OMAP243X_GPIO2_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK2,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap243x_gpio2_config = {
-	.ick_name = "gpios_ick",
-	.fck_name = "gpios_fck",
-	.virtual_irq_start = IH_GPIO_BASE + 32,
-};
-
-static struct __initdata platform_device omap243x_gpio2 = {
-	.name           = "omap-gpio",
-	.id             = 1,
-	.dev            = {
-		.platform_data = &omap243x_gpio2_config,
-	},
-	.num_resources = ARRAY_SIZE(omap243x_gpio2_resources),
-	.resource = omap243x_gpio2_resources,
-};
-
-/*
- * OMAP243X GPIO3 interface data
- */
-static struct __initdata resource omap243x_gpio3_resources[] = {
-	{
-		.start	= OMAP243X_GPIO3_BASE,
-		.end	= OMAP243X_GPIO3_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK3,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap243x_gpio3_config = {
-	.ick_name = "gpios_ick",
-	.fck_name = "gpios_fck",
-	.virtual_irq_start = IH_GPIO_BASE + 64,
-};
-
-static struct __initdata platform_device omap243x_gpio3 = {
-	.name           = "omap-gpio",
-	.id             = 2,
-	.dev            = {
-		.platform_data = &omap243x_gpio3_config,
-	},
-	.num_resources = ARRAY_SIZE(omap243x_gpio3_resources),
-	.resource = omap243x_gpio3_resources,
-};
-
-/*
- * OMAP243X GPIO4 interface data
- */
-static struct __initdata resource omap243x_gpio4_resources[] = {
-	{
-		.start	= OMAP243X_GPIO4_BASE,
-		.end	= OMAP243X_GPIO4_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK4,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap243x_gpio4_config = {
-	.ick_name = "gpios_ick",
-	.fck_name = "gpios_fck",
-	.virtual_irq_start = IH_GPIO_BASE + 96,
-};
-
-static struct __initdata platform_device omap243x_gpio4 = {
-	.name           = "omap-gpio",
-	.id             = 3,
-	.dev            = {
-		.platform_data = &omap243x_gpio4_config,
-	},
-	.num_resources = ARRAY_SIZE(omap243x_gpio4_resources),
-	.resource = omap243x_gpio4_resources,
-};
-
-/*
- * OMAP243X GPIO5 interface data
- */
-static struct __initdata resource omap243x_gpio5_resources[] = {
-	{
-		.start	= OMAP243X_GPIO5_BASE,
-		.end	= OMAP243X_GPIO5_BASE + OMAP2_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_24XX_GPIO_BANK5,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap243x_gpio5_config = {
-	.ick_name = "gpio5_ick",
-	.fck_name = "gpio5_fck",
-	.virtual_irq_start = IH_GPIO_BASE + 128,
-};
-
-static struct __initdata platform_device omap243x_gpio5 = {
-	.name           = "omap-gpio",
-	.id             = 4,
-	.dev            = {
-		.platform_data = &omap243x_gpio5_config,
-	},
-	.num_resources = ARRAY_SIZE(omap243x_gpio5_resources),
-	.resource = omap243x_gpio5_resources,
-};
-
-/*
- * OMAP3 GPIO1 interface data
- */
-static struct __initdata resource omap3_gpio1_resources[] = {
-	{
-		.start	= OMAP34XX_GPIO1_BASE,
-		.end	= OMAP34XX_GPIO1_BASE + OMAP3_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_34XX_GPIO_BANK1,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap3_gpio1_config = {
-	.ick_name = "gpio1_ick",
-	.dbck_name = "gpio1_dbck",
-	.virtual_irq_start = IH_GPIO_BASE,
-};
-
-static struct __initdata platform_device omap3_gpio1 = {
-	.name           = "omap-gpio",
-	.id             = 0,
-	.dev            = {
-		.platform_data = &omap3_gpio1_config,
-	},
-	.num_resources = ARRAY_SIZE(omap3_gpio1_resources),
-	.resource = omap3_gpio1_resources,
-};
-
-/*
- * OMAP3 GPIO2 interface data
- */
-static struct __initdata resource omap3_gpio2_resources[] = {
-	{
-		.start	= OMAP34XX_GPIO2_BASE,
-		.end	= OMAP34XX_GPIO2_BASE + OMAP3_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_34XX_GPIO_BANK2,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap3_gpio2_config = {
-	.ick_name = "gpio2_ick",
-	.dbck_name = "gpio2_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 32,
-};
-
-static struct __initdata platform_device omap3_gpio2 = {
-	.name           = "omap-gpio",
-	.id             = 1,
-	.dev            = {
-		.platform_data = &omap3_gpio2_config,
-	},
-	.num_resources = ARRAY_SIZE(omap3_gpio2_resources),
-	.resource = omap3_gpio2_resources,
-};
-
-/*
- * OMAP3 GPIO3 interface data
- */
-static struct __initdata resource omap3_gpio3_resources[] = {
-	{
-		.start	= OMAP34XX_GPIO3_BASE,
-		.end	= OMAP34XX_GPIO3_BASE + OMAP3_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_34XX_GPIO_BANK3,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap3_gpio3_config = {
-	.ick_name = "gpio3_ick",
-	.dbck_name = "gpio3_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 64,
-};
-
-static struct __initdata platform_device omap3_gpio3 = {
-	.name           = "omap-gpio",
-	.id             = 2,
-	.dev            = {
-		.platform_data = &omap3_gpio3_config,
-	},
-	.num_resources = ARRAY_SIZE(omap3_gpio3_resources),
-	.resource = omap3_gpio3_resources,
-};
-
-/*
- * OMAP3 GPIO4 interface data
- */
-static struct __initdata resource omap3_gpio4_resources[] = {
-	{
-		.start	= OMAP34XX_GPIO4_BASE,
-		.end	= OMAP34XX_GPIO4_BASE + OMAP3_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_34XX_GPIO_BANK4,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap3_gpio4_config = {
-	.ick_name = "gpio4_ick",
-	.dbck_name = "gpio4_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 96,
-};
-
-static struct __initdata platform_device omap3_gpio4 = {
-	.name           = "omap-gpio",
-	.id             = 3,
-	.dev            = {
-		.platform_data = &omap3_gpio4_config,
-	},
-	.num_resources = ARRAY_SIZE(omap3_gpio4_resources),
-	.resource = omap3_gpio4_resources,
-};
-
-/*
- * OMAP3 GPIO5 interface data
- */
-static struct __initdata resource omap3_gpio5_resources[] = {
-	{
-		.start	= OMAP34XX_GPIO5_BASE,
-		.end	= OMAP34XX_GPIO5_BASE + OMAP3_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_34XX_GPIO_BANK5,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap3_gpio5_config = {
-	.ick_name = "gpio5_ick",
-	.dbck_name = "gpio5_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 128,
-};
-
-static struct __initdata platform_device omap3_gpio5 = {
-	.name           = "omap-gpio",
-	.id             = 4,
-	.dev            = {
-		.platform_data = &omap3_gpio5_config,
-	},
-	.num_resources = ARRAY_SIZE(omap3_gpio5_resources),
-	.resource = omap3_gpio5_resources,
-};
-
-/*
- * OMAP3 GPIO6 interface data
- */
-static struct __initdata resource omap3_gpio6_resources[] = {
-	{
-		.start	= OMAP34XX_GPIO6_BASE,
-		.end	= OMAP34XX_GPIO6_BASE + OMAP3_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_34XX_GPIO_BANK4,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap3_gpio6_config = {
-	.ick_name = "gpio6_ick",
-	.dbck_name = "gpio6_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 160,
-};
-
-static struct __initdata platform_device omap3_gpio6 = {
-	.name           = "omap-gpio",
-	.id             = 5,
-	.dev            = {
-		.platform_data = &omap3_gpio6_config,
-	},
-	.num_resources = ARRAY_SIZE(omap3_gpio6_resources),
-	.resource = omap3_gpio6_resources,
-};
-
-/*
- * OMAP44XX GPIO1 interface data
- */
-static struct __initdata resource omap4_gpio1_resources[] = {
-	{
-		.start	= OMAP44XX_GPIO1_BASE,
-		.end	= OMAP44XX_GPIO1_BASE + OMAP4_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_44XX_GPIO_BANK1,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap4_gpio1_config = {
-	.ick_name = "gpio1_ick",
-	.dbck_name = "gpio1_dbck",
-	.virtual_irq_start = IH_GPIO_BASE,
-};
-
-static struct __initdata platform_device omap4_gpio1 = {
-	.name           = "omap-gpio",
-	.id             = 0,
-	.dev            = {
-		.platform_data = &omap4_gpio1_config,
-	},
-	.num_resources = ARRAY_SIZE(omap4_gpio1_resources),
-	.resource = omap4_gpio1_resources,
-};
-
-/*
- * OMAP44XX GPIO2 interface data
- */
-static struct __initdata resource omap4_gpio2_resources[] = {
-	{
-		.start	= OMAP44XX_GPIO2_BASE,
-		.end	= OMAP44XX_GPIO2_BASE + OMAP4_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_44XX_GPIO_BANK2,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap4_gpio2_config = {
-	.ick_name = "gpio2_ick",
-	.dbck_name = "gpio2_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 32,
-};
-
-static struct __initdata platform_device omap4_gpio2 = {
-	.name           = "omap-gpio",
-	.id             = 1,
-	.dev            = {
-		.platform_data = &omap4_gpio2_config,
-	},
-	.num_resources = ARRAY_SIZE(omap4_gpio2_resources),
-	.resource = omap4_gpio2_resources,
-};
-
-/*
- * OMAP44XX GPIO3 interface data
- */
-static struct __initdata resource omap4_gpio3_resources[] = {
-	{
-		.start	= OMAP44XX_GPIO3_BASE,
-		.end	= OMAP44XX_GPIO3_BASE + OMAP4_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_44XX_GPIO_BANK3,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap4_gpio3_config = {
-	.ick_name = "gpio3_ick",
-	.dbck_name = "gpio3_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 64,
-};
-
-static struct __initdata platform_device omap4_gpio3 = {
-	.name           = "omap-gpio",
-	.id             = 2,
-	.dev            = {
-		.platform_data = &omap4_gpio3_config,
-	},
-	.num_resources = ARRAY_SIZE(omap4_gpio3_resources),
-	.resource = omap4_gpio3_resources,
-};
-
-/*
- * OMAP44XX GPIO4 interface data
- */
-static struct __initdata resource omap4_gpio4_resources[] = {
-	{
-		.start	= OMAP44XX_GPIO4_BASE,
-		.end	= OMAP44XX_GPIO4_BASE + OMAP4_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_44XX_GPIO_BANK4,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap4_gpio4_config = {
-	.ick_name = "gpio4_ick",
-	.dbck_name = "gpio4_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 96,
-};
-
-static struct __initdata platform_device omap4_gpio4 = {
-	.name           = "omap-gpio",
-	.id             = 3,
-	.dev            = {
-		.platform_data = &omap4_gpio4_config,
-	},
-	.num_resources = ARRAY_SIZE(omap4_gpio4_resources),
-	.resource = omap4_gpio4_resources,
-};
-
-/*
- * OMAP44XX GPIO5 interface data
-  */
-static struct __initdata resource omap4_gpio5_resources[] = {
-	{
-		.start	= OMAP44XX_GPIO5_BASE,
-		.end	= OMAP44XX_GPIO5_BASE + OMAP4_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_44XX_GPIO_BANK5,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap4_gpio5_config = {
-	.ick_name = "gpio5_ick",
-	.dbck_name = "gpio5_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 128,
-};
-
-static struct __initdata platform_device omap4_gpio5 = {
-	.name           = "omap-gpio",
-	.id             = 4,
-	.dev            = {
-		.platform_data = &omap4_gpio5_config,
-	},
-	.num_resources = ARRAY_SIZE(omap4_gpio5_resources),
-	.resource = omap4_gpio5_resources,
-};
-
-/*
- * OMAP44XX GPIO6 interface data
-  */
-static struct __initdata resource omap4_gpio6_resources[] = {
-	{
-		.start	= OMAP44XX_GPIO6_BASE,
-		.end	= OMAP44XX_GPIO6_BASE + OMAP4_GPIO_AS_LEN - 1,
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.start	= INT_44XX_GPIO_BANK6,
-		.flags	= IORESOURCE_IRQ,
-	},
-};
-
-static struct __initdata omap_gpio_platform_data omap4_gpio6_config = {
-	.ick_name = "gpio6_ick",
-	.dbck_name = "gpio6_dbck",
-	.virtual_irq_start = IH_GPIO_BASE + 160,
-};
-
-static struct __initdata platform_device omap4_gpio6 = {
-	.name           = "omap-gpio",
-	.id             = 5,
-	.dev            = {
-		.platform_data = &omap4_gpio6_config,
-	},
-	.num_resources = ARRAY_SIZE(omap4_gpio6_resources),
-	.resource = omap4_gpio6_resources,
-};
-
-static struct __initdata platform_device * omap242x_gpio_early_dev[] = {
-	&omap242x_gpio1,
-	&omap242x_gpio2,
-	&omap242x_gpio3,
-	&omap242x_gpio4
-};
-
-static struct __initdata platform_device * omap243x_gpio_early_dev[] = {
-	&omap243x_gpio1,
-	&omap243x_gpio2,
-	&omap243x_gpio3,
-	&omap243x_gpio4,
-	&omap243x_gpio5
-};
-
-static struct __initdata platform_device * omap3_gpio_early_dev[] = {
-	&omap3_gpio1,
-	&omap3_gpio2,
-	&omap3_gpio3,
-	&omap3_gpio4,
-	&omap3_gpio5,
-	&omap3_gpio6
-};
-
-static struct __initdata platform_device * omap4_gpio_early_dev[] = {
-	&omap4_gpio1,
-	&omap4_gpio2,
-	&omap4_gpio3,
-	&omap4_gpio4,
-	&omap4_gpio5,
-	&omap4_gpio6
 };
 
 struct omap3_gpio_regs {
@@ -731,7 +57,7 @@ struct omap3_gpio_regs {
 };
 
 #ifdef CONFIG_ARCH_OMAP3
-static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS];
+static struct omap3_gpio_regs gpio_context[OMAP_NR_GPIOS];
 #endif
 
 /* GPIO -> PAD init configuration struct */
@@ -785,13 +111,13 @@ struct gpio_pad {
 	u16 save;
 };
 
-#define OMAP34XX_GPIO_AMT	(32 * OMAP34XX_NR_GPIOS)
+#define OMAP34XX_GPIO_AMT	(32 * OMAP_NR_GPIOS)
 
 #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
 static struct gpio_pad *gpio_pads;
 #endif
 static u16 gpio_pad_map[OMAP34XX_GPIO_AMT];
-static struct gpio_bank gpio_bank[OMAP_MAX_NR_GPIOS];
+static struct gpio_bank gpio_bank[OMAP_NR_GPIOS];
 static int gpio_bank_count;
 
 static inline struct gpio_bank *get_gpio_bank(int gpio)
@@ -1836,7 +1162,7 @@ void omap_gpio_save_context(void)
 	u16 offset, conf;
 	u32 out, pin;
 	struct gpio_pad *pad;
-	u32 tmp_oe[OMAP34XX_NR_GPIOS];
+	u32 tmp_oe[OMAP_NR_GPIOS];
 
 	/* saving banks from 2-6 only since GPIO1 is in WKUP */
 	for (i = 1; i < gpio_bank_count; i++) {
@@ -1978,17 +1304,8 @@ static int __devexit omap_gpio_remove(struct platform_device *pdev)
 		return 0;
 
 	bank = &gpio_bank[id];
-	if (cpu_is_omap24xx()) {
-		clk_disable(bank->fck);
-		clk_put(bank->fck);
-	}
-	clk_disable(bank->ick);
-	clk_put(bank->ick);
-
-	bank->ick = NULL;
-	bank->fck = NULL;
+	bank->device_shutdown(pdev);
 	bank->initialized = 0;
-	iounmap(bank->base);
 
 	return 0;
 }
@@ -1998,7 +1315,6 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
 	static int show_rev_once;
 	struct omap_gpio_platform_data *pdata = pdev->dev.platform_data;
 	struct gpio_bank *bank;
-	struct resource *res;
 	int id, i;
 
 	if (!pdev || !pdata) {
@@ -2007,14 +1323,11 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
+	gpio_bank_count = OMAP_NR_GPIOS;
+#ifdef CONFIG_ARCH_OMAP2
 	if (cpu_is_omap242x())
 		gpio_bank_count = OMAP242X_NR_GPIOS;
-	else if (cpu_is_omap243x())
-		gpio_bank_count = OMAP243X_NR_GPIOS;
-	else if (cpu_is_omap34xx())
-		gpio_bank_count = OMAP34XX_NR_GPIOS;
-	else if (cpu_is_omap44xx())
-		gpio_bank_count = OMAP44XX_NR_GPIOS;
+#endif
 
 	id = pdev->id;
 	if (id > gpio_bank_count) {
@@ -2028,47 +1341,17 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
 		return 0;
 
 	bank->virtual_irq_start = pdata->virtual_irq_start;
-
-	bank->ick = clk_get(NULL, pdata->ick_name);
-	if (IS_ERR(bank->ick))
-		pr_err("Could not get %s\n", pdata->ick_name);
-	else
-		clk_enable(bank->ick);
-
-	if (cpu_is_omap24xx()) {
-		bank->fck = clk_get(NULL, pdata->fck_name);
-		if (IS_ERR(bank->fck))
-			pr_err("Could not get %s\n", pdata->fck_name);
-		else
-			clk_enable(bank->fck);
-	}
+	bank->base = pdata->base;
+	bank->device_enable = pdata->device_enable;
+	bank->device_idle = pdata->device_idle;
+	bank->device_shutdown = pdata->device_shutdown;
 
 	spin_lock_init(&bank->lock);
-
-	/* Static mapping, never released */
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (unlikely(!res)) {
-		pr_err("GPIO Bank %i Invalid mem resource\n", id);
-		return -ENODEV;
-	}
-
-	bank->base = ioremap(res->start, resource_size(res));
-	if (!bank->base) {
-		pr_err("Could not ioremap gpio bank%i\n", id);
-		return -ENOMEM;
-	}
-
-	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-	if (unlikely(!res)) {
-		pr_err("GPIO Bank %i Invalid irq resource\n", id);
-		return -ENODEV;
-	}
+	pdata->device_enable(pdev);
 
 	if (cpu_is_omap44xx()) {
 		__raw_writel(0xffffffff, bank->base +
 					OMAP4_GPIO_IRQSTATUSCLR0);
-		__raw_writew(0x0015, bank->base +
-					OMAP4_GPIO_SYSCONFIG);
 		__raw_writel(0x00000000, bank->base +
 					 OMAP4_GPIO_DEBOUNCENABLE);
 		/* Initialize interface clk ungated, module enabled */
@@ -2078,8 +1361,6 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
 					OMAP24XX_GPIO_IRQENABLE1);
 		__raw_writel(0xffffffff, bank->base +
 					OMAP24XX_GPIO_IRQSTATUS1);
-		__raw_writew(0x0015, bank->base +
-					OMAP24XX_GPIO_SYSCONFIG);
 		__raw_writel(0x00000000, bank->base +
 					OMAP24XX_GPIO_DEBOUNCE_EN);
 
@@ -2120,13 +1401,16 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
 		set_irq_handler(i, handle_simple_irq);
 		set_irq_flags(i, IRQF_VALID);
 	}
-	set_irq_chained_handler(res->start, gpio_irq_handler);
-	set_irq_data(res->start, bank);
+	set_irq_chained_handler(pdata->irq, gpio_irq_handler);
+	set_irq_data(pdata->irq, bank);
 
+	/* XXX TODO: Remove once hwmod supports getting opt_clk details */
 	if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
-		bank->dbck = clk_get(NULL, pdata->dbck_name);
+		char clk_name[11];
+		sprintf(clk_name, "gpio%d_dbck", id + 1);
+		bank->dbck = clk_get(NULL, clk_name);
 		if (IS_ERR(bank->dbck))
-			pr_err("Could not get %s\n", pdata->dbck_name);
+			pr_err("Could not get %s\n", clk_name);
 	}
 
 	/* Enable autoidle for the OCP interface */
@@ -2147,64 +1431,96 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
 
 void __init omap_gpio_early_init(void)
 {
-	struct platform_device **pdev;
+	int i = 0;
 
-	if (cpu_is_omap242x()) {
-		pdev = omap242x_gpio_early_dev;
+	gpio_bank_count = OMAP_NR_GPIOS;
+#ifdef CONFIG_ARCH_OMAP2
+	if (cpu_is_omap242x())
 		gpio_bank_count = OMAP242X_NR_GPIOS;
-	} else if (cpu_is_omap243x()) {
-		pdev = omap243x_gpio_early_dev;
-		gpio_bank_count = OMAP243X_NR_GPIOS;
-	} else if (cpu_is_omap34xx()) {
-		pdev = omap3_gpio_early_dev;
-		gpio_bank_count = OMAP34XX_NR_GPIOS;
-	} else if (cpu_is_omap44xx()) {
-		pdev = omap4_gpio_early_dev;
-		gpio_bank_count = OMAP44XX_NR_GPIOS;
-	}
+#endif
+
+	do {
+		struct omap_device *od;
+		struct omap_hwmod *oh;
+		int hw_mod_name_len = 16;
+		int l;
+		char oh_name[hw_mod_name_len];
+		struct omap_gpio_platform_data *pdata;
+		char *name = "omap-gpio";
+
+		l = snprintf(oh_name, hw_mod_name_len, "gpio%d_hwmod", i + 1);
+		WARN(l >= hw_mod_name_len,
+			"String buffer overflow in GPIO device setup\n");
+
+		oh = omap_hwmod_lookup(oh_name);
+		if (!oh) {
+			pr_err("Could not look up %s\n", oh_name);
+			continue;
+		}
+
+		pdata = kzalloc(sizeof(struct omap_gpio_platform_data),
+					GFP_KERNEL);
+		pdata->base = oh->_rt_va;
+		pdata->irq = oh->mpu_irqs[0].irq;
+		pdata->virtual_irq_start = IH_GPIO_BASE + 32 * i;
+		pdata->device_enable = omap_device_enable;
+		pdata->device_idle = omap_device_idle;
+		pdata->device_shutdown = omap_device_shutdown;
+
+		od = omap_device_build(name, i, oh, pdata,
+					sizeof(*pdata),	omap_gpio_latency,
+					ARRAY_SIZE(omap_gpio_latency), 1);
+		WARN(IS_ERR(od), "Cant build omap_device for %s:%s.\n",
+					name, oh->name);
+
+		i++;
+	} while (i < gpio_bank_count);
 
-	early_platform_add_devices(pdev, gpio_bank_count);
 	early_platform_driver_register_all("earlygpio");
 	early_platform_driver_probe("earlygpio", gpio_bank_count, 0);
+	return;
 }
 
 int __init omap_init_gpio(void)
 {
-	if (cpu_is_omap242x()) {
-		platform_device_add(&omap242x_gpio1);
-		platform_device_add(&omap242x_gpio2);
-		platform_device_add(&omap242x_gpio3);
-		platform_device_add(&omap242x_gpio4);
-		platform_device_register(&omap242x_gpio1);
-		platform_device_register(&omap242x_gpio2);
-		platform_device_register(&omap242x_gpio3);
-		platform_device_register(&omap242x_gpio4);
-	} else if (cpu_is_omap243x()) {
-		platform_device_add(&omap243x_gpio1);
-		platform_device_add(&omap243x_gpio2);
-		platform_device_add(&omap243x_gpio3);
-		platform_device_add(&omap243x_gpio4);
-		platform_device_add(&omap243x_gpio5);
-		platform_device_register(&omap243x_gpio1);
-		platform_device_register(&omap243x_gpio2);
-		platform_device_register(&omap243x_gpio3);
-		platform_device_register(&omap243x_gpio4);
-		platform_device_register(&omap243x_gpio5);
-	} else if (cpu_is_omap34xx()) {
-		platform_device_register(&omap3_gpio1);
-		platform_device_register(&omap3_gpio2);
-		platform_device_register(&omap3_gpio3);
-		platform_device_register(&omap3_gpio4);
-		platform_device_register(&omap3_gpio5);
-		platform_device_register(&omap3_gpio6);
-	} else if (cpu_is_omap44xx()) {
-		platform_device_add(&omap4_gpio1);
-		platform_device_add(&omap4_gpio2);
-		platform_device_add(&omap4_gpio3);
-		platform_device_add(&omap4_gpio4);
-		platform_device_add(&omap4_gpio5);
-		platform_device_add(&omap4_gpio6);
-	}
+	int i = 0;
+	struct omap_device *od;
+	struct omap_hwmod *oh;
+	int hw_mod_name_len = 16;
+	int l;
+	char oh_name[hw_mod_name_len];
+	struct omap_gpio_platform_data *pdata;
+	char *name = "omap-gpio";
+
+	do {
+		l = snprintf(oh_name, hw_mod_name_len, "gpio%d_hwmod", i + 1);
+		WARN(l >= hw_mod_name_len,
+			"String buffer overflow in GPIO device setup\n");
+
+		oh = omap_hwmod_lookup(oh_name);
+		if (!oh) {
+			pr_err("Could not look up %s\n", oh_name);
+			continue;
+		}
+
+		pdata = kzalloc(sizeof(struct omap_gpio_platform_data),
+					GFP_KERNEL);
+		pdata->base = oh->_rt_va;
+		pdata->irq = oh->mpu_irqs[0].irq;
+		pdata->virtual_irq_start = IH_GPIO_BASE + 32 * i;
+		pdata->device_enable = omap_device_enable;
+		pdata->device_idle = omap_device_idle;
+		pdata->device_shutdown = omap_device_shutdown;
+
+		od = omap_device_build(name, i, oh, pdata,
+					sizeof(*pdata),	omap_gpio_latency,
+					ARRAY_SIZE(omap_gpio_latency), 0);
+		WARN(IS_ERR(od), "Cant build omap_device for %s:%s.\n",
+					name, oh->name);
+
+		i++;
+	} while (i < gpio_bank_count);
+
 	return 0;
 }
 
@@ -2235,7 +1551,6 @@ static int __init omap_gpio_sysinit(void)
 		if (ret == 0)
 			ret = sysdev_register(&omap_gpio_device);
 	}
-
 	return ret;
 }
 
diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h
index 1470e8e..e1a09a6 100644
--- a/arch/arm/plat-omap/include/plat/gpio.h
+++ b/arch/arm/plat-omap/include/plat/gpio.h
@@ -29,6 +29,7 @@
 #include <linux/io.h>
 #include <linux/sysdev.h>
 #include <mach/irqs.h>
+#include <linux/platform_device.h>
 
 #define OMAP1_MPUIO_BASE			0xfffb5000
 
@@ -63,11 +64,14 @@
 #define OMAP_MPUIO_LATCH		0x34
 #endif
 
+#if defined(CONFIG_ARCH_OMAP2)
+#define OMAP_NR_GPIOS			5
 #define OMAP242X_NR_GPIOS		4
-#define OMAP243X_NR_GPIOS		5
-#define OMAP34XX_NR_GPIOS		6
-#define OMAP44XX_NR_GPIOS		6
-#define OMAP_MAX_NR_GPIOS		OMAP44XX_NR_GPIOS
+#elif defined(CONFIG_ARCH_OMAP3)
+#define OMAP_NR_GPIOS			6
+#elif defined(CONFIG_ARCH_OMAP4)
+#define OMAP_NR_GPIOS			6
+#endif
 
 #define OMAP_MPUIO(nr)		(OMAP_MAX_GPIO_LINES + (nr))
 #define OMAP_GPIO_IS_MPUIO(nr)	((nr) >= OMAP_MAX_GPIO_LINES)
@@ -194,12 +198,12 @@ extern void omap3_gpio_restore_pad_context(int restore_oe);
 #include <asm-generic/gpio.h>
 
 struct omap_gpio_platform_data {
-	unsigned long pbase;
+	void __iomem *base;
 	u16 irq;
 	u16 virtual_irq_start;
-	char ick_name[11];
-	char fck_name[11];
-	char dbck_name[11];
+	int (*device_enable)(struct platform_device *pdev);
+	int (*device_shutdown) (struct platform_device *pdev);
+	int (*device_idle)(struct platform_device *pdev);
 };
 
 struct gpio_bank {
@@ -225,13 +229,14 @@ struct gpio_bank {
 	u32 saved_fallingdetect;
 	u32 saved_risingdetect;
 	u32 mod_usage;
-	struct clk *ick;
-	struct clk *fck;
 	u8 initialized;
 	struct clk *dbck;
 	u32 dbck_enable_mask;
 	void __iomem *base;
 	u16 virtual_irq_start;
+	int (*device_enable)(struct platform_device *pdev);
+	int (*device_shutdown) (struct platform_device *pdev);
+	int (*device_idle)(struct platform_device *pdev);
 #endif
 };
 
-- 
1.6.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux