Introduce dw_pcie_wake_irq_handler function to support host wakeup from the WAKE# irq. Signed-off-by: Christian Bruel <christian.bruel@xxxxxxxxxxx> --- drivers/pci/controller/dwc/pcie-designware-host.c | 15 +++++++++++++++ drivers/pci/controller/dwc/pcie-designware.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c index bcbbe02f8f86..35cbb686d3f3 100644 --- a/drivers/pci/controller/dwc/pcie-designware-host.c +++ b/drivers/pci/controller/dwc/pcie-designware-host.c @@ -16,6 +16,7 @@ #include <linux/of_pci.h> #include <linux/pci_regs.h> #include <linux/platform_device.h> +#include <linux/suspend.h> #include "../../pci.h" #include "pcie-designware.h" @@ -991,3 +992,17 @@ int dw_pcie_resume_noirq(struct dw_pcie *pci) return ret; } EXPORT_SYMBOL_GPL(dw_pcie_resume_noirq); + +irqreturn_t dw_pcie_wake_irq_handler(int irq, void *arg) +{ + struct device *dev = arg; + + dev_dbg(dev, "host wakeup by EP"); + + /* Notify PM core we are wakeup source */ + pm_wakeup_event(dev, 0); + pm_system_wakeup(); + + return IRQ_HANDLED; +} +EXPORT_SYMBOL_GPL(dw_pcie_wake_irq_handler); diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h index 110cbac7dde1..434cb6a00f01 100644 --- a/drivers/pci/controller/dwc/pcie-designware.h +++ b/drivers/pci/controller/dwc/pcie-designware.h @@ -502,6 +502,8 @@ void dw_pcie_edma_remove(struct dw_pcie *pci); int dw_pcie_suspend_noirq(struct dw_pcie *pci); int dw_pcie_resume_noirq(struct dw_pcie *pci); +irqreturn_t dw_pcie_wake_irq_handler(int irq, void *arg); + static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val) { dw_pcie_write_dbi(pci, reg, 0x4, val); -- 2.34.1