diff options
Diffstat (limited to 'arch/arm/plat-omap/gpio.c')
| -rw-r--r-- | arch/arm/plat-omap/gpio.c | 134 |
1 files changed, 100 insertions, 34 deletions
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index ee0b21f5b094..7fd89ba8d3b5 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
| @@ -6,6 +6,9 @@ | |||
| 6 | * Copyright (C) 2003-2005 Nokia Corporation | 6 | * Copyright (C) 2003-2005 Nokia Corporation |
| 7 | * Written by Juha Yrjölä <juha.yrjola@nokia.com> | 7 | * Written by Juha Yrjölä <juha.yrjola@nokia.com> |
| 8 | * | 8 | * |
| 9 | * Copyright (C) 2009 Texas Instruments | ||
| 10 | * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
| 11 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
| 10 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
| 11 | * published by the Free Software Foundation. | 14 | * published by the Free Software Foundation. |
| @@ -146,6 +149,16 @@ | |||
| 146 | #define OMAP34XX_GPIO5_BASE IO_ADDRESS(0x49056000) | 149 | #define OMAP34XX_GPIO5_BASE IO_ADDRESS(0x49056000) |
| 147 | #define OMAP34XX_GPIO6_BASE IO_ADDRESS(0x49058000) | 150 | #define OMAP34XX_GPIO6_BASE IO_ADDRESS(0x49058000) |
| 148 | 151 | ||
| 152 | /* | ||
| 153 | * OMAP44XX specific GPIO registers | ||
| 154 | */ | ||
| 155 | #define OMAP44XX_GPIO1_BASE IO_ADDRESS(0x4a310000) | ||
| 156 | #define OMAP44XX_GPIO2_BASE IO_ADDRESS(0x48055000) | ||
| 157 | #define OMAP44XX_GPIO3_BASE IO_ADDRESS(0x48057000) | ||
| 158 | #define OMAP44XX_GPIO4_BASE IO_ADDRESS(0x48059000) | ||
| 159 | #define OMAP44XX_GPIO5_BASE IO_ADDRESS(0x4805B000) | ||
| 160 | #define OMAP44XX_GPIO6_BASE IO_ADDRESS(0x4805D000) | ||
| 161 | |||
| 149 | #define OMAP_MPUIO_VBASE IO_ADDRESS(OMAP_MPUIO_BASE) | 162 | #define OMAP_MPUIO_VBASE IO_ADDRESS(OMAP_MPUIO_BASE) |
| 150 | 163 | ||
| 151 | struct gpio_bank { | 164 | struct gpio_bank { |
| @@ -153,11 +166,13 @@ struct gpio_bank { | |||
| 153 | u16 irq; | 166 | u16 irq; |
| 154 | u16 virtual_irq_start; | 167 | u16 virtual_irq_start; |
| 155 | int method; | 168 | int method; |
| 156 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 169 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ |
| 170 | defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP4) | ||
| 157 | u32 suspend_wakeup; | 171 | u32 suspend_wakeup; |
| 158 | u32 saved_wakeup; | 172 | u32 saved_wakeup; |
| 159 | #endif | 173 | #endif |
| 160 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 174 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 175 | defined(CONFIG_ARCH_OMAP4) | ||
| 161 | u32 non_wakeup_gpios; | 176 | u32 non_wakeup_gpios; |
| 162 | u32 enabled_non_wakeup_gpios; | 177 | u32 enabled_non_wakeup_gpios; |
| 163 | 178 | ||
| @@ -251,6 +266,24 @@ static struct gpio_bank gpio_bank_34xx[6] = { | |||
| 251 | 266 | ||
| 252 | #endif | 267 | #endif |
| 253 | 268 | ||
| 269 | #ifdef CONFIG_ARCH_OMAP4 | ||
| 270 | static struct gpio_bank gpio_bank_44xx[6] = { | ||
| 271 | { OMAP44XX_GPIO1_BASE, INT_44XX_GPIO_BANK1, IH_GPIO_BASE, \ | ||
| 272 | METHOD_GPIO_24XX }, | ||
| 273 | { OMAP44XX_GPIO2_BASE, INT_44XX_GPIO_BANK2, IH_GPIO_BASE + 32, \ | ||
| 274 | METHOD_GPIO_24XX }, | ||
| 275 | { OMAP44XX_GPIO3_BASE, INT_44XX_GPIO_BANK3, IH_GPIO_BASE + 64, \ | ||
| 276 | METHOD_GPIO_24XX }, | ||
| 277 | { OMAP44XX_GPIO4_BASE, INT_44XX_GPIO_BANK4, IH_GPIO_BASE + 96, \ | ||
| 278 | METHOD_GPIO_24XX }, | ||
| 279 | { OMAP44XX_GPIO5_BASE, INT_44XX_GPIO_BANK5, IH_GPIO_BASE + 128, \ | ||
| 280 | METHOD_GPIO_24XX }, | ||
| 281 | { OMAP44XX_GPIO6_BASE, INT_44XX_GPIO_BANK6, IH_GPIO_BASE + 160, \ | ||
| 282 | METHOD_GPIO_24XX }, | ||
| 283 | }; | ||
| 284 | |||
| 285 | #endif | ||
| 286 | |||
| 254 | static struct gpio_bank *gpio_bank; | 287 | static struct gpio_bank *gpio_bank; |
| 255 | static int gpio_bank_count; | 288 | static int gpio_bank_count; |
| 256 | 289 | ||
| @@ -273,7 +306,7 @@ static inline struct gpio_bank *get_gpio_bank(int gpio) | |||
| 273 | } | 306 | } |
| 274 | if (cpu_is_omap24xx()) | 307 | if (cpu_is_omap24xx()) |
| 275 | return &gpio_bank[gpio >> 5]; | 308 | return &gpio_bank[gpio >> 5]; |
| 276 | if (cpu_is_omap34xx()) | 309 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) |
| 277 | return &gpio_bank[gpio >> 5]; | 310 | return &gpio_bank[gpio >> 5]; |
| 278 | BUG(); | 311 | BUG(); |
| 279 | return NULL; | 312 | return NULL; |
| @@ -285,7 +318,7 @@ static inline int get_gpio_index(int gpio) | |||
| 285 | return gpio & 0x1f; | 318 | return gpio & 0x1f; |
| 286 | if (cpu_is_omap24xx()) | 319 | if (cpu_is_omap24xx()) |
| 287 | return gpio & 0x1f; | 320 | return gpio & 0x1f; |
| 288 | if (cpu_is_omap34xx()) | 321 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) |
| 289 | return gpio & 0x1f; | 322 | return gpio & 0x1f; |
| 290 | return gpio & 0x0f; | 323 | return gpio & 0x0f; |
| 291 | } | 324 | } |
| @@ -307,7 +340,7 @@ static inline int gpio_valid(int gpio) | |||
| 307 | return 0; | 340 | return 0; |
| 308 | if (cpu_is_omap24xx() && gpio < 128) | 341 | if (cpu_is_omap24xx() && gpio < 128) |
| 309 | return 0; | 342 | return 0; |
| 310 | if (cpu_is_omap34xx() && gpio < 192) | 343 | if ((cpu_is_omap34xx() || cpu_is_omap44xx()) && gpio < 192) |
| 311 | return 0; | 344 | return 0; |
| 312 | return -1; | 345 | return -1; |
| 313 | } | 346 | } |
| @@ -353,7 +386,8 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) | |||
| 353 | reg += OMAP850_GPIO_DIR_CONTROL; | 386 | reg += OMAP850_GPIO_DIR_CONTROL; |
| 354 | break; | 387 | break; |
| 355 | #endif | 388 | #endif |
| 356 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 389 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 390 | defined(CONFIG_ARCH_OMAP4) | ||
| 357 | case METHOD_GPIO_24XX: | 391 | case METHOD_GPIO_24XX: |
| 358 | reg += OMAP24XX_GPIO_OE; | 392 | reg += OMAP24XX_GPIO_OE; |
| 359 | break; | 393 | break; |
| @@ -425,7 +459,8 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) | |||
| 425 | l &= ~(1 << gpio); | 459 | l &= ~(1 << gpio); |
| 426 | break; | 460 | break; |
| 427 | #endif | 461 | #endif |
| 428 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 462 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 463 | defined(CONFIG_ARCH_OMAP4) | ||
| 429 | case METHOD_GPIO_24XX: | 464 | case METHOD_GPIO_24XX: |
| 430 | if (enable) | 465 | if (enable) |
| 431 | reg += OMAP24XX_GPIO_SETDATAOUT; | 466 | reg += OMAP24XX_GPIO_SETDATAOUT; |
| @@ -476,7 +511,8 @@ static int __omap_get_gpio_datain(int gpio) | |||
| 476 | reg += OMAP850_GPIO_DATA_INPUT; | 511 | reg += OMAP850_GPIO_DATA_INPUT; |
| 477 | break; | 512 | break; |
| 478 | #endif | 513 | #endif |
| 479 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 514 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 515 | defined(CONFIG_ARCH_OMAP4) | ||
| 480 | case METHOD_GPIO_24XX: | 516 | case METHOD_GPIO_24XX: |
| 481 | reg += OMAP24XX_GPIO_DATAIN; | 517 | reg += OMAP24XX_GPIO_DATAIN; |
| 482 | break; | 518 | break; |
| @@ -520,7 +556,7 @@ void omap_set_gpio_debounce(int gpio, int enable) | |||
| 520 | else | 556 | else |
| 521 | goto done; | 557 | goto done; |
| 522 | 558 | ||
| 523 | if (cpu_is_omap34xx()) { | 559 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) { |
| 524 | if (enable) | 560 | if (enable) |
| 525 | clk_enable(bank->dbck); | 561 | clk_enable(bank->dbck); |
| 526 | else | 562 | else |
| @@ -550,7 +586,8 @@ void omap_set_gpio_debounce_time(int gpio, int enc_time) | |||
| 550 | } | 586 | } |
| 551 | EXPORT_SYMBOL(omap_set_gpio_debounce_time); | 587 | EXPORT_SYMBOL(omap_set_gpio_debounce_time); |
| 552 | 588 | ||
| 553 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 589 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 590 | defined(CONFIG_ARCH_OMAP4) | ||
| 554 | static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | 591 | static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, |
| 555 | int trigger) | 592 | int trigger) |
| 556 | { | 593 | { |
| @@ -660,7 +697,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) | |||
| 660 | goto bad; | 697 | goto bad; |
| 661 | break; | 698 | break; |
| 662 | #endif | 699 | #endif |
| 663 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 700 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 701 | defined(CONFIG_ARCH_OMAP4) | ||
| 664 | case METHOD_GPIO_24XX: | 702 | case METHOD_GPIO_24XX: |
| 665 | set_24xx_gpio_triggering(bank, gpio, trigger); | 703 | set_24xx_gpio_triggering(bank, gpio, trigger); |
| 666 | break; | 704 | break; |
| @@ -745,7 +783,8 @@ static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) | |||
| 745 | reg += OMAP850_GPIO_INT_STATUS; | 783 | reg += OMAP850_GPIO_INT_STATUS; |
| 746 | break; | 784 | break; |
| 747 | #endif | 785 | #endif |
| 748 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 786 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 787 | defined(CONFIG_ARCH_OMAP4) | ||
| 749 | case METHOD_GPIO_24XX: | 788 | case METHOD_GPIO_24XX: |
| 750 | reg += OMAP24XX_GPIO_IRQSTATUS1; | 789 | reg += OMAP24XX_GPIO_IRQSTATUS1; |
| 751 | break; | 790 | break; |
| @@ -814,7 +853,8 @@ static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank) | |||
| 814 | inv = 1; | 853 | inv = 1; |
| 815 | break; | 854 | break; |
| 816 | #endif | 855 | #endif |
| 817 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 856 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 857 | defined(CONFIG_ARCH_OMAP4) | ||
| 818 | case METHOD_GPIO_24XX: | 858 | case METHOD_GPIO_24XX: |
| 819 | reg += OMAP24XX_GPIO_IRQENABLE1; | 859 | reg += OMAP24XX_GPIO_IRQENABLE1; |
| 820 | mask = 0xffffffff; | 860 | mask = 0xffffffff; |
| @@ -887,7 +927,8 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab | |||
| 887 | l |= gpio_mask; | 927 | l |= gpio_mask; |
| 888 | break; | 928 | break; |
| 889 | #endif | 929 | #endif |
| 890 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 930 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 931 | defined(CONFIG_ARCH_OMAP4) | ||
| 891 | case METHOD_GPIO_24XX: | 932 | case METHOD_GPIO_24XX: |
| 892 | if (enable) | 933 | if (enable) |
| 893 | reg += OMAP24XX_GPIO_SETIRQENABLE1; | 934 | reg += OMAP24XX_GPIO_SETIRQENABLE1; |
| @@ -932,7 +973,8 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | |||
| 932 | spin_unlock_irqrestore(&bank->lock, flags); | 973 | spin_unlock_irqrestore(&bank->lock, flags); |
| 933 | return 0; | 974 | return 0; |
| 934 | #endif | 975 | #endif |
| 935 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 976 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 977 | defined(CONFIG_ARCH_OMAP4) | ||
| 936 | case METHOD_GPIO_24XX: | 978 | case METHOD_GPIO_24XX: |
| 937 | if (bank->non_wakeup_gpios & (1 << gpio)) { | 979 | if (bank->non_wakeup_gpios & (1 << gpio)) { |
| 938 | printk(KERN_ERR "Unable to modify wakeup on " | 980 | printk(KERN_ERR "Unable to modify wakeup on " |
| @@ -1017,7 +1059,8 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) | |||
| 1017 | __raw_writel(1 << offset, reg); | 1059 | __raw_writel(1 << offset, reg); |
| 1018 | } | 1060 | } |
| 1019 | #endif | 1061 | #endif |
| 1020 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1062 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1063 | defined(CONFIG_ARCH_OMAP4) | ||
| 1021 | if (bank->method == METHOD_GPIO_24XX) { | 1064 | if (bank->method == METHOD_GPIO_24XX) { |
| 1022 | /* Disable wake-up during idle for dynamic tick */ | 1065 | /* Disable wake-up during idle for dynamic tick */ |
| 1023 | void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | 1066 | void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA; |
| @@ -1069,7 +1112,8 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
| 1069 | if (bank->method == METHOD_GPIO_850) | 1112 | if (bank->method == METHOD_GPIO_850) |
| 1070 | isr_reg = bank->base + OMAP850_GPIO_INT_STATUS; | 1113 | isr_reg = bank->base + OMAP850_GPIO_INT_STATUS; |
| 1071 | #endif | 1114 | #endif |
| 1072 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1115 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1116 | defined(CONFIG_ARCH_OMAP4) | ||
| 1073 | if (bank->method == METHOD_GPIO_24XX) | 1117 | if (bank->method == METHOD_GPIO_24XX) |
| 1074 | isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; | 1118 | isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1; |
| 1075 | #endif | 1119 | #endif |
| @@ -1346,7 +1390,7 @@ static int gpio_2irq(struct gpio_chip *chip, unsigned offset) | |||
| 1346 | /*---------------------------------------------------------------------*/ | 1390 | /*---------------------------------------------------------------------*/ |
| 1347 | 1391 | ||
| 1348 | static int initialized; | 1392 | static int initialized; |
| 1349 | #if !defined(CONFIG_ARCH_OMAP3) | 1393 | #if !(defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)) |
| 1350 | static struct clk * gpio_ick; | 1394 | static struct clk * gpio_ick; |
| 1351 | #endif | 1395 | #endif |
| 1352 | 1396 | ||
| @@ -1359,7 +1403,7 @@ static struct clk * gpio5_ick; | |||
| 1359 | static struct clk * gpio5_fck; | 1403 | static struct clk * gpio5_fck; |
| 1360 | #endif | 1404 | #endif |
| 1361 | 1405 | ||
| 1362 | #if defined(CONFIG_ARCH_OMAP3) | 1406 | #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) |
| 1363 | static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; | 1407 | static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; |
| 1364 | #endif | 1408 | #endif |
| 1365 | 1409 | ||
| @@ -1419,8 +1463,8 @@ static int __init _omap_gpio_init(void) | |||
| 1419 | } | 1463 | } |
| 1420 | #endif | 1464 | #endif |
| 1421 | 1465 | ||
| 1422 | #if defined(CONFIG_ARCH_OMAP3) | 1466 | #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) |
| 1423 | if (cpu_is_omap34xx()) { | 1467 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) { |
| 1424 | for (i = 0; i < OMAP34XX_NR_GPIOS; i++) { | 1468 | for (i = 0; i < OMAP34XX_NR_GPIOS; i++) { |
| 1425 | sprintf(clk_name, "gpio%d_ick", i + 1); | 1469 | sprintf(clk_name, "gpio%d_ick", i + 1); |
| 1426 | gpio_iclks[i] = clk_get(NULL, clk_name); | 1470 | gpio_iclks[i] = clk_get(NULL, clk_name); |
| @@ -1497,6 +1541,17 @@ static int __init _omap_gpio_init(void) | |||
| 1497 | (rev >> 4) & 0x0f, rev & 0x0f); | 1541 | (rev >> 4) & 0x0f, rev & 0x0f); |
| 1498 | } | 1542 | } |
| 1499 | #endif | 1543 | #endif |
| 1544 | #ifdef CONFIG_ARCH_OMAP4 | ||
| 1545 | if (cpu_is_omap44xx()) { | ||
| 1546 | int rev; | ||
| 1547 | |||
| 1548 | gpio_bank_count = OMAP34XX_NR_GPIOS; | ||
| 1549 | gpio_bank = gpio_bank_44xx; | ||
| 1550 | rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION); | ||
| 1551 | printk(KERN_INFO "OMAP44xx GPIO hardware version %d.%d\n", | ||
| 1552 | (rev >> 4) & 0x0f, rev & 0x0f); | ||
| 1553 | } | ||
| 1554 | #endif | ||
| 1500 | for (i = 0; i < gpio_bank_count; i++) { | 1555 | for (i = 0; i < gpio_bank_count; i++) { |
| 1501 | int j, gpio_count = 16; | 1556 | int j, gpio_count = 16; |
| 1502 | 1557 | ||
| @@ -1520,7 +1575,8 @@ static int __init _omap_gpio_init(void) | |||
| 1520 | gpio_count = 32; /* 730 has 32-bit GPIOs */ | 1575 | gpio_count = 32; /* 730 has 32-bit GPIOs */ |
| 1521 | } | 1576 | } |
| 1522 | 1577 | ||
| 1523 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1578 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1579 | defined(CONFIG_ARCH_OMAP4) | ||
| 1524 | if (bank->method == METHOD_GPIO_24XX) { | 1580 | if (bank->method == METHOD_GPIO_24XX) { |
| 1525 | static const u32 non_wakeup_gpios[] = { | 1581 | static const u32 non_wakeup_gpios[] = { |
| 1526 | 0xe203ffc0, 0x08700040 | 1582 | 0xe203ffc0, 0x08700040 |
| @@ -1577,7 +1633,7 @@ static int __init _omap_gpio_init(void) | |||
| 1577 | set_irq_chained_handler(bank->irq, gpio_irq_handler); | 1633 | set_irq_chained_handler(bank->irq, gpio_irq_handler); |
| 1578 | set_irq_data(bank->irq, bank); | 1634 | set_irq_data(bank->irq, bank); |
| 1579 | 1635 | ||
| 1580 | if (cpu_is_omap34xx()) { | 1636 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) { |
| 1581 | sprintf(clk_name, "gpio%d_dbck", i + 1); | 1637 | sprintf(clk_name, "gpio%d_dbck", i + 1); |
| 1582 | bank->dbck = clk_get(NULL, clk_name); | 1638 | bank->dbck = clk_get(NULL, clk_name); |
| 1583 | if (IS_ERR(bank->dbck)) | 1639 | if (IS_ERR(bank->dbck)) |
| @@ -1599,7 +1655,8 @@ static int __init _omap_gpio_init(void) | |||
| 1599 | return 0; | 1655 | return 0; |
| 1600 | } | 1656 | } |
| 1601 | 1657 | ||
| 1602 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1658 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ |
| 1659 | defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP4) | ||
| 1603 | static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) | 1660 | static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) |
| 1604 | { | 1661 | { |
| 1605 | int i; | 1662 | int i; |
| @@ -1622,7 +1679,8 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) | |||
| 1622 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; | 1679 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; |
| 1623 | break; | 1680 | break; |
| 1624 | #endif | 1681 | #endif |
| 1625 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1682 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1683 | defined(CONFIG_ARCH_OMAP4) | ||
| 1626 | case METHOD_GPIO_24XX: | 1684 | case METHOD_GPIO_24XX: |
| 1627 | wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; | 1685 | wake_status = bank->base + OMAP24XX_GPIO_WAKE_EN; |
| 1628 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | 1686 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; |
| @@ -1663,7 +1721,8 @@ static int omap_gpio_resume(struct sys_device *dev) | |||
| 1663 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; | 1721 | wake_set = bank->base + OMAP1610_GPIO_SET_WAKEUPENA; |
| 1664 | break; | 1722 | break; |
| 1665 | #endif | 1723 | #endif |
| 1666 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1724 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1725 | defined(CONFIG_ARCH_OMAP4) | ||
| 1667 | case METHOD_GPIO_24XX: | 1726 | case METHOD_GPIO_24XX: |
| 1668 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; | 1727 | wake_clear = bank->base + OMAP24XX_GPIO_CLEARWKUENA; |
| 1669 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; | 1728 | wake_set = bank->base + OMAP24XX_GPIO_SETWKUENA; |
| @@ -1695,7 +1754,8 @@ static struct sys_device omap_gpio_device = { | |||
| 1695 | 1754 | ||
| 1696 | #endif | 1755 | #endif |
| 1697 | 1756 | ||
| 1698 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1757 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1758 | defined(CONFIG_ARCH_OMAP4) | ||
| 1699 | 1759 | ||
| 1700 | static int workaround_enabled; | 1760 | static int workaround_enabled; |
| 1701 | 1761 | ||
| @@ -1711,7 +1771,8 @@ void omap2_gpio_prepare_for_retention(void) | |||
| 1711 | 1771 | ||
| 1712 | if (!(bank->enabled_non_wakeup_gpios)) | 1772 | if (!(bank->enabled_non_wakeup_gpios)) |
| 1713 | continue; | 1773 | continue; |
| 1714 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1774 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1775 | defined(CONFIG_ARCH_OMAP4) | ||
| 1715 | bank->saved_datain = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); | 1776 | bank->saved_datain = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); |
| 1716 | l1 = __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT); | 1777 | l1 = __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT); |
| 1717 | l2 = __raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT); | 1778 | l2 = __raw_readl(bank->base + OMAP24XX_GPIO_RISINGDETECT); |
| @@ -1720,7 +1781,8 @@ void omap2_gpio_prepare_for_retention(void) | |||
| 1720 | bank->saved_risingdetect = l2; | 1781 | bank->saved_risingdetect = l2; |
| 1721 | l1 &= ~bank->enabled_non_wakeup_gpios; | 1782 | l1 &= ~bank->enabled_non_wakeup_gpios; |
| 1722 | l2 &= ~bank->enabled_non_wakeup_gpios; | 1783 | l2 &= ~bank->enabled_non_wakeup_gpios; |
| 1723 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1784 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1785 | defined(CONFIG_ARCH_OMAP4) | ||
| 1724 | __raw_writel(l1, bank->base + OMAP24XX_GPIO_FALLINGDETECT); | 1786 | __raw_writel(l1, bank->base + OMAP24XX_GPIO_FALLINGDETECT); |
| 1725 | __raw_writel(l2, bank->base + OMAP24XX_GPIO_RISINGDETECT); | 1787 | __raw_writel(l2, bank->base + OMAP24XX_GPIO_RISINGDETECT); |
| 1726 | #endif | 1788 | #endif |
| @@ -1745,7 +1807,8 @@ void omap2_gpio_resume_after_retention(void) | |||
| 1745 | 1807 | ||
| 1746 | if (!(bank->enabled_non_wakeup_gpios)) | 1808 | if (!(bank->enabled_non_wakeup_gpios)) |
| 1747 | continue; | 1809 | continue; |
| 1748 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1810 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1811 | defined(CONFIG_ARCH_OMAP4) | ||
| 1749 | __raw_writel(bank->saved_fallingdetect, | 1812 | __raw_writel(bank->saved_fallingdetect, |
| 1750 | bank->base + OMAP24XX_GPIO_FALLINGDETECT); | 1813 | bank->base + OMAP24XX_GPIO_FALLINGDETECT); |
| 1751 | __raw_writel(bank->saved_risingdetect, | 1814 | __raw_writel(bank->saved_risingdetect, |
| @@ -1755,14 +1818,16 @@ void omap2_gpio_resume_after_retention(void) | |||
| 1755 | * state. If so, generate an IRQ by software. This is | 1818 | * state. If so, generate an IRQ by software. This is |
| 1756 | * horribly racy, but it's the best we can do to work around | 1819 | * horribly racy, but it's the best we can do to work around |
| 1757 | * this silicon bug. */ | 1820 | * this silicon bug. */ |
| 1758 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1821 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1822 | defined(CONFIG_ARCH_OMAP4) | ||
| 1759 | l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); | 1823 | l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN); |
| 1760 | #endif | 1824 | #endif |
| 1761 | l ^= bank->saved_datain; | 1825 | l ^= bank->saved_datain; |
| 1762 | l &= bank->non_wakeup_gpios; | 1826 | l &= bank->non_wakeup_gpios; |
| 1763 | if (l) { | 1827 | if (l) { |
| 1764 | u32 old0, old1; | 1828 | u32 old0, old1; |
| 1765 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1829 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ |
| 1830 | defined(CONFIG_ARCH_OMAP4) | ||
| 1766 | old0 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); | 1831 | old0 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); |
| 1767 | old1 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); | 1832 | old1 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); |
| 1768 | __raw_writel(old0 | l, bank->base + OMAP24XX_GPIO_LEVELDETECT0); | 1833 | __raw_writel(old0 | l, bank->base + OMAP24XX_GPIO_LEVELDETECT0); |
| @@ -1798,7 +1863,8 @@ static int __init omap_gpio_sysinit(void) | |||
| 1798 | 1863 | ||
| 1799 | mpuio_init(); | 1864 | mpuio_init(); |
| 1800 | 1865 | ||
| 1801 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 1866 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ |
| 1867 | defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP4) | ||
| 1802 | if (cpu_is_omap16xx() || cpu_class_is_omap2()) { | 1868 | if (cpu_is_omap16xx() || cpu_class_is_omap2()) { |
| 1803 | if (ret == 0) { | 1869 | if (ret == 0) { |
| 1804 | ret = sysdev_class_register(&omap_gpio_sysclass); | 1870 | ret = sysdev_class_register(&omap_gpio_sysclass); |
| @@ -1887,7 +1953,7 @@ static int dbg_gpio_show(struct seq_file *s, void *unused) | |||
| 1887 | 1953 | ||
| 1888 | irqstat = irq_desc[irq].status; | 1954 | irqstat = irq_desc[irq].status; |
| 1889 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ | 1955 | #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || \ |
| 1890 | defined(CONFIG_ARCH_OMAP34XX) | 1956 | defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP4) |
| 1891 | if (is_in && ((bank->suspend_wakeup & mask) | 1957 | if (is_in && ((bank->suspend_wakeup & mask) |
| 1892 | || irqstat & IRQ_TYPE_SENSE_MASK)) { | 1958 | || irqstat & IRQ_TYPE_SENSE_MASK)) { |
| 1893 | char *trigger = NULL; | 1959 | char *trigger = NULL; |
