/include/sound/

/span>(irq); ppc_cached_irq_mask[0] &= ~bit; CPC700_OUT_32(CPC700_UIC_UICER, ppc_cached_irq_mask[0]); CPC700_OUT_32(CPC700_UIC_UICSR, bit); /* Write 1 clears IRQ */ } return; } static struct hw_interrupt_type cpc700_pic = { .typename = "CPC700 PIC", .enable = cpc700_unmask_irq, .disable = cpc700_mask_irq, .ack = cpc700_mask_and_ack_irq, }; __init static void cpc700_pic_init_irq(unsigned int irq) { unsigned int tmp; /* Set interrupt sense */ tmp = CPC700_IN_32(CPC700_UIC_UICTR); if (cpc700_irq_assigns[irq][0] == 0) { tmp &= ~CPC700_UIC_IRQ_BIT(irq); } else { tmp |= CPC700_UIC_IRQ_BIT(irq); } CPC700_OUT_32(CPC700_UIC_UICTR, tmp); /* Set interrupt polarity */ tmp = CPC700_IN_32(CPC700_UIC_UICPR); if (cpc700_irq_assigns[irq][1]) { tmp |= CPC700_UIC_IRQ_BIT(irq); } else { tmp &= ~CPC700_UIC_IRQ_BIT(irq); } CPC700_OUT_32(CPC700_UIC_UICPR, tmp); /* Set interrupt critical */ tmp = CPC700_IN_32(CPC700_UIC_UICCR); tmp |= CPC700_UIC_IRQ_BIT(irq); CPC700_OUT_32(CPC700_UIC_UICCR, tmp); return; } __init void cpc700_init_IRQ(void) { int i; ppc_cached_irq_mask[0] = 0; CPC700_OUT_32(CPC700_UIC_UICER, 0x00000000); /* Disable all irq's */ CPC700_OUT_32(CPC700_UIC_UICSR, 0xffffffff); /* Clear cur intrs */ CPC700_OUT_32(CPC700_UIC_UICCR, 0xffffffff); /* Gen INT not MCP */ CPC700_OUT_32(CPC700_UIC_UICPR, 0x00000000); /* Active low */ CPC700_OUT_32(CPC700_UIC_UICTR, 0x00000000); /* Level Sensitive */ CPC700_OUT_32(CPC700_UIC_UICVR, CPC700_UIC_UICVCR_0_HI); /* IRQ 0 is highest */ for (i = 0; i < 17; i++) { irq_desc[i].handler = &cpc700_pic; cpc700_pic_init_irq(i); } for (i = 20; i < 32; i++) { irq_desc[i].handler = &cpc700_pic; cpc700_pic_init_irq(i); } return; } /* * Find the highest IRQ that generating an interrupt, if any. */ int cpc700_get_irq(struct pt_regs *regs) { int irq = 0; u_int irq_status, irq_test = 1; irq_status = CPC700_IN_32(CPC700_UIC_UICMSR); do { if (irq_status & irq_test) break; irq++; irq_test <<= 1; } while (irq < NR_IRQS); if (irq == NR_IRQS) irq = 33; return (31 - irq); }