diff options
author | Vignesh R <vigneshr@ti.com> | 2017-12-29 06:41:30 -0500 |
---|---|---|
committer | Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> | 2018-01-10 06:20:12 -0500 |
commit | 524d59f6e30aab5b618da55e604c802ccd83e708 (patch) | |
tree | cddccfd95815d5b5b11c3ebc7d7a4d6a392e097d | |
parent | 8e64a7cce7b16e02e00eeb16f66909022b200da6 (diff) |
PCI: dra7xx: Fix legacy INTD IRQ handling
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: Bjorn Helgaas <bhelgaas@google.com>
Reported-by: Chris Welch <Chris.Welch@viavisolutions.com>
Signed-off-by: Vignesh R <vigneshr@ti.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Kishon Vijay Abraham I <kishon@ti.com>
-rw-r--r-- | drivers/pci/dwc/pci-dra7xx.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c index 4ab113543923..3321da945f0f 100644 --- a/drivers/pci/dwc/pci-dra7xx.c +++ b/drivers/pci/dwc/pci-dra7xx.c | |||
@@ -226,6 +226,7 @@ static int dra7xx_pcie_intx_map(struct irq_domain *domain, unsigned int irq, | |||
226 | 226 | ||
227 | static const struct irq_domain_ops intx_domain_ops = { | 227 | static const struct irq_domain_ops intx_domain_ops = { |
228 | .map = dra7xx_pcie_intx_map, | 228 | .map = dra7xx_pcie_intx_map, |
229 | .xlate = pci_irqd_intx_xlate, | ||
229 | }; | 230 | }; |
230 | 231 | ||
231 | static int dra7xx_pcie_init_irq_domain(struct pcie_port *pp) | 232 | static int dra7xx_pcie_init_irq_domain(struct pcie_port *pp) |
@@ -269,7 +270,7 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, void *arg) | |||
269 | case INTC: | 270 | case INTC: |
270 | case INTD: | 271 | case INTD: |
271 | generic_handle_irq(irq_find_mapping(dra7xx->irq_domain, | 272 | generic_handle_irq(irq_find_mapping(dra7xx->irq_domain, |
272 | ffs(reg))); | 273 | ffs(reg) - 1)); |
273 | break; | 274 | break; |
274 | } | 275 | } |
275 | 276 | ||