dummy-irq: introduce a dummy IRQ handler driver
authorJiri Kosina <jkosina@suse.cz>
Wed, 20 Mar 2013 23:21:21 +0000 (00:21 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 25 Mar 2013 20:22:32 +0000 (13:22 -0700)
This module accepts a single 'irq' parameter, which it should register for.

Its sole purpose is to help with debugging of IRQ sharing problems, by
force-enabling IRQ that would otherwise be disabled.

Suggested-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/dummy-irq.c [new file with mode: 0644]

index e83fdfe..69bb79d 100644 (file)
@@ -93,6 +93,14 @@ config ATMEL_TCB_CLKSRC_BLOCK
          TC can be used for other purposes, such as PWM generation and
          interval timing.
 
+config DUMMY_IRQ
+       tristate "Dummy IRQ handler"
+       default n
+       ---help---
+         This module accepts a single 'irq' parameter, which it should register for.
+         The sole purpose of this module is to help with debugging of systems on
+         which spurious IRQs would happen on disabled IRQ vector.
+
 config IBM_ASM
        tristate "Device driver for IBM RSA service processor"
        depends on X86 && PCI && INPUT
index 3e2faa0..865cbc6 100644 (file)
@@ -13,6 +13,7 @@ obj-$(CONFIG_ATMEL_TCLIB)     += atmel_tclib.o
 obj-$(CONFIG_BMP085)           += bmp085.o
 obj-$(CONFIG_BMP085_I2C)       += bmp085-i2c.o
 obj-$(CONFIG_BMP085_SPI)       += bmp085-spi.o
+obj-$(CONFIG_DUMMY_IRQ)                += dummy-irq.o
 obj-$(CONFIG_ICS932S401)       += ics932s401.o
 obj-$(CONFIG_LKDTM)            += lkdtm.o
 obj-$(CONFIG_TIFM_CORE)        += tifm_core.o
diff --git a/drivers/misc/dummy-irq.c b/drivers/misc/dummy-irq.c
new file mode 100644 (file)
index 0000000..7014167
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Dummy IRQ handler driver.
+ *
+ * This module only registers itself as a handler that is specified to it
+ * by the 'irq' parameter.
+ *
+ * The sole purpose of this module is to help with debugging of systems on
+ * which spurious IRQs would happen on disabled IRQ vector.
+ *
+ * Copyright (C) 2013 Jiri Kosina
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+#include <linux/module.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+
+static int irq;
+
+static irqreturn_t dummy_interrupt(int irq, void *dev_id)
+{
+       static int count = 0;
+
+       if (count == 0) {
+               printk(KERN_INFO "dummy-irq: interrupt occured on IRQ %d\n",
+                               irq);
+               count++;
+       }
+
+       return IRQ_NONE;
+}
+
+static int __init dummy_irq_init(void)
+{
+       if (request_irq(irq, &dummy_interrupt, IRQF_SHARED, "dummy_irq", &irq)) {
+               printk(KERN_ERR "dummy-irq: cannot register IRQ %d\n", irq);
+               return -EIO;
+       }
+       printk(KERN_INFO "dummy-irq: registered for IRQ %d\n", irq);
+       return 0;
+}
+
+static void __exit dummy_irq_exit(void)
+{
+       printk(KERN_INFO "dummy-irq unloaded\n");
+       free_irq(irq, &irq);
+}
+
+module_init(dummy_irq_init);
+module_exit(dummy_irq_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Jiri Kosina");
+module_param(irq, uint, 0444);
+MODULE_PARM_DESC(irq, "The IRQ to register for");