diff options
Diffstat (limited to 'kernel/irq/devres.c')
| -rw-r--r-- | kernel/irq/devres.c | 45 | 
1 files changed, 45 insertions, 0 deletions
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 | 
