X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Farm%2Fkernel%2Firq.c;h=9c6501295b3971b89335a9cfb53c88b66a1b2507;hb=9e1bf581d67d87a1d7fc0ea500729e3a03643a26;hp=5b35e76c3ce44d4543e9bb5f59c570f20f7198c7;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 5b35e76c3..9c6501295 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -86,7 +86,7 @@ static struct irqdesc bad_irq_desc = { }; /** - * disable_irq_nosync - disable an irq without waiting + * disable_irq - disable an irq and wait for completion * @irq: Interrupt to disable * * Disable the selected interrupt line. Enables and disables @@ -94,7 +94,7 @@ static struct irqdesc bad_irq_desc = { * * This function may be called from IRQ context. */ -void disable_irq_nosync(unsigned int irq) +void disable_irq(unsigned int irq) { struct irqdesc *desc = irq_desc + irq; unsigned long flags; @@ -104,28 +104,6 @@ void disable_irq_nosync(unsigned int irq) list_del_init(&desc->pend); spin_unlock_irqrestore(&irq_controller_lock, flags); } -EXPORT_SYMBOL(disable_irq_nosync); - -/** - * disable_irq - disable an irq and wait for completion - * @irq: Interrupt to disable - * - * Disable the selected interrupt line. Enables and disables - * are nested. This functions waits for any pending IRQ - * handlers for this interrupt to complete before returning. - * If you use this function while holding a resource the IRQ - * handler may need you will deadlock. - * - * This function may be called - with care - from IRQ context. - */ -void disable_irq(unsigned int irq) -{ - struct irqdesc *desc = irq_desc + irq; - - disable_irq_nosync(irq); - if (desc->action) - synchronize_irq(irq); -} EXPORT_SYMBOL(disable_irq); /** @@ -197,30 +175,17 @@ EXPORT_SYMBOL(disable_irq_wake); int show_interrupts(struct seq_file *p, void *v) { - int i = *(loff_t *) v, cpu; + int i = *(loff_t *) v; struct irqaction * action; unsigned long flags; - if (i == 0) { - char cpuname[12]; - - seq_printf(p, " "); - for_each_present_cpu(cpu) { - sprintf(cpuname, "CPU%d", cpu); - seq_printf(p, " %10s", cpuname); - } - seq_putc(p, '\n'); - } - if (i < NR_IRQS) { spin_lock_irqsave(&irq_controller_lock, flags); action = irq_desc[i].action; if (!action) goto unlock; - seq_printf(p, "%3d: ", i); - for_each_present_cpu(cpu) - seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]); + seq_printf(p, "%3d: %10u ", i, kstat_irqs(i)); seq_printf(p, " %s", action->name); for (action = action->next; action; action = action->next) seq_printf(p, ", %s", action->name); @@ -376,6 +341,7 @@ do_edge_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) do { struct irqaction *action; + int ret; action = desc->action; if (!action) @@ -386,7 +352,9 @@ do_edge_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) desc->chip->unmask(irq); } - __do_irq(irq, action, regs); + ret = __do_irq(irq, action, regs); + if (ret != IRQ_HANDLED) + report_bad_irq(irq, regs, desc, ret); } while (desc->pending && !desc->disable_depth); desc->running = 0;