On Sat, 2010-02-20 at 19:58 -0800, David Miller wrote: > I just committed the following patch to sparc-next-2.6 > > It looks for the 'slot-names' property in PCI bus nodes and > creates PCI slot objects if found. > > Ben, maybe something similar exists on PowerPC? > > sparc64: If 'slot-names' property exist, create sysfs PCI slot information. > > Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx> > --- We could do something like that but it would collide with the pSeries specific PCI hotplug stuff that creates the slots using its own infrastructure, so I'll have to stub things a bit. Good idea though. Thanks ! Cheers, Ben. > arch/sparc/kernel/pci.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 75 insertions(+), 0 deletions(-) > > diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c > index 592b03d..d7e1cf0 100644 > --- a/arch/sparc/kernel/pci.c > +++ b/arch/sparc/kernel/pci.c > @@ -1094,3 +1094,78 @@ static int __init pcibios_init(void) > return 0; > } > subsys_initcall(pcibios_init); > + > +#ifdef CONFIG_SYSFS > +static void __devinit pci_bus_slot_names(struct device_node *node, > + struct pci_bus *bus) > +{ > + const struct pci_slot_names { > + u32 slot_mask; > + char names[0]; > + } *prop; > + const char *sp; > + int len, i; > + u32 mask; > + > + prop = of_get_property(node, "slot-names", &len); > + if (!prop) > + return; > + > + mask = prop->slot_mask; > + sp = prop->names; > + > + if (ofpci_verbose) > + printk("PCI: Making slots for [%s] mask[0x%02x]\n", > + node->full_name, mask); > + > + i = 0; > + while (mask) { > + struct pci_slot *pci_slot; > + u32 this_bit = 1 << i; > + > + if (!(mask & this_bit)) { > + i++; > + continue; > + } > + > + if (ofpci_verbose) > + printk("PCI: Making slot [%s]\n", sp); > + > + pci_slot = pci_create_slot(bus, i, sp, NULL); > + if (IS_ERR(pci_slot)) > + printk(KERN_ERR "PCI: pci_create_slot returned %ld\n", > + PTR_ERR(pci_slot)); > + > + sp += strlen(sp) + 1; > + mask &= ~this_bit; > + i++; > + } > +} > + > +static int __init of_pci_slot_init(void) > +{ > + struct pci_bus *pbus = NULL; > + > + while ((pbus = pci_find_next_bus(pbus)) != NULL) { > + struct device_node *node; > + > + if (pbus->self) { > + struct dev_archdata *sd = pbus->self->sysdata; > + > + /* PCI->PCI bridge */ > + node = sd->prom_node; > + } else { > + struct pci_pbm_info *pbm = pbus->sysdata; > + > + /* Host PCI controller */ > + node = pbm->op->node; > + } > + > + pci_bus_slot_names(node, pbus); > + } > + > + return 0; > +} > + > +module_init(of_pci_slot_init); > +#endif -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html