diff options
| -rw-r--r-- | include/linux/interrupt.h | 5 | ||||
| -rw-r--r-- | kernel/irq/devres.c | 45 | ||||
| -rw-r--r-- | kernel/irq/irqdesc.c | 1 |
3 files changed, 51 insertions, 0 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 0053adde0ed9..a2678d35b5a2 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -158,6 +158,11 @@ devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler, | |||
| 158 | devname, dev_id); | 158 | devname, dev_id); |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | extern int __must_check | ||
| 162 | devm_request_any_context_irq(struct device *dev, unsigned int irq, | ||
| 163 | irq_handler_t handler, unsigned long irqflags, | ||
| 164 | const char *devname, void *dev_id); | ||
| 165 | |||
| 161 | extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); | 166 | extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); |
| 162 | 167 | ||
| 163 | /* | 168 | /* |
diff --git a/kernel/irq/devres.c b/kernel/irq/devres.c index bd8e788d71e0..1ef0606797c9 100644 --- a/kernel/irq/devres.c +++ b/kernel/irq/devres.c | |||
| @@ -73,6 +73,51 @@ int devm_request_threaded_irq(struct device *dev, unsigned int irq, | |||
| 73 | EXPORT_SYMBOL(devm_request_threaded_irq); | 73 | EXPORT_SYMBOL(devm_request_threaded_irq); |
| 74 | 74 | ||
| 75 | /** | 75 | /** |
| 76 | * devm_request_any_context_irq - allocate an interrupt line for a managed device | ||
| 77 | * @dev: device to request interrupt for | ||
| 78 | * @irq: Interrupt line to allocate | ||
| 79 | * @handler: Function to be called when the IRQ occurs | ||
| 80 | * @thread_fn: function to be called in a threaded interrupt context. NULL | ||
| 81 | * for devices which handle everything in @handler | ||
| 82 | * @irqflags: Interrupt type flags | ||
| 83 | * @devname: An ascii name for the claiming device | ||
| 84 | * @dev_id: A cookie passed back to the handler function | ||
| 85 | * | ||
| 86 | * Except for the extra @dev argument, this function takes the | ||
| 87 | * same arguments and performs the same function as | ||
| 88 | * request_any_context_irq(). IRQs requested with this function will be | ||
| 89 | * automatically freed on driver detach. | ||
| 90 | * | ||
| 91 | * If an IRQ allocated with this function needs to be freed | ||
| 92 | * separately, devm_free_irq() must be used. | ||
| 93 | */ | ||
| 94 | int devm_request_any_context_irq(struct device *dev, unsigned int irq, | ||
| 95 | irq_handler_t handler, unsigned long irqflags, | ||
| 96 | const char *devname, void *dev_id) | ||
| 97 | { | ||
| 98 | struct irq_devres *dr; | ||
| 99 | int rc; | ||
| 100 | |||
| 101 | dr = devres_alloc(devm_irq_release, sizeof(struct irq_devres), | ||
| 102 | GFP_KERNEL); | ||
| 103 | if (!dr) | ||
| 104 | return -ENOMEM; | ||
| 105 | |||
| 106 | rc = request_any_context_irq(irq, handler, irqflags, devname, dev_id); | ||
| 107 | if (rc) { | ||
| 108 | devres_free(dr); | ||
| 109 | return rc; | ||
| 110 | } | ||
| 111 | |||
| 112 | dr->irq = irq; | ||
| 113 | dr->dev_id = dev_id; | ||
| 114 | devres_add(dev, dr); | ||
| 115 | |||
| 116 | return 0; | ||
| 117 | } | ||
| 118 | EXPORT_SYMBOL(devm_request_any_context_irq); | ||
| 119 | |||
| 120 | /** | ||
| 76 | * devm_free_irq - free an interrupt | 121 | * devm_free_irq - free an interrupt |
| 77 | * @dev: device to free interrupt for | 122 | * @dev: device to free interrupt for |
| 78 | * @irq: Interrupt line to free | 123 | * @irq: Interrupt line to free |
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 192a302d6cfd..8ab8e9390297 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c | |||
| @@ -274,6 +274,7 @@ struct irq_desc *irq_to_desc(unsigned int irq) | |||
| 274 | { | 274 | { |
| 275 | return (irq < NR_IRQS) ? irq_desc + irq : NULL; | 275 | return (irq < NR_IRQS) ? irq_desc + irq : NULL; |
| 276 | } | 276 | } |
| 277 | EXPORT_SYMBOL(irq_to_desc); | ||
| 277 | 278 | ||
| 278 | static void free_desc(unsigned int irq) | 279 | static void free_desc(unsigned int irq) |
| 279 | { | 280 | { |
