On Fri, Apr 03, 2015 at 05:25:40PM +0800, Yijing Wang wrote: > This patch separate pci_host_bridge creation out > of pci_create_root_bus(), and try to make a generic > pci_host_bridge, then we could make it hold host > bridge specific operations like > pcibios_root_bridge_prepare(). The changes are > transparent to platform host bridge drivers. > > Signed-off-by: Yijing Wang <wangyijing@xxxxxxxxxx> > --- > drivers/pci/host-bridge.c | 52 +++++++++++++++++++++ > drivers/pci/pci.h | 3 + > drivers/pci/probe.c | 113 +++++++++++++++++++++------------------------ > 3 files changed, 108 insertions(+), 60 deletions(-) > > diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c > index 39b2dbe..7d52a0a 100644 > --- a/drivers/pci/host-bridge.c > +++ b/drivers/pci/host-bridge.c > @@ -8,6 +8,58 @@ > > #include "pci.h" > > +static void pci_release_host_bridge_dev(struct device *dev) > +{ > + struct pci_host_bridge *bridge = to_pci_host_bridge(dev); > + > + if (bridge->release_fn) > + bridge->release_fn(bridge); > + > + pci_free_resource_list(&bridge->windows); > + kfree(bridge); > +} > + > +struct pci_host_bridge *pci_create_host_bridge( > + struct device *parent, int domain, int bus, > + struct list_head *resources) > +{ > + int error; > + struct pci_host_bridge *host; > + struct resource_entry *window, *n; > + > + host = kzalloc(sizeof(*host), GFP_KERNEL); > + if (!host) > + return NULL; > + > + host->dev.parent = parent; > + INIT_LIST_HEAD(&host->windows); > + resource_list_for_each_entry_safe(window, n, resources) > + list_move_tail(&window->node, &host->windows); > + /* > + * If support CONFIG_PCI_DOMAINS_GENERIC, use > + * pci_host_assign_domain_nr() to update domain > + * number. > + */ > + host->domain = domain; > + pci_host_assign_domain_nr(host); I think it's a bit confusing that there's another "host->domain =" assignment buried inside pci_host_assign_domain_nr(), so the first assignment is overwritten when CONFIG_PCI_DOMAINS_GENERIC is set. Can you do something like this instead: int pci_host_assign_domain_nr(struct pci_host_bridge *host, int domain) { #ifdef CONFIG_PCI_DOMAINS_GENERIC host->domain = pci_assign_domain_nr(host->dev.parent); #else host->domain = domain; #endif } Then the alternatives (CONFIG_PCI_DOMAINS_GENERIC=y and CONFIG_PCI_DOMAINS_GENERIC being unset) are close together and right at the #ifdef CONFIG_PCI_DOMAINS_GENERIC, so no extra comments are needed. Bjorn -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html