13 #include <linux/types.h>
16 #include <linux/bitops.h>
17 #include <linux/kernel.h>
19 #include <linux/random.h>
20 #include <linux/sched.h>
24 #include <asm/signal.h>
31 static void inline flush_crime_bus(
void)
36 static void inline flush_mace_bus(
void)
38 mace->perif.ctrl.misc;
115 .name =
"CRIME memory error",
120 .name =
"CRIME CPU error",
130 static inline void crime_enable_irq(
struct irq_data *
d)
134 crime_mask |= 1 <<
bit;
135 crime->imask = crime_mask;
138 static inline void crime_disable_irq(
struct irq_data *
d)
142 crime_mask &= ~(1 <<
bit);
143 crime->imask = crime_mask;
147 static struct irq_chip crime_level_interrupt = {
148 .name =
"IP32 CRIME",
149 .irq_mask = crime_disable_irq,
150 .irq_unmask = crime_enable_irq,
153 static void crime_edge_mask_and_ack_irq(
struct irq_data *
d)
159 crime_int =
crime->hard_int;
160 crime_int &= ~(1 <<
bit);
161 crime->hard_int = crime_int;
163 crime_disable_irq(d);
166 static struct irq_chip crime_edge_interrupt = {
167 .name =
"IP32 CRIME",
168 .irq_ack = crime_edge_mask_and_ack_irq,
169 .irq_mask = crime_disable_irq,
170 .irq_mask_ack = crime_edge_mask_and_ack_irq,
171 .irq_unmask = crime_enable_irq,
180 static unsigned long macepci_mask;
182 static void enable_macepci_irq(
struct irq_data *
d)
185 mace->pci.control = macepci_mask;
187 crime->imask = crime_mask;
190 static void disable_macepci_irq(
struct irq_data *
d)
193 crime->imask = crime_mask;
196 mace->pci.control = macepci_mask;
200 static struct irq_chip ip32_macepci_interrupt = {
201 .name =
"IP32 MACE PCI",
202 .irq_mask = disable_macepci_irq,
203 .irq_unmask = enable_macepci_irq,
210 #define MACEISA_AUDIO_INT (MACEISA_AUDIO_SW_INT | \
211 MACEISA_AUDIO_SC_INT | \
212 MACEISA_AUDIO1_DMAT_INT | \
213 MACEISA_AUDIO1_OF_INT | \
214 MACEISA_AUDIO2_DMAT_INT | \
215 MACEISA_AUDIO2_MERR_INT | \
216 MACEISA_AUDIO3_DMAT_INT | \
217 MACEISA_AUDIO3_MERR_INT)
218 #define MACEISA_MISC_INT (MACEISA_RTC_INT | \
220 MACEISA_KEYB_POLL_INT | \
221 MACEISA_MOUSE_INT | \
222 MACEISA_MOUSE_POLL_INT | \
223 MACEISA_TIMER0_INT | \
224 MACEISA_TIMER1_INT | \
226 #define MACEISA_SUPERIO_INT (MACEISA_PARALLEL_INT | \
227 MACEISA_PAR_CTXA_INT | \
228 MACEISA_PAR_CTXB_INT | \
229 MACEISA_PAR_MERR_INT | \
230 MACEISA_SERIAL1_INT | \
231 MACEISA_SERIAL1_TDMAT_INT | \
232 MACEISA_SERIAL1_TDMAPR_INT | \
233 MACEISA_SERIAL1_TDMAME_INT | \
234 MACEISA_SERIAL1_RDMAT_INT | \
235 MACEISA_SERIAL1_RDMAOR_INT | \
236 MACEISA_SERIAL2_INT | \
237 MACEISA_SERIAL2_TDMAT_INT | \
238 MACEISA_SERIAL2_TDMAPR_INT | \
239 MACEISA_SERIAL2_TDMAME_INT | \
240 MACEISA_SERIAL2_RDMAT_INT | \
241 MACEISA_SERIAL2_RDMAOR_INT)
243 static unsigned long maceisa_mask;
245 static void enable_maceisa_irq(
struct irq_data *
d)
247 unsigned int crime_int = 0;
262 pr_debug(
"crime_int %08x enabled\n", crime_int);
263 crime_mask |= crime_int;
264 crime->imask = crime_mask;
266 mace->perif.ctrl.imask = maceisa_mask;
269 static void disable_maceisa_irq(
struct irq_data *
d)
271 unsigned int crime_int = 0;
280 crime_mask &= ~crime_int;
281 crime->imask = crime_mask;
283 mace->perif.ctrl.imask = maceisa_mask;
287 static void mask_and_ack_maceisa_irq(
struct irq_data *d)
289 unsigned long mace_int;
292 mace_int =
mace->perif.ctrl.istat;
294 mace->perif.ctrl.istat = mace_int;
296 disable_maceisa_irq(d);
299 static struct irq_chip ip32_maceisa_level_interrupt = {
300 .name =
"IP32 MACE ISA",
301 .irq_mask = disable_maceisa_irq,
302 .irq_unmask = enable_maceisa_irq,
305 static struct irq_chip ip32_maceisa_edge_interrupt = {
306 .name =
"IP32 MACE ISA",
307 .irq_ack = mask_and_ack_maceisa_irq,
308 .irq_mask = disable_maceisa_irq,
309 .irq_mask_ack = mask_and_ack_maceisa_irq,
310 .irq_unmask = enable_maceisa_irq,
317 static void enable_mace_irq(
struct irq_data *d)
321 crime_mask |= (1 <<
bit);
322 crime->imask = crime_mask;
325 static void disable_mace_irq(
struct irq_data *d)
329 crime_mask &= ~(1 <<
bit);
330 crime->imask = crime_mask;
334 static struct irq_chip ip32_mace_interrupt = {
336 .irq_mask = disable_mace_irq,
337 .irq_unmask = enable_mace_irq,
340 static void ip32_unknown_interrupt(
void)
342 printk(
"Unknown interrupt occurred!\n");
346 printk(
"CRIME intr status: %016lx\n",
crime->istat);
347 printk(
"CRIME hardware intr register: %016lx\n",
crime->hard_int);
348 printk(
"MACE ISA intr mask: %08lx\n",
mace->perif.ctrl.imask);
349 printk(
"MACE ISA intr status: %08lx\n",
mace->perif.ctrl.istat);
350 printk(
"MACE PCI control register: %08x\n",
mace->pci.control);
352 printk(
"Register dump:\n");
362 static void ip32_irq0(
void)
375 crime_int =
crime->istat & crime_mask;
384 unsigned long mace_int =
mace->perif.ctrl.istat;
392 static void ip32_irq1(
void)
394 ip32_unknown_interrupt();
397 static void ip32_irq2(
void)
399 ip32_unknown_interrupt();
402 static void ip32_irq3(
void)
404 ip32_unknown_interrupt();
407 static void ip32_irq4(
void)
409 ip32_unknown_interrupt();
412 static void ip32_irq5(
void)
444 mace->perif.ctrl.istat = 0;
445 mace->perif.ctrl.imask = 0;
452 &ip32_mace_interrupt,
459 &ip32_macepci_interrupt,
467 &crime_level_interrupt,
477 &crime_edge_interrupt,
486 &ip32_maceisa_edge_interrupt,
493 &ip32_maceisa_level_interrupt,
502 #define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5)