ARM: OMAP: gpio lockdep updates
authorDavid Brownell <dbrownell@users.sourceforge.net>
Mon, 3 Mar 2008 12:33:30 +0000 (04:33 -0800)
committerTony Lindgren <tony@atomide.com>
Wed, 5 Mar 2008 08:23:21 +0000 (10:23 +0200)
Fix some spinlock issues reported by lockdep:  since the gpio bank
locks can be aquired in both irq and non-irq contexts, they need
to be consistent about always using the irq-safe variants.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/plat-omap/gpio.c

index 9030495..66a1455 100644 (file)
@@ -333,13 +333,14 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
 void omap_set_gpio_direction(int gpio, int is_input)
 {
        struct gpio_bank *bank;
+       unsigned long flags;
 
        if (check_gpio(gpio) < 0)
                return;
        bank = get_gpio_bank(gpio);
-       spin_lock(&bank->lock);
+       spin_lock_irqsave(&bank->lock, flags);
        _set_gpio_direction(bank, get_gpio_index(gpio), is_input);
-       spin_unlock(&bank->lock);
+       spin_unlock_irqrestore(&bank->lock, flags);
 }
 
 static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
@@ -406,13 +407,14 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
 void omap_set_gpio_dataout(int gpio, int enable)
 {
        struct gpio_bank *bank;
+       unsigned long flags;
 
        if (check_gpio(gpio) < 0)
                return;
        bank = get_gpio_bank(gpio);
-       spin_lock(&bank->lock);
+       spin_lock_irqsave(&bank->lock, flags);
        _set_gpio_dataout(bank, get_gpio_index(gpio), enable);
-       spin_unlock(&bank->lock);
+       spin_unlock_irqrestore(&bank->lock, flags);
 }
 
 int omap_get_gpio_datain(int gpio)
@@ -624,6 +626,7 @@ static int gpio_irq_type(unsigned irq, unsigned type)
        struct gpio_bank *bank;
        unsigned gpio;
        int retval;
+       unsigned long flags;
 
        if (!cpu_class_is_omap2() && irq > IH_MPUIO_BASE)
                gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE);
@@ -642,13 +645,13 @@ static int gpio_irq_type(unsigned irq, unsigned type)
                return -EINVAL;
 
        bank = get_irq_chip_data(irq);
-       spin_lock(&bank->lock);
+       spin_lock_irqsave(&bank->lock, flags);
        retval = _set_gpio_triggering(bank, get_gpio_index(gpio), type);
        if (retval == 0) {
                irq_desc[irq].status &= ~IRQ_TYPE_SENSE_MASK;
                irq_desc[irq].status |= type;
        }
-       spin_unlock(&bank->lock);
+       spin_unlock_irqrestore(&bank->lock, flags);
        return retval;
 }
 
@@ -830,11 +833,13 @@ static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int ena
  */
 static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
 {
+       unsigned long flags;
+
        switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP16XX
        case METHOD_MPUIO:
        case METHOD_GPIO_1610:
-               spin_lock(&bank->lock);
+               spin_lock_irqsave(&bank->lock, flags);
                if (enable) {
                        bank->suspend_wakeup |= (1 << gpio);
                        enable_irq_wake(bank->irq);
@@ -842,7 +847,7 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
                        disable_irq_wake(bank->irq);
                        bank->suspend_wakeup &= ~(1 << gpio);
                }
-               spin_unlock(&bank->lock);
+               spin_unlock_irqrestore(&bank->lock, flags);
                return 0;
 #endif
 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
@@ -853,7 +858,7 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
                                        (bank - gpio_bank) * 32 + gpio);
                        return -EINVAL;
                }
-               spin_lock(&bank->lock);
+               spin_lock_irqsave(&bank->lock, flags);
                if (enable) {
                        bank->suspend_wakeup |= (1 << gpio);
                        enable_irq_wake(bank->irq);
@@ -861,7 +866,7 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
                        disable_irq_wake(bank->irq);
                        bank->suspend_wakeup &= ~(1 << gpio);
                }
-               spin_unlock(&bank->lock);
+               spin_unlock_irqrestore(&bank->lock, flags);
                return 0;
 #endif
        default:
@@ -897,16 +902,17 @@ static int gpio_wake_enable(unsigned int irq, unsigned int enable)
 int omap_request_gpio(int gpio)
 {
        struct gpio_bank *bank;
+       unsigned long flags;
 
        if (check_gpio(gpio) < 0)
                return -EINVAL;
 
        bank = get_gpio_bank(gpio);
-       spin_lock(&bank->lock);
+       spin_lock_irqsave(&bank->lock, flags);
        if (unlikely(bank->reserved_map & (1 << get_gpio_index(gpio)))) {
                printk(KERN_ERR "omap-gpio: GPIO %d is already reserved!\n", gpio);
                dump_stack();
-               spin_unlock(&bank->lock);
+               spin_unlock_irqrestore(&bank->lock, flags);
                return -1;
        }
        bank->reserved_map |= (1 << get_gpio_index(gpio));
@@ -925,7 +931,7 @@ int omap_request_gpio(int gpio)
                __raw_writel(__raw_readl(reg) | (1 << get_gpio_index(gpio)), reg);
        }
 #endif
-       spin_unlock(&bank->lock);
+       spin_unlock_irqrestore(&bank->lock, flags);
 
        return 0;
 }
@@ -933,15 +939,16 @@ int omap_request_gpio(int gpio)
 void omap_free_gpio(int gpio)
 {
        struct gpio_bank *bank;
+       unsigned long flags;
 
        if (check_gpio(gpio) < 0)
                return;
        bank = get_gpio_bank(gpio);
-       spin_lock(&bank->lock);
+       spin_lock_irqsave(&bank->lock, flags);
        if (unlikely(!(bank->reserved_map & (1 << get_gpio_index(gpio))))) {
                printk(KERN_ERR "omap-gpio: GPIO %d wasn't reserved!\n", gpio);
                dump_stack();
-               spin_unlock(&bank->lock);
+               spin_unlock_irqrestore(&bank->lock, flags);
                return;
        }
 #ifdef CONFIG_ARCH_OMAP16XX
@@ -960,7 +967,7 @@ void omap_free_gpio(int gpio)
 #endif
        bank->reserved_map &= ~(1 << get_gpio_index(gpio));
        _reset_gpio(bank, gpio);
-       spin_unlock(&bank->lock);
+       spin_unlock_irqrestore(&bank->lock, flags);
 }
 
 /*
@@ -1194,11 +1201,12 @@ static int omap_mpuio_suspend_late(struct platform_device *pdev, pm_message_t me
 {
        struct gpio_bank        *bank = platform_get_drvdata(pdev);
        void __iomem            *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT;
+       unsigned long           flags;
 
-       spin_lock(&bank->lock);
+       spin_lock_irqsave(&bank->lock, flags);
        bank->saved_wakeup = __raw_readl(mask_reg);
        __raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg);
-       spin_unlock(&bank->lock);
+       spin_unlock_irqrestore(&bank->lock, flags);
 
        return 0;
 }
@@ -1207,10 +1215,11 @@ static int omap_mpuio_resume_early(struct platform_device *pdev)
 {
        struct gpio_bank        *bank = platform_get_drvdata(pdev);
        void __iomem            *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT;
+       unsigned long           flags;
 
-       spin_lock(&bank->lock);
+       spin_lock_irqsave(&bank->lock, flags);
        __raw_writel(bank->saved_wakeup, mask_reg);
-       spin_unlock(&bank->lock);
+       spin_unlock_irqrestore(&bank->lock, flags);
 
        return 0;
 }
@@ -1495,6 +1504,7 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
                void __iomem *wake_status;
                void __iomem *wake_clear;
                void __iomem *wake_set;
+               unsigned long flags;
 
                switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP16XX
@@ -1515,11 +1525,11 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
                        continue;
                }
 
-               spin_lock(&bank->lock);
+               spin_lock_irqsave(&bank->lock, flags);
                bank->saved_wakeup = __raw_readl(wake_status);
                __raw_writel(0xffffffff, wake_clear);
                __raw_writel(bank->suspend_wakeup, wake_set);
-               spin_unlock(&bank->lock);
+               spin_unlock_irqrestore(&bank->lock, flags);
        }
 
        return 0;
@@ -1536,6 +1546,7 @@ static int omap_gpio_resume(struct sys_device *dev)
                struct gpio_bank *bank = &gpio_bank[i];
                void __iomem *wake_clear;
                void __iomem *wake_set;
+               unsigned long flags;
 
                switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP16XX
@@ -1554,10 +1565,10 @@ static int omap_gpio_resume(struct sys_device *dev)
                        continue;
                }
 
-               spin_lock(&bank->lock);
+               spin_lock_irqsave(&bank->lock, flags);
                __raw_writel(0xffffffff, wake_clear);
                __raw_writel(bank->saved_wakeup, wake_set);
-               spin_unlock(&bank->lock);
+               spin_unlock_irqrestore(&bank->lock, flags);
        }
 
        return 0;