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 22static int irq = -1; 23 24static 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 37static 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 51static void __exit dummy_irq_exit(void) 52{ 53 printk(KERN_INFO "dummy-irq unloaded\n"); 54 free_irq(irq, &irq); 55} 56 57module_init(dummy_irq_init); 58module_exit(dummy_irq_exit); 59 60MODULE_LICENSE("GPL"); 61MODULE_AUTHOR("Jiri Kosina"); 62module_param(irq, uint, 0444); 63MODULE_PARM_DESC(irq, "The IRQ to register for"); 64MODULE_DESCRIPTION("Dummy IRQ handler driver"); 65