PCI: altera: Use size=4 IRQ domain for legacy INTx
authorPaul Burton <paul.burton@imgtec.com>
Tue, 15 Aug 2017 21:24:38 +0000 (16:24 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 16 Aug 2017 16:41:20 +0000 (11:41 -0500)
The devicetree binding documentation for the Altera PCIe controller shows
an example which uses an interrupt-map property to map PCI INTx interrupts
to hardware IRQ numbers 1-4. The driver creates an IRQ domain with size 5
in order to cover this range, with hwirq=0 left unused.

This patch cleans up this wasted IRQ domain entry, modifying the driver to
use an IRQ domain of size 4 which matches the actual number of PCI INTx
interrupts. Since the hwirq numbers 1-4 are part of the devicetree binding,
and this is considered ABI, we cannot simply change the interrupt-map
property to use the range 0-3. Instead we make use of the
pci_irqd_intx_xlate() helper function to translate the range 1-4 used at
the DT level into the range 0-3 which is now used within the driver, and
stop adding 1 to decoded hwirq numbers in altera_pcie_isr().

Whilst cleaning up INTx handling we make use of the new PCI_NUM_INTX macro
& drop the custom INTX_NUM definition.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Ley Foon Tan <lftan@altera.com>
drivers/pci/host/pcie-altera.c

index 4ea4f8f..6fced59 100644 (file)
@@ -76,8 +76,6 @@
 #define LINK_UP_TIMEOUT                        HZ
 #define LINK_RETRAIN_TIMEOUT           HZ
 
-#define INTX_NUM                       4
-
 #define DWORD_MASK                     3
 
 struct altera_pcie {
@@ -464,6 +462,7 @@ static int altera_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
 
 static const struct irq_domain_ops intx_domain_ops = {
        .map = altera_pcie_intx_map,
+       .xlate = pci_irqd_intx_xlate,
 };
 
 static void altera_pcie_isr(struct irq_desc *desc)
@@ -481,11 +480,11 @@ static void altera_pcie_isr(struct irq_desc *desc)
 
        while ((status = cra_readl(pcie, P2A_INT_STATUS)
                & P2A_INT_STS_ALL) != 0) {
-               for_each_set_bit(bit, &status, INTX_NUM) {
+               for_each_set_bit(bit, &status, PCI_NUM_INTX) {
                        /* clear interrupts */
                        cra_writel(pcie, 1 << bit, P2A_INT_STATUS);
 
-                       virq = irq_find_mapping(pcie->irq_domain, bit + 1);
+                       virq = irq_find_mapping(pcie->irq_domain, bit);
                        if (virq)
                                generic_handle_irq(virq);
                        else
@@ -536,7 +535,7 @@ static int altera_pcie_init_irq_domain(struct altera_pcie *pcie)
        struct device_node *node = dev->of_node;
 
        /* Setup INTx */
-       pcie->irq_domain = irq_domain_add_linear(node, INTX_NUM + 1,
+       pcie->irq_domain = irq_domain_add_linear(node, PCI_NUM_INTX,
                                        &intx_domain_ops, pcie);
        if (!pcie->irq_domain) {
                dev_err(dev, "Failed to get a INTx IRQ domain\n");