131
131
static uint64_t crime_mask;
133
static inline void crime_enable_irq(unsigned int irq)
133
static inline void crime_enable_irq(struct irq_data *d)
135
unsigned int bit = irq - CRIME_IRQ_BASE;
135
unsigned int bit = d->irq - CRIME_IRQ_BASE;
137
137
crime_mask |= 1 << bit;
138
138
crime->imask = crime_mask;
141
static inline void crime_disable_irq(unsigned int irq)
141
static inline void crime_disable_irq(struct irq_data *d)
143
unsigned int bit = irq - CRIME_IRQ_BASE;
143
unsigned int bit = d->irq - CRIME_IRQ_BASE;
145
145
crime_mask &= ~(1 << bit);
146
146
crime->imask = crime_mask;
147
147
flush_crime_bus();
150
static void crime_level_mask_and_ack_irq(unsigned int irq)
152
crime_disable_irq(irq);
155
static void crime_level_end_irq(unsigned int irq)
157
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
158
crime_enable_irq(irq);
161
150
static struct irq_chip crime_level_interrupt = {
162
151
.name = "IP32 CRIME",
163
.ack = crime_level_mask_and_ack_irq,
164
.mask = crime_disable_irq,
165
.mask_ack = crime_level_mask_and_ack_irq,
166
.unmask = crime_enable_irq,
167
.end = crime_level_end_irq,
152
.irq_mask = crime_disable_irq,
153
.irq_unmask = crime_enable_irq,
170
static void crime_edge_mask_and_ack_irq(unsigned int irq)
156
static void crime_edge_mask_and_ack_irq(struct irq_data *d)
172
unsigned int bit = irq - CRIME_IRQ_BASE;
158
unsigned int bit = d->irq - CRIME_IRQ_BASE;
173
159
uint64_t crime_int;
175
161
/* Edge triggered interrupts must be cleared. */
177
162
crime_int = crime->hard_int;
178
163
crime_int &= ~(1 << bit);
179
164
crime->hard_int = crime_int;
181
crime_disable_irq(irq);
184
static void crime_edge_end_irq(unsigned int irq)
186
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
187
crime_enable_irq(irq);
166
crime_disable_irq(d);
190
169
static struct irq_chip crime_edge_interrupt = {
191
170
.name = "IP32 CRIME",
192
.ack = crime_edge_mask_and_ack_irq,
193
.mask = crime_disable_irq,
194
.mask_ack = crime_edge_mask_and_ack_irq,
195
.unmask = crime_enable_irq,
196
.end = crime_edge_end_irq,
171
.irq_ack = crime_edge_mask_and_ack_irq,
172
.irq_mask = crime_disable_irq,
173
.irq_mask_ack = crime_edge_mask_and_ack_irq,
174
.irq_unmask = crime_enable_irq,
205
183
static unsigned long macepci_mask;
207
static void enable_macepci_irq(unsigned int irq)
185
static void enable_macepci_irq(struct irq_data *d)
209
macepci_mask |= MACEPCI_CONTROL_INT(irq - MACEPCI_SCSI0_IRQ);
187
macepci_mask |= MACEPCI_CONTROL_INT(d->irq - MACEPCI_SCSI0_IRQ);
210
188
mace->pci.control = macepci_mask;
211
crime_mask |= 1 << (irq - CRIME_IRQ_BASE);
189
crime_mask |= 1 << (d->irq - CRIME_IRQ_BASE);
212
190
crime->imask = crime_mask;
215
static void disable_macepci_irq(unsigned int irq)
193
static void disable_macepci_irq(struct irq_data *d)
217
crime_mask &= ~(1 << (irq - CRIME_IRQ_BASE));
195
crime_mask &= ~(1 << (d->irq - CRIME_IRQ_BASE));
218
196
crime->imask = crime_mask;
219
197
flush_crime_bus();
220
macepci_mask &= ~MACEPCI_CONTROL_INT(irq - MACEPCI_SCSI0_IRQ);
198
macepci_mask &= ~MACEPCI_CONTROL_INT(d->irq - MACEPCI_SCSI0_IRQ);
221
199
mace->pci.control = macepci_mask;
222
200
flush_mace_bus();
225
static void end_macepci_irq(unsigned int irq)
227
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
228
enable_macepci_irq(irq);
231
203
static struct irq_chip ip32_macepci_interrupt = {
232
204
.name = "IP32 MACE PCI",
233
.ack = disable_macepci_irq,
234
.mask = disable_macepci_irq,
235
.mask_ack = disable_macepci_irq,
236
.unmask = enable_macepci_irq,
237
.end = end_macepci_irq,
205
.irq_mask = disable_macepci_irq,
206
.irq_unmask = enable_macepci_irq,
240
209
/* This is used for MACE ISA interrupts. That means bits 4-6 in the
277
246
static unsigned long maceisa_mask;
279
static void enable_maceisa_irq(unsigned int irq)
248
static void enable_maceisa_irq(struct irq_data *d)
281
250
unsigned int crime_int = 0;
283
pr_debug("maceisa enable: %u\n", irq);
252
pr_debug("maceisa enable: %u\n", d->irq);
286
255
case MACEISA_AUDIO_SW_IRQ ... MACEISA_AUDIO3_MERR_IRQ:
287
256
crime_int = MACE_AUDIO_INT;
296
265
pr_debug("crime_int %08x enabled\n", crime_int);
297
266
crime_mask |= crime_int;
298
267
crime->imask = crime_mask;
299
maceisa_mask |= 1 << (irq - MACEISA_AUDIO_SW_IRQ);
268
maceisa_mask |= 1 << (d->irq - MACEISA_AUDIO_SW_IRQ);
300
269
mace->perif.ctrl.imask = maceisa_mask;
303
static void disable_maceisa_irq(unsigned int irq)
272
static void disable_maceisa_irq(struct irq_data *d)
305
274
unsigned int crime_int = 0;
307
maceisa_mask &= ~(1 << (irq - MACEISA_AUDIO_SW_IRQ));
276
maceisa_mask &= ~(1 << (d->irq - MACEISA_AUDIO_SW_IRQ));
308
277
if (!(maceisa_mask & MACEISA_AUDIO_INT))
309
278
crime_int |= MACE_AUDIO_INT;
310
279
if (!(maceisa_mask & MACEISA_MISC_INT))
318
287
flush_mace_bus();
321
static void mask_and_ack_maceisa_irq(unsigned int irq)
290
static void mask_and_ack_maceisa_irq(struct irq_data *d)
323
292
unsigned long mace_int;
325
294
/* edge triggered */
326
295
mace_int = mace->perif.ctrl.istat;
327
mace_int &= ~(1 << (irq - MACEISA_AUDIO_SW_IRQ));
296
mace_int &= ~(1 << (d->irq - MACEISA_AUDIO_SW_IRQ));
328
297
mace->perif.ctrl.istat = mace_int;
330
disable_maceisa_irq(irq);
333
static void end_maceisa_irq(unsigned irq)
335
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
336
enable_maceisa_irq(irq);
299
disable_maceisa_irq(d);
339
302
static struct irq_chip ip32_maceisa_level_interrupt = {
340
303
.name = "IP32 MACE ISA",
341
.ack = disable_maceisa_irq,
342
.mask = disable_maceisa_irq,
343
.mask_ack = disable_maceisa_irq,
344
.unmask = enable_maceisa_irq,
345
.end = end_maceisa_irq,
304
.irq_mask = disable_maceisa_irq,
305
.irq_unmask = enable_maceisa_irq,
348
308
static struct irq_chip ip32_maceisa_edge_interrupt = {
349
309
.name = "IP32 MACE ISA",
350
.ack = mask_and_ack_maceisa_irq,
351
.mask = disable_maceisa_irq,
352
.mask_ack = mask_and_ack_maceisa_irq,
353
.unmask = enable_maceisa_irq,
354
.end = end_maceisa_irq,
310
.irq_ack = mask_and_ack_maceisa_irq,
311
.irq_mask = disable_maceisa_irq,
312
.irq_mask_ack = mask_and_ack_maceisa_irq,
313
.irq_unmask = enable_maceisa_irq,
357
316
/* This is used for regular non-ISA, non-PCI MACE interrupts. That means
358
317
* bits 0-3 and 7 in the CRIME register.
361
static void enable_mace_irq(unsigned int irq)
320
static void enable_mace_irq(struct irq_data *d)
363
unsigned int bit = irq - CRIME_IRQ_BASE;
322
unsigned int bit = d->irq - CRIME_IRQ_BASE;
365
324
crime_mask |= (1 << bit);
366
325
crime->imask = crime_mask;
369
static void disable_mace_irq(unsigned int irq)
328
static void disable_mace_irq(struct irq_data *d)
371
unsigned int bit = irq - CRIME_IRQ_BASE;
330
unsigned int bit = d->irq - CRIME_IRQ_BASE;
373
332
crime_mask &= ~(1 << bit);
374
333
crime->imask = crime_mask;
375
334
flush_crime_bus();
378
static void end_mace_irq(unsigned int irq)
380
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
381
enable_mace_irq(irq);
384
337
static struct irq_chip ip32_mace_interrupt = {
385
338
.name = "IP32 MACE",
386
.ack = disable_mace_irq,
387
.mask = disable_mace_irq,
388
.mask_ack = disable_mace_irq,
389
.unmask = enable_mace_irq,
339
.irq_mask = disable_mace_irq,
340
.irq_unmask = enable_mace_irq,
393
343
static void ip32_unknown_interrupt(void)
501
451
for (irq = CRIME_IRQ_BASE; irq <= IP32_IRQ_MAX; irq++) {
503
453
case MACE_VID_IN1_IRQ ... MACE_PCI_BRIDGE_IRQ:
504
set_irq_chip_and_handler_name(irq,&ip32_mace_interrupt,
505
handle_level_irq, "level");
454
irq_set_chip_and_handler_name(irq,
455
&ip32_mace_interrupt,
508
460
case MACEPCI_SCSI0_IRQ ... MACEPCI_SHARED2_IRQ:
509
set_irq_chip_and_handler_name(irq,
510
&ip32_macepci_interrupt, handle_level_irq,
461
irq_set_chip_and_handler_name(irq,
462
&ip32_macepci_interrupt,
514
467
case CRIME_CPUERR_IRQ:
515
468
case CRIME_MEMERR_IRQ:
516
set_irq_chip_and_handler_name(irq,
517
&crime_level_interrupt, handle_level_irq,
469
irq_set_chip_and_handler_name(irq,
470
&crime_level_interrupt,
521
475
case CRIME_GBE0_IRQ ... CRIME_GBE3_IRQ:
522
476
case CRIME_RE_EMPTY_E_IRQ ... CRIME_RE_IDLE_E_IRQ:
523
477
case CRIME_SOFT0_IRQ ... CRIME_SOFT2_IRQ:
524
478
case CRIME_VICE_IRQ:
525
set_irq_chip_and_handler_name(irq,
526
&crime_edge_interrupt, handle_edge_irq, "edge");
479
irq_set_chip_and_handler_name(irq,
480
&crime_edge_interrupt,
529
485
case MACEISA_PARALLEL_IRQ:
530
486
case MACEISA_SERIAL1_TDMAPR_IRQ:
531
487
case MACEISA_SERIAL2_TDMAPR_IRQ:
532
set_irq_chip_and_handler_name(irq,
533
&ip32_maceisa_edge_interrupt, handle_edge_irq,
488
irq_set_chip_and_handler_name(irq,
489
&ip32_maceisa_edge_interrupt,
538
set_irq_chip_and_handler_name(irq,
539
&ip32_maceisa_level_interrupt, handle_level_irq,
495
irq_set_chip_and_handler_name(irq,
496
&ip32_maceisa_level_interrupt,