]> Pileus Git - ~andy/linux/blobdiff - drivers/pci/remove.c
Linux 3.14
[~andy/linux] / drivers / pci / remove.c
index cc9337a71529180eaebc7beb991dfb7c9e186ea8..8bd76c9ba21cf4e5c5a4b58cb40ccd990cfacc5e 100644 (file)
@@ -7,8 +7,6 @@ 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;
@@ -34,6 +32,9 @@ static void pci_stop_dev(struct pci_dev *dev)
 
 static void pci_destroy_dev(struct pci_dev *dev)
 {
+       if (!dev->dev.kobj.parent)
+               return;
+
        device_del(&dev->dev);
 
        down_write(&pci_bus_sem);
@@ -114,6 +115,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 +137,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 +156,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);
 }