diff options
Diffstat (limited to 'drivers/pci/pcie/portdrv_pci.c')
| -rw-r--r-- | drivers/pci/pcie/portdrv_pci.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index ca10911ee0d..0761d90ca27 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c @@ -133,9 +133,17 @@ static int pcie_port_runtime_resume(struct device *dev)  {  	return 0;  } + +static int pcie_port_runtime_idle(struct device *dev) +{ +	/* Delay for a short while to prevent too frequent suspend/resume */ +	pm_schedule_suspend(dev, 10); +	return -EBUSY; +}  #else  #define pcie_port_runtime_suspend	NULL  #define pcie_port_runtime_resume	NULL +#define pcie_port_runtime_idle		NULL  #endif  static const struct dev_pm_ops pcie_portdrv_pm_ops = { @@ -148,6 +156,7 @@ static const struct dev_pm_ops pcie_portdrv_pm_ops = {  	.resume_noirq	= pcie_port_resume_noirq,  	.runtime_suspend = pcie_port_runtime_suspend,  	.runtime_resume = pcie_port_runtime_resume, +	.runtime_idle	= pcie_port_runtime_idle,  };  #define PCIE_PORTDRV_PM_OPS	(&pcie_portdrv_pm_ops) @@ -193,6 +202,11 @@ static int __devinit pcie_portdrv_probe(struct pci_dev *dev,  		return status;  	pci_save_state(dev); +	/* +	 * D3cold may not work properly on some PCIe port, so disable +	 * it by default. +	 */ +	dev->d3cold_allowed = false;  	if (!pci_match_id(port_runtime_pm_black_list, dev))  		pm_runtime_put_noidle(&dev->dev);  |