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.cto 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. ...