Merge branch 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind...
[pandora-kernel.git] / arch / arm / plat-omap / gpio.c
index c6e1de5..dc2ac42 100644 (file)
 #define OMAP4_GPIO_IRQSTATUSCLR1       0x0040
 #define OMAP4_GPIO_IRQWAKEN0           0x0044
 #define OMAP4_GPIO_IRQWAKEN1           0x0048
-#define OMAP4_GPIO_SYSSTATUS           0x0104
+#define OMAP4_GPIO_SYSSTATUS           0x0114
+#define OMAP4_GPIO_IRQENABLE1          0x011c
+#define OMAP4_GPIO_WAKE_EN             0x0120
+#define OMAP4_GPIO_IRQSTATUS2          0x0128
+#define OMAP4_GPIO_IRQENABLE2          0x012c
 #define OMAP4_GPIO_CTRL                        0x0130
 #define OMAP4_GPIO_OE                  0x0134
 #define OMAP4_GPIO_DATAIN              0x0138
 #define OMAP4_GPIO_FALLINGDETECT       0x014c
 #define OMAP4_GPIO_DEBOUNCENABLE       0x0150
 #define OMAP4_GPIO_DEBOUNCINGTIME      0x0154
+#define OMAP4_GPIO_CLEARIRQENABLE1     0x0160
+#define OMAP4_GPIO_SETIRQENABLE1       0x0164
+#define OMAP4_GPIO_CLEARWKUENA         0x0180
+#define OMAP4_GPIO_SETWKUENA           0x0184
 #define OMAP4_GPIO_CLEARDATAOUT                0x0190
 #define OMAP4_GPIO_SETDATAOUT          0x0194
 /*
@@ -305,8 +313,6 @@ struct omap3_gpio_regs {
        u32 risingdetect;
        u32 fallingdetect;
        u32 dataout;
-       u32 setwkuena;
-       u32 setdataout;
 };
 
 static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS];
@@ -593,11 +599,15 @@ static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)
                reg += OMAP7XX_GPIO_DATA_OUTPUT;
                break;
 #endif
-#ifdef CONFIG_ARCH_OMAP2PLUS
+#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
        case METHOD_GPIO_24XX:
-       case METHOD_GPIO_44XX:
                reg += OMAP24XX_GPIO_DATAOUT;
                break;
+#endif
+#ifdef CONFIG_ARCH_OMAP4
+       case METHOD_GPIO_44XX:
+               reg += OMAP4_GPIO_DATAOUT;
+               break;
 #endif
        default:
                return -EINVAL;
@@ -1215,11 +1225,17 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
 #endif
        if (!cpu_class_is_omap1()) {
                if (!bank->mod_usage) {
+                       void __iomem *reg = bank->base;
                        u32 ctrl;
-                       ctrl = __raw_readl(bank->base + OMAP24XX_GPIO_CTRL);
-                       ctrl &= 0xFFFFFFFE;
+
+                       if (cpu_is_omap24xx() || cpu_is_omap34xx())
+                               reg += OMAP24XX_GPIO_CTRL;
+                       else if (cpu_is_omap44xx())
+                               reg += OMAP4_GPIO_CTRL;
+                       ctrl = __raw_readl(reg);
                        /* Module is enabled, clocks are not gated */
-                       __raw_writel(ctrl, bank->base + OMAP24XX_GPIO_CTRL);
+                       ctrl &= 0xFFFFFFFE;
+                       __raw_writel(ctrl, reg);
                }
                bank->mod_usage |= 1 << offset;
        }
@@ -1241,22 +1257,34 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
                __raw_writel(1 << offset, reg);
        }
 #endif
-#ifdef CONFIG_ARCH_OMAP2PLUS
-       if ((bank->method == METHOD_GPIO_24XX) ||
-                       (bank->method == METHOD_GPIO_44XX)) {
+#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
+       if (bank->method == METHOD_GPIO_24XX) {
                /* Disable wake-up during idle for dynamic tick */
                void __iomem *reg = bank->base + OMAP24XX_GPIO_CLEARWKUENA;
                __raw_writel(1 << offset, reg);
        }
+#endif
+#ifdef CONFIG_ARCH_OMAP4
+       if (bank->method == METHOD_GPIO_44XX) {
+               /* Disable wake-up during idle for dynamic tick */
+               void __iomem *reg = bank->base + OMAP4_GPIO_IRQWAKEN0;
+               __raw_writel(1 << offset, reg);
+       }
 #endif
        if (!cpu_class_is_omap1()) {
                bank->mod_usage &= ~(1 << offset);
                if (!bank->mod_usage) {
+                       void __iomem *reg = bank->base;
                        u32 ctrl;
-                       ctrl = __raw_readl(bank->base + OMAP24XX_GPIO_CTRL);
+
+                       if (cpu_is_omap24xx() || cpu_is_omap34xx())
+                               reg += OMAP24XX_GPIO_CTRL;
+                       else if (cpu_is_omap44xx())
+                               reg += OMAP4_GPIO_CTRL;
+                       ctrl = __raw_readl(reg);
                        /* Module is disabled, clocks are gated */
                        ctrl |= 1;
-                       __raw_writel(ctrl, bank->base + OMAP24XX_GPIO_CTRL);
+                       __raw_writel(ctrl, reg);
                }
        }
        _reset_gpio(bank, bank->chip.base + offset);
@@ -1585,9 +1613,14 @@ static int gpio_is_input(struct gpio_bank *bank, int mask)
                reg += OMAP7XX_GPIO_DIR_CONTROL;
                break;
        case METHOD_GPIO_24XX:
-       case METHOD_GPIO_44XX:
                reg += OMAP24XX_GPIO_OE;
                break;
+       case METHOD_GPIO_44XX:
+               reg += OMAP4_GPIO_OE;
+               break;
+       default:
+               WARN_ONCE(1, "gpio_is_input: incorrect OMAP GPIO method");
+               return -EINVAL;
        }
        return __raw_readl(reg) & mask;
 }
@@ -2241,10 +2274,6 @@ void omap_gpio_save_context(void)
                        __raw_readl(bank->base + OMAP24XX_GPIO_FALLINGDETECT);
                gpio_context[i].dataout =
                        __raw_readl(bank->base + OMAP24XX_GPIO_DATAOUT);
-               gpio_context[i].setwkuena =
-                       __raw_readl(bank->base + OMAP24XX_GPIO_SETWKUENA);
-               gpio_context[i].setdataout =
-                       __raw_readl(bank->base + OMAP24XX_GPIO_SETDATAOUT);
        }
 }
 
@@ -2277,10 +2306,6 @@ void omap_gpio_restore_context(void)
                                bank->base + OMAP24XX_GPIO_FALLINGDETECT);
                __raw_writel(gpio_context[i].dataout,
                                bank->base + OMAP24XX_GPIO_DATAOUT);
-               __raw_writel(gpio_context[i].setwkuena,
-                               bank->base + OMAP24XX_GPIO_SETWKUENA);
-               __raw_writel(gpio_context[i].setdataout,
-                               bank->base + OMAP24XX_GPIO_SETDATAOUT);
        }
 }
 #endif
@@ -2320,110 +2345,3 @@ static int __init omap_gpio_sysinit(void)
 }
 
 arch_initcall(omap_gpio_sysinit);
-
-
-#ifdef CONFIG_DEBUG_FS
-
-#include <linux/debugfs.h>
-#include <linux/seq_file.h>
-
-static int dbg_gpio_show(struct seq_file *s, void *unused)
-{
-       unsigned        i, j, gpio;
-
-       for (i = 0, gpio = 0; i < gpio_bank_count; i++) {
-               struct gpio_bank        *bank = gpio_bank + i;
-               unsigned                bankwidth = 16;
-               u32                     mask = 1;
-
-               if (bank_is_mpuio(bank))
-                       gpio = OMAP_MPUIO(0);
-               else if (cpu_class_is_omap2() || cpu_is_omap7xx())
-                       bankwidth = 32;
-
-               for (j = 0; j < bankwidth; j++, gpio++, mask <<= 1) {
-                       unsigned        irq, value, is_in, irqstat;
-                       const char      *label;
-
-                       label = gpiochip_is_requested(&bank->chip, j);
-                       if (!label)
-                               continue;
-
-                       irq = bank->virtual_irq_start + j;
-                       value = gpio_get_value(gpio);
-                       is_in = gpio_is_input(bank, mask);
-
-                       if (bank_is_mpuio(bank))
-                               seq_printf(s, "MPUIO %2d ", j);
-                       else
-                               seq_printf(s, "GPIO %3d ", gpio);
-                       seq_printf(s, "(%-20.20s): %s %s",
-                                       label,
-                                       is_in ? "in " : "out",
-                                       value ? "hi"  : "lo");
-
-/* FIXME for at least omap2, show pullup/pulldown state */
-
-                       irqstat = irq_desc[irq].status;
-#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
-                       if (is_in && ((bank->suspend_wakeup & mask)
-                                       || irqstat & IRQ_TYPE_SENSE_MASK)) {
-                               char    *trigger = NULL;
-
-                               switch (irqstat & IRQ_TYPE_SENSE_MASK) {
-                               case IRQ_TYPE_EDGE_FALLING:
-                                       trigger = "falling";
-                                       break;
-                               case IRQ_TYPE_EDGE_RISING:
-                                       trigger = "rising";
-                                       break;
-                               case IRQ_TYPE_EDGE_BOTH:
-                                       trigger = "bothedge";
-                                       break;
-                               case IRQ_TYPE_LEVEL_LOW:
-                                       trigger = "low";
-                                       break;
-                               case IRQ_TYPE_LEVEL_HIGH:
-                                       trigger = "high";
-                                       break;
-                               case IRQ_TYPE_NONE:
-                                       trigger = "(?)";
-                                       break;
-                               }
-                               seq_printf(s, ", irq-%d %-8s%s",
-                                               irq, trigger,
-                                               (bank->suspend_wakeup & mask)
-                                                       ? " wakeup" : "");
-                       }
-#endif
-                       seq_printf(s, "\n");
-               }
-
-               if (bank_is_mpuio(bank)) {
-                       seq_printf(s, "\n");
-                       gpio = 0;
-               }
-       }
-       return 0;
-}
-
-static int dbg_gpio_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, dbg_gpio_show, &inode->i_private);
-}
-
-static const struct file_operations debug_fops = {
-       .open           = dbg_gpio_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-
-static int __init omap_gpio_debuginit(void)
-{
-       (void) debugfs_create_file("omap_gpio", S_IRUGO,
-                                       NULL, NULL, &debug_fops);
-       return 0;
-}
-late_initcall(omap_gpio_debuginit);
-#endif