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 live online training, plus books, videos, and digital content from nearly 200 publishers.