diff options
| -rw-r--r-- | include/linux/interrupt.h | 17 | ||||
| -rw-r--r-- | kernel/irq/devres.c | 16 |
2 files changed, 24 insertions, 9 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 6fc2b720c231..dbf6a6fd116c 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -123,9 +123,20 @@ extern void free_irq(unsigned int, void *); | |||
| 123 | 123 | ||
| 124 | struct device; | 124 | struct device; |
| 125 | 125 | ||
| 126 | extern int __must_check devm_request_irq(struct device *dev, unsigned int irq, | 126 | extern int __must_check |
| 127 | irq_handler_t handler, unsigned long irqflags, | 127 | devm_request_threaded_irq(struct device *dev, unsigned int irq, |
| 128 | const char *devname, void *dev_id); | 128 | irq_handler_t handler, irq_handler_t thread_fn, |
| 129 | unsigned long irqflags, const char *devname, | ||
| 130 | void *dev_id); | ||
| 131 | |||
| 132 | static inline int __must_check | ||
| 133 | devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler, | ||
| 134 | unsigned long irqflags, const char *devname, void *dev_id) | ||
| 135 | { | ||
| 136 | return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags, | ||
| 137 | devname, dev_id); | ||
| 138 | } | ||
| 139 | |||
| 129 | extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); | 140 | extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); |
| 130 | 141 | ||
| 131 | /* | 142 | /* |
diff --git a/kernel/irq/devres.c b/kernel/irq/devres.c index 38a25b8d8bff..d06df9c41cba 100644 --- a/kernel/irq/devres.c +++ b/kernel/irq/devres.c | |||
| @@ -26,10 +26,12 @@ static int devm_irq_match(struct device *dev, void *res, void *data) | |||
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | /** | 28 | /** |
| 29 | * devm_request_irq - allocate an interrupt line for a managed device | 29 | * devm_request_threaded_irq - allocate an interrupt line for a managed device |
| 30 | * @dev: device to request interrupt for | 30 | * @dev: device to request interrupt for |
| 31 | * @irq: Interrupt line to allocate | 31 | * @irq: Interrupt line to allocate |
| 32 | * @handler: Function to be called when the IRQ occurs | 32 | * @handler: Function to be called when the IRQ occurs |
| 33 | * @thread_fn: function to be called in a threaded interrupt context. NULL | ||
| 34 | * for devices which handle everything in @handler | ||
| 33 | * @irqflags: Interrupt type flags | 35 | * @irqflags: Interrupt type flags |
| 34 | * @devname: An ascii name for the claiming device | 36 | * @devname: An ascii name for the claiming device |
| 35 | * @dev_id: A cookie passed back to the handler function | 37 | * @dev_id: A cookie passed back to the handler function |
| @@ -42,9 +44,10 @@ static int devm_irq_match(struct device *dev, void *res, void *data) | |||
| 42 | * If an IRQ allocated with this function needs to be freed | 44 | * If an IRQ allocated with this function needs to be freed |
| 43 | * separately, dev_free_irq() must be used. | 45 | * separately, dev_free_irq() must be used. |
| 44 | */ | 46 | */ |
| 45 | int devm_request_irq(struct device *dev, unsigned int irq, | 47 | int devm_request_threaded_irq(struct device *dev, unsigned int irq, |
| 46 | irq_handler_t handler, unsigned long irqflags, | 48 | irq_handler_t handler, irq_handler_t thread_fn, |
| 47 | const char *devname, void *dev_id) | 49 | unsigned long irqflags, const char *devname, |
| 50 | void *dev_id) | ||
| 48 | { | 51 | { |
| 49 | struct irq_devres *dr; | 52 | struct irq_devres *dr; |
| 50 | int rc; | 53 | int rc; |
| @@ -54,7 +57,8 @@ int devm_request_irq(struct device *dev, unsigned int irq, | |||
| 54 | if (!dr) | 57 | if (!dr) |
| 55 | return -ENOMEM; | 58 | return -ENOMEM; |
| 56 | 59 | ||
| 57 | rc = request_irq(irq, handler, irqflags, devname, dev_id); | 60 | rc = request_threaded_irq(irq, handler, thread_fn, irqflags, devname, |
| 61 | dev_id); | ||
| 58 | if (rc) { | 62 | if (rc) { |
| 59 | devres_free(dr); | 63 | devres_free(dr); |
| 60 | return rc; | 64 | return rc; |
| @@ -66,7 +70,7 @@ int devm_request_irq(struct device *dev, unsigned int irq, | |||
| 66 | 70 | ||
| 67 | return 0; | 71 | return 0; |
| 68 | } | 72 | } |
| 69 | EXPORT_SYMBOL(devm_request_irq); | 73 | EXPORT_SYMBOL(devm_request_threaded_irq); |
| 70 | 74 | ||
| 71 | /** | 75 | /** |
| 72 | * devm_free_irq - free an interrupt | 76 | * devm_free_irq - free an interrupt |
