sparc64: Properly claim resources as each PCI bus is probed.
authorDavid S. Miller <davem@davemloft.net>
Wed, 13 Aug 2014 06:29:09 +0000 (23:29 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 14 Aug 2014 04:17:49 +0000 (21:17 -0700)
Perform a pci_claim_resource() on all valid resources discovered
during the OF device tree scan.

Based almost entirely upon the PCI OF bus probing code which does
the same thing there.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/kernel/pci.c

index cc4c31e5185e57d8dc35b6748f3ecb712e4731d4..b36365f49478c573d715816d53582e2dfb153227 100644 (file)
@@ -617,6 +617,36 @@ static void pci_bus_register_of_sysfs(struct pci_bus *bus)
                pci_bus_register_of_sysfs(child_bus);
 }
 
+static void pci_claim_bus_resources(struct pci_bus *bus)
+{
+       struct pci_bus *child_bus;
+       struct pci_dev *dev;
+
+       list_for_each_entry(dev, &bus->devices, bus_list) {
+               int i;
+
+               for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+                       struct resource *r = &dev->resource[i];
+
+                       if (r->parent || !r->start || !r->flags)
+                               continue;
+
+                       if (ofpci_verbose)
+                               printk("PCI: Claiming %s: "
+                                      "Resource %d: %016llx..%016llx [%x]\n",
+                                      pci_name(dev), i,
+                                      (unsigned long long)r->start,
+                                      (unsigned long long)r->end,
+                                      (unsigned int)r->flags);
+
+                       pci_claim_resource(dev, i);
+               }
+       }
+
+       list_for_each_entry(child_bus, &bus->children, node)
+               pci_claim_bus_resources(child_bus);
+}
+
 struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
                                 struct device *parent)
 {
@@ -647,6 +677,8 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
        pci_bus_add_devices(bus);
        pci_bus_register_of_sysfs(bus);
 
+       pci_claim_bus_resources(bus);
+
        return bus;
 }