genirq: Add missing buslock to set_irq_type(), set_irq_wake()
authorThomas Gleixner <tglx@linutronix.de>
Sat, 12 Feb 2011 11:10:49 +0000 (12:10 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 19 Feb 2011 11:58:06 +0000 (12:58 +0100)
chips behind a slow bus cannot update the chip under desc->lock, but
we miss the chip_buslock/chip_bus_sync_unlock() calls around the set
type and set wake functions.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

kernel/irq/chip.c
kernel/irq/manage.c

index baa5c4a..9639ab8 100644 (file)
@@ -65,9 +65,11 @@ int set_irq_type(unsigned int irq, unsigned int type)
        if (type == IRQ_TYPE_NONE)
                return 0;
 
+       chip_bus_lock(desc);
        raw_spin_lock_irqsave(&desc->lock, flags);
        ret = __irq_set_trigger(desc, irq, type);
        raw_spin_unlock_irqrestore(&desc->lock, flags);
+       chip_bus_sync_unlock(desc);
        return ret;
 }
 EXPORT_SYMBOL(set_irq_type);
index ba84307..a400db2 100644 (file)
@@ -454,6 +454,7 @@ int set_irq_wake(unsigned int irq, unsigned int on)
        /* wakeup-capable irqs can be shared between drivers that
         * don't need to have the same sleep mode behaviors.
         */
+       chip_bus_lock(desc);
        raw_spin_lock_irqsave(&desc->lock, flags);
        if (on) {
                if (desc->wake_depth++ == 0) {
@@ -476,6 +477,7 @@ int set_irq_wake(unsigned int irq, unsigned int on)
        }
 
        raw_spin_unlock_irqrestore(&desc->lock, flags);
+       chip_bus_sync_unlock(desc);
        return ret;
 }
 EXPORT_SYMBOL(set_irq_wake);