1 #include <linux/init.h>
2 #include <linux/list.h>
4 #include <asm/mach/irq.h>
5 #include <asm/hardware/iomd.h>
9 static void iomd_ack_irq_a(unsigned int irq
)
11 unsigned int val
, mask
;
14 val
= iomd_readb(IOMD_IRQMASKA
);
15 iomd_writeb(val
& ~mask
, IOMD_IRQMASKA
);
16 iomd_writeb(mask
, IOMD_IRQCLRA
);
19 static void iomd_mask_irq_a(unsigned int irq
)
21 unsigned int val
, mask
;
24 val
= iomd_readb(IOMD_IRQMASKA
);
25 iomd_writeb(val
& ~mask
, IOMD_IRQMASKA
);
28 static void iomd_unmask_irq_a(unsigned int irq
)
30 unsigned int val
, mask
;
33 val
= iomd_readb(IOMD_IRQMASKA
);
34 iomd_writeb(val
| mask
, IOMD_IRQMASKA
);
37 static struct irqchip iomd_a_chip
= {
38 .ack
= iomd_ack_irq_a
,
39 .mask
= iomd_mask_irq_a
,
40 .unmask
= iomd_unmask_irq_a
,
43 static void iomd_mask_irq_b(unsigned int irq
)
45 unsigned int val
, mask
;
47 mask
= 1 << (irq
& 7);
48 val
= iomd_readb(IOMD_IRQMASKB
);
49 iomd_writeb(val
& ~mask
, IOMD_IRQMASKB
);
52 static void iomd_unmask_irq_b(unsigned int irq
)
54 unsigned int val
, mask
;
56 mask
= 1 << (irq
& 7);
57 val
= iomd_readb(IOMD_IRQMASKB
);
58 iomd_writeb(val
| mask
, IOMD_IRQMASKB
);
61 static struct irqchip iomd_b_chip
= {
62 .ack
= iomd_mask_irq_b
,
63 .mask
= iomd_mask_irq_b
,
64 .unmask
= iomd_unmask_irq_b
,
67 static void iomd_mask_irq_dma(unsigned int irq
)
69 unsigned int val
, mask
;
71 mask
= 1 << (irq
& 7);
72 val
= iomd_readb(IOMD_DMAMASK
);
73 iomd_writeb(val
& ~mask
, IOMD_DMAMASK
);
76 static void iomd_unmask_irq_dma(unsigned int irq
)
78 unsigned int val
, mask
;
80 mask
= 1 << (irq
& 7);
81 val
= iomd_readb(IOMD_DMAMASK
);
82 iomd_writeb(val
| mask
, IOMD_DMAMASK
);
85 static struct irqchip iomd_dma_chip
= {
86 .ack
= iomd_mask_irq_dma
,
87 .mask
= iomd_mask_irq_dma
,
88 .unmask
= iomd_unmask_irq_dma
,
91 static void iomd_mask_irq_fiq(unsigned int irq
)
93 unsigned int val
, mask
;
95 mask
= 1 << (irq
& 7);
96 val
= iomd_readb(IOMD_FIQMASK
);
97 iomd_writeb(val
& ~mask
, IOMD_FIQMASK
);
100 static void iomd_unmask_irq_fiq(unsigned int irq
)
102 unsigned int val
, mask
;
104 mask
= 1 << (irq
& 7);
105 val
= iomd_readb(IOMD_FIQMASK
);
106 iomd_writeb(val
| mask
, IOMD_FIQMASK
);
109 static struct irqchip iomd_fiq_chip
= {
110 .ack
= iomd_mask_irq_fiq
,
111 .mask
= iomd_mask_irq_fiq
,
112 .unmask
= iomd_unmask_irq_fiq
,
115 void __init
rpc_init_irq(void)
117 unsigned int irq
, flags
;
119 iomd_writeb(0, IOMD_IRQMASKA
);
120 iomd_writeb(0, IOMD_IRQMASKB
);
121 iomd_writeb(0, IOMD_FIQMASK
);
122 iomd_writeb(0, IOMD_DMAMASK
);
124 for (irq
= 0; irq
< NR_IRQS
; irq
++) {
127 if (irq
<= 6 || (irq
>= 9 && irq
<= 15))
130 if (irq
== 21 || (irq
>= 16 && irq
<= 19) ||
131 irq
== IRQ_KEYBOARDTX
)
132 flags
|= IRQF_NOAUTOEN
;
136 set_irq_chip(irq
, &iomd_a_chip
);
137 set_irq_handler(irq
, do_level_IRQ
);
138 set_irq_flags(irq
, flags
);
142 set_irq_chip(irq
, &iomd_b_chip
);
143 set_irq_handler(irq
, do_level_IRQ
);
144 set_irq_flags(irq
, flags
);
148 set_irq_chip(irq
, &iomd_dma_chip
);
149 set_irq_handler(irq
, do_level_IRQ
);
150 set_irq_flags(irq
, flags
);
154 set_irq_chip(irq
, &iomd_fiq_chip
);
155 set_irq_flags(irq
, IRQF_VALID
);