Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
[linux-2.6] / arch / mips / gt64120 / wrppmc / int-handler.S
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 1995, 1996, 1997, 2003 by Ralf Baechle
7  * Copyright (C) Wind River System Inc. Rongkai.Zhan <rongkai.zhan@windriver.com>
8  */
9 #include <asm/asm.h>
10 #include <asm/mipsregs.h>
11 #include <asm/addrspace.h>
12 #include <asm/regdef.h>
13 #include <asm/stackframe.h>
14 #include <asm/mach-wrppmc/mach-gt64120.h>
15
16         .align  5
17         .set    noat
18 NESTED(handle_IRQ, PT_SIZE, sp)
19         SAVE_ALL
20         CLI                             # Important: mark KERNEL mode !
21         .set    at
22
23         mfc0    t0, CP0_CAUSE           # get pending interrupts
24         mfc0    t1, CP0_STATUS          # get enabled interrupts
25         and     t0, t0, t1              # get allowed interrupts
26         andi    t0, t0, 0xFF00
27         beqz    t0, 1f
28         move    a1, sp                  # Prepare 'struct pt_regs *regs' pointer
29
30         andi    t1, t0, CAUSEF_IP7      # CPU Compare/Count internal timer
31         bnez    t1, handle_cputimer_irq
32         andi    t1, t0, CAUSEF_IP6      # UART 16550 port
33         bnez    t1, handle_uart_irq
34         andi    t1, t0, CAUSEF_IP3      # PCI INT_A
35         bnez    t1, handle_pci_intA_irq
36
37         /* wrong alarm or masked ... */
38 1:      j       spurious_interrupt
39         nop
40 END(handle_IRQ)
41
42         .align  5
43 handle_cputimer_irq:
44         li      a0, WRPPMC_MIPS_TIMER_IRQ
45         jal     do_IRQ
46         j       ret_from_irq
47
48         .align  5
49 handle_uart_irq:
50         li      a0, WRPPMC_UART16550_IRQ
51         jal     do_IRQ
52         j       ret_from_irq
53
54         .align  5
55 handle_pci_intA_irq:
56         li      a0, WRPPMC_PCI_INTA_IRQ
57         jal     do_IRQ
58         j       ret_from_irq
59