2 * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
3 * Author: Fuxin Zhang, zhangfx@lemote.com
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version.
10 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
11 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
13 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
14 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
15 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
16 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
17 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
18 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
19 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <linux/delay.h>
28 #include <linux/init.h>
29 #include <linux/interrupt.h>
30 #include <linux/irq.h>
32 #include <asm/irq_cpu.h>
33 #include <asm/i8259.h>
34 #include <asm/mipsregs.h>
35 #include <asm/mips-boards/bonito64.h>
39 * the first level int-handler will jump here if it is a bonito irq
41 static void bonito_irqdispatch(void)
46 /* workaround the IO dma problem: let cpu looping to allow DMA finish */
47 int_status
= BONITO_INTISR
;
48 if (int_status
& (1 << 10)) {
49 while (int_status
& (1 << 10)) {
51 int_status
= BONITO_INTISR
;
55 /* Get pending sources, masked by current enables */
56 int_status
= BONITO_INTISR
& BONITO_INTEN
;
58 if (int_status
!= 0) {
59 i
= __ffs(int_status
);
60 int_status
&= ~(1 << i
);
61 do_IRQ(BONITO_IRQ_BASE
+ i
);
65 static void i8259_irqdispatch(void)
78 asmlinkage
void plat_irq_dispatch(void)
80 unsigned int pending
= read_c0_cause() & read_c0_status() & ST0_IM
;
82 if (pending
& CAUSEF_IP7
) {
83 do_IRQ(MIPS_CPU_IRQ_BASE
+ 7);
84 } else if (pending
& CAUSEF_IP5
) {
86 } else if (pending
& CAUSEF_IP2
) {
93 static struct irqaction cascade_irqaction
= {
95 .mask
= CPU_MASK_NONE
,
99 void __init
arch_init_irq(void)
101 extern void bonito_irq_init(void);
104 * Clear all of the interrupts while we change the able around a bit.
105 * int-handler is not on bootstrap
107 clear_c0_status(ST0_IM
| ST0_BEV
);
110 /* most bonito irq should be level triggered */
111 BONITO_INTEDGE
= BONITO_ICU_SYSTEMERR
| BONITO_ICU_MASTERERR
|
112 BONITO_ICU_RETRYERR
| BONITO_ICU_MBOXES
;
116 * Mask out all interrupt by writing "1" to all bit position in
117 * the interrupt reset reg.
119 BONITO_INTENCLR
= ~0;
121 /* init all controller
122 * 0-15 ------> i8259 interrupt
123 * 16-23 ------> mips cpu interrupt
124 * 32-63 ------> bonito irq
127 /* Sets the first-level interrupt dispatcher. */
133 printk("GPIODATA=%x, GPIOIE=%x\n", BONITO_GPIODATA, BONITO_GPIOIE);
134 printk("INTEN=%x, INTSET=%x, INTCLR=%x, INTISR=%x\n",
135 BONITO_INTEN, BONITO_INTENSET,
136 BONITO_INTENCLR, BONITO_INTISR);
139 /* bonito irq at IP2 */
140 setup_irq(MIPS_CPU_IRQ_BASE
+ 2, &cascade_irqaction
);
141 /* 8259 irq at IP5 */
142 setup_irq(MIPS_CPU_IRQ_BASE
+ 5, &cascade_irqaction
);