]>
Commit | Line | Data |
---|---|---|
2874c5fd | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
42d226c7 | 2 | /* |
0bb383a2 | 3 | * Copyright (C) 2007 Lemote Inc. & Institute of Computing Technology |
42d226c7 | 4 | * Author: Fuxin Zhang, zhangfx@lemote.com |
42d226c7 | 5 | */ |
42d226c7 | 6 | #include <linux/interrupt.h> |
42d226c7 ST |
7 | |
8 | #include <asm/irq_cpu.h> | |
9 | #include <asm/i8259.h> | |
42d226c7 | 10 | |
5e983ff6 | 11 | #include <loongson.h> |
42d226c7 ST |
12 | |
13 | static void i8259_irqdispatch(void) | |
14 | { | |
15 | int irq; | |
16 | ||
17 | irq = i8259_irq(); | |
5e983ff6 | 18 | if (irq >= 0) |
42d226c7 | 19 | do_IRQ(irq); |
5e983ff6 | 20 | else |
42d226c7 | 21 | spurious_interrupt(); |
42d226c7 ST |
22 | } |
23 | ||
85749d24 | 24 | asmlinkage void mach_irq_dispatch(unsigned int pending) |
42d226c7 | 25 | { |
5e983ff6 | 26 | if (pending & CAUSEF_IP7) |
42d226c7 | 27 | do_IRQ(MIPS_CPU_IRQ_BASE + 7); |
67b35e5d | 28 | else if (pending & CAUSEF_IP6) /* perf counter loverflow */ |
de3bc0e7 | 29 | do_perfcnt_IRQ(); |
5e983ff6 | 30 | else if (pending & CAUSEF_IP5) |
42d226c7 | 31 | i8259_irqdispatch(); |
5e983ff6 | 32 | else if (pending & CAUSEF_IP2) |
42d226c7 | 33 | bonito_irqdispatch(); |
5e983ff6 | 34 | else |
42d226c7 | 35 | spurious_interrupt(); |
42d226c7 ST |
36 | } |
37 | ||
38 | static struct irqaction cascade_irqaction = { | |
39 | .handler = no_action, | |
42d226c7 | 40 | .name = "cascade", |
77cbece7 | 41 | .flags = IRQF_NO_THREAD, |
42d226c7 ST |
42 | }; |
43 | ||
85749d24 WZ |
44 | void __init mach_init_irq(void) |
45 | { | |
42d226c7 | 46 | /* init all controller |
70342287 RB |
47 | * 0-15 ------> i8259 interrupt |
48 | * 16-23 ------> mips cpu interrupt | |
49 | * 32-63 ------> bonito irq | |
42d226c7 ST |
50 | */ |
51 | ||
b8c7428a WZ |
52 | /* most bonito irq should be level triggered */ |
53 | LOONGSON_INTEDGE = LOONGSON_ICU_SYSTEMERR | LOONGSON_ICU_MASTERERR | | |
54 | LOONGSON_ICU_RETRYERR | LOONGSON_ICU_MBOXES; | |
55 | ||
42d226c7 ST |
56 | /* Sets the first-level interrupt dispatcher. */ |
57 | mips_cpu_irq_init(); | |
58 | init_i8259_irqs(); | |
59 | bonito_irq_init(); | |
60 | ||
42d226c7 ST |
61 | /* bonito irq at IP2 */ |
62 | setup_irq(MIPS_CPU_IRQ_BASE + 2, &cascade_irqaction); | |
63 | /* 8259 irq at IP5 */ | |
64 | setup_irq(MIPS_CPU_IRQ_BASE + 5, &cascade_irqaction); | |
42d226c7 | 65 | } |