]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/irq/autoprobe.c
Merge branch 'locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-omap-h63xx.git] / kernel / irq / autoprobe.c
index 650ce4102a6333d9ddf097692583e55659a25333..1de9700f416e48e11861e08c42b0ea99216f9e42 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/module.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
+#include <linux/async.h>
 
 #include "internals.h"
 
@@ -34,15 +35,16 @@ unsigned long probe_irq_on(void)
        unsigned int status;
        int i;
 
+       /*
+        * quiesce the kernel, or at least the asynchronous portion
+        */
+       async_synchronize_full();
        mutex_lock(&probing_active);
        /*
         * something may have generated an irq long ago and we want to
         * flush such a longstanding irq before considering it as spurious.
         */
        for_each_irq_desc_reverse(i, desc) {
-               if (!desc)
-                       continue;
-
                spin_lock_irq(&desc->lock);
                if (!desc->action && !(desc->status & IRQ_NOPROBE)) {
                        /*
@@ -71,9 +73,6 @@ unsigned long probe_irq_on(void)
         * happened in the previous stage, it may have masked itself)
         */
        for_each_irq_desc_reverse(i, desc) {
-               if (!desc)
-                       continue;
-
                spin_lock_irq(&desc->lock);
                if (!desc->action && !(desc->status & IRQ_NOPROBE)) {
                        desc->status |= IRQ_AUTODETECT | IRQ_WAITING;
@@ -92,9 +91,6 @@ unsigned long probe_irq_on(void)
         * Now filter out any obviously spurious interrupts
         */
        for_each_irq_desc(i, desc) {
-               if (!desc)
-                       continue;
-
                spin_lock_irq(&desc->lock);
                status = desc->status;
 
@@ -133,9 +129,6 @@ unsigned int probe_irq_mask(unsigned long val)
        int i;
 
        for_each_irq_desc(i, desc) {
-               if (!desc)
-                       continue;
-
                spin_lock_irq(&desc->lock);
                status = desc->status;
 
@@ -178,9 +171,6 @@ int probe_irq_off(unsigned long val)
        unsigned int status;
 
        for_each_irq_desc(i, desc) {
-               if (!desc)
-                       continue;
-
                spin_lock_irq(&desc->lock);
                status = desc->status;