void __init fill_ebus_child(struct device_node *dp, struct linux_ebus_child *dev) { const int *regs; const int *irqs; int i, len; dev->prom_node = dp; regs = of_get_property(dp, "reg", &len); if (!regs) len = 0; dev->num_addrs = len / sizeof(regs[0]); for (i = 0; i < dev->num_addrs; i++) { if (regs[i] >= dev->parent->num_addrs) { prom_printf("UGH: property for %s was %d, need < %d\n", dev->prom_node->name, len, dev->parent->num_addrs); panic(__FUNCTION__); } /* XXX resource */ dev->resource[i].start = dev->parent->resource[regs[i]].start; } for (i = 0; i < PROMINTR_MAX; i++) dev->irqs[i] = PCI_IRQ_NONE; if ((dev->irqs[0] = ebus_blacklist_irq(dev->prom_node->name)) != 0) { dev->num_irqs = 1; } else { irqs = of_get_property(dp, "interrupts", &len); if (!irqs) { dev->num_irqs = 0; dev->irqs[0] = 0; if (dev->parent->num_irqs != 0) { dev->num_irqs = 1; dev->irqs[0] = dev->parent->irqs[0]; } } else { dev->num_irqs = len / sizeof(irqs[0]); if (irqs[0] == 0 || irqs[0] >= 8) { /* * XXX Zero is a valid pin number... * This works as long as Ebus is not wired * to INTA#. */ printk("EBUS: %s got bad irq %d from PROM\n", dev->prom_node->name, irqs[0]); dev->num_irqs = 0; dev->irqs[0] = 0; } else { dev->irqs[0] = pcic_pin_to_irq(irqs[0], dev->prom_node->name); } } } }
void __init fill_ebus_child(int node, struct linux_prom_registers *preg, struct linux_ebus_child *dev) { int regs[PROMREG_MAX]; int irqs[PROMREG_MAX]; char lbuf[128]; int i, len; dev->prom_node = node; prom_getstring(node, "name", lbuf, sizeof(lbuf)); strcpy(dev->prom_name, lbuf); len = prom_getproperty(node, "reg", (void *)regs, sizeof(regs)); if (len == -1) len = 0; dev->num_addrs = len / sizeof(regs[0]); for (i = 0; i < dev->num_addrs; i++) { if (regs[i] >= dev->parent->num_addrs) { prom_printf("UGH: property for %s was %d, need < %d\n", dev->prom_name, len, dev->parent->num_addrs); panic(__FUNCTION__); } dev->resource[i].start = dev->parent->resource[regs[i]].start; /* XXX resource */ } for (i = 0; i < PROMINTR_MAX; i++) dev->irqs[i] = PCI_IRQ_NONE; if ((dev->irqs[0] = ebus_blacklist_irq(dev->prom_name)) != 0) { dev->num_irqs = 1; } else if ((len = prom_getproperty(node, "interrupts", (char *)&irqs, sizeof(irqs))) == -1 || len == 0) { dev->num_irqs = 0; dev->irqs[0] = 0; if (dev->parent->num_irqs != 0) { dev->num_irqs = 1; dev->irqs[0] = dev->parent->irqs[0]; /* P3 */ /* printk("EBUS: dev %s irq %d from parent\n", dev->prom_name, dev->irqs[0]); */ } } else { dev->num_irqs = len / sizeof(irqs[0]); if (irqs[0] == 0 || irqs[0] >= 8) { /* * XXX Zero is a valid pin number... * This works as long as Ebus is not wired to INTA#. */ printk("EBUS: %s got bad irq %d from PROM\n", dev->prom_name, irqs[0]); dev->num_irqs = 0; dev->irqs[0] = 0; } else { dev->irqs[0] = pcic_pin_to_irq(irqs[0], dev->prom_name); } } }
int __init ebus_blacklist_irq(const char *name) { struct ebus_device_irq *dp; if ((dp = ebus_blackp) != NULL) { for (; dp->name != NULL; dp++) { if (strcmp(name, dp->name) == 0) { return pcic_pin_to_irq(dp->pin, name); } } } return 0; }