The prototype of request_irq is:
int request_irq ( unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char * devname, void * dev_id);
I noticed a similar question, “Simple interrupt handler: request_irq returns error code -22,” but I did not use the IRQF_SHARED flag, so there is no reason that it could conflict with dev_id equal to NULL. But it still does not register the irq test, and errno is always -22(-EINVAL) .
Here is my simple irq test module:
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/types.h> #include <linux/interrupt.h> static irqreturn_t irq_handle(int irq, void *dev_id) { printk("irq happened\n"); return IRQ_HANDLED; } static int irq_test_init(void) { int rc = request_irq(50, irq_handle, IRQF_DISABLED, "irq_test", NULL); if(rc!=0){ printk(KERN_INFO "fail to register test irq, errno:%d\n",rc); return -1; } printk(KERN_INFO "success request irq\n"); return 0; } static void irq_test_exit(void) { free_irq(50, NULL); printk(KERN_INFO "irq module removed!\n"); return; } module_init(irq_test_init); module_exit(irq_test_exit); MODULE_LICENSE("GPL");
source share