genirq: add support for threaded interrupts to devres

Some devices use devres_request_irq() for to install their interrupt
handler. Add support for threaded interrupts to devres as well.

[tglx - simplified and adapted to latest threadirq version]

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

authored by Arjan van de Ven and committed by Thomas Gleixner 935bd5b9 3aa551c9

+24 -9
+14 -3
include/linux/interrupt.h
··· 123 123 124 124 struct device; 125 125 126 - extern int __must_check devm_request_irq(struct device *dev, unsigned int irq, 127 - irq_handler_t handler, unsigned long irqflags, 128 - const char *devname, void *dev_id); 126 + extern int __must_check 127 + devm_request_threaded_irq(struct device *dev, unsigned int irq, 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 140 extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); 130 141 131 142 /*
+10 -6
kernel/irq/devres.c
··· 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 30 * @dev: device to request interrupt for 31 31 * @irq: Interrupt line to allocate 32 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 35 * @irqflags: Interrupt type flags 34 36 * @devname: An ascii name for the claiming device 35 37 * @dev_id: A cookie passed back to the handler function ··· 44 42 * If an IRQ allocated with this function needs to be freed 45 43 * separately, dev_free_irq() must be used. 46 44 */ 47 - int devm_request_irq(struct device *dev, unsigned int irq, 48 - irq_handler_t handler, unsigned long irqflags, 49 - const char *devname, void *dev_id) 45 + int devm_request_threaded_irq(struct device *dev, unsigned int irq, 46 + irq_handler_t handler, irq_handler_t thread_fn, 47 + unsigned long irqflags, const char *devname, 48 + void *dev_id) 50 49 { 51 50 struct irq_devres *dr; 52 51 int rc; ··· 57 54 if (!dr) 58 55 return -ENOMEM; 59 56 60 - rc = request_irq(irq, handler, irqflags, devname, dev_id); 57 + rc = request_threaded_irq(irq, handler, thread_fn, irqflags, devname, 58 + dev_id); 61 59 if (rc) { 62 60 devres_free(dr); 63 61 return rc; ··· 70 66 71 67 return 0; 72 68 } 73 - EXPORT_SYMBOL(devm_request_irq); 69 + EXPORT_SYMBOL(devm_request_threaded_irq); 74 70 75 71 /** 76 72 * devm_free_irq - free an interrupt