HID: intel-ish-hid: Replace PCI_DEV_FLAGS_NO_D3 with pci_save_state

PCI_DEV_FLAGS_NO_D3 should not be used outside of PCI core.

Instead, we can use pci_save_state() to hint PCI core that the device
should stay at D0 during suspend. By doing so, PCI core will let the
upstream bridges also stays at D0 so the entire hierarchy is in the
correct power state as PCI spec mandates.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
Kai-Heng Feng 2020-06-29 12:16:46 +08:00 committed by Jiri Kosina
parent a789d5f8a9
commit 7e341061dd
1 changed files with 11 additions and 5 deletions

View File

@ -106,6 +106,11 @@ static inline bool ish_should_enter_d0i3(struct pci_dev *pdev)
return !pm_suspend_via_firmware() || pdev->device == CHV_DEVICE_ID;
}
static inline bool ish_should_leave_d0i3(struct pci_dev *pdev)
{
return !pm_resume_via_firmware() || pdev->device == CHV_DEVICE_ID;
}
/**
* ish_probe() - PCI driver probe callback
* @pdev: pci device
@ -215,9 +220,7 @@ static void __maybe_unused ish_resume_handler(struct work_struct *work)
struct ishtp_device *dev = pci_get_drvdata(pdev);
int ret;
/* Check the NO_D3 flag to distinguish the resume paths */
if (pdev->dev_flags & PCI_DEV_FLAGS_NO_D3) {
pdev->dev_flags &= ~PCI_DEV_FLAGS_NO_D3;
if (ish_should_leave_d0i3(pdev) && !dev->suspend_flag) {
disable_irq_wake(pdev->irq);
ishtp_send_resume(dev);
@ -281,8 +284,11 @@ static int __maybe_unused ish_suspend(struct device *device)
*/
ish_disable_dma(dev);
} else {
/* Set the NO_D3 flag, the ISH would enter D0i3 */
pdev->dev_flags |= PCI_DEV_FLAGS_NO_D3;
/*
* Save state so PCI core will keep the device at D0,
* the ISH would enter D0i3
*/
pci_save_state(pdev);
enable_irq_wake(pdev->irq);
}