diff options
Diffstat (limited to 'include/linux/interrupt.h')
-rw-r--r-- | include/linux/interrupt.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index d9b05b5bf8c7..b95dc28f4cc3 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -57,6 +57,9 @@ * IRQF_NO_THREAD - Interrupt cannot be threaded * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device * resume time. + * __IRQF_NMI - Route the interrupt to an NMI or some similar signal that is not + * masked by local_irq_disable(). Used internally by + * request_nmi_irq(). */ #define IRQF_DISABLED 0x00000020 #define IRQF_SHARED 0x00000080 @@ -70,6 +73,7 @@ #define IRQF_FORCE_RESUME 0x00008000 #define IRQF_NO_THREAD 0x00010000 #define IRQF_EARLY_RESUME 0x00020000 +#define __IRQF_NMI 0x00040000 #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) @@ -139,6 +143,22 @@ extern int __must_check request_percpu_irq(unsigned int irq, irq_handler_t handler, const char *devname, void __percpu *percpu_dev_id); +static inline int __must_check request_nmi_irq(unsigned int irq, + unsigned long flags, + const char *name, void *dev_id) +{ + /* + * no_action unconditionally returns IRQ_NONE which is exactly + * what we need. The handler might be expected to be unreachable + * but some controllers may spuriously ack the NMI from the IRQ + * handling code. When this happens it occurs very rarely, thus + * by returning IRQ_NONE we can rely on the spurious interrupt + * logic to do the right thing. + */ + return request_irq(irq, no_action, flags | IRQF_NO_THREAD | __IRQF_NMI, + name, dev_id); +} + extern void free_irq(unsigned int, void *); extern void free_percpu_irq(unsigned int, void __percpu *); |