Merge branch 'master' into upstream
[powerpc.git] / arch / arm / kernel / irq.c
index c3d4e94..e101846 100644 (file)
@@ -77,6 +77,7 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_printf(p, "%3d: ", i);
                for_each_present_cpu(cpu)
                        seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
+               seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-");
                seq_printf(p, "  %s", action->name);
                for (action = action->next; action; action = action->next)
                        seq_printf(p, ", %s", action->name);
@@ -110,7 +111,8 @@ static struct irq_desc bad_irq_desc = {
  */
 asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
 {
-       struct irqdesc *desc = irq_desc + irq;
+       struct pt_regs *old_regs = set_irq_regs(regs);
+       struct irq_desc *desc = irq_desc + irq;
 
        /*
         * Some hardware gives randomly wrong interrupts.  Rather
@@ -121,17 +123,18 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
 
        irq_enter();
 
-       desc_handle_irq(irq, desc, regs);
+       desc_handle_irq(irq, desc);
 
        /* AT91 specific workaround */
        irq_finish(irq);
 
        irq_exit();
+       set_irq_regs(old_regs);
 }
 
 void set_irq_flags(unsigned int irq, unsigned int iflags)
 {
-       struct irqdesc *desc;
+       struct irq_desc *desc;
        unsigned long flags;
 
        if (irq >= NR_IRQS) {
@@ -156,8 +159,7 @@ void __init init_IRQ(void)
        int irq;
 
        for (irq = 0; irq < NR_IRQS; irq++)
-               irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_DELAYED_DISABLE |
-                       IRQ_NOPROBE;
+               irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE;
 
 #ifdef CONFIG_SMP
        bad_irq_desc.affinity = CPU_MASK_ALL;
@@ -167,6 +169,16 @@ void __init init_IRQ(void)
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
+
+static void route_irq(struct irq_desc *desc, unsigned int irq, unsigned int cpu)
+{
+       pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->cpu, cpu);
+
+       spin_lock_irq(&desc->lock);
+       desc->chip->set_affinity(irq, cpumask_of_cpu(cpu));
+       spin_unlock_irq(&desc->lock);
+}
+
 /*
  * The CPU has been marked offline.  Migrate IRQs off this CPU.  If
  * the affinity settings do not allow other CPUs, force them onto any
@@ -177,7 +189,7 @@ void migrate_irqs(void)
        unsigned int i, cpu = smp_processor_id();
 
        for (i = 0; i < NR_IRQS; i++) {
-               struct irqdesc *desc = irq_desc + i;
+               struct irq_desc *desc = irq_desc + i;
 
                if (desc->cpu == cpu) {
                        unsigned int newcpu = any_online_cpu(desc->affinity);