|
@@ -38,38 +38,15 @@
|
|
|
#include <asm/pda.h>
|
|
|
|
|
|
static atomic_t irq_err_count;
|
|
|
-static spinlock_t irq_controller_lock;
|
|
|
-
|
|
|
-/*
|
|
|
- * Dummy mask/unmask handler
|
|
|
- */
|
|
|
-void dummy_mask_unmask_irq(unsigned int irq)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
void ack_bad_irq(unsigned int irq)
|
|
|
{
|
|
|
atomic_inc(&irq_err_count);
|
|
|
printk(KERN_ERR "IRQ: spurious interrupt %d\n", irq);
|
|
|
}
|
|
|
|
|
|
-static struct irq_chip bad_chip = {
|
|
|
- .ack = dummy_mask_unmask_irq,
|
|
|
- .mask = dummy_mask_unmask_irq,
|
|
|
- .unmask = dummy_mask_unmask_irq,
|
|
|
-};
|
|
|
-
|
|
|
-static int bad_stats;
|
|
|
static struct irq_desc bad_irq_desc = {
|
|
|
- .status = IRQ_DISABLED,
|
|
|
- .chip = &bad_chip,
|
|
|
.handle_irq = handle_bad_irq,
|
|
|
- .depth = 1,
|
|
|
.lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock),
|
|
|
- .kstat_irqs = &bad_stats,
|
|
|
-#ifdef CONFIG_SMP
|
|
|
- .affinity = CPU_MASK_ALL
|
|
|
-#endif
|
|
|
};
|
|
|
|
|
|
#ifdef CONFIG_CPUMASK_OFFSTACK
|
|
@@ -119,21 +96,13 @@ __attribute__((l1_text))
|
|
|
#endif
|
|
|
asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
|
|
{
|
|
|
- struct pt_regs *old_regs;
|
|
|
- struct irq_desc *desc = irq_desc + irq;
|
|
|
#ifndef CONFIG_IPIPE
|
|
|
unsigned short pending, other_ints;
|
|
|
#endif
|
|
|
- old_regs = set_irq_regs(regs);
|
|
|
-
|
|
|
- /*
|
|
|
- * Some hardware gives randomly wrong interrupts. Rather
|
|
|
- * than crashing, do something sensible.
|
|
|
- */
|
|
|
- if (irq >= NR_IRQS)
|
|
|
- desc = &bad_irq_desc;
|
|
|
+ struct pt_regs *old_regs = set_irq_regs(regs);
|
|
|
|
|
|
irq_enter();
|
|
|
+
|
|
|
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
|
|
/* Debugging check for stack overflow: is there less than STACK_WARN free? */
|
|
|
{
|
|
@@ -149,7 +118,15 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
|
- generic_handle_irq(irq);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Some hardware gives randomly wrong interrupts. Rather
|
|
|
+ * than crashing, do something sensible.
|
|
|
+ */
|
|
|
+ if (irq >= NR_IRQS)
|
|
|
+ handle_bad_irq(irq, &bad_irq_desc);
|
|
|
+ else
|
|
|
+ generic_handle_irq(irq);
|
|
|
|
|
|
#ifndef CONFIG_IPIPE
|
|
|
/*
|
|
@@ -173,14 +150,6 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
|
|
|
|
|
void __init init_IRQ(void)
|
|
|
{
|
|
|
- struct irq_desc *desc;
|
|
|
- int irq;
|
|
|
-
|
|
|
- spin_lock_init(&irq_controller_lock);
|
|
|
- for (irq = 0, desc = irq_desc; irq < NR_IRQS; irq++, desc++) {
|
|
|
- *desc = bad_irq_desc;
|
|
|
- }
|
|
|
-
|
|
|
init_arch_irq();
|
|
|
|
|
|
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
|