Merge branch 'x86-x32-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / pci / remove.c
index cc9337a..4ff36bf 100644 (file)
@@ -3,20 +3,6 @@
 #include <linux/pci-aspm.h>
 #include "pci.h"
 
-static void pci_free_resources(struct pci_dev *dev)
-{
-       int i;
-
-       msi_remove_pci_irq_vectors(dev);
-
-       pci_cleanup_rom(dev);
-       for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-               struct resource *res = dev->resource + i;
-               if (res->parent)
-                       release_resource(res);
-       }
-}
-
 static void pci_stop_dev(struct pci_dev *dev)
 {
        pci_pme_active(dev, false);
@@ -34,13 +20,11 @@ static void pci_stop_dev(struct pci_dev *dev)
 
 static void pci_destroy_dev(struct pci_dev *dev)
 {
-       device_del(&dev->dev);
+       if (!dev->dev.kobj.parent)
+               return;
 
-       down_write(&pci_bus_sem);
-       list_del(&dev->bus_list);
-       up_write(&pci_bus_sem);
+       device_del(&dev->dev);
 
-       pci_free_resources(dev);
        put_device(&dev->dev);
 }
 
@@ -114,6 +98,14 @@ void pci_stop_and_remove_bus_device(struct pci_dev *dev)
 }
 EXPORT_SYMBOL(pci_stop_and_remove_bus_device);
 
+void pci_stop_and_remove_bus_device_locked(struct pci_dev *dev)
+{
+       pci_lock_rescan_remove();
+       pci_stop_and_remove_bus_device(dev);
+       pci_unlock_rescan_remove();
+}
+EXPORT_SYMBOL_GPL(pci_stop_and_remove_bus_device_locked);
+
 void pci_stop_root_bus(struct pci_bus *bus)
 {
        struct pci_dev *child, *tmp;
@@ -128,7 +120,7 @@ void pci_stop_root_bus(struct pci_bus *bus)
                pci_stop_bus_device(child);
 
        /* stop the host bridge */
-       device_del(&host_bridge->dev);
+       device_release_driver(&host_bridge->dev);
 }
 
 void pci_remove_root_bus(struct pci_bus *bus)
@@ -147,5 +139,5 @@ void pci_remove_root_bus(struct pci_bus *bus)
        host_bridge->bus = NULL;
 
        /* remove the host bridge */
-       put_device(&host_bridge->dev);
+       device_unregister(&host_bridge->dev);
 }