Installing an Interrupt Handler
Interrupt lines are a precious and often limited resource,
particularly when there are only 15 or 16 of them. The kernel
keeps a registry of interrupt lines, similar to the
registry of I/O ports. A module is allowed to request an
interrupt channel (or IRQ, for Interrupt ReQuest) and release it when
it’s done. The following functions, declared in
<linux/sched.h>
, implement the interface:
int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *device, void *dev_id); void free_irq(unsigned int irq, void *dev_id);
Note that version 1.2 featured different prototypes. See Section 9.8 later in this chapter for portability issues.
The value returned to the requesting function is 0 to indicate
success or a negative error code, as usual. It’s not uncommon for
the function to return -EBUSY
to signal that another driver
is already using the requested interrupt line. The arguments to the
functions are as follows:
-
unsigned int irq
This is the interrupt number. Sometimes the mapping from the Linux number to the hardware number isn’t one-to-one. Look, for example, at
arch/ alpha/kernel/irq.c
to see the Alpha mapping. The argument to the kernel functions is the Linux number rather than the hardware number.-
void (*handler)(int, void *, struct pt_regs *)
The pointer to the handling function being installed.
-
unsigned long flags
As you might expect, a bitmask of options related to interrupt management. ...
Get Linux Device Drivers now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.