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

Commit bb168a0f authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: msi: set enable_irq_wake for PCIe MSI IRQ"

parents 39d25940 cc675921
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);
	}