Subject: [PATCH -v3] PCI, ACPI: Use DEVICE_ACPI_HANDLE for root bus struct pointer 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. we shoudl use that same field for for root bus -v3: do not need to and should not set that archdata.acpi_handle directly acpi_pci_root_add ==> pci_acpi_scan_root ==> pci_create_root_bus ==> device_register(&bridge->dev) ==> device_add ==> platform_notify ==> acpi_bind_one will set that for us. that mean's we still need to keep acpi_get_pci_rootbridge_handle for acpi_pci_find_root_bridge in acpi_pci_bus bus_type. Signed-off-by: Yinghai Lu Cc: Len Brown Cc: linux-acpi@vger.kernel.org --- include/linux/pci-acpi.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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