summaryrefslogtreecommitdiffstats
path: root/drivers/pci/dwc/pci-dra7xx.c
diff options
context:
space:
mode:
authorVignesh R2017-12-29 12:41:31 +0100
committerLorenzo Pieralisi2018-01-10 12:20:32 +0100
commit09b2d20349e37a03a0951ab69524b516c8f1cc5b (patch)
tree726cacfa874758f2337fe493149b31cd0a48ccd5 /drivers/pci/dwc/pci-dra7xx.c
parentPCI: dra7xx: Fix legacy INTD IRQ handling (diff)
downloadkernel-qcow2-linux-09b2d20349e37a03a0951ab69524b516c8f1cc5b.tar.gz
kernel-qcow2-linux-09b2d20349e37a03a0951ab69524b516c8f1cc5b.tar.xz
kernel-qcow2-linux-09b2d20349e37a03a0951ab69524b516c8f1cc5b.zip
PCI: dra7xx: Iterate over INTx status bits
It is possible that more than one legacy IRQ may be set at the same time, therefore iterate and handle all the pending INTx interrupts before clearing the status and exiting the IRQ handler. Otherwise, some interrupts would be lost. 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>
Diffstat (limited to 'drivers/pci/dwc/pci-dra7xx.c')
-rw-r--r--drivers/pci/dwc/pci-dra7xx.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c
index 3321da945f0f..8bf7c2714db6 100644
--- a/drivers/pci/dwc/pci-dra7xx.c
+++ b/drivers/pci/dwc/pci-dra7xx.c
@@ -257,7 +257,8 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, void *arg)
struct dra7xx_pcie *dra7xx = arg;
struct dw_pcie *pci = dra7xx->pci;
struct pcie_port *pp = &pci->pp;
- u32 reg;
+ unsigned long reg;
+ u32 virq, bit;
reg = dra7xx_pcie_readl(dra7xx, PCIECTRL_DRA7XX_CONF_IRQSTATUS_MSI);
@@ -269,8 +270,11 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, void *arg)
case INTB:
case INTC:
case INTD:
- generic_handle_irq(irq_find_mapping(dra7xx->irq_domain,
- ffs(reg) - 1));
+ for_each_set_bit(bit, &reg, PCI_NUM_INTX) {
+ virq = irq_find_mapping(dra7xx->irq_domain, bit);
+ if (virq)
+ generic_handle_irq(virq);
+ }
break;
}