aboutsummaryrefslogtreecommitdiff
path: root/include/linux/interrupt.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/interrupt.h')
-rw-r--r--include/linux/interrupt.h20
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 *);