X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=kernel%2Firq%2Fautoprobe.c;h=533068cfb607fad10202210b916909efd314cbb7;hb=7ac3ae32d170cea8cb8e7822acc29ed8f1b1018d;hp=5c988bba401fc4db32547e14297fde304db2b616;hpb=34ffdb7233d5847808d2b63ca6761dac3af9c942;p=linux-2.6 diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c index 5c988bba40..533068cfb6 100644 --- a/kernel/irq/autoprobe.c +++ b/kernel/irq/autoprobe.c @@ -11,6 +11,8 @@ #include #include +#include "internals.h" + /* * Autodetection depends on the fact that any interrupt that * comes in on to an unassigned handler will get stuck with @@ -40,8 +42,21 @@ unsigned long probe_irq_on(void) desc = irq_desc + i; spin_lock_irq(&desc->lock); - if (!desc->action) + if (!desc->action && !(desc->status & IRQ_NOPROBE)) { + /* + * An old-style architecture might still have + * the handle_bad_irq handler there: + */ + compat_irq_chip_set_default_handler(desc); + + /* + * Some chips need to know about probing in + * progress: + */ + if (desc->chip->set_type) + desc->chip->set_type(i, IRQ_TYPE_PROBE); desc->chip->startup(i); + } spin_unlock_irq(&desc->lock); } @@ -57,7 +72,7 @@ unsigned long probe_irq_on(void) desc = irq_desc + i; spin_lock_irq(&desc->lock); - if (!desc->action) { + if (!desc->action && !(desc->status & IRQ_NOPROBE)) { desc->status |= IRQ_AUTODETECT | IRQ_WAITING; if (desc->chip->startup(i)) desc->status |= IRQ_PENDING;