1 /* 2 * OMAP16xx specific gpio init 3 * 4 * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 5 * 6 * Author: 7 * Charulatha V <charu@ti.com> 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License as 11 * published by the Free Software Foundation version 2. 12 * 13 * This program is distributed "as is" WITHOUT ANY WARRANTY of any 14 * kind, whether express or implied; without even the implied warranty 15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 */ 18 19 #include <linux/gpio.h> 20 21 #define OMAP1610_GPIO1_BASE 0xfffbe400 22 #define OMAP1610_GPIO2_BASE 0xfffbec00 23 #define OMAP1610_GPIO3_BASE 0xfffbb400 24 #define OMAP1610_GPIO4_BASE 0xfffbbc00 25 #define OMAP1_MPUIO_VBASE OMAP1_MPUIO_BASE 26 27 /* mpu gpio */ 28 static struct __initdata resource omap16xx_mpu_gpio_resources[] = { 29 { 30 .start = OMAP1_MPUIO_VBASE, 31 .end = OMAP1_MPUIO_VBASE + SZ_2K - 1, 32 .flags = IORESOURCE_MEM, 33 }, 34 { 35 .start = INT_MPUIO, 36 .flags = IORESOURCE_IRQ, 37 }, 38 }; 39 40 static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = { 41 .virtual_irq_start = IH_MPUIO_BASE, 42 .bank_type = METHOD_MPUIO, 43 .bank_width = 16, 44 .bank_stride = 1, 45 }; 46 47 static struct __initdata platform_device omap16xx_mpu_gpio = { 48 .name = "omap_gpio", 49 .id = 0, 50 .dev = { 51 .platform_data = &omap16xx_mpu_gpio_config, 52 }, 53 .num_resources = ARRAY_SIZE(omap16xx_mpu_gpio_resources), 54 .resource = omap16xx_mpu_gpio_resources, 55 }; 56 57 /* gpio1 */ 58 static struct __initdata resource omap16xx_gpio1_resources[] = { 59 { 60 .start = OMAP1610_GPIO1_BASE, 61 .end = OMAP1610_GPIO1_BASE + SZ_2K - 1, 62 .flags = IORESOURCE_MEM, 63 }, 64 { 65 .start = INT_GPIO_BANK1, 66 .flags = IORESOURCE_IRQ, 67 }, 68 }; 69 70 static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = { 71 .virtual_irq_start = IH_GPIO_BASE, 72 .bank_type = METHOD_GPIO_1610, 73 .bank_width = 16, 74 }; 75 76 static struct __initdata platform_device omap16xx_gpio1 = { 77 .name = "omap_gpio", 78 .id = 1, 79 .dev = { 80 .platform_data = &omap16xx_gpio1_config, 81 }, 82 .num_resources = ARRAY_SIZE(omap16xx_gpio1_resources), 83 .resource = omap16xx_gpio1_resources, 84 }; 85 86 /* gpio2 */ 87 static struct __initdata resource omap16xx_gpio2_resources[] = { 88 { 89 .start = OMAP1610_GPIO2_BASE, 90 .end = OMAP1610_GPIO2_BASE + SZ_2K - 1, 91 .flags = IORESOURCE_MEM, 92 }, 93 { 94 .start = INT_1610_GPIO_BANK2, 95 .flags = IORESOURCE_IRQ, 96 }, 97 }; 98 99 static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = { 100 .virtual_irq_start = IH_GPIO_BASE + 16, 101 .bank_type = METHOD_GPIO_1610, 102 .bank_width = 16, 103 }; 104 105 static struct __initdata platform_device omap16xx_gpio2 = { 106 .name = "omap_gpio", 107 .id = 2, 108 .dev = { 109 .platform_data = &omap16xx_gpio2_config, 110 }, 111 .num_resources = ARRAY_SIZE(omap16xx_gpio2_resources), 112 .resource = omap16xx_gpio2_resources, 113 }; 114 115 /* gpio3 */ 116 static struct __initdata resource omap16xx_gpio3_resources[] = { 117 { 118 .start = OMAP1610_GPIO3_BASE, 119 .end = OMAP1610_GPIO3_BASE + SZ_2K - 1, 120 .flags = IORESOURCE_MEM, 121 }, 122 { 123 .start = INT_1610_GPIO_BANK3, 124 .flags = IORESOURCE_IRQ, 125 }, 126 }; 127 128 static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = { 129 .virtual_irq_start = IH_GPIO_BASE + 32, 130 .bank_type = METHOD_GPIO_1610, 131 .bank_width = 16, 132 }; 133 134 static struct __initdata platform_device omap16xx_gpio3 = { 135 .name = "omap_gpio", 136 .id = 3, 137 .dev = { 138 .platform_data = &omap16xx_gpio3_config, 139 }, 140 .num_resources = ARRAY_SIZE(omap16xx_gpio3_resources), 141 .resource = omap16xx_gpio3_resources, 142 }; 143 144 /* gpio4 */ 145 static struct __initdata resource omap16xx_gpio4_resources[] = { 146 { 147 .start = OMAP1610_GPIO4_BASE, 148 .end = OMAP1610_GPIO4_BASE + SZ_2K - 1, 149 .flags = IORESOURCE_MEM, 150 }, 151 { 152 .start = INT_1610_GPIO_BANK4, 153 .flags = IORESOURCE_IRQ, 154 }, 155 }; 156 157 static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = { 158 .virtual_irq_start = IH_GPIO_BASE + 48, 159 .bank_type = METHOD_GPIO_1610, 160 .bank_width = 16, 161 }; 162 163 static struct __initdata platform_device omap16xx_gpio4 = { 164 .name = "omap_gpio", 165 .id = 4, 166 .dev = { 167 .platform_data = &omap16xx_gpio4_config, 168 }, 169 .num_resources = ARRAY_SIZE(omap16xx_gpio4_resources), 170 .resource = omap16xx_gpio4_resources, 171 }; 172 173 static struct __initdata platform_device * omap16xx_gpio_dev[] = { 174 &omap16xx_mpu_gpio, 175 &omap16xx_gpio1, 176 &omap16xx_gpio2, 177 &omap16xx_gpio3, 178 &omap16xx_gpio4, 179 }; 180 181 /* 182 * omap16xx_gpio_init needs to be done before 183 * machine_init functions access gpio APIs. 184 * Hence omap16xx_gpio_init is a postcore_initcall. 185 */ 186 static int __init omap16xx_gpio_init(void) 187 { 188 int i; 189 190 if (!cpu_is_omap16xx()) 191 return -EINVAL; 192 193 for (i = 0; i < ARRAY_SIZE(omap16xx_gpio_dev); i++) 194 platform_device_register(omap16xx_gpio_dev[i]); 195 196 gpio_bank_count = ARRAY_SIZE(omap16xx_gpio_dev); 197 198 return 0; 199 } 200 postcore_initcall(omap16xx_gpio_init); 201