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

Commit cc675921 authored by Tony Truong's avatar Tony Truong
Browse files

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: default avatarTony Truong <truong@codeaurora.org>
parent eca62752
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
// 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 <linux/interrupt.h>
#include <linux/iommu.h>
@@ -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 @@ static int msm_msi_qgic_irq_setup(struct msm_msi *msi)
		irq = msi->grps[grp].irqs[index].hwirq;

		irq_set_chained_handler_and_data(irq, NULL, NULL);
		disable_irq_wake(irq);
		irq_dispose_mapping(irq);
	}