[ARM] pxa: move DMA registers definitions into <mach/dma.h>
[safe/jmp/linux-2.6] / arch / arm / plat-omap / gpio.c
index a6dbef4..f856a90 100644 (file)
@@ -245,6 +245,8 @@ static inline struct gpio_bank *get_gpio_bank(int gpio)
                return &gpio_bank[gpio >> 5];
        if (cpu_is_omap34xx())
                return &gpio_bank[gpio >> 5];
+       BUG();
+       return NULL;
 }
 
 static inline int get_gpio_index(int gpio)
@@ -448,6 +450,7 @@ void omap_set_gpio_debounce(int gpio, int enable)
 {
        struct gpio_bank *bank;
        void __iomem *reg;
+       unsigned long flags;
        u32 val, l = 1 << get_gpio_index(gpio);
 
        if (cpu_class_is_omap1())
@@ -455,21 +458,28 @@ void omap_set_gpio_debounce(int gpio, int enable)
 
        bank = get_gpio_bank(gpio);
        reg = bank->base;
-
        reg += OMAP24XX_GPIO_DEBOUNCE_EN;
+
+       spin_lock_irqsave(&bank->lock, flags);
        val = __raw_readl(reg);
 
        if (enable && !(val & l))
                val |= l;
-       else if (!enable && val & l)
+       else if (!enable && (val & l))
                val &= ~l;
        else
-               return;
+               goto done;
 
-       if (cpu_is_omap34xx())
-               enable ? clk_enable(bank->dbck) : clk_disable(bank->dbck);
+       if (cpu_is_omap34xx()) {
+               if (enable)
+                       clk_enable(bank->dbck);
+               else
+                       clk_disable(bank->dbck);
+       }
 
        __raw_writel(val, reg);
+done:
+       spin_unlock_irqrestore(&bank->lock, flags);
 }
 EXPORT_SYMBOL(omap_set_gpio_debounce);
 
@@ -886,26 +896,17 @@ static int gpio_wake_enable(unsigned int irq, unsigned int enable)
        return retval;
 }
 
-int omap_request_gpio(int gpio)
+static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
 {
-       struct gpio_bank *bank;
+       struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
        unsigned long flags;
-       int status;
-
-       if (check_gpio(gpio) < 0)
-               return -EINVAL;
 
-       status = gpio_request(gpio, NULL);
-       if (status < 0)
-               return status;
-
-       bank = get_gpio_bank(gpio);
        spin_lock_irqsave(&bank->lock, flags);
 
        /* Set trigger to none. You need to enable the desired trigger with
         * request_irq() or set_irq_type().
         */
-       _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
+       _set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
 
 #ifdef CONFIG_ARCH_OMAP15XX
        if (bank->method == METHOD_GPIO_1510) {
@@ -913,7 +914,7 @@ int omap_request_gpio(int gpio)
 
                /* Claim the pin for MPU */
                reg = bank->base + OMAP1510_GPIO_PIN_CONTROL;
-               __raw_writel(__raw_readl(reg) | (1 << get_gpio_index(gpio)), reg);
+               __raw_writel(__raw_readl(reg) | (1 << offset), reg);
        }
 #endif
        spin_unlock_irqrestore(&bank->lock, flags);
@@ -921,39 +922,28 @@ int omap_request_gpio(int gpio)
        return 0;
 }
 
-void omap_free_gpio(int gpio)
+static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
 {
-       struct gpio_bank *bank;
+       struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
        unsigned long flags;
 
-       if (check_gpio(gpio) < 0)
-               return;
-       bank = get_gpio_bank(gpio);
        spin_lock_irqsave(&bank->lock, flags);
-       if (unlikely(!gpiochip_is_requested(&bank->chip,
-                               get_gpio_index(gpio)))) {
-               spin_unlock_irqrestore(&bank->lock, flags);
-               printk(KERN_ERR "omap-gpio: GPIO %d wasn't reserved!\n", gpio);
-               dump_stack();
-               return;
-       }
 #ifdef CONFIG_ARCH_OMAP16XX
        if (bank->method == METHOD_GPIO_1610) {
                /* Disable wake-up during idle for dynamic tick */
                void __iomem *reg = bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA;
-               __raw_writel(1 << get_gpio_index(gpio), reg);
+               __raw_writel(1 << offset, reg);
        }
 #endif
 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
        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 << get_gpio_index(gpio), reg);
+               __raw_writel(1 << offset, reg);
        }
 #endif
-       _reset_gpio(bank, gpio);
+       _reset_gpio(bank, bank->chip.base + offset);
        spin_unlock_irqrestore(&bank->lock, flags);
-       gpio_free(gpio);
 }
 
 /*
@@ -1458,6 +1448,8 @@ static int __init _omap_gpio_init(void)
                /* REVISIT eventually switch from OMAP-specific gpio structs
                 * over to the generic ones
                 */
+               bank->chip.request = omap_gpio_request;
+               bank->chip.free = omap_gpio_free;
                bank->chip.direction_input = gpio_input;
                bank->chip.get = gpio_get;
                bank->chip.direction_output = gpio_output;
@@ -1726,9 +1718,6 @@ static int __init omap_gpio_sysinit(void)
        return ret;
 }
 
-EXPORT_SYMBOL(omap_request_gpio);
-EXPORT_SYMBOL(omap_free_gpio);
-
 arch_initcall(omap_gpio_sysinit);
 
 
@@ -1800,6 +1789,8 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
 /* FIXME for at least omap2, show pullup/pulldown state */
 
                        irqstat = irq_desc[irq].status;
+#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) ||  \
+               defined(CONFIG_ARCH_OMAP34XX)
                        if (is_in && ((bank->suspend_wakeup & mask)
                                        || irqstat & IRQ_TYPE_SENSE_MASK)) {
                                char    *trigger = NULL;
@@ -1829,6 +1820,7 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
                                                (bank->suspend_wakeup & mask)
                                                        ? " wakeup" : "");
                        }
+#endif
                        seq_printf(s, "\n");
                }