gpio7xx.c (6698B)
1/* 2 * OMAP7xx specific gpio init 3 * 4 * Copyright (C) 2010 Texas Instruments Incorporated - https://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#include <linux/platform_data/gpio-omap.h> 21 22#include "irqs.h" 23#include "soc.h" 24 25#define OMAP7XX_GPIO1_BASE 0xfffbc000 26#define OMAP7XX_GPIO2_BASE 0xfffbc800 27#define OMAP7XX_GPIO3_BASE 0xfffbd000 28#define OMAP7XX_GPIO4_BASE 0xfffbd800 29#define OMAP7XX_GPIO5_BASE 0xfffbe000 30#define OMAP7XX_GPIO6_BASE 0xfffbe800 31#define OMAP1_MPUIO_VBASE OMAP1_MPUIO_BASE 32 33/* mpu gpio */ 34static struct resource omap7xx_mpu_gpio_resources[] = { 35 { 36 .start = OMAP1_MPUIO_VBASE, 37 .end = OMAP1_MPUIO_VBASE + SZ_2K - 1, 38 .flags = IORESOURCE_MEM, 39 }, 40 { 41 .start = INT_7XX_MPUIO, 42 .flags = IORESOURCE_IRQ, 43 }, 44}; 45 46static struct omap_gpio_reg_offs omap7xx_mpuio_regs = { 47 .revision = USHRT_MAX, 48 .direction = OMAP_MPUIO_IO_CNTL / 2, 49 .datain = OMAP_MPUIO_INPUT_LATCH / 2, 50 .dataout = OMAP_MPUIO_OUTPUT / 2, 51 .irqstatus = OMAP_MPUIO_GPIO_INT / 2, 52 .irqenable = OMAP_MPUIO_GPIO_MASKIT / 2, 53 .irqenable_inv = true, 54 .irqctrl = OMAP_MPUIO_GPIO_INT_EDGE >> 1, 55}; 56 57static struct omap_gpio_platform_data omap7xx_mpu_gpio_config = { 58 .is_mpuio = true, 59 .bank_width = 16, 60 .bank_stride = 2, 61 .regs = &omap7xx_mpuio_regs, 62}; 63 64static struct platform_device omap7xx_mpu_gpio = { 65 .name = "omap_gpio", 66 .id = 0, 67 .dev = { 68 .platform_data = &omap7xx_mpu_gpio_config, 69 }, 70 .num_resources = ARRAY_SIZE(omap7xx_mpu_gpio_resources), 71 .resource = omap7xx_mpu_gpio_resources, 72}; 73 74/* gpio1 */ 75static struct resource omap7xx_gpio1_resources[] = { 76 { 77 .start = OMAP7XX_GPIO1_BASE, 78 .end = OMAP7XX_GPIO1_BASE + SZ_2K - 1, 79 .flags = IORESOURCE_MEM, 80 }, 81 { 82 .start = INT_7XX_GPIO_BANK1, 83 .flags = IORESOURCE_IRQ, 84 }, 85}; 86 87static struct omap_gpio_reg_offs omap7xx_gpio_regs = { 88 .revision = USHRT_MAX, 89 .direction = OMAP7XX_GPIO_DIR_CONTROL, 90 .datain = OMAP7XX_GPIO_DATA_INPUT, 91 .dataout = OMAP7XX_GPIO_DATA_OUTPUT, 92 .irqstatus = OMAP7XX_GPIO_INT_STATUS, 93 .irqenable = OMAP7XX_GPIO_INT_MASK, 94 .irqenable_inv = true, 95 .irqctrl = OMAP7XX_GPIO_INT_CONTROL, 96}; 97 98static struct omap_gpio_platform_data omap7xx_gpio1_config = { 99 .bank_width = 32, 100 .regs = &omap7xx_gpio_regs, 101}; 102 103static struct platform_device omap7xx_gpio1 = { 104 .name = "omap_gpio", 105 .id = 1, 106 .dev = { 107 .platform_data = &omap7xx_gpio1_config, 108 }, 109 .num_resources = ARRAY_SIZE(omap7xx_gpio1_resources), 110 .resource = omap7xx_gpio1_resources, 111}; 112 113/* gpio2 */ 114static struct resource omap7xx_gpio2_resources[] = { 115 { 116 .start = OMAP7XX_GPIO2_BASE, 117 .end = OMAP7XX_GPIO2_BASE + SZ_2K - 1, 118 .flags = IORESOURCE_MEM, 119 }, 120 { 121 .start = INT_7XX_GPIO_BANK2, 122 .flags = IORESOURCE_IRQ, 123 }, 124}; 125 126static struct omap_gpio_platform_data omap7xx_gpio2_config = { 127 .bank_width = 32, 128 .regs = &omap7xx_gpio_regs, 129}; 130 131static struct platform_device omap7xx_gpio2 = { 132 .name = "omap_gpio", 133 .id = 2, 134 .dev = { 135 .platform_data = &omap7xx_gpio2_config, 136 }, 137 .num_resources = ARRAY_SIZE(omap7xx_gpio2_resources), 138 .resource = omap7xx_gpio2_resources, 139}; 140 141/* gpio3 */ 142static struct resource omap7xx_gpio3_resources[] = { 143 { 144 .start = OMAP7XX_GPIO3_BASE, 145 .end = OMAP7XX_GPIO3_BASE + SZ_2K - 1, 146 .flags = IORESOURCE_MEM, 147 }, 148 { 149 .start = INT_7XX_GPIO_BANK3, 150 .flags = IORESOURCE_IRQ, 151 }, 152}; 153 154static struct omap_gpio_platform_data omap7xx_gpio3_config = { 155 .bank_width = 32, 156 .regs = &omap7xx_gpio_regs, 157}; 158 159static struct platform_device omap7xx_gpio3 = { 160 .name = "omap_gpio", 161 .id = 3, 162 .dev = { 163 .platform_data = &omap7xx_gpio3_config, 164 }, 165 .num_resources = ARRAY_SIZE(omap7xx_gpio3_resources), 166 .resource = omap7xx_gpio3_resources, 167}; 168 169/* gpio4 */ 170static struct resource omap7xx_gpio4_resources[] = { 171 { 172 .start = OMAP7XX_GPIO4_BASE, 173 .end = OMAP7XX_GPIO4_BASE + SZ_2K - 1, 174 .flags = IORESOURCE_MEM, 175 }, 176 { 177 .start = INT_7XX_GPIO_BANK4, 178 .flags = IORESOURCE_IRQ, 179 }, 180}; 181 182static struct omap_gpio_platform_data omap7xx_gpio4_config = { 183 .bank_width = 32, 184 .regs = &omap7xx_gpio_regs, 185}; 186 187static struct platform_device omap7xx_gpio4 = { 188 .name = "omap_gpio", 189 .id = 4, 190 .dev = { 191 .platform_data = &omap7xx_gpio4_config, 192 }, 193 .num_resources = ARRAY_SIZE(omap7xx_gpio4_resources), 194 .resource = omap7xx_gpio4_resources, 195}; 196 197/* gpio5 */ 198static struct resource omap7xx_gpio5_resources[] = { 199 { 200 .start = OMAP7XX_GPIO5_BASE, 201 .end = OMAP7XX_GPIO5_BASE + SZ_2K - 1, 202 .flags = IORESOURCE_MEM, 203 }, 204 { 205 .start = INT_7XX_GPIO_BANK5, 206 .flags = IORESOURCE_IRQ, 207 }, 208}; 209 210static struct omap_gpio_platform_data omap7xx_gpio5_config = { 211 .bank_width = 32, 212 .regs = &omap7xx_gpio_regs, 213}; 214 215static struct platform_device omap7xx_gpio5 = { 216 .name = "omap_gpio", 217 .id = 5, 218 .dev = { 219 .platform_data = &omap7xx_gpio5_config, 220 }, 221 .num_resources = ARRAY_SIZE(omap7xx_gpio5_resources), 222 .resource = omap7xx_gpio5_resources, 223}; 224 225/* gpio6 */ 226static struct resource omap7xx_gpio6_resources[] = { 227 { 228 .start = OMAP7XX_GPIO6_BASE, 229 .end = OMAP7XX_GPIO6_BASE + SZ_2K - 1, 230 .flags = IORESOURCE_MEM, 231 }, 232 { 233 .start = INT_7XX_GPIO_BANK6, 234 .flags = IORESOURCE_IRQ, 235 }, 236}; 237 238static struct omap_gpio_platform_data omap7xx_gpio6_config = { 239 .bank_width = 32, 240 .regs = &omap7xx_gpio_regs, 241}; 242 243static struct platform_device omap7xx_gpio6 = { 244 .name = "omap_gpio", 245 .id = 6, 246 .dev = { 247 .platform_data = &omap7xx_gpio6_config, 248 }, 249 .num_resources = ARRAY_SIZE(omap7xx_gpio6_resources), 250 .resource = omap7xx_gpio6_resources, 251}; 252 253static struct platform_device *omap7xx_gpio_dev[] __initdata = { 254 &omap7xx_mpu_gpio, 255 &omap7xx_gpio1, 256 &omap7xx_gpio2, 257 &omap7xx_gpio3, 258 &omap7xx_gpio4, 259 &omap7xx_gpio5, 260 &omap7xx_gpio6, 261}; 262 263/* 264 * omap7xx_gpio_init needs to be done before 265 * machine_init functions access gpio APIs. 266 * Hence omap7xx_gpio_init is a postcore_initcall. 267 */ 268static int __init omap7xx_gpio_init(void) 269{ 270 int i; 271 272 if (!cpu_is_omap7xx()) 273 return -EINVAL; 274 275 for (i = 0; i < ARRAY_SIZE(omap7xx_gpio_dev); i++) 276 platform_device_register(omap7xx_gpio_dev[i]); 277 278 return 0; 279} 280postcore_initcall(omap7xx_gpio_init);