aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/irq/manage.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2011-03-28 08:10:52 -0400
committerThomas Gleixner <tglx@linutronix.de>2011-03-28 10:55:10 -0400
commit32f4125ebffee4f3c4dbc6a437fc656129eb9e60 (patch)
treed64c6bb7ba40c33734896303734416ea5b4f3290 /kernel/irq/manage.c
parentc2d0c555c22242c3a76e366074c4d83ef9fa3b8c (diff)
genirq: Move INPROGRESS, MASKED and DISABLED state flags to irq_data
We really need these flags for some of the interrupt chips. Move it from internal state to irq_data and provide proper accessors. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: David Daney <ddaney@caviumnetworks.com>
Diffstat (limited to 'kernel/irq/manage.c')
-rw-r--r--kernel/irq/manage.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 3d151fd762ad..6e8acb755993 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -41,7 +41,7 @@ early_param("threadirqs", setup_forced_irqthreads);
41void synchronize_irq(unsigned int irq) 41void synchronize_irq(unsigned int irq)
42{ 42{
43 struct irq_desc *desc = irq_to_desc(irq); 43 struct irq_desc *desc = irq_to_desc(irq);
44 unsigned int state; 44 bool inprogress;
45 45
46 if (!desc) 46 if (!desc)
47 return; 47 return;
@@ -53,16 +53,16 @@ void synchronize_irq(unsigned int irq)
53 * Wait until we're out of the critical section. This might 53 * Wait until we're out of the critical section. This might
54 * give the wrong answer due to the lack of memory barriers. 54 * give the wrong answer due to the lack of memory barriers.
55 */ 55 */
56 while (desc->istate & IRQS_INPROGRESS) 56 while (irqd_irq_inprogress(&desc->irq_data))
57 cpu_relax(); 57 cpu_relax();
58 58
59 /* Ok, that indicated we're done: double-check carefully. */ 59 /* Ok, that indicated we're done: double-check carefully. */
60 raw_spin_lock_irqsave(&desc->lock, flags); 60 raw_spin_lock_irqsave(&desc->lock, flags);
61 state = desc->istate; 61 inprogress = irqd_irq_inprogress(&desc->irq_data);
62 raw_spin_unlock_irqrestore(&desc->lock, flags); 62 raw_spin_unlock_irqrestore(&desc->lock, flags);
63 63
64 /* Oops, that failed? */ 64 /* Oops, that failed? */
65 } while (state & IRQS_INPROGRESS); 65 } while (inprogress);
66 66
67 /* 67 /*
68 * We made sure that no hardirq handler is running. Now verify 68 * We made sure that no hardirq handler is running. Now verify
@@ -563,9 +563,9 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
563 flags &= IRQ_TYPE_SENSE_MASK; 563 flags &= IRQ_TYPE_SENSE_MASK;
564 564
565 if (chip->flags & IRQCHIP_SET_TYPE_MASKED) { 565 if (chip->flags & IRQCHIP_SET_TYPE_MASKED) {
566 if (!(desc->istate & IRQS_MASKED)) 566 if (!irqd_irq_masked(&desc->irq_data))
567 mask_irq(desc); 567 mask_irq(desc);
568 if (!(desc->istate & IRQS_DISABLED)) 568 if (!irqd_irq_disabled(&desc->irq_data))
569 unmask = 1; 569 unmask = 1;
570 } 570 }
571 571
@@ -663,7 +663,7 @@ again:
663 * irq_wake_thread(). See the comment there which explains the 663 * irq_wake_thread(). See the comment there which explains the
664 * serialization. 664 * serialization.
665 */ 665 */
666 if (unlikely(desc->istate & IRQS_INPROGRESS)) { 666 if (unlikely(irqd_irq_inprogress(&desc->irq_data))) {
667 raw_spin_unlock_irq(&desc->lock); 667 raw_spin_unlock_irq(&desc->lock);
668 chip_bus_sync_unlock(desc); 668 chip_bus_sync_unlock(desc);
669 cpu_relax(); 669 cpu_relax();
@@ -680,12 +680,10 @@ again:
680 680
681 desc->threads_oneshot &= ~action->thread_mask; 681 desc->threads_oneshot &= ~action->thread_mask;
682 682
683 if (!desc->threads_oneshot && !(desc->istate & IRQS_DISABLED) && 683 if (!desc->threads_oneshot && !irqd_irq_disabled(&desc->irq_data) &&
684 (desc->istate & IRQS_MASKED)) { 684 irqd_irq_masked(&desc->irq_data))
685 irq_compat_clr_masked(desc); 685 unmask_irq(desc);
686 desc->istate &= ~IRQS_MASKED; 686
687 desc->irq_data.chip->irq_unmask(&desc->irq_data);
688 }
689out_unlock: 687out_unlock:
690 raw_spin_unlock_irq(&desc->lock); 688 raw_spin_unlock_irq(&desc->lock);
691 chip_bus_sync_unlock(desc); 689 chip_bus_sync_unlock(desc);
@@ -779,7 +777,7 @@ static int irq_thread(void *data)
779 atomic_inc(&desc->threads_active); 777 atomic_inc(&desc->threads_active);
780 778
781 raw_spin_lock_irq(&desc->lock); 779 raw_spin_lock_irq(&desc->lock);
782 if (unlikely(desc->istate & IRQS_DISABLED)) { 780 if (unlikely(irqd_irq_disabled(&desc->irq_data))) {
783 /* 781 /*
784 * CHECKME: We might need a dedicated 782 * CHECKME: We might need a dedicated
785 * IRQ_THREAD_PENDING flag here, which 783 * IRQ_THREAD_PENDING flag here, which
@@ -997,8 +995,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
997 } 995 }
998 996
999 desc->istate &= ~(IRQS_AUTODETECT | IRQS_SPURIOUS_DISABLED | \ 997 desc->istate &= ~(IRQS_AUTODETECT | IRQS_SPURIOUS_DISABLED | \
1000 IRQS_INPROGRESS | IRQS_ONESHOT | \ 998 IRQS_ONESHOT | IRQS_WAITING);
1001 IRQS_WAITING); 999 irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS);
1002 1000
1003 if (new->flags & IRQF_PERCPU) { 1001 if (new->flags & IRQF_PERCPU) {
1004 irqd_set(&desc->irq_data, IRQD_PER_CPU); 1002 irqd_set(&desc->irq_data, IRQD_PER_CPU);