aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2017-04-13 03:06:41 -0400
committerBjorn Helgaas <bhelgaas@google.com>2017-04-18 14:40:00 -0400
commit25ce4be72411867e0471908ee9319599035cc624 (patch)
tree1c29262ad5fb60ba2fd8d68e58be2c74fb848297
parenta7e60e55d73c39df7bcfedb6ccf9b6b1100d960d (diff)
genirq: Return the IRQ name from free_irq()
This allows callers to get back at them instead of having to store it in another variable. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--include/linux/interrupt.h2
-rw-r--r--kernel/irq/manage.c13
2 files changed, 11 insertions, 4 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
index 53144e78a369..a6fba4804672 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -155,7 +155,7 @@ extern int __must_check
155request_percpu_irq(unsigned int irq, irq_handler_t handler, 155request_percpu_irq(unsigned int irq, irq_handler_t handler,
156 const char *devname, void __percpu *percpu_dev_id); 156 const char *devname, void __percpu *percpu_dev_id);
157 157
158extern void free_irq(unsigned int, void *); 158extern const void *free_irq(unsigned int, void *);
159extern void free_percpu_irq(unsigned int, void __percpu *); 159extern void free_percpu_irq(unsigned int, void __percpu *);
160 160
161struct device; 161struct device;
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 391cb738b2db..e688e7e06772 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1574,20 +1574,27 @@ EXPORT_SYMBOL_GPL(remove_irq);
1574 * have completed. 1574 * have completed.
1575 * 1575 *
1576 * This function must not be called from interrupt context. 1576 * This function must not be called from interrupt context.
1577 *
1578 * Returns the devname argument passed to request_irq.
1577 */ 1579 */
1578void free_irq(unsigned int irq, void *dev_id) 1580const void *free_irq(unsigned int irq, void *dev_id)
1579{ 1581{
1580 struct irq_desc *desc = irq_to_desc(irq); 1582 struct irq_desc *desc = irq_to_desc(irq);
1583 struct irqaction *action;
1584 const char *devname;
1581 1585
1582 if (!desc || WARN_ON(irq_settings_is_per_cpu_devid(desc))) 1586 if (!desc || WARN_ON(irq_settings_is_per_cpu_devid(desc)))
1583 return; 1587 return NULL;
1584 1588
1585#ifdef CONFIG_SMP 1589#ifdef CONFIG_SMP
1586 if (WARN_ON(desc->affinity_notify)) 1590 if (WARN_ON(desc->affinity_notify))
1587 desc->affinity_notify = NULL; 1591 desc->affinity_notify = NULL;
1588#endif 1592#endif
1589 1593
1590 kfree(__free_irq(irq, dev_id)); 1594 action = __free_irq(irq, dev_id);
1595 devname = action->name;
1596 kfree(action);
1597 return devname;
1591} 1598}
1592EXPORT_SYMBOL(free_irq); 1599EXPORT_SYMBOL(free_irq);
1593 1600