1 /* 2 * Dummy IRQ handler driver. 3 * 4 * This module only registers itself as a handler that is specified to it 5 * by the 'irq' parameter. 6 * 7 * The sole purpose of this module is to help with debugging of systems on 8 * which spurious IRQs would happen on disabled IRQ vector. 9 * 10 * Copyright (C) 2013 Jiri Kosina 11 */ 12 13 /* 14 * This program is free software; you can redistribute it and/or modify it 15 * under the terms of the GNU General Public License version 2 as published by 16 * the Free Software Foundation. 17 */ 18 #include <linux/module.h> 19 #include <linux/irq.h> 20 #include <linux/interrupt.h> 21 22 static int irq = -1; 23 24 static irqreturn_t dummy_interrupt(int irq, void *dev_id) 25 { 26 static int count = 0; 27 28 if (count == 0) { 29 printk(KERN_INFO "dummy-irq: interrupt occurred on IRQ %d\n", 30 irq); 31 count++; 32 } 33 34 return IRQ_NONE; 35 } 36 37 static int __init dummy_irq_init(void) 38 { 39 if (irq < 0) { 40 printk(KERN_ERR "dummy-irq: no IRQ given. Use irq=N\n"); 41 return -EIO; 42 } 43 if (request_irq(irq, &dummy_interrupt, IRQF_SHARED, "dummy_irq", &irq)) { 44 printk(KERN_ERR "dummy-irq: cannot register IRQ %d\n", irq); 45 return -EIO; 46 } 47 printk(KERN_INFO "dummy-irq: registered for IRQ %d\n", irq); 48 return 0; 49 } 50 51 static void __exit dummy_irq_exit(void) 52 { 53 printk(KERN_INFO "dummy-irq unloaded\n"); 54 free_irq(irq, &irq); 55 } 56 57 module_init(dummy_irq_init); 58 module_exit(dummy_irq_exit); 59 60 MODULE_LICENSE("GPL"); 61 MODULE_AUTHOR("Jiri Kosina"); 62 module_param(irq, uint, 0444); 63 MODULE_PARM_DESC(irq, "The IRQ to register for"); 64