void via_irq_enable(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); #ifdef DEBUG_IRQUSE printk(KERN_DEBUG "via_irq_enable(%d)\n", irq); #endif if (irq_src == 1) { via1[vIER] = IER_SET_BIT(irq_idx); } else if (irq_src == 2) { if (irq != IRQ_MAC_NUBUS || nubus_disabled == 0) via2[gIER] = IER_SET_BIT(irq_idx); } else if (irq_src == 7) { switch (macintosh_config->via_type) { case MAC_VIA_II: case MAC_VIA_QUADRA: nubus_disabled &= ~(1 << irq_idx); /* Enable the CA1 interrupt when no slot is disabled. */ if (!nubus_disabled) via2[gIER] = IER_SET_BIT(1); break; case MAC_VIA_IICI: /* On RBV, enable the slot interrupt. * SIER works like IER. */ via2[rSIER] = IER_SET_BIT(irq_idx); break; } } }
void via_irq_disable(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int irq_bit = 1 << irq_idx; #ifdef DEBUG_IRQUSE printk(KERN_DEBUG "via_irq_disable(%d)\n", irq); #endif if (irq_src == 1) { via1[vIER] = irq_bit; } else if (irq_src == 2) { via2[gIER] = irq_bit; } else if (irq_src == 7) { if (rbv_present) { /* disable the slot interrupt. SIER works like IER. */ via2[rSIER] = IER_CLR_BIT(irq_idx); } else { /* disable the nubus irq by changing dir to output */ /* except on PMU */ if ((macintosh_config->adb_type != MAC_ADB_PB1) && (macintosh_config->adb_type != MAC_ADB_PB2)) { via2[vDirA] |= irq_bit; } } nubus_active &= ~irq_bit; } }
void psc_irq_clear(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int pIFR = pIERbase + (irq_src << 4); psc_write_byte(pIFR, 1 << irq_idx); }
void mac_disable_irq (unsigned int irq) { int irq_src = IRQ_SRC(irq); switch(irq_src) { case 1: via_irq_disable(irq); break; case 2: case 7: if (oss_present) { oss_irq_disable(irq); } else { via_irq_disable(irq); } break; case 3: case 4: case 5: case 6: if (psc_present) { psc_irq_disable(irq); } else if (oss_present) { oss_irq_disable(irq); } else if (irq_src == 4) { scc_irq_disable(irq); } break; case 8: if (baboon_present) { baboon_irq_disable(irq); } break; } }
static 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_clear_irq( unsigned int irq ) { switch(IRQ_SRC(irq)) { case 1: via_irq_clear(irq); break; case 2: case 7: if (oss_present) { oss_irq_clear(irq); } else { via_irq_clear(irq); } break; case 3: case 4: case 5: case 6: if (psc_present) { psc_irq_clear(irq); } else if (oss_present) { oss_irq_clear(irq); } break; case 8: if (baboon_present) { baboon_irq_clear(irq); } break; } }
int mac_irq_pending(unsigned int irq) { switch(IRQ_SRC(irq)) { case 1: return via_irq_pending(irq); case 2: case 7: if (oss_present) return oss_irq_pending(irq); else return via_irq_pending(irq); case 3: case 5: case 6: if (psc_present) return psc_irq_pending(irq); else if (oss_present) return oss_irq_pending(irq); break; case 4: if (psc_present) return psc_irq_pending(irq); break; } return 0; }
void mac_irq_disable(struct irq_data *data) { int irq = data->irq; int irq_src = IRQ_SRC(irq); switch(irq_src) { case 1: via_irq_disable(irq); break; case 2: case 7: if (oss_present) oss_irq_disable(irq); else via_irq_disable(irq); break; case 3: case 5: case 6: if (psc_present) psc_irq_disable(irq); else if (oss_present) oss_irq_disable(irq); break; case 4: if (psc_present) psc_irq_disable(irq); break; case 8: if (baboon_present) baboon_irq_disable(irq); break; } }
void oss_irq_disable(int irq) { #ifdef DEBUG_IRQUSE printk("oss_irq_disable(%d)\n", irq); #endif switch(irq) { case IRQ_MAC_SCC: oss->irq_level[OSS_IOPSCC] = 0; return; case IRQ_MAC_ADB: oss->irq_level[OSS_IOPISM] = 0; return; case IRQ_MAC_SCSI: oss->irq_level[OSS_SCSI] = 0; 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] = 0; return; } if (IRQ_SRC(irq) == 1) via_irq_disable(irq); }
void via_irq_disable(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); #ifdef DEBUG_IRQUSE printk(KERN_DEBUG "via_irq_disable(%d)\n", irq); #endif if (irq_src == 1) { via1[vIER] = IER_CLR_BIT(irq_idx); } else if (irq_src == 2) { via2[gIER] = IER_CLR_BIT(irq_idx); } else if (irq_src == 7) { switch (macintosh_config->via_type) { case MAC_VIA_II: case MAC_VIA_QUADRA: nubus_disabled |= 1 << irq_idx; if (nubus_disabled) via2[gIER] = IER_CLR_BIT(1); break; case MAC_VIA_IICI: via2[rSIER] = IER_CLR_BIT(irq_idx); break; } } }
int psc_irq_pending(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int pIFR = pIERbase + (irq_src << 4); return psc_read_byte(pIFR) & (1 << irq_idx); }
void psc_irq_disable(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int pIER = pIERbase + (irq_src << 4); #ifdef DEBUG_IRQUSE printk("psc_irq_disable(%d)\n", irq); #endif psc_write_byte(pIER, 1 << irq_idx); }
void via_irq_enable(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int irq_bit = 1 << irq_idx; #ifdef DEBUG_IRQUSE printk(KERN_DEBUG "via_irq_enable(%d)\n", irq); #endif if (irq_src == 1) { via1[vIER] = irq_bit | 0x80; } else if (irq_src == 2) { /* * Set vPCR for SCSI interrupts (but not on RBV) */ if ((irq_idx == 0) && !rbv_present) { if (macintosh_config->scsi_type == MAC_SCSI_OLD) { /* CB2 (IRQ) indep. input, positive edge */ /* CA2 (DRQ) indep. input, positive edge */ via2[vPCR] = 0x66; } else { /* CB2 (IRQ) indep. input, negative edge */ /* CA2 (DRQ) indep. input, negative edge */ via2[vPCR] = 0x22; } } via2[gIER] = irq_bit | 0x80; } else if (irq_src == 7) { if (rbv_present) { /* enable the slot interrupt. SIER works like IER. */ via2[rSIER] = IER_SET_BIT(irq_idx); } else { /* Make sure the bit is an input, to enable the irq */ /* But not on PowerBooks, that's ADB... */ if ((macintosh_config->adb_type != MAC_ADB_PB1) && (macintosh_config->adb_type != MAC_ADB_PB2)) { switch(macintosh_config->ident) { case MAC_MODEL_II: case MAC_MODEL_IIX: case MAC_MODEL_IICX: case MAC_MODEL_SE30: via2[vDirA] &= (~irq_bit | 0xc0); break; default: via2[vDirA] &= ~irq_bit; } } } nubus_active |= irq_bit; } }
void via_irq_clear(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int irq_bit = 1 << irq_idx; if (irq_src == 1) { via1[vIFR] = irq_bit; } else if (irq_src == 2) { via2[gIFR] = irq_bit | rbv_clear; } else if (irq_src == 7) { /* FIXME: hmm.. */ } }
void via_irq_clear(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int irq_bit = 1 << irq_idx; if (irq_src == 1) { via1[vIFR] = irq_bit; } else if (irq_src == 2) { via2[gIFR] = irq_bit | rbv_clear; } else if (irq_src == 7) { /* FIXME: There is no way to clear an individual nubus slot * IRQ flag, other than getting the device to do it. */ } }
int via_irq_pending(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int irq_bit = 1 << irq_idx; if (irq_src == 1) { return via1[vIFR] & irq_bit; } else if (irq_src == 2) { return via2[gIFR] & irq_bit; } else if (irq_src == 7) { return ~via2[gBufA] & irq_bit; } return 0; }
int via_irq_pending(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int irq_bit = 1 << irq_idx; if (irq_src == 1) { return via1[vIFR] & irq_bit; } else if (irq_src == 2) { return via2[gIFR] & irq_bit; } else if (irq_src == 7) { /* Always 0 for MAC_VIA_QUADRA if the slot irq is disabled. */ return ~via2[gBufA] & irq_bit; } return 0; }
void via_irq_enable(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); #ifdef DEBUG_IRQUSE printk(KERN_DEBUG "via_irq_enable(%d)\n", irq); #endif if (irq_src == 1) { via1[vIER] = IER_SET_BIT(irq_idx); } else if (irq_src == 2) { if (irq != IRQ_MAC_NUBUS || nubus_disabled == 0) via2[gIER] = IER_SET_BIT(irq_idx); } else if (irq_src == 7) { switch (macintosh_config->via_type) { case MAC_VIA_II: nubus_disabled &= ~(1 << irq_idx); /* Enable the CA1 interrupt when no slot is disabled. */ if (!nubus_disabled) via2[gIER] = IER_SET_BIT(1); break; case MAC_VIA_IIci: /* On RBV, enable the slot interrupt. * SIER works like IER. */ via2[rSIER] = IER_SET_BIT(irq_idx); break; case MAC_VIA_QUADRA: /* Make the port A line an input to enable the slot irq. * But not on PowerBooks, that's ADB. */ if ((macintosh_config->adb_type != MAC_ADB_PB1) && (macintosh_config->adb_type != MAC_ADB_PB2)) via2[vDirA] &= ~(1 << irq_idx); break; } } }
void via_irq_enable(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int irq_bit = 1 << irq_idx; #ifdef DEBUG_IRQUSE printk("via_irq_enable(%d)\n", irq); #endif if (irq_src == 1) { via1[vIER] = irq_bit | 0x80; } else if (irq_src == 2) { /* * Set vPCR for SCSI interrupts (but not on RBV) */ if ((irq_idx == 0) && !rbv_present) { if (macintosh_config->scsi_type == MAC_SCSI_OLD) { /* CB2 (IRQ) indep. input, positive edge */ /* CA2 (DRQ) indep. input, positive edge */ via2[vPCR] = 0x66; } else { /* CB2 (IRQ) indep. input, negative edge */ /* CA2 (DRQ) indep. input, negative edge */ via2[vPCR] = 0x22; } } via2[gIER] = irq_bit | 0x80; } else if (irq_src == 7) { if (rbv_present) { /* enable the slot interrupt. SIER works like IER. */ via2[rSIER] = IER_SET_BIT(irq_idx); } else { /* Make sure the bit is an input, to enable the irq */ via2[vDirA] &= ~irq_bit; } nubus_active |= irq_bit; } }
void via_irq_disable(int irq) { int irq_src = IRQ_SRC(irq); int irq_idx = IRQ_IDX(irq); int irq_bit = 1 << irq_idx; #ifdef DEBUG_IRQUSE printk("via_irq_disable(%d)\n", irq); #endif if (irq_src == 1) { via1[vIER] = irq_bit; } else if (irq_src == 2) { via2[gIER] = irq_bit; } else if (irq_src == 7) { if (rbv_present) { /* disable the slot interrupt. SIER works like IER. */ via2[rSIER] = IER_CLR_BIT(irq_idx); } else { /* disable the nubus irq by changing dir to output */ via2[vDirA] |= irq_bit; } nubus_active &= ~irq_bit; } }
int show_mac_interrupts(struct seq_file *p, void *v) { int i; irq_node_t *node; char *base; /* Don't do Nubus interrupts in this loop; we do them separately */ /* below so that we can print slot numbers instead of IRQ numbers */ for (i = VIA1_SOURCE_BASE ; i < NUM_MAC_SOURCES ; ++i) { /* Nonexistant interrupt or nothing registered; skip it. */ if ((node = mac_irq_list[i]) == NULL) continue; if (node->flags & IRQ_FLG_STD) continue; base = ""; switch(IRQ_SRC(i)) { case 1: base = "via1"; break; case 2: if (oss_present) { base = "oss"; } else { base = "via2"; } break; case 3: case 4: case 5: case 6: if (psc_present) { base = "psc"; } else if (oss_present) { base = "oss"; } else { if (IRQ_SRC(i) == 4) base = "scc"; } break; case 7: base = "nbus"; break; case 8: base = "bbn"; break; } seq_printf(p, "%4s %2d: %10u ", base, i, kstat_cpu(0).irqs[i]); do { if (node->flags & IRQ_FLG_FAST) { seq_puts(p, "F "); } else if (node->flags & IRQ_FLG_SLOW) { seq_puts(p, "S "); } else { seq_puts(p, " "); } seq_printf(p, "%s\n", node->devname); if ((node = node->next)) { seq_puts(p, " "); } } while(node); } return 0; }