void mac_enable_irq (unsigned int irq) { int irq_src = IRQ_SRC(irq); switch(irq_src) { case 1: via_irq_enable(irq); break; case 2: case 7: if (oss_present) { oss_irq_enable(irq); } else { via_irq_enable(irq); } break; case 3: case 4: case 5: case 6: if (psc_present) { psc_irq_enable(irq); } else if (oss_present) { oss_irq_enable(irq); } else if (irq_src == 4) { scc_irq_enable(irq); } break; case 8: if (baboon_present) { baboon_irq_enable(irq); } break; } }
void mac_irq_enable(struct irq_data *data) { int irq = data->irq; int irq_src = IRQ_SRC(irq); switch(irq_src) { case 1: via_irq_enable(irq); break; case 2: case 7: if (oss_present) oss_irq_enable(irq); else via_irq_enable(irq); break; case 3: case 5: case 6: if (psc_present) psc_irq_enable(irq); else if (oss_present) oss_irq_enable(irq); break; case 4: if (psc_present) psc_irq_enable(irq); break; case 8: if (baboon_present) baboon_irq_enable(irq); break; } }
void oss_irq_enable(int irq) { #ifdef DEBUG_IRQUSE printk("oss_irq_enable(%d)\n", irq); #endif switch(irq) { case IRQ_MAC_SCC: oss->irq_level[OSS_IOPSCC] = OSS_IRQLEV_IOPSCC; return; case IRQ_MAC_ADB: oss->irq_level[OSS_IOPISM] = OSS_IRQLEV_IOPISM; return; case IRQ_MAC_SCSI: oss->irq_level[OSS_SCSI] = OSS_IRQLEV_SCSI; return; case IRQ_NUBUS_9: case IRQ_NUBUS_A: case IRQ_NUBUS_B: case IRQ_NUBUS_C: case IRQ_NUBUS_D: case IRQ_NUBUS_E: irq -= NUBUS_SOURCE_BASE; oss->irq_level[irq] = OSS_IRQLEV_NUBUS; return; } if (IRQ_SRC(irq) == 1) via_irq_enable(irq); }
void via1_irq(int irq, void *dev_id, struct pt_regs *regs) { int irq_bit, i; unsigned char events, mask; mask = via1[vIER] & 0x7F; if (!(events = via1[vIFR] & mask)) return; for (i = 0, irq_bit = 1 ; i < 7 ; i++, irq_bit <<= 1) if (events & irq_bit) { via1[vIER] = irq_bit; mac_do_irq_list(VIA1_SOURCE_BASE + i, regs); via1[vIFR] = irq_bit; via1[vIER] = irq_bit | 0x80; } #if 0 /* freakin' pmu is doing weird stuff */ if (!oss_present) { /* This (still) seems to be necessary to get IDE working. However, if you enable VBL interrupts, you're screwed... */ /* FIXME: should we check the SLOTIRQ bit before pulling this stunt? */ /* No, it won't be set. that's why we're doing this. */ via_irq_disable(IRQ_MAC_NUBUS); via_irq_clear(IRQ_MAC_NUBUS); mac_do_irq_list(IRQ_MAC_NUBUS, regs); via_irq_enable(IRQ_MAC_NUBUS); } #endif }
void via_nubus_irq_shutdown(int irq) { switch (macintosh_config->via_type) { case MAC_VIA_II: case MAC_VIA_QUADRA: /* Ensure that the umbrella CA1 interrupt remains enabled. */ via_irq_enable(irq); break; case MAC_VIA_IICI: via_irq_disable(irq); break; } }
void via_nubus_irq(int irq, void *dev_id, struct pt_regs *regs) { int irq_bit, i; unsigned char events; if (!(events = ~via2[gBufA] & nubus_active)) return; for (i = 0, irq_bit = 1 ; i < 7 ; i++, irq_bit <<= 1) { if (events & irq_bit) { via_irq_disable(NUBUS_SOURCE_BASE + i); mac_do_irq_list(NUBUS_SOURCE_BASE + i, regs); via_irq_enable(NUBUS_SOURCE_BASE + i); } } }
void via_nubus_irq_startup(int irq) { int irq_idx = IRQ_IDX(irq); switch (macintosh_config->via_type) { case MAC_VIA_II: case MAC_VIA_QUADRA: /* Make the port A line an input. Probably redundant. */ if (macintosh_config->via_type == MAC_VIA_II) { /* The top two bits are RAM size outputs. */ via2[vDirA] &= 0xC0 | ~(1 << irq_idx); } else { /* Allow NuBus slots 9 through F. */ via2[vDirA] &= 0x80 | ~(1 << irq_idx); } /* fall through */ case MAC_VIA_IICI: via_irq_enable(irq); break; } }
irqreturn_t via1_irq(int irq, void *dev_id) { int irq_num; unsigned char irq_bit, events; events = via1[vIFR] & via1[vIER] & 0x7F; if (!events) return IRQ_NONE; irq_num = VIA1_SOURCE_BASE; irq_bit = 1; do { if (events & irq_bit) { via1[vIFR] = irq_bit; m68k_handle_int(irq_num); } ++irq_num; irq_bit <<= 1; } while (events >= irq_bit); #if 0 /* freakin' pmu is doing weird stuff */ if (!oss_present) { /* This (still) seems to be necessary to get IDE working. However, if you enable VBL interrupts, you're screwed... */ /* FIXME: should we check the SLOTIRQ bit before pulling this stunt? */ /* No, it won't be set. that's why we're doing this. */ via_irq_disable(IRQ_MAC_NUBUS); via_irq_clear(IRQ_MAC_NUBUS); m68k_handle_int(IRQ_MAC_NUBUS); via_irq_enable(IRQ_MAC_NUBUS); } #endif return IRQ_HANDLED; }