diff options
author | Christoph Hellwig <hch@lst.de> | 2017-04-13 03:06:41 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2017-04-18 14:40:00 -0400 |
commit | 25ce4be72411867e0471908ee9319599035cc624 (patch) | |
tree | 1c29262ad5fb60ba2fd8d68e58be2c74fb848297 | |
parent | a7e60e55d73c39df7bcfedb6ccf9b6b1100d960d (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.h | 2 | ||||
-rw-r--r-- | kernel/irq/manage.c | 13 |
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 | |||
155 | request_percpu_irq(unsigned int irq, irq_handler_t handler, | 155 | request_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 | ||
158 | extern void free_irq(unsigned int, void *); | 158 | extern const void *free_irq(unsigned int, void *); |
159 | extern void free_percpu_irq(unsigned int, void __percpu *); | 159 | extern void free_percpu_irq(unsigned int, void __percpu *); |
160 | 160 | ||
161 | struct device; | 161 | struct 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 | */ |
1578 | void free_irq(unsigned int irq, void *dev_id) | 1580 | const 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 | } |
1592 | EXPORT_SYMBOL(free_irq); | 1599 | EXPORT_SYMBOL(free_irq); |
1593 | 1600 | ||