powerpc/pci: Make both ppc32 and ppc64 use sysdata for pci_controller
authorGrant Likely <grant.likely@secretlab.ca>
Fri, 4 Feb 2011 18:24:11 +0000 (11:24 -0700)
committerGrant Likely <grant.likely@secretlab.ca>
Fri, 4 Feb 2011 18:46:51 +0000 (11:46 -0700)
Currently, ppc32 uses sysdata for the pci_controller pointer, and
ppc64 uses it to hold the device_node pointer.  This patch moves the
of_node pointer into (struct pci_bus*)->dev.of_node and
(struct pci_dev*)->dev.of_node so that sysdata can be converted to always
use the pci_controller pointer instead.  It also fixes up the
allocating of pci devices so that the of_node pointer gets assigned
consistently and increments the ref count.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
arch/microblaze/pci/pci_32.c
arch/powerpc/include/asm/pci-bridge.h
arch/powerpc/include/asm/pci.h
arch/powerpc/kernel/of_platform.c
arch/powerpc/kernel/pci-common.c
arch/powerpc/kernel/pci_32.c
arch/powerpc/kernel/pci_64.c
arch/powerpc/kernel/pci_dn.c
arch/powerpc/kernel/pci_of_scan.c
arch/powerpc/platforms/pseries/pci_dlpar.c

index 3c3d808d7ce08529def87f83738e52666893f559..92728a6cfd80c8a95b0ef1b2bf7dea10a5f25aed 100644 (file)
@@ -332,6 +332,7 @@ static void __devinit pcibios_scan_phb(struct pci_controller *hose)
                       hose->global_number);
                return;
        }
+       bus.dev->of_node = of_node_get(node);
        bus->secondary = hose->first_busno;
        hose->bus = bus;
 
index edeb80fdd2c3cc10ffea07ddf63e79586cf7995a..5e156e034fe29f18a9fc7cd3405ab550cc3ab091 100644 (file)
@@ -164,13 +164,13 @@ extern void setup_indirect_pci(struct pci_controller* hose,
                               resource_size_t cfg_addr,
                               resource_size_t cfg_data, u32 flags);
 
-#ifndef CONFIG_PPC64
-
 static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)
 {
        return bus->sysdata;
 }
 
+#ifndef CONFIG_PPC64
+
 static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
 {
        struct pci_controller *host;
@@ -228,19 +228,10 @@ extern void * update_dn_pci_info(struct device_node *dn, void *data);
 
 /* Get a device_node from a pci_dev.  This code must be fast except
  * in the case where the sysdata is incorrect and needs to be fixed
- * up (this will only happen once).
- * In this case the sysdata will have been inherited from a PCI host
- * bridge or a PCI-PCI bridge further up the tree, so it will point
- * to a valid struct pci_dn, just not the one we want.
- */
+ * up (this will only happen once). */
 static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev)
 {
-       struct device_node *dn = dev->sysdata;
-       struct pci_dn *pdn = dn->data;
-
-       if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number)
-               return dn;      /* fast path.  sysdata is good */
-       return fetch_dev_dn(dev);
+       return dev->dev.of_node ? dev->dev.of_node : fetch_dev_dn(dev);
 }
 
 static inline int pci_device_from_OF_node(struct device_node *np,
@@ -258,7 +249,7 @@ static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
        if (bus->self)
                return pci_device_to_OF_node(bus->self);
        else
-               return bus->sysdata; /* Must be root bus (PHB) */
+               return bus->dev.of_node; /* Must be root bus (PHB) */
 }
 
 /** Find the bus corresponding to the indicated device node */
@@ -270,14 +261,6 @@ extern void pcibios_remove_pci_devices(struct pci_bus *bus);
 /** Discover new pci devices under this bus, and add them */
 extern void pcibios_add_pci_devices(struct pci_bus *bus);
 
-static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)
-{
-       struct device_node *busdn = bus->sysdata;
-
-       BUG_ON(busdn == NULL);
-       return PCI_DN(busdn)->phb;
-}
-
 
 extern void isa_bridge_find_early(struct pci_controller *hose);
 
index a20a9ad2258b2c38a21064eb3df89109bbe9f110..7d7790954e02039f02ad71f1ac935b866eac7e4f 100644 (file)
@@ -201,7 +201,7 @@ extern void pci_resource_to_user(const struct pci_dev *dev, int bar,
 extern void pcibios_setup_bus_devices(struct pci_bus *bus);
 extern void pcibios_setup_bus_self(struct pci_bus *bus);
 extern void pcibios_setup_phb_io_space(struct pci_controller *hose);
-extern void pcibios_scan_phb(struct pci_controller *hose, void *sysdata);
+extern void pcibios_scan_phb(struct pci_controller *hose);
 
 #endif /* __KERNEL__ */
 #endif /* __ASM_POWERPC_PCI_H */
index b2c363ef38ad7dce344c9058abdad4563e911b21..9bd951c677670148772a97bd29cb8b2331d3ac3f 100644 (file)
@@ -74,7 +74,7 @@ static int __devinit of_pci_phb_probe(struct platform_device *dev,
 #endif /* CONFIG_EEH */
 
        /* Scan the bus */
-       pcibios_scan_phb(phb, dev->dev.of_node);
+       pcibios_scan_phb(phb);
        if (phb->bus == NULL)
                return -ENXIO;
 
index eb341be9a4d934505017e5e96af994b51076a91f..3cd85faa8ac66e3c251a98805d789060dbffce2d 100644 (file)
@@ -1688,13 +1688,8 @@ int early_find_capability(struct pci_controller *hose, int bus, int devfn,
 /**
  * pci_scan_phb - Given a pci_controller, setup and scan the PCI bus
  * @hose: Pointer to the PCI host controller instance structure
- * @sysdata: value to use for sysdata pointer.  ppc32 and ppc64 differ here
- *
- * Note: the 'data' pointer is a temporary measure.  As 32 and 64 bit
- * pci code gets merged, this parameter should become unnecessary because
- * both will use the same value.
  */
-void __devinit pcibios_scan_phb(struct pci_controller *hose, void *sysdata)
+void __devinit pcibios_scan_phb(struct pci_controller *hose)
 {
        struct pci_bus *bus;
        struct device_node *node = hose->dn;
@@ -1704,13 +1699,13 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose, void *sysdata)
                 node ? node->full_name : "<NO NAME>");
 
        /* Create an empty bus for the toplevel */
-       bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops,
-                            sysdata);
+       bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose);
        if (bus == NULL) {
                pr_err("Failed to create bus for PCI domain %04x\n",
                        hose->global_number);
                return;
        }
+       bus->dev.of_node = of_node_get(node);
        bus->secondary = hose->first_busno;
        hose->bus = bus;
 
index e7db5b48004ab43e30de96e2ac79d93a11b5fd6b..bedb370459f2604f185bea39f8833a296c5e5a00 100644 (file)
@@ -381,7 +381,7 @@ static int __init pcibios_init(void)
                if (pci_assign_all_buses)
                        hose->first_busno = next_busno;
                hose->last_busno = 0xff;
-               pcibios_scan_phb(hose, hose);
+               pcibios_scan_phb(hose);
                pci_bus_add_devices(hose->bus);
                if (pci_assign_all_buses || next_busno <= hose->last_busno)
                        next_busno = hose->last_busno + pcibios_assign_bus_offset;
index 851577608a783ddff85726914eed20b0515c5fae..fc6452b6be9fa7e71153d9ea7bbbe48099a476d1 100644 (file)
@@ -64,7 +64,7 @@ static int __init pcibios_init(void)
 
        /* Scan all of the recorded PCI controllers.  */
        list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
-               pcibios_scan_phb(hose, hose->dn);
+               pcibios_scan_phb(hose);
                pci_bus_add_devices(hose->bus);
        }
 
@@ -242,10 +242,10 @@ long sys_pciconfig_iobase(long which, unsigned long in_bus,
                        break;
                bus = NULL;
        }
-       if (bus == NULL || bus->sysdata == NULL)
+       if (bus == NULL || bus->dev.of_node == NULL)
                return -ENODEV;
 
-       hose_node = (struct device_node *)bus->sysdata;
+       hose_node = bus->dev.of_node;
        hose = PCI_DN(hose_node)->phb;
 
        switch (which) {
index d56b35ee7f74f04af5290aa10937f2e323e1cc6d..29852688ceaaae7f6f9c09cbc7e3f6350ee8170f 100644 (file)
@@ -161,7 +161,7 @@ static void *is_devfn_node(struct device_node *dn, void *data)
 /*
  * This is the "slow" path for looking up a device_node from a
  * pci_dev.  It will hunt for the device under its parent's
- * phb and then update sysdata for a future fastpath.
+ * phb and then update of_node pointer.
  *
  * It may also do fixups on the actual device since this happens
  * on the first read/write.
@@ -170,16 +170,19 @@ static void *is_devfn_node(struct device_node *dn, void *data)
  * In this case it may probe for real hardware ("just in case")
  * and add a device_node to the device tree if necessary.
  *
+ * Is this function necessary anymore now that dev->dev.of_node is
+ * used to store the node pointer?
+ *
  */
 struct device_node *fetch_dev_dn(struct pci_dev *dev)
 {
-       struct device_node *orig_dn = dev->sysdata;
+       struct device_node *orig_dn = dev->dev.of_node;
        struct device_node *dn;
        unsigned long searchval = (dev->bus->number << 8) | dev->devfn;
 
        dn = traverse_pci_devices(orig_dn, is_devfn_node, (void *)searchval);
        if (dn)
-               dev->sysdata = dn;
+               dev->dev.of_node = dn;
        return dn;
 }
 EXPORT_SYMBOL(fetch_dev_dn);
index e751506323b4509bf04abefb266a6435173a307f..1e89a72fd0301d744f36e2f0db8cb6cb320f9620 100644 (file)
@@ -135,7 +135,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
        pr_debug("    create device, devfn: %x, type: %s\n", devfn, type);
 
        dev->bus = bus;
-       dev->sysdata = node;
+       dev->dev.of_node = of_node_get(node);
        dev->dev.parent = bus->bridge;
        dev->dev.bus = &pci_bus_type;
        dev->devfn = devfn;
@@ -238,7 +238,7 @@ void __devinit of_scan_pci_bridge(struct device_node *node,
        bus->primary = dev->bus->number;
        bus->subordinate = busrange[1];
        bus->bridge_ctl = 0;
-       bus->sysdata = node;
+       bus->dev.of_node = of_node_get(node);
 
        /* parse ranges property */
        /* PCI #address-cells == 3 and #size-cells == 2 always */
index 5fcc92a12d3e1256b1c5d648b624f4791e3b0817..3bf4488aaec6537ce6983965bee978209fb7be4e 100644 (file)
@@ -149,7 +149,7 @@ struct pci_controller * __devinit init_phb_dynamic(struct device_node *dn)
        if (dn->child)
                eeh_add_device_tree_early(dn);
 
-       pcibios_scan_phb(phb, dn);
+       pcibios_scan_phb(phb);
        pcibios_finish_adding_to_bus(phb->bus);
 
        return phb;