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); }