diff --git a/drivers/hid/intel-ish-hid/ipc/pci-ish.c b/drivers/hid/intel-ish-hid/ipc/pci-ish.c index 55cb25038e63..0d854e4f1f7c 100644 --- a/drivers/hid/intel-ish-hid/ipc/pci-ish.c +++ b/drivers/hid/intel-ish-hid/ipc/pci-ish.c @@ -119,7 +119,7 @@ static inline bool ish_should_leave_d0i3(struct pci_dev *pdev) return !pm_resume_via_firmware() || pdev->device == CHV_DEVICE_ID; } -static int enable_gpe(struct device *dev) +static int enable_gpe(struct device *dev, bool status) { #ifdef CONFIG_ACPI acpi_status acpi_sts; @@ -133,7 +133,11 @@ static int enable_gpe(struct device *dev) } wakeup = &adev->wakeup; - acpi_sts = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number); + if (status) + acpi_sts = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number); + else + acpi_sts = acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number); + if (ACPI_FAILURE(acpi_sts)) { dev_err(dev, "enable ose_gpe failed\n"); return -EIO; @@ -145,13 +149,13 @@ static int enable_gpe(struct device *dev) #endif } -static void enable_pme_wake(struct pci_dev *pdev) +static void enable_pme_wake(struct pci_dev *pdev, status) { if ((pci_pme_capable(pdev, PCI_D0) || pci_pme_capable(pdev, PCI_D3hot) || - pci_pme_capable(pdev, PCI_D3cold)) && !enable_gpe(&pdev->dev)) { - pci_pme_active(pdev, true); - dev_dbg(&pdev->dev, "ish ipc driver pme wake enabled\n"); + pci_pme_capable(pdev, PCI_D3cold)) && !enable_gpe(&pdev->dev), status) { + pci_pme_active(pdev, status); + dev_dbg(&pdev->dev, "ish ipc driver pme wake enabled state %d\n", status); } } @@ -225,7 +229,7 @@ static int ish_probe(struct pci_dev *pdev, const struct pci_device_id *ent) /* Enable PME for EHL */ if (pdev->device == EHL_Ax_DEVICE_ID) - enable_pme_wake(pdev); + enable_pme_wake(pdev, true); ret = ish_init(ishtp); if (ret) @@ -353,6 +357,9 @@ static int __maybe_unused ish_suspend(struct device *device) ish_disable_dma(dev); } + if (dev->pdev->device == EHL_Ax_DEVICE_ID) + enable_pme_wake(pdev, false); + return 0; } @@ -373,7 +380,7 @@ static int __maybe_unused ish_resume(struct device *device) /* add this to finish power flow for EHL */ if (dev->pdev->device == EHL_Ax_DEVICE_ID) { pci_set_power_state(pdev, PCI_D0); - enable_pme_wake(pdev); + enable_pme_wake(pdev, true); dev_dbg(dev->devc, "set power state to D0 for ehl\n"); }