From cc675921979e4a332eb01a97abf0fbaf00118157 Mon Sep 17 00:00:00 2001 From: Tony Truong Date: Thu, 11 Feb 2021 09:00:06 -0800 Subject: [PATCH] msm: msi: set enable_irq_wake for PCIe MSI IRQ To guarantee PCIe client MSI can wake up APPS while its in LPM, call enable_irq_wake on the parent MSI, PCIe MSI IRQ. Doing so will make sure these IRQs are not disabled as part of APPS system suspend. Change-Id: Ifdb74068a26eca7028667310d62df8b974e58927 Signed-off-by: Tony Truong --- drivers/pci/controller/pci-msm-msi.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/pci/controller/pci-msm-msi.c b/drivers/pci/controller/pci-msm-msi.c index 5a0f2c5a7a32..e568c8b03feb 100644 --- a/drivers/pci/controller/pci-msm-msi.c +++ b/drivers/pci/controller/pci-msm-msi.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.*/ +/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.*/ #include #include @@ -480,6 +480,14 @@ static int msm_msi_snps_irq_setup(struct msm_msi *msi) goto free_irqs; } + ret = enable_irq_wake(irq); + if (ret) { + dev_err(msi->dev, + "MSI: Unable to set enable_irq_wake for interrupt: %d: %d\n", + i, irq); + goto free_irq; + } + msi_grp = &msi->grps[i]; msi_grp->int_en_reg = msi->pcie_cfg + PCIE_MSI_CTRL_INT_N_EN_OFFS(i); @@ -503,11 +511,14 @@ static int msm_msi_snps_irq_setup(struct msm_msi *msi) return 0; +free_irq: + irq_dispose_mapping(irq); free_irqs: for (--i; i >= 0; i--) { irq = msi->grps[i].irqs[0].hwirq; irq_set_chained_handler_and_data(irq, NULL, NULL); + disable_irq_wake(irq); irq_dispose_mapping(irq); } @@ -531,6 +542,14 @@ static int msm_msi_qgic_irq_setup(struct msm_msi *msi) goto free_irqs; } + ret = enable_irq_wake(irq); + if (ret) { + dev_err(msi->dev, + "MSI: Unable to set enable_irq_wake for interrupt: %d: %d\n", + i, irq); + goto free_irq; + } + grp = i / MSI_IRQ_PER_GRP; index = i % MSI_IRQ_PER_GRP; msi_grp = &msi->grps[grp]; @@ -547,6 +566,8 @@ static int msm_msi_qgic_irq_setup(struct msm_msi *msi) return 0; +free_irq: + irq_dispose_mapping(irq); free_irqs: for (--i; i >= 0; i--) { grp = i / MSI_IRQ_PER_GRP; @@ -554,6 +575,7 @@ free_irqs: irq = msi->grps[grp].irqs[index].hwirq; irq_set_chained_handler_and_data(irq, NULL, NULL); + disable_irq_wake(irq); irq_dispose_mapping(irq); }