1 /* $Id: irq.c,v 1.20 2004/01/13 05:52:11 kkojima Exp $ 2 * 3 * linux/arch/sh/kernel/irq.c 4 * 5 * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar 6 * 7 * 8 * SuperH version: Copyright (C) 1999 Niibe Yutaka 9 */ 10 11 #include <linux/irq.h> 12 #include <linux/interrupt.h> 13 #include <linux/kernel_stat.h> 14 #include <linux/seq_file.h> 15 #include <asm/irq.h> 16 #include <asm/processor.h> 17 #include <asm/cpu/mmu_context.h> 18 19 /* 20 * 'what should we do if we get a hw irq event on an illegal vector'. 21 * each architecture has to answer this themselves, it doesn't deserve 22 * a generic callback i think. 23 */ 24 void ack_bad_irq(unsigned int irq) 25 { 26 printk("unexpected IRQ trap at vector %02x\n", irq); 27 } 28 29 #if defined(CONFIG_PROC_FS) 30 int show_interrupts(struct seq_file *p, void *v) 31 { 32 int i = *(loff_t *) v, j; 33 struct irqaction * action; 34 unsigned long flags; 35 36 if (i == 0) { 37 seq_puts(p, " "); 38 for_each_online_cpu(j) 39 seq_printf(p, "CPU%d ",j); 40 seq_putc(p, '\n'); 41 } 42 43 if (i < NR_IRQS) { 44 spin_lock_irqsave(&irq_desc[i].lock, flags); 45 action = irq_desc[i].action; 46 if (!action) 47 goto unlock; 48 seq_printf(p, "%3d: ",i); 49 seq_printf(p, "%10u ", kstat_irqs(i)); 50 seq_printf(p, " %14s", irq_desc[i].handler->typename); 51 seq_printf(p, " %s", action->name); 52 53 for (action=action->next; action; action = action->next) 54 seq_printf(p, ", %s", action->name); 55 seq_putc(p, '\n'); 56 unlock: 57 spin_unlock_irqrestore(&irq_desc[i].lock, flags); 58 } 59 return 0; 60 } 61 #endif 62 63 64 asmlinkage int do_IRQ(unsigned long r4, unsigned long r5, 65 unsigned long r6, unsigned long r7, 66 struct pt_regs regs) 67 { 68 int irq = r4; 69 70 irq_enter(); 71 72 #ifdef CONFIG_CPU_HAS_INTEVT 73 __asm__ __volatile__ ( 74 #ifdef CONFIG_CPU_HAS_SR_RB 75 "stc r2_bank, %0\n\t" 76 #else 77 "mov.l @%1, %0\n\t" 78 #endif 79 "shlr2 %0\n\t" 80 "shlr2 %0\n\t" 81 "shlr %0\n\t" 82 "add #-16, %0\n\t" 83 : "=z" (irq), "=r" (r4) 84 : "1" (INTEVT) 85 : "memory" 86 ); 87 #endif 88 89 irq = irq_demux(irq); 90 __do_IRQ(irq, ®s); 91 irq_exit(); 92 return 1; 93 } 94