|
@@ -432,7 +432,6 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
|
|
|
{
|
|
|
void __iomem *base = bank->base;
|
|
|
u32 gpio_bit = 1 << gpio;
|
|
|
- u32 val;
|
|
|
|
|
|
if (cpu_is_omap44xx()) {
|
|
|
MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit,
|
|
@@ -455,15 +454,8 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
|
|
|
}
|
|
|
if (likely(!(bank->non_wakeup_gpios & gpio_bit))) {
|
|
|
if (cpu_is_omap44xx()) {
|
|
|
- if (trigger != 0)
|
|
|
- __raw_writel(1 << gpio, bank->base+
|
|
|
- OMAP4_GPIO_IRQWAKEN0);
|
|
|
- else {
|
|
|
- val = __raw_readl(bank->base +
|
|
|
- OMAP4_GPIO_IRQWAKEN0);
|
|
|
- __raw_writel(val & (~(1 << gpio)), bank->base +
|
|
|
- OMAP4_GPIO_IRQWAKEN0);
|
|
|
- }
|
|
|
+ MOD_REG_BIT(OMAP4_GPIO_IRQWAKEN0, gpio_bit,
|
|
|
+ trigger != 0);
|
|
|
} else {
|
|
|
/*
|
|
|
* GPIO wakeup request can only be generated on edge
|
|
@@ -1134,8 +1126,11 @@ static void gpio_irq_shutdown(struct irq_data *d)
|
|
|
{
|
|
|
unsigned int gpio = d->irq - IH_GPIO_BASE;
|
|
|
struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
+ spin_lock_irqsave(&bank->lock, flags);
|
|
|
_reset_gpio(bank, gpio);
|
|
|
+ spin_unlock_irqrestore(&bank->lock, flags);
|
|
|
}
|
|
|
|
|
|
static void gpio_ack_irq(struct irq_data *d)
|
|
@@ -1150,9 +1145,12 @@ static void gpio_mask_irq(struct irq_data *d)
|
|
|
{
|
|
|
unsigned int gpio = d->irq - IH_GPIO_BASE;
|
|
|
struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
+ spin_lock_irqsave(&bank->lock, flags);
|
|
|
_set_gpio_irqenable(bank, gpio, 0);
|
|
|
_set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE);
|
|
|
+ spin_unlock_irqrestore(&bank->lock, flags);
|
|
|
}
|
|
|
|
|
|
static void gpio_unmask_irq(struct irq_data *d)
|
|
@@ -1161,7 +1159,9 @@ static void gpio_unmask_irq(struct irq_data *d)
|
|
|
struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
|
|
|
unsigned int irq_mask = 1 << get_gpio_index(gpio);
|
|
|
u32 trigger = irqd_get_trigger_type(d);
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
+ spin_lock_irqsave(&bank->lock, flags);
|
|
|
if (trigger)
|
|
|
_set_gpio_triggering(bank, get_gpio_index(gpio), trigger);
|
|
|
|
|
@@ -1173,6 +1173,7 @@ static void gpio_unmask_irq(struct irq_data *d)
|
|
|
}
|
|
|
|
|
|
_set_gpio_irqenable(bank, gpio, 1);
|
|
|
+ spin_unlock_irqrestore(&bank->lock, flags);
|
|
|
}
|
|
|
|
|
|
static struct irq_chip gpio_irq_chip = {
|
|
@@ -1524,7 +1525,7 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, int id)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void __init omap_gpio_chip_init(struct gpio_bank *bank)
|
|
|
+static void __devinit omap_gpio_chip_init(struct gpio_bank *bank)
|
|
|
{
|
|
|
int j;
|
|
|
static int gpio;
|