]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/pci/hotplug/rpadlpar_core.c
[POWERPC] Merge PCI resource fixups
[linux-2.6-omap-h63xx.git] / drivers / pci / hotplug / rpadlpar_core.c
index 72383467a0d5a5cbb9a60e0bdc4f04b0904f5172..191954bc8e5baf8df9d796226aee25d9e111b42f 100644 (file)
@@ -98,7 +98,16 @@ static struct device_node *find_dlpar_node(char *drc_name, int *node_type)
        return NULL;
 }
 
-static struct slot *find_slot(struct device_node *dn)
+/**
+ * find_php_slot - return hotplug slot structure for device node
+ * @dn: target &device_node
+ *
+ * This routine will return the hotplug slot structure
+ * for a given device node. Note that built-in PCI slots
+ * may be dlpar-able, but not hot-pluggable, so this routine
+ * will return NULL for built-in PCI slots.
+ */
+static struct slot *find_php_slot(struct device_node *dn)
 {
        struct list_head *tmp, *n;
        struct slot *slot;
@@ -146,13 +155,13 @@ static void dlpar_pci_add_bus(struct device_node *dn)
            dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
                of_scan_pci_bridge(dn, dev);
 
-       pcibios_fixup_new_pci_devices(dev->subordinate,0);
+       pcibios_fixup_new_pci_devices(dev->subordinate);
 
        /* Claim new bus resources */
        pcibios_claim_one_bus(dev->bus);
 
-       /* ioremap() for child bus, which may or may not succeed */
-       remap_bus_range(dev->subordinate);
+       /* Map IO space for child bus, which may or may not succeed */
+       pcibios_map_io_space(dev->subordinate);
 
        /* Add new devices to global lists.  Register in proc, sysfs. */
        pci_bus_add_devices(phb->bus);
@@ -224,9 +233,9 @@ static int dlpar_remove_phb(char *drc_name, struct device_node *dn)
        if (!pcibios_find_pci_bus(dn))
                return -EINVAL;
 
-       slot = find_slot(dn);
+       /* If pci slot is hotplugable, use hotplug to remove it */
+       slot = find_php_slot(dn);
        if (slot) {
-               /* Remove hotplug slot */
                if (rpaphp_deregister_slot(slot)) {
                        printk(KERN_ERR
                                "%s: unable to remove hotplug slot %s\n",
@@ -285,9 +294,8 @@ static int dlpar_add_vio_slot(char *drc_name, struct device_node *dn)
  * dlpar_add_slot - DLPAR add an I/O Slot
  * @drc_name: drc-name of newly added slot
  *
- * Make the hotplug module and the kernel aware
- * of a newly added I/O Slot.
- * Return Codes -
+ * Make the hotplug module and the kernel aware of a newly added I/O Slot.
+ * Return Codes:
  * 0                   Success
  * -ENODEV             Not a valid drc_name
  * -EINVAL             Slot already added
@@ -331,9 +339,9 @@ exit:
 /**
  * dlpar_remove_vio_slot - DLPAR remove a virtual I/O Slot
  * @drc_name: drc-name of newly added slot
+ * @dn: &device_node
  *
- * Remove the kernel and hotplug representations
- * of an I/O Slot.
+ * Remove the kernel and hotplug representations of an I/O Slot.
  * Return Codes:
  * 0                   Success
  * -EINVAL             Vio dev doesn't exist
@@ -351,11 +359,11 @@ static int dlpar_remove_vio_slot(char *drc_name, struct device_node *dn)
 }
 
 /**
- * dlpar_remove_slot - DLPAR remove a PCI I/O Slot
+ * dlpar_remove_pci_slot - DLPAR remove a PCI I/O Slot
  * @drc_name: drc-name of newly added slot
+ * @dn: &device_node
  *
- * Remove the kernel and hotplug representations
- * of a PCI I/O Slot.
+ * Remove the kernel and hotplug representations of a PCI I/O Slot.
  * Return Codes:
  * 0                   Success
  * -ENODEV             Not a valid drc_name
@@ -370,24 +378,19 @@ int dlpar_remove_pci_slot(char *drc_name, struct device_node *dn)
        if (!bus)
                return -EINVAL;
 
-       slot = find_slot(dn);
+       /* If pci slot is hotplugable, use hotplug to remove it */
+       slot = find_php_slot(dn);
        if (slot) {
-               /* Remove hotplug slot */
                if (rpaphp_deregister_slot(slot)) {
                        printk(KERN_ERR
                                "%s: unable to remove hotplug slot %s\n",
                                __FUNCTION__, drc_name);
                        return -EIO;
                }
-       } else {
-               struct pci_dev *dev, *tmp;
-               list_for_each_entry_safe(dev, tmp, &bus->devices, bus_list) {
-                       eeh_remove_bus_device(dev);
-                       pci_remove_bus_device(dev);
-               }
-       }
+       } else
+               pcibios_remove_pci_devices(bus);
 
-       if (unmap_bus_range(bus)) {
+       if (pcibios_unmap_io_space(bus)) {
                printk(KERN_ERR "%s: failed to unmap bus range\n",
                        __FUNCTION__);
                return -ERANGE;
@@ -402,8 +405,7 @@ int dlpar_remove_pci_slot(char *drc_name, struct device_node *dn)
  * dlpar_remove_slot - DLPAR remove an I/O Slot
  * @drc_name: drc-name of newly added slot
  *
- * Remove the kernel and hotplug representations
- * of an I/O Slot.
+ * Remove the kernel and hotplug representations of an I/O Slot.
  * Return Codes:
  * 0                   Success
  * -ENODEV             Not a valid drc_name