Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e157e52 authored by Mika Westerberg's avatar Mika Westerberg Committed by Bjorn Helgaas
Browse files

PCI/PME: Implement runtime PM callbacks



Basically we need to do the same steps than what we do when system sleep is
entered and disable PME interrupt when the root port is runtime suspended.
This prevents spurious wakeups immediately when the port is transitioned
into D3cold.

Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 9c62f0bf
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -432,6 +432,31 @@ static void pcie_pme_remove(struct pcie_device *srv)
	kfree(get_service_data(srv));
}

static int pcie_pme_runtime_suspend(struct pcie_device *srv)
{
	struct pcie_pme_service_data *data = get_service_data(srv);

	spin_lock_irq(&data->lock);
	pcie_pme_interrupt_enable(srv->port, false);
	pcie_clear_root_pme_status(srv->port);
	data->noirq = true;
	spin_unlock_irq(&data->lock);

	return 0;
}

static int pcie_pme_runtime_resume(struct pcie_device *srv)
{
	struct pcie_pme_service_data *data = get_service_data(srv);

	spin_lock_irq(&data->lock);
	pcie_pme_interrupt_enable(srv->port, true);
	data->noirq = false;
	spin_unlock_irq(&data->lock);

	return 0;
}

static struct pcie_port_service_driver pcie_pme_driver = {
	.name		= "pcie_pme",
	.port_type	= PCI_EXP_TYPE_ROOT_PORT,
@@ -439,6 +464,8 @@ static struct pcie_port_service_driver pcie_pme_driver = {

	.probe		= pcie_pme_probe,
	.suspend	= pcie_pme_suspend,
	.runtime_suspend = pcie_pme_runtime_suspend,
	.runtime_resume	= pcie_pme_runtime_resume,
	.resume		= pcie_pme_resume,
	.remove		= pcie_pme_remove,
};