diff options
Diffstat (limited to 'drivers/pci/pci-acpi.c')
| -rw-r--r-- | drivers/pci/pci-acpi.c | 74 | 
1 files changed, 21 insertions, 53 deletions
| diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 260a06fb78a6..a42dbf448860 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -906,7 +906,7 @@ acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev,   *	choose highest power _SxD or any lower power   */ -static pci_power_t acpi_pci_choose_state(struct pci_dev *pdev) +pci_power_t acpi_pci_choose_state(struct pci_dev *pdev)  {  	int acpi_state, d_max; @@ -965,22 +965,20 @@ int pci_dev_acpi_reset(struct pci_dev *dev, bool probe)  	return 0;  } -static bool acpi_pci_power_manageable(struct pci_dev *dev) +bool acpi_pci_power_manageable(struct pci_dev *dev)  {  	struct acpi_device *adev = ACPI_COMPANION(&dev->dev); -	if (!adev) -		return false; -	return acpi_device_power_manageable(adev); +	return adev && acpi_device_power_manageable(adev);  } -static bool acpi_pci_bridge_d3(struct pci_dev *dev) +bool acpi_pci_bridge_d3(struct pci_dev *dev)  {  	const union acpi_object *obj;  	struct acpi_device *adev;  	struct pci_dev *rpdev; -	if (!dev->is_hotplug_bridge) +	if (acpi_pci_disabled || !dev->is_hotplug_bridge)  		return false;  	/* Assume D3 support if the bridge is power-manageable by ACPI. */ @@ -1008,7 +1006,7 @@ static bool acpi_pci_bridge_d3(struct pci_dev *dev)  	return obj->integer.value == 1;  } -static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state) +int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)  {  	struct acpi_device *adev = ACPI_COMPANION(&dev->dev);  	static const u8 state_conv[] = { @@ -1046,7 +1044,7 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)  	return error;  } -static pci_power_t acpi_pci_get_power_state(struct pci_dev *dev) +pci_power_t acpi_pci_get_power_state(struct pci_dev *dev)  {  	struct acpi_device *adev = ACPI_COMPANION(&dev->dev);  	static const pci_power_t state_conv[] = { @@ -1068,7 +1066,7 @@ static pci_power_t acpi_pci_get_power_state(struct pci_dev *dev)  	return state_conv[state];  } -static void acpi_pci_refresh_power_state(struct pci_dev *dev) +void acpi_pci_refresh_power_state(struct pci_dev *dev)  {  	struct acpi_device *adev = ACPI_COMPANION(&dev->dev); @@ -1093,17 +1091,23 @@ static int acpi_pci_propagate_wakeup(struct pci_bus *bus, bool enable)  	return 0;  } -static int acpi_pci_wakeup(struct pci_dev *dev, bool enable) +int acpi_pci_wakeup(struct pci_dev *dev, bool enable)  { +	if (acpi_pci_disabled) +		return 0; +  	if (acpi_pm_device_can_wakeup(&dev->dev))  		return acpi_pm_set_device_wakeup(&dev->dev, enable);  	return acpi_pci_propagate_wakeup(dev->bus, enable);  } -static bool acpi_pci_need_resume(struct pci_dev *dev) +bool acpi_pci_need_resume(struct pci_dev *dev)  { -	struct acpi_device *adev = ACPI_COMPANION(&dev->dev); +	struct acpi_device *adev; + +	if (acpi_pci_disabled) +		return false;  	/*  	 * In some cases (eg. Samsung 305V4A) leaving a bridge in suspend over @@ -1115,6 +1119,7 @@ static bool acpi_pci_need_resume(struct pci_dev *dev)  	if (pci_is_bridge(dev) && acpi_target_system_state() != ACPI_STATE_S0)  		return true; +	adev = ACPI_COMPANION(&dev->dev);  	if (!adev || !acpi_device_power_manageable(adev))  		return false; @@ -1128,17 +1133,6 @@ static bool acpi_pci_need_resume(struct pci_dev *dev)  	return !!adev->power.flags.dsw_present;  } -static const struct pci_platform_pm_ops acpi_pci_platform_pm = { -	.bridge_d3 = acpi_pci_bridge_d3, -	.is_manageable = acpi_pci_power_manageable, -	.set_state = acpi_pci_set_power_state, -	.get_state = acpi_pci_get_power_state, -	.refresh_state = acpi_pci_refresh_power_state, -	.choose_state = acpi_pci_choose_state, -	.set_wakeup = acpi_pci_wakeup, -	.need_resume = acpi_pci_need_resume, -}; -  void acpi_pci_add_bus(struct pci_bus *bus)  {  	union acpi_object *obj; @@ -1356,13 +1350,9 @@ static void pci_acpi_set_external_facing(struct pci_dev *dev)  		dev->external_facing = 1;  } -static void pci_acpi_setup(struct device *dev) +void pci_acpi_setup(struct device *dev, struct acpi_device *adev)  {  	struct pci_dev *pci_dev = to_pci_dev(dev); -	struct acpi_device *adev = ACPI_COMPANION(dev); - -	if (!adev) -		return;  	pci_acpi_optimize_delay(pci_dev, adev->handle);  	pci_acpi_set_external_facing(pci_dev); @@ -1386,14 +1376,10 @@ static void pci_acpi_setup(struct device *dev)  	acpi_device_power_add_dependent(adev, dev);  } -static void pci_acpi_cleanup(struct device *dev) +void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev)  { -	struct acpi_device *adev = ACPI_COMPANION(dev);  	struct pci_dev *pci_dev = to_pci_dev(dev); -	if (!adev) -		return; -  	pci_acpi_remove_edr_notifier(pci_dev);  	pci_acpi_remove_pm_notifier(adev);  	if (adev->wakeup.flags.valid) { @@ -1405,20 +1391,6 @@ static void pci_acpi_cleanup(struct device *dev)  	}  } -static bool pci_acpi_bus_match(struct device *dev) -{ -	return dev_is_pci(dev); -} - -static struct acpi_bus_type acpi_pci_bus = { -	.name = "PCI", -	.match = pci_acpi_bus_match, -	.find_companion = acpi_pci_find_companion, -	.setup = pci_acpi_setup, -	.cleanup = pci_acpi_cleanup, -}; - -  static struct fwnode_handle *(*pci_msi_get_fwnode_cb)(struct device *dev);  /** @@ -1460,8 +1432,6 @@ struct irq_domain *pci_host_bridge_acpi_msi_domain(struct pci_bus *bus)  static int __init acpi_pci_init(void)  { -	int ret; -  	if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) {  		pr_info("ACPI FADT declares the system doesn't support MSI, so disable it\n");  		pci_no_msi(); @@ -1472,11 +1442,9 @@ static int __init acpi_pci_init(void)  		pcie_no_aspm();  	} -	ret = register_acpi_bus_type(&acpi_pci_bus); -	if (ret) +	if (acpi_pci_disabled)  		return 0; -	pci_set_platform_pm(&acpi_pci_platform_pm);  	acpi_pci_slot_init();  	acpiphp_init(); | 
