2 * Copyright (C) 2010 Scott Nicholas <neutronscott@scottn.us>
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
9 #include <linux/init.h>
10 #include <linux/kernel_stat.h>
11 #include <linux/signal.h>
12 #include <linux/sched.h>
13 #include <linux/interrupt.h>
14 #include <linux/slab.h>
15 #include <linux/random.h>
17 #include <linux/irq.h>
18 #include <asm/mipsregs.h>
19 #include <asm/irq_cpu.h>
24 void enable_adm8668_irq(unsigned int irq
);
25 void disable_adm8668_irq(unsigned int irq
);
26 void adm8668_irq_cascade(void);
28 void plat_irq_dispatch(void)
32 pending
= read_c0_cause() & read_c0_status() & ST0_IM
;
34 /* timer interrupt, that we renumbered */
35 if (pending
& STATUSF_IP7
)
36 do_IRQ(MIPS_CPU_IRQ_BASE
+ 7);
37 if (pending
& STATUSF_IP2
)
38 adm8668_irq_cascade();
44 void adm8668_irq_cascade()
49 intsrc
= ADM8668_INTC_REG(IRQ_STATUS_REG
) & IRQ_MASK
;
50 for (i
= 0; intsrc
; intsrc
>>= 1, i
++)
58 static __inline
void _irq_enable(int irql
)
60 ADM8668_INTC_REG(IRQ_ENABLE_REG
) = (1 << irql
);
67 static __inline
void _irq_disable(int irql
)
69 ADM8668_INTC_REG(IRQ_DISABLE_REG
) = (1 << irql
);
76 void enable_adm8668_irq(unsigned int irq
)
78 if ((irq
< 0) || (irq
> NR_IRQS
))
88 void disable_adm8668_irq(unsigned int irq
)
90 if ((irq
< 0) || (irq
> NR_IRQS
))
96 static inline void ack_adm8668_irq(unsigned int irq_nr
)
98 ADM8668_INTC_REG(IRQ_DISABLE_REG
) = (1 << irq_nr
);
105 static struct irq_chip adm8668_irq_type
= {
107 .ack
= ack_adm8668_irq
,
108 .mask
= disable_adm8668_irq
,
109 .unmask
= enable_adm8668_irq
115 void __init
init_adm8668_irqs(void)
119 for (i
= 0; i
<= INT_LVL_MAX
; i
++)
120 set_irq_chip_and_handler(i
, &adm8668_irq_type
,
123 /* hw0 is where our interrupts are uh.. interrupted at. */
124 set_c0_status(IE_IRQ0
);
130 void __init
arch_init_irq(void)