diff options
Diffstat (limited to 'drivers/pci/pci-acpi.c')
| -rw-r--r-- | drivers/pci/pci-acpi.c | 45 | 
1 files changed, 38 insertions, 7 deletions
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index dee5dddaa29..e4b1fb2c0f5 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -53,14 +53,15 @@ static void pci_acpi_wake_dev(acpi_handle handle, u32 event, void *context)  		return;  	} -	if (!pci_dev->pm_cap || !pci_dev->pme_support -	     || pci_check_pme_status(pci_dev)) { -		if (pci_dev->pme_poll) -			pci_dev->pme_poll = false; +	/* Clear PME Status if set. */ +	if (pci_dev->pme_support) +		pci_check_pme_status(pci_dev); -		pci_wakeup_event(pci_dev); -		pm_runtime_resume(&pci_dev->dev); -	} +	if (pci_dev->pme_poll) +		pci_dev->pme_poll = false; + +	pci_wakeup_event(pci_dev); +	pm_runtime_resume(&pci_dev->dev);  	if (pci_dev->subordinate)  		pci_pme_wakeup_bus(pci_dev->subordinate); @@ -287,6 +288,32 @@ static struct pci_platform_pm_ops acpi_pci_platform_pm = {  	.run_wake = acpi_pci_run_wake,  }; +void acpi_pci_add_bus(struct pci_bus *bus) +{ +	acpi_handle handle = NULL; + +	if (bus->bridge) +		handle = ACPI_HANDLE(bus->bridge); +	if (acpi_pci_disabled || handle == NULL) +		return; + +	acpi_pci_slot_enumerate(bus, handle); +	acpiphp_enumerate_slots(bus, handle); +} + +void acpi_pci_remove_bus(struct pci_bus *bus) +{ +	/* +	 * bus->bridge->acpi_node.handle has already been reset to NULL +	 * when acpi_pci_remove_bus() is called, so don't check ACPI handle. +	 */ +	if (acpi_pci_disabled) +		return; + +	acpiphp_remove_slots(bus); +	acpi_pci_slot_remove(bus); +} +  /* ACPI bus type */  static int acpi_pci_find_device(struct device *dev, acpi_handle *handle)  { @@ -361,7 +388,11 @@ static int __init acpi_pci_init(void)  	ret = register_acpi_bus_type(&acpi_pci_bus);  	if (ret)  		return 0; +  	pci_set_platform_pm(&acpi_pci_platform_pm); +	acpi_pci_slot_init(); +	acpiphp_init(); +  	return 0;  }  arch_initcall(acpi_pci_init);  |