diff options
Diffstat (limited to 'drivers/pci/pci.c')
| -rw-r--r-- | drivers/pci/pci.c | 36 | 
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 54858838f09..bdf66b500f2 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -86,7 +86,7 @@ enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_TUNE_OFF;   * the dfl or actual value as it sees fit.  Don't forget this is   * measured in 32-bit words, not bytes.   */ -u8 pci_dfl_cache_line_size __devinitdata = L1_CACHE_BYTES >> 2; +u8 pci_dfl_cache_line_size = L1_CACHE_BYTES >> 2;  u8 pci_cache_line_size;  /* @@ -1858,6 +1858,38 @@ bool pci_dev_run_wake(struct pci_dev *dev)  }  EXPORT_SYMBOL_GPL(pci_dev_run_wake); +void pci_config_pm_runtime_get(struct pci_dev *pdev) +{ +	struct device *dev = &pdev->dev; +	struct device *parent = dev->parent; + +	if (parent) +		pm_runtime_get_sync(parent); +	pm_runtime_get_noresume(dev); +	/* +	 * pdev->current_state is set to PCI_D3cold during suspending, +	 * so wait until suspending completes +	 */ +	pm_runtime_barrier(dev); +	/* +	 * Only need to resume devices in D3cold, because config +	 * registers are still accessible for devices suspended but +	 * not in D3cold. +	 */ +	if (pdev->current_state == PCI_D3cold) +		pm_runtime_resume(dev); +} + +void pci_config_pm_runtime_put(struct pci_dev *pdev) +{ +	struct device *dev = &pdev->dev; +	struct device *parent = dev->parent; + +	pm_runtime_put(dev); +	if (parent) +		pm_runtime_put_sync(parent); +} +  /**   * pci_pm_init - Initialize PM functions of given PCI device   * @dev: PCI device to handle. @@ -3825,7 +3857,7 @@ static int __init pci_resource_alignment_sysfs_init(void)  late_initcall(pci_resource_alignment_sysfs_init); -static void __devinit pci_no_domains(void) +static void pci_no_domains(void)  {  #ifdef CONFIG_PCI_DOMAINS  	pci_domains_supported = 0;  |