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