|
@@ -230,9 +230,11 @@ void disable_irq_nosync(unsigned int irq)
|
|
|
if (!desc)
|
|
|
return;
|
|
|
|
|
|
+ chip_bus_lock(irq, desc);
|
|
|
spin_lock_irqsave(&desc->lock, flags);
|
|
|
__disable_irq(desc, irq, false);
|
|
|
spin_unlock_irqrestore(&desc->lock, flags);
|
|
|
+ chip_bus_sync_unlock(irq, desc);
|
|
|
}
|
|
|
EXPORT_SYMBOL(disable_irq_nosync);
|
|
|
|
|
@@ -294,7 +296,8 @@ void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume)
|
|
|
* matches the last disable, processing of interrupts on this
|
|
|
* IRQ line is re-enabled.
|
|
|
*
|
|
|
- * This function may be called from IRQ context.
|
|
|
+ * This function may be called from IRQ context only when
|
|
|
+ * desc->chip->bus_lock and desc->chip->bus_sync_unlock are NULL !
|
|
|
*/
|
|
|
void enable_irq(unsigned int irq)
|
|
|
{
|
|
@@ -304,9 +307,11 @@ void enable_irq(unsigned int irq)
|
|
|
if (!desc)
|
|
|
return;
|
|
|
|
|
|
+ chip_bus_lock(irq, desc);
|
|
|
spin_lock_irqsave(&desc->lock, flags);
|
|
|
__enable_irq(desc, irq, false);
|
|
|
spin_unlock_irqrestore(&desc->lock, flags);
|
|
|
+ chip_bus_sync_unlock(irq, desc);
|
|
|
}
|
|
|
EXPORT_SYMBOL(enable_irq);
|
|
|
|
|
@@ -468,12 +473,14 @@ static int irq_wait_for_interrupt(struct irqaction *action)
|
|
|
*/
|
|
|
static void irq_finalize_oneshot(unsigned int irq, struct irq_desc *desc)
|
|
|
{
|
|
|
+ chip_bus_lock(irq, desc);
|
|
|
spin_lock_irq(&desc->lock);
|
|
|
if (!(desc->status & IRQ_DISABLED) && (desc->status & IRQ_MASKED)) {
|
|
|
desc->status &= ~IRQ_MASKED;
|
|
|
desc->chip->unmask(irq);
|
|
|
}
|
|
|
spin_unlock_irq(&desc->lock);
|
|
|
+ chip_bus_sync_unlock(irq, desc);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
@@ -904,7 +911,14 @@ EXPORT_SYMBOL_GPL(remove_irq);
|
|
|
*/
|
|
|
void free_irq(unsigned int irq, void *dev_id)
|
|
|
{
|
|
|
+ struct irq_desc *desc = irq_to_desc(irq);
|
|
|
+
|
|
|
+ if (!desc)
|
|
|
+ return;
|
|
|
+
|
|
|
+ chip_bus_lock(irq, desc);
|
|
|
kfree(__free_irq(irq, dev_id));
|
|
|
+ chip_bus_sync_unlock(irq, desc);
|
|
|
}
|
|
|
EXPORT_SYMBOL(free_irq);
|
|
|
|
|
@@ -1011,7 +1025,10 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler,
|
|
|
action->name = devname;
|
|
|
action->dev_id = dev_id;
|
|
|
|
|
|
+ chip_bus_lock(irq, desc);
|
|
|
retval = __setup_irq(irq, desc, action);
|
|
|
+ chip_bus_sync_unlock(irq, desc);
|
|
|
+
|
|
|
if (retval)
|
|
|
kfree(action);
|
|
|
|