2 * icu.c, Interrupt Control Unit routines for the NEC VR4100 series.
4 * Copyright (C) 2001-2002 MontaVista Software Inc.
5 * Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com>
6 * Copyright (C) 2003-2004 Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
7 * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 * MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com>
26 * - New creation, NEC VR4122 and VR4131 are supported.
27 * - Added support for NEC VR4111 and VR4121.
29 * Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
30 * - Coped with INTASSIGN of NEC VR4133.
32 #include <linux/errno.h>
33 #include <linux/init.h>
34 #include <linux/interrupt.h>
35 #include <linux/irq.h>
36 #include <linux/module.h>
37 #include <linux/smp.h>
38 #include <linux/types.h>
43 #include <asm/irq_cpu.h>
44 #include <asm/vr41xx/vr41xx.h>
46 extern asmlinkage
void vr41xx_handle_interrupt(void);
48 extern void init_vr41xx_giuint_irq(void);
49 extern void giuint_irq_dispatch(struct pt_regs
*regs
);
51 static uint32_t icu1_base
;
52 static uint32_t icu2_base
;
54 static struct irqaction icu_cascade
= {
56 .mask
= CPU_MASK_NONE
,
60 static unsigned char sysint1_assign
[16] = {
61 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
62 static unsigned char sysint2_assign
[16] = {
63 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
65 #define SYSINT1REG_TYPE1 KSEG1ADDR(0x0b000080)
66 #define SYSINT2REG_TYPE1 KSEG1ADDR(0x0b000200)
68 #define SYSINT1REG_TYPE2 KSEG1ADDR(0x0f000080)
69 #define SYSINT2REG_TYPE2 KSEG1ADDR(0x0f0000a0)
71 #define SYSINT1REG 0x00
72 #define PIUINTREG 0x02
73 #define INTASSIGN0 0x04
74 #define INTASSIGN1 0x06
75 #define GIUINTLREG 0x08
76 #define DSIUINTREG 0x0a
77 #define MSYSINT1REG 0x0c
78 #define MPIUINTREG 0x0e
79 #define MAIUINTREG 0x10
80 #define MKIUINTREG 0x12
81 #define MGIUINTLREG 0x14
82 #define MDSIUINTREG 0x16
85 #define INTASSIGN2 0x1c
86 #define INTASSIGN3 0x1e
88 #define SYSINT2REG 0x00
89 #define GIUINTHREG 0x02
90 #define FIRINTREG 0x04
91 #define MSYSINT2REG 0x06
92 #define MGIUINTHREG 0x08
93 #define MFIRINTREG 0x0a
94 #define PCIINTREG 0x0c
95 #define PCIINT0 0x0001
96 #define SCUINTREG 0x0e
97 #define SCUINT0 0x0001
98 #define CSIINTREG 0x10
99 #define MPCIINTREG 0x12
100 #define MSCUINTREG 0x14
101 #define MCSIINTREG 0x16
102 #define BCUINTREG 0x18
103 #define BCUINTR 0x0001
104 #define MBCUINTREG 0x1a
106 #define SYSINT1_IRQ_TO_PIN(x) ((x) - SYSINT1_IRQ_BASE) /* Pin 0-15 */
107 #define SYSINT2_IRQ_TO_PIN(x) ((x) - SYSINT2_IRQ_BASE) /* Pin 0-15 */
109 #define read_icu1(offset) readw(icu1_base + (offset))
110 #define write_icu1(val, offset) writew((val), icu1_base + (offset))
112 #define read_icu2(offset) readw(icu2_base + (offset))
113 #define write_icu2(val, offset) writew((val), icu2_base + (offset))
115 #define INTASSIGN_MAX 4
116 #define INTASSIGN_MASK 0x0007
118 static inline uint16_t set_icu1(uint8_t offset
, uint16_t set
)
122 res
= read_icu1(offset
);
124 write_icu1(res
, offset
);
129 static inline uint16_t clear_icu1(uint8_t offset
, uint16_t clear
)
133 res
= read_icu1(offset
);
135 write_icu1(res
, offset
);
140 static inline uint16_t set_icu2(uint8_t offset
, uint16_t set
)
144 res
= read_icu2(offset
);
146 write_icu2(res
, offset
);
151 static inline uint16_t clear_icu2(uint8_t offset
, uint16_t clear
)
155 res
= read_icu2(offset
);
157 write_icu2(res
, offset
);
162 /*=======================================================================*/
164 void vr41xx_enable_piuint(uint16_t mask
)
166 irq_desc_t
*desc
= irq_desc
+ PIU_IRQ
;
169 if (current_cpu_data
.cputype
== CPU_VR4111
||
170 current_cpu_data
.cputype
== CPU_VR4121
) {
171 spin_lock_irqsave(&desc
->lock
, flags
);
172 set_icu1(MPIUINTREG
, mask
);
173 spin_unlock_irqrestore(&desc
->lock
, flags
);
177 EXPORT_SYMBOL(vr41xx_enable_piuint
);
179 void vr41xx_disable_piuint(uint16_t mask
)
181 irq_desc_t
*desc
= irq_desc
+ PIU_IRQ
;
184 if (current_cpu_data
.cputype
== CPU_VR4111
||
185 current_cpu_data
.cputype
== CPU_VR4121
) {
186 spin_lock_irqsave(&desc
->lock
, flags
);
187 clear_icu1(MPIUINTREG
, mask
);
188 spin_unlock_irqrestore(&desc
->lock
, flags
);
192 EXPORT_SYMBOL(vr41xx_disable_piuint
);
194 void vr41xx_enable_aiuint(uint16_t mask
)
196 irq_desc_t
*desc
= irq_desc
+ AIU_IRQ
;
199 if (current_cpu_data
.cputype
== CPU_VR4111
||
200 current_cpu_data
.cputype
== CPU_VR4121
) {
201 spin_lock_irqsave(&desc
->lock
, flags
);
202 set_icu1(MAIUINTREG
, mask
);
203 spin_unlock_irqrestore(&desc
->lock
, flags
);
207 EXPORT_SYMBOL(vr41xx_enable_aiuint
);
209 void vr41xx_disable_aiuint(uint16_t mask
)
211 irq_desc_t
*desc
= irq_desc
+ AIU_IRQ
;
214 if (current_cpu_data
.cputype
== CPU_VR4111
||
215 current_cpu_data
.cputype
== CPU_VR4121
) {
216 spin_lock_irqsave(&desc
->lock
, flags
);
217 clear_icu1(MAIUINTREG
, mask
);
218 spin_unlock_irqrestore(&desc
->lock
, flags
);
222 EXPORT_SYMBOL(vr41xx_disable_aiuint
);
224 void vr41xx_enable_kiuint(uint16_t mask
)
226 irq_desc_t
*desc
= irq_desc
+ KIU_IRQ
;
229 if (current_cpu_data
.cputype
== CPU_VR4111
||
230 current_cpu_data
.cputype
== CPU_VR4121
) {
231 spin_lock_irqsave(&desc
->lock
, flags
);
232 set_icu1(MKIUINTREG
, mask
);
233 spin_unlock_irqrestore(&desc
->lock
, flags
);
237 EXPORT_SYMBOL(vr41xx_enable_kiuint
);
239 void vr41xx_disable_kiuint(uint16_t mask
)
241 irq_desc_t
*desc
= irq_desc
+ KIU_IRQ
;
244 if (current_cpu_data
.cputype
== CPU_VR4111
||
245 current_cpu_data
.cputype
== CPU_VR4121
) {
246 spin_lock_irqsave(&desc
->lock
, flags
);
247 clear_icu1(MKIUINTREG
, mask
);
248 spin_unlock_irqrestore(&desc
->lock
, flags
);
252 EXPORT_SYMBOL(vr41xx_disable_kiuint
);
254 void vr41xx_enable_dsiuint(uint16_t mask
)
256 irq_desc_t
*desc
= irq_desc
+ DSIU_IRQ
;
259 spin_lock_irqsave(&desc
->lock
, flags
);
260 set_icu1(MDSIUINTREG
, mask
);
261 spin_unlock_irqrestore(&desc
->lock
, flags
);
264 EXPORT_SYMBOL(vr41xx_enable_dsiuint
);
266 void vr41xx_disable_dsiuint(uint16_t mask
)
268 irq_desc_t
*desc
= irq_desc
+ DSIU_IRQ
;
271 spin_lock_irqsave(&desc
->lock
, flags
);
272 clear_icu1(MDSIUINTREG
, mask
);
273 spin_unlock_irqrestore(&desc
->lock
, flags
);
276 EXPORT_SYMBOL(vr41xx_disable_dsiuint
);
278 void vr41xx_enable_firint(uint16_t mask
)
280 irq_desc_t
*desc
= irq_desc
+ FIR_IRQ
;
283 spin_lock_irqsave(&desc
->lock
, flags
);
284 set_icu2(MFIRINTREG
, mask
);
285 spin_unlock_irqrestore(&desc
->lock
, flags
);
288 EXPORT_SYMBOL(vr41xx_enable_firint
);
290 void vr41xx_disable_firint(uint16_t mask
)
292 irq_desc_t
*desc
= irq_desc
+ FIR_IRQ
;
295 spin_lock_irqsave(&desc
->lock
, flags
);
296 clear_icu2(MFIRINTREG
, mask
);
297 spin_unlock_irqrestore(&desc
->lock
, flags
);
300 EXPORT_SYMBOL(vr41xx_disable_firint
);
302 void vr41xx_enable_pciint(void)
304 irq_desc_t
*desc
= irq_desc
+ PCI_IRQ
;
307 if (current_cpu_data
.cputype
== CPU_VR4122
||
308 current_cpu_data
.cputype
== CPU_VR4131
||
309 current_cpu_data
.cputype
== CPU_VR4133
) {
310 spin_lock_irqsave(&desc
->lock
, flags
);
311 write_icu2(PCIINT0
, MPCIINTREG
);
312 spin_unlock_irqrestore(&desc
->lock
, flags
);
316 EXPORT_SYMBOL(vr41xx_enable_pciint
);
318 void vr41xx_disable_pciint(void)
320 irq_desc_t
*desc
= irq_desc
+ PCI_IRQ
;
323 if (current_cpu_data
.cputype
== CPU_VR4122
||
324 current_cpu_data
.cputype
== CPU_VR4131
||
325 current_cpu_data
.cputype
== CPU_VR4133
) {
326 spin_lock_irqsave(&desc
->lock
, flags
);
327 write_icu2(0, MPCIINTREG
);
328 spin_unlock_irqrestore(&desc
->lock
, flags
);
332 EXPORT_SYMBOL(vr41xx_disable_pciint
);
334 void vr41xx_enable_scuint(void)
336 irq_desc_t
*desc
= irq_desc
+ SCU_IRQ
;
339 if (current_cpu_data
.cputype
== CPU_VR4122
||
340 current_cpu_data
.cputype
== CPU_VR4131
||
341 current_cpu_data
.cputype
== CPU_VR4133
) {
342 spin_lock_irqsave(&desc
->lock
, flags
);
343 write_icu2(SCUINT0
, MSCUINTREG
);
344 spin_unlock_irqrestore(&desc
->lock
, flags
);
348 EXPORT_SYMBOL(vr41xx_enable_scuint
);
350 void vr41xx_disable_scuint(void)
352 irq_desc_t
*desc
= irq_desc
+ SCU_IRQ
;
355 if (current_cpu_data
.cputype
== CPU_VR4122
||
356 current_cpu_data
.cputype
== CPU_VR4131
||
357 current_cpu_data
.cputype
== CPU_VR4133
) {
358 spin_lock_irqsave(&desc
->lock
, flags
);
359 write_icu2(0, MSCUINTREG
);
360 spin_unlock_irqrestore(&desc
->lock
, flags
);
364 EXPORT_SYMBOL(vr41xx_disable_scuint
);
366 void vr41xx_enable_csiint(uint16_t mask
)
368 irq_desc_t
*desc
= irq_desc
+ CSI_IRQ
;
371 if (current_cpu_data
.cputype
== CPU_VR4122
||
372 current_cpu_data
.cputype
== CPU_VR4131
||
373 current_cpu_data
.cputype
== CPU_VR4133
) {
374 spin_lock_irqsave(&desc
->lock
, flags
);
375 set_icu2(MCSIINTREG
, mask
);
376 spin_unlock_irqrestore(&desc
->lock
, flags
);
380 EXPORT_SYMBOL(vr41xx_enable_csiint
);
382 void vr41xx_disable_csiint(uint16_t mask
)
384 irq_desc_t
*desc
= irq_desc
+ CSI_IRQ
;
387 if (current_cpu_data
.cputype
== CPU_VR4122
||
388 current_cpu_data
.cputype
== CPU_VR4131
||
389 current_cpu_data
.cputype
== CPU_VR4133
) {
390 spin_lock_irqsave(&desc
->lock
, flags
);
391 clear_icu2(MCSIINTREG
, mask
);
392 spin_unlock_irqrestore(&desc
->lock
, flags
);
396 EXPORT_SYMBOL(vr41xx_disable_csiint
);
398 void vr41xx_enable_bcuint(void)
400 irq_desc_t
*desc
= irq_desc
+ BCU_IRQ
;
403 if (current_cpu_data
.cputype
== CPU_VR4122
||
404 current_cpu_data
.cputype
== CPU_VR4131
||
405 current_cpu_data
.cputype
== CPU_VR4133
) {
406 spin_lock_irqsave(&desc
->lock
, flags
);
407 write_icu2(BCUINTR
, MBCUINTREG
);
408 spin_unlock_irqrestore(&desc
->lock
, flags
);
412 EXPORT_SYMBOL(vr41xx_enable_bcuint
);
414 void vr41xx_disable_bcuint(void)
416 irq_desc_t
*desc
= irq_desc
+ BCU_IRQ
;
419 if (current_cpu_data
.cputype
== CPU_VR4122
||
420 current_cpu_data
.cputype
== CPU_VR4131
||
421 current_cpu_data
.cputype
== CPU_VR4133
) {
422 spin_lock_irqsave(&desc
->lock
, flags
);
423 write_icu2(0, MBCUINTREG
);
424 spin_unlock_irqrestore(&desc
->lock
, flags
);
428 EXPORT_SYMBOL(vr41xx_disable_bcuint
);
430 /*=======================================================================*/
432 static unsigned int startup_sysint1_irq(unsigned int irq
)
434 set_icu1(MSYSINT1REG
, (uint16_t)1 << SYSINT1_IRQ_TO_PIN(irq
));
436 return 0; /* never anything pending */
439 static void shutdown_sysint1_irq(unsigned int irq
)
441 clear_icu1(MSYSINT1REG
, (uint16_t)1 << SYSINT1_IRQ_TO_PIN(irq
));
444 static void enable_sysint1_irq(unsigned int irq
)
446 set_icu1(MSYSINT1REG
, (uint16_t)1 << SYSINT1_IRQ_TO_PIN(irq
));
449 #define disable_sysint1_irq shutdown_sysint1_irq
450 #define ack_sysint1_irq shutdown_sysint1_irq
452 static void end_sysint1_irq(unsigned int irq
)
454 if (!(irq_desc
[irq
].status
& (IRQ_DISABLED
| IRQ_INPROGRESS
)))
455 set_icu1(MSYSINT1REG
, (uint16_t)1 << SYSINT1_IRQ_TO_PIN(irq
));
458 static struct hw_interrupt_type sysint1_irq_type
= {
459 .typename
= "SYSINT1",
460 .startup
= startup_sysint1_irq
,
461 .shutdown
= shutdown_sysint1_irq
,
462 .enable
= enable_sysint1_irq
,
463 .disable
= disable_sysint1_irq
,
464 .ack
= ack_sysint1_irq
,
465 .end
= end_sysint1_irq
,
468 /*=======================================================================*/
470 static unsigned int startup_sysint2_irq(unsigned int irq
)
472 set_icu2(MSYSINT2REG
, (uint16_t)1 << SYSINT2_IRQ_TO_PIN(irq
));
474 return 0; /* never anything pending */
477 static void shutdown_sysint2_irq(unsigned int irq
)
479 clear_icu2(MSYSINT2REG
, (uint16_t)1 << SYSINT2_IRQ_TO_PIN(irq
));
482 static void enable_sysint2_irq(unsigned int irq
)
484 set_icu2(MSYSINT2REG
, (uint16_t)1 << SYSINT2_IRQ_TO_PIN(irq
));
487 #define disable_sysint2_irq shutdown_sysint2_irq
488 #define ack_sysint2_irq shutdown_sysint2_irq
490 static void end_sysint2_irq(unsigned int irq
)
492 if (!(irq_desc
[irq
].status
& (IRQ_DISABLED
| IRQ_INPROGRESS
)))
493 set_icu2(MSYSINT2REG
, (uint16_t)1 << SYSINT2_IRQ_TO_PIN(irq
));
496 static struct hw_interrupt_type sysint2_irq_type
= {
497 .typename
= "SYSINT2",
498 .startup
= startup_sysint2_irq
,
499 .shutdown
= shutdown_sysint2_irq
,
500 .enable
= enable_sysint2_irq
,
501 .disable
= disable_sysint2_irq
,
502 .ack
= ack_sysint2_irq
,
503 .end
= end_sysint2_irq
,
506 /*=======================================================================*/
508 static inline int set_sysint1_assign(unsigned int irq
, unsigned char assign
)
510 irq_desc_t
*desc
= irq_desc
+ irq
;
511 uint16_t intassign0
, intassign1
;
514 pin
= SYSINT1_IRQ_TO_PIN(irq
);
516 spin_lock_irq(&desc
->lock
);
518 intassign0
= read_icu1(INTASSIGN0
);
519 intassign1
= read_icu1(INTASSIGN1
);
523 intassign0
&= ~INTASSIGN_MASK
;
524 intassign0
|= (uint16_t)assign
;
527 intassign0
&= ~(INTASSIGN_MASK
<< 3);
528 intassign0
|= (uint16_t)assign
<< 3;
531 intassign0
&= ~(INTASSIGN_MASK
<< 6);
532 intassign0
|= (uint16_t)assign
<< 6;
535 intassign0
&= ~(INTASSIGN_MASK
<< 9);
536 intassign0
|= (uint16_t)assign
<< 9;
539 intassign0
&= ~(INTASSIGN_MASK
<< 12);
540 intassign0
|= (uint16_t)assign
<< 12;
543 intassign1
&= ~INTASSIGN_MASK
;
544 intassign1
|= (uint16_t)assign
;
547 intassign1
&= ~(INTASSIGN_MASK
<< 6);
548 intassign1
|= (uint16_t)assign
<< 6;
551 intassign1
&= ~(INTASSIGN_MASK
<< 9);
552 intassign1
|= (uint16_t)assign
<< 9;
558 sysint1_assign
[pin
] = assign
;
559 write_icu1(intassign0
, INTASSIGN0
);
560 write_icu1(intassign1
, INTASSIGN1
);
562 spin_unlock_irq(&desc
->lock
);
567 static inline int set_sysint2_assign(unsigned int irq
, unsigned char assign
)
569 irq_desc_t
*desc
= irq_desc
+ irq
;
570 uint16_t intassign2
, intassign3
;
573 pin
= SYSINT2_IRQ_TO_PIN(irq
);
575 spin_lock_irq(&desc
->lock
);
577 intassign2
= read_icu1(INTASSIGN2
);
578 intassign3
= read_icu1(INTASSIGN3
);
582 intassign2
&= ~INTASSIGN_MASK
;
583 intassign2
|= (uint16_t)assign
;
586 intassign2
&= ~(INTASSIGN_MASK
<< 3);
587 intassign2
|= (uint16_t)assign
<< 3;
590 intassign2
&= ~(INTASSIGN_MASK
<< 6);
591 intassign2
|= (uint16_t)assign
<< 6;
594 intassign2
&= ~(INTASSIGN_MASK
<< 9);
595 intassign2
|= (uint16_t)assign
<< 9;
598 intassign2
&= ~(INTASSIGN_MASK
<< 12);
599 intassign2
|= (uint16_t)assign
<< 12;
602 intassign3
&= ~INTASSIGN_MASK
;
603 intassign3
|= (uint16_t)assign
;
606 intassign3
&= ~(INTASSIGN_MASK
<< 3);
607 intassign3
|= (uint16_t)assign
<< 3;
610 intassign3
&= ~(INTASSIGN_MASK
<< 6);
611 intassign3
|= (uint16_t)assign
<< 6;
614 intassign3
&= ~(INTASSIGN_MASK
<< 9);
615 intassign3
|= (uint16_t)assign
<< 9;
618 intassign3
&= ~(INTASSIGN_MASK
<< 12);
619 intassign3
|= (uint16_t)assign
<< 12;
625 sysint2_assign
[pin
] = assign
;
626 write_icu1(intassign2
, INTASSIGN2
);
627 write_icu1(intassign3
, INTASSIGN3
);
629 spin_unlock_irq(&desc
->lock
);
634 int vr41xx_set_intassign(unsigned int irq
, unsigned char intassign
)
636 int retval
= -EINVAL
;
638 if (current_cpu_data
.cputype
!= CPU_VR4133
)
641 if (intassign
> INTASSIGN_MAX
)
644 if (irq
>= SYSINT1_IRQ_BASE
&& irq
<= SYSINT1_IRQ_LAST
)
645 retval
= set_sysint1_assign(irq
, intassign
);
646 else if (irq
>= SYSINT2_IRQ_BASE
&& irq
<= SYSINT2_IRQ_LAST
)
647 retval
= set_sysint2_assign(irq
, intassign
);
652 EXPORT_SYMBOL(vr41xx_set_intassign
);
654 /*=======================================================================*/
656 asmlinkage
void irq_dispatch(unsigned char intnum
, struct pt_regs
*regs
)
658 uint16_t pend1
, pend2
;
659 uint16_t mask1
, mask2
;
662 pend1
= read_icu1(SYSINT1REG
);
663 mask1
= read_icu1(MSYSINT1REG
);
665 pend2
= read_icu2(SYSINT2REG
);
666 mask2
= read_icu2(MSYSINT2REG
);
672 for (i
= 0; i
< 16; i
++) {
673 if (intnum
== sysint1_assign
[i
] &&
674 (mask1
& ((uint16_t)1 << i
))) {
676 giuint_irq_dispatch(regs
);
678 do_IRQ(SYSINT1_IRQ(i
), regs
);
685 for (i
= 0; i
< 16; i
++) {
686 if (intnum
== sysint2_assign
[i
] &&
687 (mask2
& ((uint16_t)1 << i
))) {
688 do_IRQ(SYSINT2_IRQ(i
), regs
);
694 printk(KERN_ERR
"spurious ICU interrupt: %04x,%04x\n", pend1
, pend2
);
696 atomic_inc(&irq_err_count
);
699 /*=======================================================================*/
701 static int __init
vr41xx_icu_init(void)
703 switch (current_cpu_data
.cputype
) {
706 icu1_base
= SYSINT1REG_TYPE1
;
707 icu2_base
= SYSINT2REG_TYPE1
;
712 icu1_base
= SYSINT1REG_TYPE2
;
713 icu2_base
= SYSINT2REG_TYPE2
;
716 printk(KERN_ERR
"ICU: Unexpected CPU of NEC VR4100 series\n");
720 write_icu1(0, MSYSINT1REG
);
721 write_icu1(0xffff, MGIUINTLREG
);
723 write_icu2(0, MSYSINT2REG
);
724 write_icu2(0xffff, MGIUINTHREG
);
729 early_initcall(vr41xx_icu_init
);
731 /*=======================================================================*/
733 static inline void init_vr41xx_icu_irq(void)
737 for (i
= SYSINT1_IRQ_BASE
; i
<= SYSINT1_IRQ_LAST
; i
++)
738 irq_desc
[i
].handler
= &sysint1_irq_type
;
740 for (i
= SYSINT2_IRQ_BASE
; i
<= SYSINT2_IRQ_LAST
; i
++)
741 irq_desc
[i
].handler
= &sysint2_irq_type
;
743 setup_irq(INT0_CASCADE_IRQ
, &icu_cascade
);
744 setup_irq(INT1_CASCADE_IRQ
, &icu_cascade
);
745 setup_irq(INT2_CASCADE_IRQ
, &icu_cascade
);
746 setup_irq(INT3_CASCADE_IRQ
, &icu_cascade
);
747 setup_irq(INT4_CASCADE_IRQ
, &icu_cascade
);
750 void __init
arch_init_irq(void)
752 mips_cpu_irq_init(MIPS_CPU_IRQ_BASE
);
753 init_vr41xx_icu_irq();
754 init_vr41xx_giuint_irq();
756 set_except_vector(0, vr41xx_handle_interrupt
);