|
@@ -153,6 +153,42 @@ void pcibios_free_controller(struct pci_controller *phb)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pcibios_free_controller);
|
|
|
|
|
|
+/*
|
|
|
+ * This function is used to call pcibios_free_controller()
|
|
|
+ * in a deferred manner: a callback from the PCI subsystem.
|
|
|
+ *
|
|
|
+ * _*DO NOT*_ call pcibios_free_controller() explicitly if
|
|
|
+ * this is used (or it may access an invalid *phb pointer).
|
|
|
+ *
|
|
|
+ * The callback occurs when all references to the root bus
|
|
|
+ * are dropped (e.g., child buses/devices and their users).
|
|
|
+ *
|
|
|
+ * It's called as .release_fn() of 'struct pci_host_bridge'
|
|
|
+ * which is associated with the 'struct pci_controller.bus'
|
|
|
+ * (root bus) - it expects .release_data to hold a pointer
|
|
|
+ * to 'struct pci_controller'.
|
|
|
+ *
|
|
|
+ * In order to use it, register .release_fn()/release_data
|
|
|
+ * like this:
|
|
|
+ *
|
|
|
+ * pci_set_host_bridge_release(bridge,
|
|
|
+ * pcibios_free_controller_deferred
|
|
|
+ * (void *) phb);
|
|
|
+ *
|
|
|
+ * e.g. in the pcibios_root_bridge_prepare() callback from
|
|
|
+ * pci_create_root_bus().
|
|
|
+ */
|
|
|
+void pcibios_free_controller_deferred(struct pci_host_bridge *bridge)
|
|
|
+{
|
|
|
+ struct pci_controller *phb = (struct pci_controller *)
|
|
|
+ bridge->release_data;
|
|
|
+
|
|
|
+ pr_debug("domain %d, dynamic %d\n", phb->global_number, phb->is_dynamic);
|
|
|
+
|
|
|
+ pcibios_free_controller(phb);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(pcibios_free_controller_deferred);
|
|
|
+
|
|
|
/*
|
|
|
* The function is used to return the minimal alignment
|
|
|
* for memory or I/O windows of the associated P2P bridge.
|