diff options
Diffstat (limited to 'arch/arm/plat-omap/gpio.c')
| -rw-r--r-- | arch/arm/plat-omap/gpio.c | 224 |
1 files changed, 129 insertions, 95 deletions
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index b0c73613a4e9..35a59ce5a2b4 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | /* | 31 | /* |
| 32 | * OMAP1510 GPIO registers | 32 | * OMAP1510 GPIO registers |
| 33 | */ | 33 | */ |
| 34 | #define OMAP1510_GPIO_BASE OMAP1_IO_ADDRESS(0xfffce000) | 34 | #define OMAP1510_GPIO_BASE 0xfffce000 |
| 35 | #define OMAP1510_GPIO_DATA_INPUT 0x00 | 35 | #define OMAP1510_GPIO_DATA_INPUT 0x00 |
| 36 | #define OMAP1510_GPIO_DATA_OUTPUT 0x04 | 36 | #define OMAP1510_GPIO_DATA_OUTPUT 0x04 |
| 37 | #define OMAP1510_GPIO_DIR_CONTROL 0x08 | 37 | #define OMAP1510_GPIO_DIR_CONTROL 0x08 |
| @@ -45,10 +45,10 @@ | |||
| 45 | /* | 45 | /* |
| 46 | * OMAP1610 specific GPIO registers | 46 | * OMAP1610 specific GPIO registers |
| 47 | */ | 47 | */ |
| 48 | #define OMAP1610_GPIO1_BASE OMAP1_IO_ADDRESS(0xfffbe400) | 48 | #define OMAP1610_GPIO1_BASE 0xfffbe400 |
| 49 | #define OMAP1610_GPIO2_BASE OMAP1_IO_ADDRESS(0xfffbec00) | 49 | #define OMAP1610_GPIO2_BASE 0xfffbec00 |
| 50 | #define OMAP1610_GPIO3_BASE OMAP1_IO_ADDRESS(0xfffbb400) | 50 | #define OMAP1610_GPIO3_BASE 0xfffbb400 |
| 51 | #define OMAP1610_GPIO4_BASE OMAP1_IO_ADDRESS(0xfffbbc00) | 51 | #define OMAP1610_GPIO4_BASE 0xfffbbc00 |
| 52 | #define OMAP1610_GPIO_REVISION 0x0000 | 52 | #define OMAP1610_GPIO_REVISION 0x0000 |
| 53 | #define OMAP1610_GPIO_SYSCONFIG 0x0010 | 53 | #define OMAP1610_GPIO_SYSCONFIG 0x0010 |
| 54 | #define OMAP1610_GPIO_SYSSTATUS 0x0014 | 54 | #define OMAP1610_GPIO_SYSSTATUS 0x0014 |
| @@ -70,12 +70,12 @@ | |||
| 70 | /* | 70 | /* |
| 71 | * OMAP7XX specific GPIO registers | 71 | * OMAP7XX specific GPIO registers |
| 72 | */ | 72 | */ |
| 73 | #define OMAP7XX_GPIO1_BASE OMAP1_IO_ADDRESS(0xfffbc000) | 73 | #define OMAP7XX_GPIO1_BASE 0xfffbc000 |
| 74 | #define OMAP7XX_GPIO2_BASE OMAP1_IO_ADDRESS(0xfffbc800) | 74 | #define OMAP7XX_GPIO2_BASE 0xfffbc800 |
| 75 | #define OMAP7XX_GPIO3_BASE OMAP1_IO_ADDRESS(0xfffbd000) | 75 | #define OMAP7XX_GPIO3_BASE 0xfffbd000 |
| 76 | #define OMAP7XX_GPIO4_BASE OMAP1_IO_ADDRESS(0xfffbd800) | 76 | #define OMAP7XX_GPIO4_BASE 0xfffbd800 |
| 77 | #define OMAP7XX_GPIO5_BASE OMAP1_IO_ADDRESS(0xfffbe000) | 77 | #define OMAP7XX_GPIO5_BASE 0xfffbe000 |
| 78 | #define OMAP7XX_GPIO6_BASE OMAP1_IO_ADDRESS(0xfffbe800) | 78 | #define OMAP7XX_GPIO6_BASE 0xfffbe800 |
| 79 | #define OMAP7XX_GPIO_DATA_INPUT 0x00 | 79 | #define OMAP7XX_GPIO_DATA_INPUT 0x00 |
| 80 | #define OMAP7XX_GPIO_DATA_OUTPUT 0x04 | 80 | #define OMAP7XX_GPIO_DATA_OUTPUT 0x04 |
| 81 | #define OMAP7XX_GPIO_DIR_CONTROL 0x08 | 81 | #define OMAP7XX_GPIO_DIR_CONTROL 0x08 |
| @@ -83,21 +83,21 @@ | |||
| 83 | #define OMAP7XX_GPIO_INT_MASK 0x10 | 83 | #define OMAP7XX_GPIO_INT_MASK 0x10 |
| 84 | #define OMAP7XX_GPIO_INT_STATUS 0x14 | 84 | #define OMAP7XX_GPIO_INT_STATUS 0x14 |
| 85 | 85 | ||
| 86 | #define OMAP1_MPUIO_VBASE OMAP1_IO_ADDRESS(OMAP1_MPUIO_BASE) | 86 | #define OMAP1_MPUIO_VBASE OMAP1_MPUIO_BASE |
| 87 | 87 | ||
| 88 | /* | 88 | /* |
| 89 | * omap24xx specific GPIO registers | 89 | * omap24xx specific GPIO registers |
| 90 | */ | 90 | */ |
| 91 | #define OMAP242X_GPIO1_BASE OMAP2_IO_ADDRESS(0x48018000) | 91 | #define OMAP242X_GPIO1_BASE 0x48018000 |
| 92 | #define OMAP242X_GPIO2_BASE OMAP2_IO_ADDRESS(0x4801a000) | 92 | #define OMAP242X_GPIO2_BASE 0x4801a000 |
| 93 | #define OMAP242X_GPIO3_BASE OMAP2_IO_ADDRESS(0x4801c000) | 93 | #define OMAP242X_GPIO3_BASE 0x4801c000 |
| 94 | #define OMAP242X_GPIO4_BASE OMAP2_IO_ADDRESS(0x4801e000) | 94 | #define OMAP242X_GPIO4_BASE 0x4801e000 |
| 95 | 95 | ||
| 96 | #define OMAP243X_GPIO1_BASE OMAP2_IO_ADDRESS(0x4900C000) | 96 | #define OMAP243X_GPIO1_BASE 0x4900C000 |
| 97 | #define OMAP243X_GPIO2_BASE OMAP2_IO_ADDRESS(0x4900E000) | 97 | #define OMAP243X_GPIO2_BASE 0x4900E000 |
| 98 | #define OMAP243X_GPIO3_BASE OMAP2_IO_ADDRESS(0x49010000) | 98 | #define OMAP243X_GPIO3_BASE 0x49010000 |
| 99 | #define OMAP243X_GPIO4_BASE OMAP2_IO_ADDRESS(0x49012000) | 99 | #define OMAP243X_GPIO4_BASE 0x49012000 |
| 100 | #define OMAP243X_GPIO5_BASE OMAP2_IO_ADDRESS(0x480B6000) | 100 | #define OMAP243X_GPIO5_BASE 0x480B6000 |
| 101 | 101 | ||
| 102 | #define OMAP24XX_GPIO_REVISION 0x0000 | 102 | #define OMAP24XX_GPIO_REVISION 0x0000 |
| 103 | #define OMAP24XX_GPIO_SYSCONFIG 0x0010 | 103 | #define OMAP24XX_GPIO_SYSCONFIG 0x0010 |
| @@ -154,24 +154,25 @@ | |||
| 154 | * omap34xx specific GPIO registers | 154 | * omap34xx specific GPIO registers |
| 155 | */ | 155 | */ |
| 156 | 156 | ||
| 157 | #define OMAP34XX_GPIO1_BASE OMAP2_IO_ADDRESS(0x48310000) | 157 | #define OMAP34XX_GPIO1_BASE 0x48310000 |
| 158 | #define OMAP34XX_GPIO2_BASE OMAP2_IO_ADDRESS(0x49050000) | 158 | #define OMAP34XX_GPIO2_BASE 0x49050000 |
| 159 | #define OMAP34XX_GPIO3_BASE OMAP2_IO_ADDRESS(0x49052000) | 159 | #define OMAP34XX_GPIO3_BASE 0x49052000 |
| 160 | #define OMAP34XX_GPIO4_BASE OMAP2_IO_ADDRESS(0x49054000) | 160 | #define OMAP34XX_GPIO4_BASE 0x49054000 |
| 161 | #define OMAP34XX_GPIO5_BASE OMAP2_IO_ADDRESS(0x49056000) | 161 | #define OMAP34XX_GPIO5_BASE 0x49056000 |
| 162 | #define OMAP34XX_GPIO6_BASE OMAP2_IO_ADDRESS(0x49058000) | 162 | #define OMAP34XX_GPIO6_BASE 0x49058000 |
| 163 | 163 | ||
| 164 | /* | 164 | /* |
| 165 | * OMAP44XX specific GPIO registers | 165 | * OMAP44XX specific GPIO registers |
| 166 | */ | 166 | */ |
| 167 | #define OMAP44XX_GPIO1_BASE OMAP2_IO_ADDRESS(0x4a310000) | 167 | #define OMAP44XX_GPIO1_BASE 0x4a310000 |
| 168 | #define OMAP44XX_GPIO2_BASE OMAP2_IO_ADDRESS(0x48055000) | 168 | #define OMAP44XX_GPIO2_BASE 0x48055000 |
| 169 | #define OMAP44XX_GPIO3_BASE OMAP2_IO_ADDRESS(0x48057000) | 169 | #define OMAP44XX_GPIO3_BASE 0x48057000 |
| 170 | #define OMAP44XX_GPIO4_BASE OMAP2_IO_ADDRESS(0x48059000) | 170 | #define OMAP44XX_GPIO4_BASE 0x48059000 |
| 171 | #define OMAP44XX_GPIO5_BASE OMAP2_IO_ADDRESS(0x4805B000) | 171 | #define OMAP44XX_GPIO5_BASE 0x4805B000 |
| 172 | #define OMAP44XX_GPIO6_BASE OMAP2_IO_ADDRESS(0x4805D000) | 172 | #define OMAP44XX_GPIO6_BASE 0x4805D000 |
| 173 | 173 | ||
| 174 | struct gpio_bank { | 174 | struct gpio_bank { |
| 175 | unsigned long pbase; | ||
| 175 | void __iomem *base; | 176 | void __iomem *base; |
| 176 | u16 irq; | 177 | u16 irq; |
| 177 | u16 virtual_irq_start; | 178 | u16 virtual_irq_start; |
| @@ -204,77 +205,106 @@ struct gpio_bank { | |||
| 204 | 205 | ||
| 205 | #ifdef CONFIG_ARCH_OMAP16XX | 206 | #ifdef CONFIG_ARCH_OMAP16XX |
| 206 | static struct gpio_bank gpio_bank_1610[5] = { | 207 | static struct gpio_bank gpio_bank_1610[5] = { |
| 207 | { OMAP1_MPUIO_VBASE, INT_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO}, | 208 | { OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE, |
| 208 | { OMAP1610_GPIO1_BASE, INT_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_1610 }, | 209 | METHOD_MPUIO }, |
| 209 | { OMAP1610_GPIO2_BASE, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16, METHOD_GPIO_1610 }, | 210 | { OMAP1610_GPIO1_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE, |
| 210 | { OMAP1610_GPIO3_BASE, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32, METHOD_GPIO_1610 }, | 211 | METHOD_GPIO_1610 }, |
| 211 | { OMAP1610_GPIO4_BASE, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48, METHOD_GPIO_1610 }, | 212 | { OMAP1610_GPIO2_BASE, NULL, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16, |
| 213 | METHOD_GPIO_1610 }, | ||
| 214 | { OMAP1610_GPIO3_BASE, NULL, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32, | ||
| 215 | METHOD_GPIO_1610 }, | ||
| 216 | { OMAP1610_GPIO4_BASE, NULL, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48, | ||
| 217 | METHOD_GPIO_1610 }, | ||
| 212 | }; | 218 | }; |
| 213 | #endif | 219 | #endif |
| 214 | 220 | ||
| 215 | #ifdef CONFIG_ARCH_OMAP15XX | 221 | #ifdef CONFIG_ARCH_OMAP15XX |
| 216 | static struct gpio_bank gpio_bank_1510[2] = { | 222 | static struct gpio_bank gpio_bank_1510[2] = { |
| 217 | { OMAP1_MPUIO_VBASE, INT_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO }, | 223 | { OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE, |
| 218 | { OMAP1510_GPIO_BASE, INT_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_1510 } | 224 | METHOD_MPUIO }, |
| 225 | { OMAP1510_GPIO_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE, | ||
| 226 | METHOD_GPIO_1510 } | ||
| 219 | }; | 227 | }; |
| 220 | #endif | 228 | #endif |
| 221 | 229 | ||
| 222 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | 230 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) |
| 223 | static struct gpio_bank gpio_bank_7xx[7] = { | 231 | static struct gpio_bank gpio_bank_7xx[7] = { |
| 224 | { OMAP1_MPUIO_VBASE, INT_7XX_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO }, | 232 | { OMAP1_MPUIO_VBASE, NULL, INT_7XX_MPUIO, IH_MPUIO_BASE, |
| 225 | { OMAP7XX_GPIO1_BASE, INT_7XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_7XX }, | 233 | METHOD_MPUIO }, |
| 226 | { OMAP7XX_GPIO2_BASE, INT_7XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_7XX }, | 234 | { OMAP7XX_GPIO1_BASE, NULL, INT_7XX_GPIO_BANK1, IH_GPIO_BASE, |
| 227 | { OMAP7XX_GPIO3_BASE, INT_7XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_7XX }, | 235 | METHOD_GPIO_7XX }, |
| 228 | { OMAP7XX_GPIO4_BASE, INT_7XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_7XX }, | 236 | { OMAP7XX_GPIO2_BASE, NULL, INT_7XX_GPIO_BANK2, IH_GPIO_BASE + 32, |
| 229 | { OMAP7XX_GPIO5_BASE, INT_7XX_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_7XX }, | 237 | METHOD_GPIO_7XX }, |
| 230 | { OMAP7XX_GPIO6_BASE, INT_7XX_GPIO_BANK6, IH_GPIO_BASE + 160, METHOD_GPIO_7XX }, | 238 | { OMAP7XX_GPIO3_BASE, NULL, INT_7XX_GPIO_BANK3, IH_GPIO_BASE + 64, |
| 239 | METHOD_GPIO_7XX }, | ||
| 240 | { OMAP7XX_GPIO4_BASE, NULL, INT_7XX_GPIO_BANK4, IH_GPIO_BASE + 96, | ||
| 241 | METHOD_GPIO_7XX }, | ||
| 242 | { OMAP7XX_GPIO5_BASE, NULL, INT_7XX_GPIO_BANK5, IH_GPIO_BASE + 128, | ||
| 243 | METHOD_GPIO_7XX }, | ||
| 244 | { OMAP7XX_GPIO6_BASE, NULL, INT_7XX_GPIO_BANK6, IH_GPIO_BASE + 160, | ||
| 245 | METHOD_GPIO_7XX }, | ||
| 231 | }; | 246 | }; |
| 232 | #endif | 247 | #endif |
| 233 | 248 | ||
| 234 | #ifdef CONFIG_ARCH_OMAP24XX | 249 | #ifdef CONFIG_ARCH_OMAP24XX |
| 235 | 250 | ||
| 236 | static struct gpio_bank gpio_bank_242x[4] = { | 251 | static struct gpio_bank gpio_bank_242x[4] = { |
| 237 | { OMAP242X_GPIO1_BASE, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX }, | 252 | { OMAP242X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, |
| 238 | { OMAP242X_GPIO2_BASE, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX }, | 253 | METHOD_GPIO_24XX }, |
| 239 | { OMAP242X_GPIO3_BASE, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX }, | 254 | { OMAP242X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, |
| 240 | { OMAP242X_GPIO4_BASE, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX }, | 255 | METHOD_GPIO_24XX }, |
| 256 | { OMAP242X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, | ||
| 257 | METHOD_GPIO_24XX }, | ||
| 258 | { OMAP242X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, | ||
| 259 | METHOD_GPIO_24XX }, | ||
| 241 | }; | 260 | }; |
| 242 | 261 | ||
| 243 | static struct gpio_bank gpio_bank_243x[5] = { | 262 | static struct gpio_bank gpio_bank_243x[5] = { |
| 244 | { OMAP243X_GPIO1_BASE, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX }, | 263 | { OMAP243X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, |
| 245 | { OMAP243X_GPIO2_BASE, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX }, | 264 | METHOD_GPIO_24XX }, |
| 246 | { OMAP243X_GPIO3_BASE, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX }, | 265 | { OMAP243X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, |
| 247 | { OMAP243X_GPIO4_BASE, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX }, | 266 | METHOD_GPIO_24XX }, |
| 248 | { OMAP243X_GPIO5_BASE, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_24XX }, | 267 | { OMAP243X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, |
| 268 | METHOD_GPIO_24XX }, | ||
| 269 | { OMAP243X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, | ||
| 270 | METHOD_GPIO_24XX }, | ||
| 271 | { OMAP243X_GPIO5_BASE, NULL, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128, | ||
| 272 | METHOD_GPIO_24XX }, | ||
| 249 | }; | 273 | }; |
| 250 | 274 | ||
| 251 | #endif | 275 | #endif |
| 252 | 276 | ||
| 253 | #ifdef CONFIG_ARCH_OMAP34XX | 277 | #ifdef CONFIG_ARCH_OMAP34XX |
| 254 | static struct gpio_bank gpio_bank_34xx[6] = { | 278 | static struct gpio_bank gpio_bank_34xx[6] = { |
| 255 | { OMAP34XX_GPIO1_BASE, INT_34XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX }, | 279 | { OMAP34XX_GPIO1_BASE, NULL, INT_34XX_GPIO_BANK1, IH_GPIO_BASE, |
| 256 | { OMAP34XX_GPIO2_BASE, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX }, | 280 | METHOD_GPIO_24XX }, |
| 257 | { OMAP34XX_GPIO3_BASE, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX }, | 281 | { OMAP34XX_GPIO2_BASE, NULL, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32, |
| 258 | { OMAP34XX_GPIO4_BASE, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX }, | 282 | METHOD_GPIO_24XX }, |
| 259 | { OMAP34XX_GPIO5_BASE, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_24XX }, | 283 | { OMAP34XX_GPIO3_BASE, NULL, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64, |
| 260 | { OMAP34XX_GPIO6_BASE, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160, METHOD_GPIO_24XX }, | 284 | METHOD_GPIO_24XX }, |
| 285 | { OMAP34XX_GPIO4_BASE, NULL, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96, | ||
| 286 | METHOD_GPIO_24XX }, | ||
| 287 | { OMAP34XX_GPIO5_BASE, NULL, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128, | ||
| 288 | METHOD_GPIO_24XX }, | ||
| 289 | { OMAP34XX_GPIO6_BASE, NULL, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160, | ||
| 290 | METHOD_GPIO_24XX }, | ||
| 261 | }; | 291 | }; |
| 262 | 292 | ||
| 263 | #endif | 293 | #endif |
| 264 | 294 | ||
| 265 | #ifdef CONFIG_ARCH_OMAP4 | 295 | #ifdef CONFIG_ARCH_OMAP4 |
| 266 | static struct gpio_bank gpio_bank_44xx[6] = { | 296 | static struct gpio_bank gpio_bank_44xx[6] = { |
| 267 | { OMAP44XX_GPIO1_BASE, INT_44XX_GPIO_BANK1, IH_GPIO_BASE, \ | 297 | { OMAP44XX_GPIO1_BASE, NULL, INT_44XX_GPIO_BANK1, IH_GPIO_BASE, |
| 268 | METHOD_GPIO_24XX }, | 298 | METHOD_GPIO_24XX }, |
| 269 | { OMAP44XX_GPIO2_BASE, INT_44XX_GPIO_BANK2, IH_GPIO_BASE + 32, \ | 299 | { OMAP44XX_GPIO2_BASE, NULL, INT_44XX_GPIO_BANK2, IH_GPIO_BASE + 32, |
| 270 | METHOD_GPIO_24XX }, | 300 | METHOD_GPIO_24XX }, |
| 271 | { OMAP44XX_GPIO3_BASE, INT_44XX_GPIO_BANK3, IH_GPIO_BASE + 64, \ | 301 | { OMAP44XX_GPIO3_BASE, NULL, INT_44XX_GPIO_BANK3, IH_GPIO_BASE + 64, |
| 272 | METHOD_GPIO_24XX }, | 302 | METHOD_GPIO_24XX }, |
| 273 | { OMAP44XX_GPIO4_BASE, INT_44XX_GPIO_BANK4, IH_GPIO_BASE + 96, \ | 303 | { OMAP44XX_GPIO4_BASE, NULL, INT_44XX_GPIO_BANK4, IH_GPIO_BASE + 96, |
| 274 | METHOD_GPIO_24XX }, | 304 | METHOD_GPIO_24XX }, |
| 275 | { OMAP44XX_GPIO5_BASE, INT_44XX_GPIO_BANK5, IH_GPIO_BASE + 128, \ | 305 | { OMAP44XX_GPIO5_BASE, NULL, INT_44XX_GPIO_BANK5, IH_GPIO_BASE + 128, |
| 276 | METHOD_GPIO_24XX }, | 306 | METHOD_GPIO_24XX }, |
| 277 | { OMAP44XX_GPIO6_BASE, INT_44XX_GPIO_BANK6, IH_GPIO_BASE + 160, \ | 307 | { OMAP44XX_GPIO6_BASE, NULL, INT_44XX_GPIO_BANK6, IH_GPIO_BASE + 160, |
| 278 | METHOD_GPIO_24XX }, | 308 | METHOD_GPIO_24XX }, |
| 279 | }; | 309 | }; |
| 280 | 310 | ||
| @@ -1511,6 +1541,23 @@ static struct clk * gpio5_fck; | |||
| 1511 | static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; | 1541 | static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; |
| 1512 | #endif | 1542 | #endif |
| 1513 | 1543 | ||
| 1544 | static void __init omap_gpio_show_rev(void) | ||
| 1545 | { | ||
| 1546 | u32 rev; | ||
| 1547 | |||
| 1548 | if (cpu_is_omap16xx()) | ||
| 1549 | rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION); | ||
| 1550 | else if (cpu_is_omap24xx() || cpu_is_omap34xx()) | ||
| 1551 | rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION); | ||
| 1552 | else if (cpu_is_omap44xx()) | ||
| 1553 | rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION); | ||
| 1554 | else | ||
| 1555 | return; | ||
| 1556 | |||
| 1557 | printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n", | ||
| 1558 | (rev >> 4) & 0x0f, rev & 0x0f); | ||
| 1559 | } | ||
| 1560 | |||
| 1514 | /* This lock class tells lockdep that GPIO irqs are in a different | 1561 | /* This lock class tells lockdep that GPIO irqs are in a different |
| 1515 | * category than their parents, so it won't report false recursion. | 1562 | * category than their parents, so it won't report false recursion. |
| 1516 | */ | 1563 | */ |
| @@ -1521,6 +1568,7 @@ static int __init _omap_gpio_init(void) | |||
| 1521 | int i; | 1568 | int i; |
| 1522 | int gpio = 0; | 1569 | int gpio = 0; |
| 1523 | struct gpio_bank *bank; | 1570 | struct gpio_bank *bank; |
| 1571 | int bank_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */ | ||
| 1524 | char clk_name[11]; | 1572 | char clk_name[11]; |
| 1525 | 1573 | ||
| 1526 | initialized = 1; | 1574 | initialized = 1; |
| @@ -1583,69 +1631,45 @@ static int __init _omap_gpio_init(void) | |||
| 1583 | 1631 | ||
| 1584 | #ifdef CONFIG_ARCH_OMAP15XX | 1632 | #ifdef CONFIG_ARCH_OMAP15XX |
| 1585 | if (cpu_is_omap15xx()) { | 1633 | if (cpu_is_omap15xx()) { |
| 1586 | printk(KERN_INFO "OMAP1510 GPIO hardware\n"); | ||
| 1587 | gpio_bank_count = 2; | 1634 | gpio_bank_count = 2; |
| 1588 | gpio_bank = gpio_bank_1510; | 1635 | gpio_bank = gpio_bank_1510; |
| 1636 | bank_size = SZ_2K; | ||
| 1589 | } | 1637 | } |
| 1590 | #endif | 1638 | #endif |
| 1591 | #if defined(CONFIG_ARCH_OMAP16XX) | 1639 | #if defined(CONFIG_ARCH_OMAP16XX) |
| 1592 | if (cpu_is_omap16xx()) { | 1640 | if (cpu_is_omap16xx()) { |
| 1593 | u32 rev; | ||
| 1594 | |||
| 1595 | gpio_bank_count = 5; | 1641 | gpio_bank_count = 5; |
| 1596 | gpio_bank = gpio_bank_1610; | 1642 | gpio_bank = gpio_bank_1610; |
| 1597 | rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION); | 1643 | bank_size = SZ_2K; |
| 1598 | printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n", | ||
| 1599 | (rev >> 4) & 0x0f, rev & 0x0f); | ||
| 1600 | } | 1644 | } |
| 1601 | #endif | 1645 | #endif |
| 1602 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | 1646 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) |
| 1603 | if (cpu_is_omap7xx()) { | 1647 | if (cpu_is_omap7xx()) { |
| 1604 | printk(KERN_INFO "OMAP7XX GPIO hardware\n"); | ||
| 1605 | gpio_bank_count = 7; | 1648 | gpio_bank_count = 7; |
| 1606 | gpio_bank = gpio_bank_7xx; | 1649 | gpio_bank = gpio_bank_7xx; |
| 1650 | bank_size = SZ_2K; | ||
| 1607 | } | 1651 | } |
| 1608 | #endif | 1652 | #endif |
| 1609 | #ifdef CONFIG_ARCH_OMAP24XX | 1653 | #ifdef CONFIG_ARCH_OMAP24XX |
| 1610 | if (cpu_is_omap242x()) { | 1654 | if (cpu_is_omap242x()) { |
| 1611 | int rev; | ||
| 1612 | |||
| 1613 | gpio_bank_count = 4; | 1655 | gpio_bank_count = 4; |
| 1614 | gpio_bank = gpio_bank_242x; | 1656 | gpio_bank = gpio_bank_242x; |
| 1615 | rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION); | ||
| 1616 | printk(KERN_INFO "OMAP242x GPIO hardware version %d.%d\n", | ||
| 1617 | (rev >> 4) & 0x0f, rev & 0x0f); | ||
| 1618 | } | 1657 | } |
| 1619 | if (cpu_is_omap243x()) { | 1658 | if (cpu_is_omap243x()) { |
| 1620 | int rev; | ||
| 1621 | |||
| 1622 | gpio_bank_count = 5; | 1659 | gpio_bank_count = 5; |
| 1623 | gpio_bank = gpio_bank_243x; | 1660 | gpio_bank = gpio_bank_243x; |
| 1624 | rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION); | ||
| 1625 | printk(KERN_INFO "OMAP243x GPIO hardware version %d.%d\n", | ||
| 1626 | (rev >> 4) & 0x0f, rev & 0x0f); | ||
| 1627 | } | 1661 | } |
| 1628 | #endif | 1662 | #endif |
| 1629 | #ifdef CONFIG_ARCH_OMAP34XX | 1663 | #ifdef CONFIG_ARCH_OMAP34XX |
| 1630 | if (cpu_is_omap34xx()) { | 1664 | if (cpu_is_omap34xx()) { |
| 1631 | int rev; | ||
| 1632 | |||
| 1633 | gpio_bank_count = OMAP34XX_NR_GPIOS; | 1665 | gpio_bank_count = OMAP34XX_NR_GPIOS; |
| 1634 | gpio_bank = gpio_bank_34xx; | 1666 | gpio_bank = gpio_bank_34xx; |
| 1635 | rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION); | ||
| 1636 | printk(KERN_INFO "OMAP34xx GPIO hardware version %d.%d\n", | ||
| 1637 | (rev >> 4) & 0x0f, rev & 0x0f); | ||
| 1638 | } | 1667 | } |
| 1639 | #endif | 1668 | #endif |
| 1640 | #ifdef CONFIG_ARCH_OMAP4 | 1669 | #ifdef CONFIG_ARCH_OMAP4 |
| 1641 | if (cpu_is_omap44xx()) { | 1670 | if (cpu_is_omap44xx()) { |
| 1642 | int rev; | ||
| 1643 | |||
| 1644 | gpio_bank_count = OMAP34XX_NR_GPIOS; | 1671 | gpio_bank_count = OMAP34XX_NR_GPIOS; |
| 1645 | gpio_bank = gpio_bank_44xx; | 1672 | gpio_bank = gpio_bank_44xx; |
| 1646 | rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION); | ||
| 1647 | printk(KERN_INFO "OMAP44xx GPIO hardware version %d.%d\n", | ||
| 1648 | (rev >> 4) & 0x0f, rev & 0x0f); | ||
| 1649 | } | 1673 | } |
| 1650 | #endif | 1674 | #endif |
| 1651 | for (i = 0; i < gpio_bank_count; i++) { | 1675 | for (i = 0; i < gpio_bank_count; i++) { |
| @@ -1653,6 +1677,14 @@ static int __init _omap_gpio_init(void) | |||
| 1653 | 1677 | ||
| 1654 | bank = &gpio_bank[i]; | 1678 | bank = &gpio_bank[i]; |
| 1655 | spin_lock_init(&bank->lock); | 1679 | spin_lock_init(&bank->lock); |
| 1680 | |||
| 1681 | /* Static mapping, never released */ | ||
| 1682 | bank->base = ioremap(bank->pbase, bank_size); | ||
| 1683 | if (!bank->base) { | ||
| 1684 | printk(KERN_ERR "Could not ioremap gpio bank%i\n", i); | ||
| 1685 | continue; | ||
| 1686 | } | ||
| 1687 | |||
| 1656 | if (bank_is_mpuio(bank)) | 1688 | if (bank_is_mpuio(bank)) |
| 1657 | __raw_writew(0xffff, bank->base + OMAP_MPUIO_GPIO_MASKIT); | 1689 | __raw_writew(0xffff, bank->base + OMAP_MPUIO_GPIO_MASKIT); |
| 1658 | if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) { | 1690 | if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) { |
| @@ -1758,6 +1790,8 @@ static int __init _omap_gpio_init(void) | |||
| 1758 | if (cpu_is_omap34xx()) | 1790 | if (cpu_is_omap34xx()) |
| 1759 | omap_writel(1 << 0, 0x48306814); | 1791 | omap_writel(1 << 0, 0x48306814); |
| 1760 | 1792 | ||
| 1793 | omap_gpio_show_rev(); | ||
| 1794 | |||
| 1761 | return 0; | 1795 | return 0; |
| 1762 | } | 1796 | } |
| 1763 | 1797 | ||
