]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/kernel/irq_64.c
generic: add irq_desc in function in parameter
[linux-2.6-omap-h63xx.git] / arch / x86 / kernel / irq_64.c
index 1f78b238d8d2cc8778520e048fe69d36a97209b2..f58b995b30ee6adc7598ed98eaa09ad838a1726d 100644 (file)
@@ -81,17 +81,18 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_putc(p, '\n');
        }
 
-       if (i < NR_IRQS) {
+       if (i < nr_irqs) {
                unsigned any_count = 0;
+               struct irq_desc *desc = irq_to_desc(i);
 
-               spin_lock_irqsave(&irq_desc[i].lock, flags);
+               spin_lock_irqsave(&desc->lock, flags);
 #ifndef CONFIG_SMP
                any_count = kstat_irqs(i);
 #else
                for_each_online_cpu(j)
-                       any_count |= kstat_cpu(j).irqs[i];
+                       any_count |= kstat_irqs_cpu(i, j);
 #endif
-               action = irq_desc[i].action;
+               action = desc->action;
                if (!action && !any_count)
                        goto skip;
                seq_printf(p, "%3d: ",i);
@@ -99,10 +100,10 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_printf(p, "%10u ", kstat_irqs(i));
 #else
                for_each_online_cpu(j)
-                       seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
+                       seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
 #endif
-               seq_printf(p, " %8s", irq_desc[i].chip->name);
-               seq_printf(p, "-%-8s", irq_desc[i].name);
+               seq_printf(p, " %8s", desc->chip->name);
+               seq_printf(p, "-%-8s", desc->name);
 
                if (action) {
                        seq_printf(p, "  %s", action->name);
@@ -111,8 +112,8 @@ int show_interrupts(struct seq_file *p, void *v)
                }
                seq_putc(p, '\n');
 skip:
-               spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-       } else if (i == NR_IRQS) {
+               spin_unlock_irqrestore(&desc->lock, flags);
+       } else if (i == nr_irqs) {
                seq_printf(p, "NMI: ");
                for_each_online_cpu(j)
                        seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count);
@@ -129,7 +130,7 @@ skip:
                seq_printf(p, "CAL: ");
                for_each_online_cpu(j)
                        seq_printf(p, "%10u ", cpu_pda(j)->irq_call_count);
-               seq_printf(p, "  function call interrupts\n");
+               seq_printf(p, "  Function call interrupts\n");
                seq_printf(p, "TLB: ");
                for_each_online_cpu(j)
                        seq_printf(p, "%10u ", cpu_pda(j)->irq_tlb_count);
@@ -188,6 +189,7 @@ u64 arch_irq_stat(void)
 asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
 {
        struct pt_regs *old_regs = set_irq_regs(regs);
+       struct irq_desc *desc;
 
        /* high bit used in ret_from_ code  */
        unsigned vector = ~regs->orig_ax;
@@ -201,8 +203,9 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
        stack_overflow_check(regs);
 #endif
 
-       if (likely(irq < NR_IRQS))
-               generic_handle_irq(irq);
+       desc = __irq_to_desc(irq);
+       if (likely(desc))
+               generic_handle_irq_desc(irq, desc);
        else {
                if (!disable_apic)
                        ack_APIC_irq();
@@ -223,8 +226,9 @@ void fixup_irqs(cpumask_t map)
 {
        unsigned int irq;
        static int warned;
+       struct irq_desc *desc;
 
-       for (irq = 0; irq < NR_IRQS; irq++) {
+       for_each_irq_desc(irq, desc) {
                cpumask_t mask;
                int break_affinity = 0;
                int set_affinity = 1;
@@ -233,32 +237,32 @@ void fixup_irqs(cpumask_t map)
                        continue;
 
                /* interrupt's are disabled at this point */
-               spin_lock(&irq_desc[irq].lock);
+               spin_lock(&desc->lock);
 
                if (!irq_has_action(irq) ||
-                   cpus_equal(irq_desc[irq].affinity, map)) {
-                       spin_unlock(&irq_desc[irq].lock);
+                   cpus_equal(desc->affinity, map)) {
+                       spin_unlock(&desc->lock);
                        continue;
                }
 
-               cpus_and(mask, irq_desc[irq].affinity, map);
+               cpus_and(mask, desc->affinity, map);
                if (cpus_empty(mask)) {
                        break_affinity = 1;
                        mask = map;
                }
 
-               if (irq_desc[irq].chip->mask)
-                       irq_desc[irq].chip->mask(irq);
+               if (desc->chip->mask)
+                       desc->chip->mask(irq);
 
-               if (irq_desc[irq].chip->set_affinity)
-                       irq_desc[irq].chip->set_affinity(irq, mask);
+               if (desc->chip->set_affinity)
+                       desc->chip->set_affinity(irq, mask);
                else if (!(warned++))
                        set_affinity = 0;
 
-               if (irq_desc[irq].chip->unmask)
-                       irq_desc[irq].chip->unmask(irq);
+               if (desc->chip->unmask)
+                       desc->chip->unmask(irq);
 
-               spin_unlock(&irq_desc[irq].lock);
+               spin_unlock(&desc->lock);
 
                if (break_affinity && set_affinity)
                        printk("Broke affinity for irq %i\n", irq);