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

Commit b36199bc authored by Vignesh R's avatar Vignesh R Committed by Greg Kroah-Hartman
Browse files

PCI: dra7xx: Fix legacy INTD IRQ handling



commit 524d59f6 upstream.

Legacy INTD IRQ handling is broken on dra7xx due to fact that driver
uses hwirq in range of 1-4 for INTA, INTD whereas IRQ domain is of size
4 which is numbered 0-3. Therefore when INTD IRQ line is used with
pci-dra7xx driver following warning is seen:

       WARNING: CPU: 0 PID: 1 at kernel/irq/irqdomain.c:342 irq_domain_associate+0x12c/0x1c4
       error: hwirq 0x4 is too large for dummy

Fix this by using pci_irqd_intx_xlate() helper to translate the INTx 1-4
range into the 0-3 as done in other PCIe drivers.

Suggested-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reported-by: default avatarChris Welch <Chris.Welch@viavisolutions.com>
Signed-off-by: default avatarVignesh R <vigneshr@ti.com>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ae85d34d
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -227,6 +227,7 @@ static int dra7xx_pcie_intx_map(struct irq_domain *domain, unsigned int irq,


static const struct irq_domain_ops intx_domain_ops = {
static const struct irq_domain_ops intx_domain_ops = {
	.map = dra7xx_pcie_intx_map,
	.map = dra7xx_pcie_intx_map,
	.xlate = pci_irqd_intx_xlate,
};
};


static int dra7xx_pcie_init_irq_domain(struct pcie_port *pp)
static int dra7xx_pcie_init_irq_domain(struct pcie_port *pp)
@@ -270,7 +271,7 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, void *arg)
	case INTC:
	case INTC:
	case INTD:
	case INTD:
		generic_handle_irq(irq_find_mapping(dra7xx->irq_domain,
		generic_handle_irq(irq_find_mapping(dra7xx->irq_domain,
						    ffs(reg)));
						    ffs(reg) - 1));
		break;
		break;
	}
	}