void enable_irq(unsigned int irq_nr) { unsigned int n = irq_nr; if(n >= SGINT_END) { printk("whee, invalid irq_nr %d\n", irq_nr); panic("IRQ, you lose..."); } if(n >= SGINT_LOCAL0 && n < SGINT_GIO) { enable_local_irq(n - SGINT_LOCAL0); } else if(n >= SGINT_GIO && n < SGINT_HPCDMA) { enable_gio_irq(n - SGINT_GIO); } else if(n >= SGINT_HPCDMA && n < SGINT_END) { enable_hpcdma_irq(n - SGINT_HPCDMA); } else { panic("how did I get here?"); } }
void enable_local_irq(unsigned int irq_nr) { unsigned long flags; save_and_cli(flags); switch(irq_nr) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: ioc_icontrol->imask0 |= (1 << irq_nr); break; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: ioc_icontrol->imask1 |= (1 << (irq_nr - 8)); break; case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: enable_local_irq(7); ioc_icontrol->cmeimask0 |= (1 << (irq_nr - 16)); break; default: printk("Yeeee, got passed irq_nr %d at disable_irq\n", irq_nr); panic("INVALID IRQ level!"); }; restore_flags(flags); }