Subject: [PATCH] PCI, ACPI, x86, ia64: Use pci_host_bridge dev to save acpi_handle

So we could avoid calling acpi_get_pci_rootbridge_handle that could cause deadlock.

non root pci bus is using bridge->dev archdata.acpi_handle.
for root bus that field is not used, could just save root handle, and get that
later when need to get root bus's handle.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: x86@kernel.org
Cc: linux-ia64@vger.kernel.org

---
 arch/ia64/pci/pci.c      |    1 +
 arch/x86/pci/acpi.c      |    1 +
 include/linux/pci-acpi.h |   15 ++++++++++-----
 3 files changed, 12 insertions(+), 5 deletions(-)

Index: linux-2.6/arch/ia64/pci/pci.c
===================================================================
--- linux-2.6.orig/arch/ia64/pci/pci.c
+++ linux-2.6/arch/ia64/pci/pci.c
@@ -385,6 +385,7 @@ pci_acpi_scan_root(struct acpi_pci_root
 		return NULL;
 	}
 
+	pbus->bridge->archdata.acpi_handle = device->handle;
 	pci_scan_child_bus(pbus);
 	return pbus;
 
Index: linux-2.6/arch/x86/pci/acpi.c
===================================================================
--- linux-2.6.orig/arch/x86/pci/acpi.c
+++ linux-2.6/arch/x86/pci/acpi.c
@@ -520,6 +520,7 @@ struct pci_bus * __devinit pci_acpi_scan
 						  sd, &resources);
 
 		if (bus) {
+			bus->bridge->archdata.acpi_handle = device->handle;
 			pci_scan_child_bus(bus);
 			pci_set_host_bridge_release(
 				to_pci_host_bridge(bus->bridge),
Index: linux-2.6/include/linux/pci-acpi.h
===================================================================
--- linux-2.6.orig/include/linux/pci-acpi.h
+++ linux-2.6/include/linux/pci-acpi.h
@@ -22,19 +22,24 @@ extern phys_addr_t acpi_pci_root_get_mcf
 static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
 {
 	struct pci_bus *pbus = pdev->bus;
+
 	/* Find a PCI root bus */
 	while (!pci_is_root_bus(pbus))
 		pbus = pbus->parent;
-	return acpi_get_pci_rootbridge_handle(pci_domain_nr(pbus),
-					      pbus->number);
+
+	return DEVICE_ACPI_HANDLE(pbus->bridge);
 }
 
 static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)
 {
+	struct device *dev;
+
 	if (!pci_is_root_bus(pbus))
-		return DEVICE_ACPI_HANDLE(&(pbus->self->dev));
-	return acpi_get_pci_rootbridge_handle(pci_domain_nr(pbus),
-					      pbus->number);
+		dev = &pbus->self->dev;
+	else
+		dev = pbus->bridge;
+
+	return DEVICE_ACPI_HANDLE(dev);
 }
 #endif
 
