static __init void pmac_init_IRQ(void) { struct device_node *irqctrler = NULL; struct device_node *irqctrler2 = NULL; struct device_node *np = NULL; struct mpic *mpic1, *mpic2; /* We first try to detect Apple's new Core99 chipset, since mac-io * is quite different on those machines and contains an IBM MPIC2. */ while ((np = of_find_node_by_type(np, "open-pic")) != NULL) { struct device_node *parent = of_get_parent(np); if (parent && !strcmp(parent->name, "u3")) irqctrler2 = of_node_get(np); else irqctrler = of_node_get(np); of_node_put(parent); } if (irqctrler != NULL && irqctrler->n_addrs > 0) { unsigned char senses[128]; printk(KERN_INFO "PowerMac using OpenPIC irq controller at 0x%08x\n", (unsigned int)irqctrler->addrs[0].address); prom_get_irq_senses(senses, 0, 128); mpic1 = mpic_alloc(irqctrler->addrs[0].address, MPIC_PRIMARY | MPIC_WANTS_RESET, 0, 0, 128, 256, senses, 128, " K2-MPIC "); BUG_ON(mpic1 == NULL); mpic_init(mpic1); if (irqctrler2 != NULL && irqctrler2->n_intrs > 0 && irqctrler2->n_addrs > 0) { printk(KERN_INFO "Slave OpenPIC at 0x%08x hooked on IRQ %d\n", (u32)irqctrler2->addrs[0].address, irqctrler2->intrs[0].line); pmac_call_feature(PMAC_FTR_ENABLE_MPIC, irqctrler2, 0, 0); prom_get_irq_senses(senses, 128, 128 + 128); /* We don't need to set MPIC_BROKEN_U3 here since we don't have * hypertransport interrupts routed to it */ mpic2 = mpic_alloc(irqctrler2->addrs[0].address, MPIC_BIG_ENDIAN | MPIC_WANTS_RESET, 0, 128, 128, 0, senses, 128, " U3-MPIC "); BUG_ON(mpic2 == NULL); mpic_init(mpic2); mpic_setup_cascade(irqctrler2->intrs[0].line, pmac_u3_cascade, mpic2); } } of_node_put(irqctrler); of_node_put(irqctrler2); }
static void __init pSeries_setup_mpic(void) { unsigned int *opprop; unsigned long openpic_addr = 0; unsigned char senses[NR_IRQS - NUM_ISA_INTERRUPTS]; struct device_node *root; int irq_count; /* Find the Open PIC if present */ root = of_find_node_by_path("/"); opprop = (unsigned int *) get_property(root, "platform-open-pic", NULL); if (opprop != 0) { int n = prom_n_addr_cells(root); for (openpic_addr = 0; n > 0; --n) openpic_addr = (openpic_addr << 32) + *opprop++; printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr); } of_node_put(root); BUG_ON(openpic_addr == 0); /* Get the sense values from OF */ prom_get_irq_senses(senses, NUM_ISA_INTERRUPTS, NR_IRQS); /* Setup the openpic driver */ irq_count = NR_IRQS - NUM_ISA_INTERRUPTS - 4; /* leave room for IPIs */ pSeries_mpic = mpic_alloc(openpic_addr, MPIC_PRIMARY, 16, 16, irq_count, /* isu size, irq offset, irq count */ NR_IRQS - 4, /* ipi offset */ senses, irq_count, /* sense & sense size */ " MPIC "); }
static __init void maple_init_IRQ(void) { struct device_node *root; unsigned int *opprop; unsigned long opic_addr; struct mpic *mpic; unsigned char senses[128]; int n; DBG(" -> maple_init_IRQ\n"); /* XXX: Non standard, replace that with a proper openpic/mpic node * in the device-tree. Find the Open PIC if present */ root = of_find_node_by_path("/"); opprop = (unsigned int *) get_property(root, "platform-open-pic", NULL); if (opprop == 0) panic("OpenPIC not found !\n"); n = prom_n_addr_cells(root); for (opic_addr = 0; n > 0; --n) opic_addr = (opic_addr << 32) + *opprop++; of_node_put(root); /* Obtain sense values from device-tree */ prom_get_irq_senses(senses, 0, 128); mpic = mpic_alloc(opic_addr, MPIC_PRIMARY | MPIC_BIG_ENDIAN | MPIC_BROKEN_U3 | MPIC_WANTS_RESET, 0, 0, 128, 128, senses, 128, "U3-MPIC"); BUG_ON(mpic == NULL); mpic_init(mpic); DBG(" <- maple_init_IRQ\n"); }