dummy-irq.c (1397B)
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 18static int irq = -1; 19 20static 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 33static 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 47static void __exit dummy_irq_exit(void) 48{ 49 printk(KERN_INFO "dummy-irq unloaded\n"); 50 free_irq(irq, &irq); 51} 52 53module_init(dummy_irq_init); 54module_exit(dummy_irq_exit); 55 56MODULE_LICENSE("GPL"); 57MODULE_AUTHOR("Jiri Kosina"); 58module_param_hw(irq, uint, irq, 0444); 59MODULE_PARM_DESC(irq, "The IRQ to register for"); 60MODULE_DESCRIPTION("Dummy IRQ handler driver");