dummy-irq.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. #include <linux/module.h>
  14. #include <linux/irq.h>
  15. #include <linux/interrupt.h>
  16. static int irq = -1;
  17. static irqreturn_t dummy_interrupt(int irq, void *dev_id)
  18. {
  19. static int count = 0;
  20. if (count == 0) {
  21. printk(KERN_INFO "dummy-irq: interrupt occurred on IRQ %d\n",
  22. irq);
  23. count++;
  24. }
  25. return IRQ_NONE;
  26. }
  27. static int __init dummy_irq_init(void)
  28. {
  29. if (irq < 0) {
  30. printk(KERN_ERR "dummy-irq: no IRQ given. Use irq=N\n");
  31. return -EIO;
  32. }
  33. if (request_irq(irq, &dummy_interrupt, IRQF_SHARED, "dummy_irq", &irq)) {
  34. printk(KERN_ERR "dummy-irq: cannot register IRQ %d\n", irq);
  35. return -EIO;
  36. }
  37. printk(KERN_INFO "dummy-irq: registered for IRQ %d\n", irq);
  38. return 0;
  39. }
  40. static void __exit dummy_irq_exit(void)
  41. {
  42. printk(KERN_INFO "dummy-irq unloaded\n");
  43. free_irq(irq, &irq);
  44. }
  45. module_init(dummy_irq_init);
  46. module_exit(dummy_irq_exit);
  47. MODULE_LICENSE("GPL");
  48. MODULE_AUTHOR("Jiri Kosina");
  49. module_param_hw(irq, uint, irq, 0444);
  50. MODULE_PARM_DESC(irq, "The IRQ to register for");
  51. MODULE_DESCRIPTION("Dummy IRQ handler driver");