NAME
probe_irq_on, probe_irq_off - safe probing for IRQs
SYNOPSIS
#include <linux/interrupt.h>
unsigned long probe_irq_on(void)
int probe_irq_off(unsigned long irqs));
DESCRIPTION
Usage
probe_irq_on() turns on IRQ detection. It operates by ena-
bling all interrupts which have no handlers, while keeping
the handlers for those interrupts NULL. The kernel's gen-
eric interrupt handling routine will disable these IRQs when
an interrupt is received on them. probe_irq_on() adds each
of these IRQ numbers to a vector which it will return. It
waits approximately 100ms for any spurious interrupts that
may occur, and masks these from its vector; it then returns
this vector to its caller.
probe_irq_off() tests an internal list of enabled IRQs
against its irqs parameter, which should be the value
returned by the last probe_irq_on(). This function basi-
cally detects which IRQs have been switched off, and thus
which ones have received interrupts.
Example
This explanation may seem a bit confusing, so here is an
example of code the mythical FUBAR 2000 driver could use to
probe for IRQs:
unsigned long irqs;
int irq;
irqs = probe_irq_on();
outb(FB2K_GIVE_ME_AN_INTERRUPT_OR_GIVE_ME_DEATH,
FB2K_CONTROL_PORT);
/* the interrupt could take a while to occur */
udelay(1000);
irq = probe_irq_off(irqs);
if (irq == 0) {
printk("fb2k: could not detect IRQ.\n");
printk("fb2k: Installation failed.\n");
} else if (irq == -1) {
printk("fb2k: multiple IRQs detected.\n");
printk("fb2k: Installation failed.\n");
} else {
fb2k_dev->irq = irq;
printk("fb2k: using probed IRQ %d.\n", irq);
}
RETURN VALUE
probe_irq_on() returns a bitmap of all unhandled IRQs
(except those which are receiving spurious interrupts).
This value should only be used as a parameter to the next
call to probe_irq_off().
probe_irq_off() returns the IRQ number of whichever unhan-
dled interrupt has occurred since the last probe_irq_on().
If no interrupts have occurred on any of the marked IRQs, 0
is returned; if interrupts have occurred on more than one of
these IRQs, -1 is returned.
AVAILABILITY
Linux 1.2+. These functions are not available on m68k-based
machines.
SEE ALSO
request_irq(9)
arch/*/kernel/irq.c
AUTHOR
Neil Moore <amethyst@maxwell.ml.org>
BUGS
As mentioned above, these functions are not available on
m68k-based machines.
This manpage is way too confusing.