genirq: Move IRQ_ONESHOT to core
Thomas Gleixner [Mon, 7 Feb 2011 20:02:10 +0000 (21:02 +0100)]
No users outside of core.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

include/linux/irq.h
kernel/irq/chip.c
kernel/irq/internals.h
kernel/irq/manage.c

index 274590f..1a4c723 100644 (file)
@@ -71,7 +71,6 @@ typedef       void (*irq_flow_handler_t)(unsigned int irq,
 #define IRQ_MOVE_PCNTXT                0x01000000      /* IRQ migration from process context */
 #define IRQ_AFFINITY_SET       0x02000000      /* IRQ affinity was set from userspace*/
 #define IRQ_SUSPENDED          0x04000000      /* IRQ has gone through suspend sequence */
-#define IRQ_ONESHOT            0x08000000      /* IRQ is not unmasked after hardirq */
 #define IRQ_NESTED_THREAD      0x10000000      /* IRQ is nested into another, no own handler thread */
 
 #define IRQF_MODIFY_MASK       \
index 0753855..420fa6b 100644 (file)
@@ -472,7 +472,7 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc)
 
        handle_irq_event(desc);
 
-       if (!(desc->status & (IRQ_DISABLED | IRQ_ONESHOT)))
+       if (!(desc->status & IRQ_DISABLED) && !(desc->istate & IRQS_ONESHOT))
                unmask_irq(desc);
 out_unlock:
        raw_spin_unlock(&desc->lock);
index d1cb1f8..36563f7 100644 (file)
@@ -42,12 +42,14 @@ enum {
  *                               detection
  * IRQS_POLL_INPROGRESS                - polling in progress
  * IRQS_INPROGRESS             - Interrupt in progress
+ * IRQS_ONESHOT                        - irq is not unmasked in primary handler
  */
 enum {
        IRQS_AUTODETECT         = 0x00000001,
        IRQS_SPURIOUS_DISABLED  = 0x00000002,
        IRQS_POLL_INPROGRESS    = 0x00000008,
        IRQS_INPROGRESS         = 0x00000010,
+       IRQS_ONESHOT            = 0x00000020,
 };
 
 #define irq_data_to_desc(data) container_of(data, struct irq_desc, irq_data)
index 7e5a508..aca4208 100644 (file)
@@ -697,7 +697,7 @@ static int irq_thread(void *data)
        };
        struct irqaction *action = data;
        struct irq_desc *desc = irq_to_desc(action->irq);
-       int wake, oneshot = desc->status & IRQ_ONESHOT;
+       int wake, oneshot = desc->istate & IRQS_ONESHOT;
 
        sched_setscheduler(current, SCHED_FIFO, &param);
        current->irqaction = action;
@@ -897,12 +897,12 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
                        desc->status |= IRQ_PER_CPU;
 #endif
 
-               desc->status &= ~(IRQ_WAITING | IRQ_ONESHOT);
+               desc->status &= ~IRQ_WAITING;
                desc->istate &= ~(IRQS_AUTODETECT | IRQS_SPURIOUS_DISABLED | \
-                                 IRQS_INPROGRESS);
+                                 IRQS_INPROGRESS | IRQS_ONESHOT);
 
                if (new->flags & IRQF_ONESHOT)
-                       desc->status |= IRQ_ONESHOT;
+                       desc->istate |= IRQS_ONESHOT;
 
                if (!(desc->status & IRQ_NOAUTOEN))
                        irq_startup(desc);