diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 8647dc6..e901902 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -160,6 +160,8 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
 
 void __weak pcibios_resource_survey_bus(struct pci_bus *bus) { }
 
+void __weak pcibios_irq_setup(struct device *dev) { }
+
 /**
  * pci_bus_add_device - start driver for a single device
  * @dev: device to add
@@ -170,6 +172,9 @@ int pci_bus_add_device(struct pci_dev *dev)
 {
 	int retval;
 
+	/* need to after bridge is scanned */
+	pcibios_irq_setup(&dev->dev);
+
 	/*
 	 * Can not put in pci_device_add yet because resources
 	 * are not assigned yet for some devices.
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
index ba4545f..87bd80b 100644
--- a/drivers/pci/pci-acpi.c
+++ b/drivers/pci/pci-acpi.c
@@ -302,14 +302,16 @@ static int acpi_pci_find_device(struct device *dev, acpi_handle *handle)
 	return 0;
 }
 
-static void pci_acpi_setup(struct device *dev)
+void pcibios_irq_setup(struct device *dev)
 {
 	struct pci_dev *pci_dev = to_pci_dev(dev);
 	acpi_handle handle = ACPI_HANDLE(dev);
-	struct acpi_device *adev;
 	acpi_status status;
 	acpi_handle dummy;
 
+	if (acpi_disabled || acpi_pci_disabled)
+		return;
+
 	/*
 	 * Evaluate and parse _PRT, if exists.  This code allows parsing of
 	 * _PRT objects within the scope of non-bridge devices.  Note that
@@ -326,6 +328,13 @@ static void pci_acpi_setup(struct device *dev)
 			pci_dev->subordinate->number : pci_dev->bus->number;
 		acpi_pci_irq_add_prt(handle, pci_domain_nr(pci_dev->bus), bus);
 	}
+}
+
+static void pci_acpi_setup(struct device *dev)
+{
+	struct pci_dev *pci_dev = to_pci_dev(dev);
+	acpi_handle handle = ACPI_HANDLE(dev);
+	struct acpi_device *adev;
 
 	if (acpi_bus_get_device(handle, &adev) || !adev->wakeup.flags.valid)
 		return;
