|
|
@@ -1167,6 +1167,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
|
|
if (desc->irq_data.chip->flags & IRQCHIP_ONESHOT_SAFE)
|
|
|
new->flags &= ~IRQF_ONESHOT;
|
|
|
|
|
|
+ mutex_lock(&desc->request_mutex);
|
|
|
+
|
|
|
chip_bus_lock(desc);
|
|
|
|
|
|
/*
|
|
|
@@ -1350,6 +1352,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
|
|
|
|
|
raw_spin_unlock_irqrestore(&desc->lock, flags);
|
|
|
chip_bus_sync_unlock(desc);
|
|
|
+ mutex_unlock(&desc->request_mutex);
|
|
|
|
|
|
irq_setup_timings(desc, new);
|
|
|
|
|
|
@@ -1383,6 +1386,8 @@ out_unlock:
|
|
|
|
|
|
chip_bus_sync_unlock(desc);
|
|
|
|
|
|
+ mutex_unlock(&desc->request_mutex);
|
|
|
+
|
|
|
out_thread:
|
|
|
if (new->thread) {
|
|
|
struct task_struct *t = new->thread;
|
|
|
@@ -1446,6 +1451,7 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
|
|
|
if (!desc)
|
|
|
return NULL;
|
|
|
|
|
|
+ mutex_lock(&desc->request_mutex);
|
|
|
chip_bus_lock(desc);
|
|
|
raw_spin_lock_irqsave(&desc->lock, flags);
|
|
|
|
|
|
@@ -1521,6 +1527,8 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ mutex_unlock(&desc->request_mutex);
|
|
|
+
|
|
|
irq_chip_pm_put(&desc->irq_data);
|
|
|
module_put(desc->owner);
|
|
|
kfree(action->secondary);
|