2 * linux/include/asm-arm/arch-rpc/irq.h
4 * Copyright (C) 1996 Russell King
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 * 10-10-1996 RMK Brought up to date with arch-sa110eval
12 * 22-08-1998 RMK Restructured IRQ routines
14 #include <asm/hardware/iomd.h>
17 #define fixup_irq(x) (x)
19 static void rpc_mask_irq_ack_a(unsigned int irq)
21 unsigned int val, mask;
24 val = iomd_readb(IOMD_IRQMASKA);
25 iomd_writeb(val & ~mask, IOMD_IRQMASKA);
26 iomd_writeb(mask, IOMD_IRQCLRA);
29 static void rpc_mask_irq_a(unsigned int irq)
31 unsigned int val, mask;
34 val = iomd_readb(IOMD_IRQMASKA);
35 iomd_writeb(val & ~mask, IOMD_IRQMASKA);
38 static void rpc_unmask_irq_a(unsigned int irq)
40 unsigned int val, mask;
43 val = iomd_readb(IOMD_IRQMASKA);
44 iomd_writeb(val | mask, IOMD_IRQMASKA);
47 static void rpc_mask_irq_b(unsigned int irq)
49 unsigned int val, mask;
51 mask = 1 << (irq & 7);
52 val = iomd_readb(IOMD_IRQMASKB);
53 iomd_writeb(val & ~mask, IOMD_IRQMASKB);
56 static void rpc_unmask_irq_b(unsigned int irq)
58 unsigned int val, mask;
60 mask = 1 << (irq & 7);
61 val = iomd_readb(IOMD_IRQMASKB);
62 iomd_writeb(val | mask, IOMD_IRQMASKB);
67 static void rpc_mask_irq_c(unsigned int irq)
69 unsigned int val, mask;
71 mask = 1 << (irq & 7);
72 val = iomd_readb(IOMD_IRQMASKC);
73 iomd_writeb(val & ~mask, IOMD_IRQMASKC);
76 static void rpc_unmask_irq_c(unsigned int irq)
78 unsigned int val, mask;
80 mask = 1 << (irq & 7);
81 val = iomd_readb(IOMD_IRQMASKC);
82 iomd_writeb(val | mask, IOMD_IRQMASKC);
85 static void rpc_mask_irq_d(unsigned int irq)
87 unsigned int val, mask;
89 mask = 1 << (irq & 7);
90 val = iomd_readb(IOMD_IRQMASKD);
91 iomd_writeb(val & ~mask, IOMD_IRQMASKD);
94 static void rpc_unmask_irq_d(unsigned int irq)
96 unsigned int val, mask;
98 mask = 1 << (irq & 7);
99 val = iomd_readb(IOMD_IRQMASKD);
100 iomd_writeb(val | mask, IOMD_IRQMASKD);
103 static void rpc_mask_irq_dma(unsigned int irq)
105 unsigned int val, mask;
107 mask = 1 << (irq & 7);
108 val = iomd_readb(IOMD_DMAMASK);
109 iomd_writeb(val & ~mask, IOMD_DMAMASK);
112 static void rpc_unmask_irq_dma(unsigned int irq)
114 unsigned int val, mask;
116 mask = 1 << (irq & 7);
117 val = iomd_readb(IOMD_DMAMASK);
118 iomd_writeb(val | mask, IOMD_DMAMASK);
121 static void rpc_mask_irq_fiq(unsigned int irq)
123 unsigned int val, mask;
125 mask = 1 << (irq & 7);
126 val = iomd_readb(IOMD_FIQMASK);
127 iomd_writeb(val & ~mask, IOMD_FIQMASK);
130 static void rpc_unmask_irq_fiq(unsigned int irq)
132 unsigned int val, mask;
134 mask = 1 << (irq & 7);
135 val = iomd_readb(IOMD_FIQMASK);
136 iomd_writeb(val | mask, IOMD_FIQMASK);
139 static __inline__ void irq_init_irq(void)
143 iomd_writeb(0, IOMD_IRQMASKA);
144 iomd_writeb(0, IOMD_IRQMASKB);
145 iomd_writeb(0, IOMD_IRQMASKC);
146 iomd_writeb(0, IOMD_IRQMASKD);
148 iomd_writeb(0xff, IOMD_IOLINES);
150 iomd_writeb(0, IOMD_FIQMASK);
151 iomd_writeb(0, IOMD_DMAMASK);
153 for (irq = 0; irq < NR_IRQS; irq++) {
156 irq_desc[irq].probe_ok = 1;
158 irq_desc[irq].valid = 1;
159 irq_desc[irq].mask_ack = rpc_mask_irq_ack_a;
160 irq_desc[irq].mask = rpc_mask_irq_a;
161 irq_desc[irq].unmask = rpc_unmask_irq_a;
165 irq_desc[irq].probe_ok = 1;
167 irq_desc[irq].valid = 1;
168 irq_desc[irq].mask_ack = rpc_mask_irq_b;
169 irq_desc[irq].mask = rpc_mask_irq_b;
170 irq_desc[irq].unmask = rpc_unmask_irq_b;
175 irq_desc[irq].noautoenable = 1;
177 irq_desc[irq].valid = 1;
178 irq_desc[irq].mask_ack = rpc_mask_irq_dma;
179 irq_desc[irq].mask = rpc_mask_irq_dma;
180 irq_desc[irq].unmask = rpc_unmask_irq_dma;
184 irq_desc[irq].valid = 1;
185 irq_desc[irq].mask_ack = rpc_mask_irq_c;
186 irq_desc[irq].mask = rpc_mask_irq_c;
187 irq_desc[irq].unmask = rpc_unmask_irq_c;
191 irq_desc[irq].valid = 1;
192 irq_desc[irq].mask_ack = rpc_mask_irq_d;
193 irq_desc[irq].mask = rpc_mask_irq_d;
194 irq_desc[irq].unmask = rpc_unmask_irq_d;
198 irq_desc[irq].valid = 1;
199 irq_desc[irq].mask_ack = rpc_mask_irq_fiq;
200 irq_desc[irq].mask = rpc_mask_irq_fiq;
201 irq_desc[irq].unmask = rpc_unmask_irq_fiq;
206 irq_desc[IRQ_KEYBOARDTX].noautoenable = 1;