pci: framework: disable auto suspend link
Some endpoint devices do not go into D3hot during suspend. By pass auto suspend if device do not allow D3hot. CRs-Fixed: 2418347 Change-Id: Ida6e4a2b60b7d08932bfff79144afd67787ca0f2 Signed-off-by: Sujeev Dias <sdias@codeaurora.org>
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
parent
d126692554
commit
02f0bed29f
@@ -827,6 +827,10 @@ static int pci_pm_suspend_noirq(struct device *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if d3hot is not supported bail out */
|
||||||
|
if (pci_dev->no_d3hot)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (!pci_dev->state_saved) {
|
if (!pci_dev->state_saved) {
|
||||||
pci_save_state(pci_dev);
|
pci_save_state(pci_dev);
|
||||||
if (pci_power_manageable(pci_dev))
|
if (pci_power_manageable(pci_dev))
|
||||||
@@ -883,7 +887,8 @@ static int pci_pm_resume_noirq(struct device *dev)
|
|||||||
if (dev_pm_smart_suspend_and_suspended(dev))
|
if (dev_pm_smart_suspend_and_suspended(dev))
|
||||||
pm_runtime_set_active(dev);
|
pm_runtime_set_active(dev);
|
||||||
|
|
||||||
pci_pm_default_resume_early(pci_dev);
|
if (!pci_dev->no_d3hot)
|
||||||
|
pci_pm_default_resume_early(pci_dev);
|
||||||
|
|
||||||
if (pci_has_legacy_pm_support(pci_dev))
|
if (pci_has_legacy_pm_support(pci_dev))
|
||||||
return pci_legacy_resume_early(dev);
|
return pci_legacy_resume_early(dev);
|
||||||
@@ -1281,6 +1286,10 @@ static int pci_pm_runtime_suspend(struct device *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if d3hot is not supported bail out */
|
||||||
|
if (pci_dev->no_d3hot)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (!pci_dev->state_saved) {
|
if (!pci_dev->state_saved) {
|
||||||
pci_save_state(pci_dev);
|
pci_save_state(pci_dev);
|
||||||
pci_finish_runtime_suspend(pci_dev);
|
pci_finish_runtime_suspend(pci_dev);
|
||||||
@@ -1295,6 +1304,10 @@ static int pci_pm_runtime_resume(struct device *dev)
|
|||||||
struct pci_dev *pci_dev = to_pci_dev(dev);
|
struct pci_dev *pci_dev = to_pci_dev(dev);
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
/* we skipped d3hot processing so skip re-init */
|
||||||
|
if (pci_dev->no_d3hot)
|
||||||
|
goto skip_restore;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restoring config space is necessary even if the device is not bound
|
* Restoring config space is necessary even if the device is not bound
|
||||||
* to a driver because although we left it in D0, it may have gone to
|
* to a driver because although we left it in D0, it may have gone to
|
||||||
@@ -1309,6 +1322,7 @@ static int pci_pm_runtime_resume(struct device *dev)
|
|||||||
pci_enable_wake(pci_dev, PCI_D0, false);
|
pci_enable_wake(pci_dev, PCI_D0, false);
|
||||||
pci_fixup_device(pci_fixup_resume, pci_dev);
|
pci_fixup_device(pci_fixup_resume, pci_dev);
|
||||||
|
|
||||||
|
skip_restore:
|
||||||
if (pm && pm->runtime_resume)
|
if (pm && pm->runtime_resume)
|
||||||
rc = pm->runtime_resume(dev);
|
rc = pm->runtime_resume(dev);
|
||||||
|
|
||||||
|
|||||||
@@ -333,6 +333,7 @@ struct pci_dev {
|
|||||||
unsigned int d2_support:1; /* Low power state D2 is supported */
|
unsigned int d2_support:1; /* Low power state D2 is supported */
|
||||||
unsigned int no_d1d2:1; /* D1 and D2 are forbidden */
|
unsigned int no_d1d2:1; /* D1 and D2 are forbidden */
|
||||||
unsigned int no_d3cold:1; /* D3cold is forbidden */
|
unsigned int no_d3cold:1; /* D3cold is forbidden */
|
||||||
|
unsigned int no_d3hot:1; /* D3hot is forbidden */
|
||||||
unsigned int bridge_d3:1; /* Allow D3 for bridge */
|
unsigned int bridge_d3:1; /* Allow D3 for bridge */
|
||||||
unsigned int d3cold_allowed:1; /* D3cold is allowed by user */
|
unsigned int d3cold_allowed:1; /* D3cold is allowed by user */
|
||||||
unsigned int mmio_always_on:1; /* Disallow turning off io/mem
|
unsigned int mmio_always_on:1; /* Disallow turning off io/mem
|
||||||
|
|||||||
Reference in New Issue
Block a user