diff options
-rw-r--r-- | drivers/pci/host/pci-xgene.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/pci/host/pci-xgene.c b/drivers/pci/host/pci-xgene.c index 8cae013e7188..262bedf026c1 100644 --- a/drivers/pci/host/pci-xgene.c +++ b/drivers/pci/host/pci-xgene.c | |||
@@ -636,13 +636,16 @@ static int xgene_pcie_probe_bridge(struct platform_device *pdev) | |||
636 | struct xgene_pcie_port *port; | 636 | struct xgene_pcie_port *port; |
637 | resource_size_t iobase = 0; | 637 | resource_size_t iobase = 0; |
638 | struct pci_bus *bus, *child; | 638 | struct pci_bus *bus, *child; |
639 | struct pci_host_bridge *bridge; | ||
639 | int ret; | 640 | int ret; |
640 | LIST_HEAD(res); | 641 | LIST_HEAD(res); |
641 | 642 | ||
642 | port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL); | 643 | bridge = devm_pci_alloc_host_bridge(dev, sizeof(*port)); |
643 | if (!port) | 644 | if (!bridge) |
644 | return -ENOMEM; | 645 | return -ENOMEM; |
645 | 646 | ||
647 | port = pci_host_bridge_priv(bridge); | ||
648 | |||
646 | port->node = of_node_get(dn); | 649 | port->node = of_node_get(dn); |
647 | port->dev = dev; | 650 | port->dev = dev; |
648 | 651 | ||
@@ -670,11 +673,17 @@ static int xgene_pcie_probe_bridge(struct platform_device *pdev) | |||
670 | if (ret) | 673 | if (ret) |
671 | goto error; | 674 | goto error; |
672 | 675 | ||
673 | bus = pci_create_root_bus(dev, 0, &xgene_pcie_ops, port, &res); | 676 | list_splice_init(&res, &bridge->windows); |
674 | if (!bus) { | 677 | bridge->dev.parent = dev; |
675 | ret = -ENOMEM; | 678 | bridge->sysdata = port; |
679 | bridge->busnr = 0; | ||
680 | bridge->ops = &xgene_pcie_ops; | ||
681 | |||
682 | ret = pci_scan_root_bus_bridge(bridge); | ||
683 | if (ret < 0) | ||
676 | goto error; | 684 | goto error; |
677 | } | 685 | |
686 | bus = bridge->bus; | ||
678 | 687 | ||
679 | pci_scan_child_bus(bus); | 688 | pci_scan_child_bus(bus); |
680 | pci_assign_unassigned_bus_resources(bus); | 689 | pci_assign_unassigned_bus_resources(bus); |