[PATCH] Separate pci bits out of struct device_node

This patch pulls the PCI-related junk out of struct device_node and
puts it in a separate structure, struct pci_dn.  The device_node now
just has a void * pointer in it, which points to a struct pci_dn for
nodes that represent PCI devices.  It could potentially be used in
future for device-specific data for other sorts of devices, such as
virtual I/O devices.

Signed-off-by: Paul Mackerras <paulus@samba.org>
diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c
index 4ada151..ad1017d 100644
--- a/drivers/pci/hotplug/rpadlpar_core.c
+++ b/drivers/pci/hotplug/rpadlpar_core.c
@@ -134,7 +134,8 @@
 static int pci_add_secondary_bus(struct device_node *dn,
 		struct pci_dev *bridge_dev)
 {
-	struct pci_controller *hose = dn->phb;
+	struct pci_dn *pdn = dn->data;
+	struct pci_controller *hose = pdn->phb;
 	struct pci_bus *child;
 	u8 sec_busno;
 
@@ -159,7 +160,7 @@
 	if (hose->last_busno < child->number)
 		hose->last_busno = child->number;
 
-	dn->bussubno = child->number;
+	pdn->bussubno = child->number;
 
 	/* ioremap() for child bus, which may or may not succeed */
 	remap_bus_range(child);
@@ -183,11 +184,12 @@
 
 static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn)
 {
-	struct pci_controller *hose = dn->phb;
+	struct pci_dn *pdn = dn->data;
+	struct pci_controller *hose = pdn->phb;
 	struct pci_dev *dev = NULL;
 
 	/* Scan phb bus for EADS device, adding new one to bus->devices */
-	if (!pci_scan_single_device(hose->bus, dn->devfn)) {
+	if (!pci_scan_single_device(hose->bus, pdn->devfn)) {
 		printk(KERN_ERR "%s: found no device on bus\n", __FUNCTION__);
 		return NULL;
 	}
@@ -269,6 +271,7 @@
 static int dlpar_remove_phb(char *drc_name, struct device_node *dn)
 {
 	struct slot *slot;
+	struct pci_dn *pdn;
 	int rc = 0;
 
 	if (!rpaphp_find_pci_bus(dn))
@@ -285,12 +288,13 @@
 		}
 	}
 
-	BUG_ON(!dn->phb);
-	rc = dlpar_remove_root_bus(dn->phb);
+	pdn = dn->data;
+	BUG_ON(!pdn || !pdn->phb);
+	rc = dlpar_remove_root_bus(pdn->phb);
 	if (rc < 0)
 		return rc;
 
-	dn->phb = NULL;
+	pdn->phb = NULL;
 
 	return 0;
 }
@@ -299,7 +303,7 @@
 {
 	struct pci_controller *phb;
 
-	if (dn->phb) {
+	if (PCI_DN(dn)->phb) {
 		/* PHB already exists */
 		return -EINVAL;
 	}
diff --git a/drivers/pci/hotplug/rpaphp_pci.c b/drivers/pci/hotplug/rpaphp_pci.c
index 17a0279..49e4d10 100644
--- a/drivers/pci/hotplug/rpaphp_pci.c
+++ b/drivers/pci/hotplug/rpaphp_pci.c
@@ -51,10 +51,12 @@
 
 struct pci_bus *rpaphp_find_pci_bus(struct device_node *dn)
 {
-	if (!dn->phb || !dn->phb->bus)
+	struct pci_dn *pdn = dn->data;
+
+	if (!pdn  || !pdn->phb || !pdn->phb->bus)
 		return NULL;
 
-	return find_bus_among_children(dn->phb->bus, dn);
+	return find_bus_among_children(pdn->phb->bus, dn);
 }
 EXPORT_SYMBOL_GPL(rpaphp_find_pci_bus);
 
@@ -229,7 +231,7 @@
 	if (!dn || !dn->child)
 		return NULL;
 
-	slotno = PCI_SLOT(dn->child->devfn);
+	slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
 
 	/* pci_scan_slot should find all children */
 	num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));