mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 08:02:07 +00:00
ARM: OMAP: gpio lockdep updates
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>
This commit is contained in:
parent
02bad5f9bc
commit
a6472533e4
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user