]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/pci/irq.c
x86: fix mpparse.c build error on latest git
[linux-2.6-omap-h63xx.git] / arch / x86 / pci / irq.c
index 373b9afe6d4445b08efee66dfb4856519b434bd1..4064345cf14450557580ca3dbf14b07004f1efc4 100644 (file)
@@ -533,7 +533,7 @@ static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq,
 {
        struct pci_dev *bridge;
        int pin = pci_get_interrupt_pin(dev, &bridge);
-       return pcibios_set_irq_routing(bridge, pin, irq);
+       return pcibios_set_irq_routing(bridge, pin - 1, irq);
 }
 
 #endif
@@ -887,7 +887,6 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
                dev_dbg(&dev->dev, "no interrupt pin\n");
                return 0;
        }
-       pin = pin - 1;
 
        /* Find IRQ routing entry */
 
@@ -897,17 +896,17 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
        info = pirq_get_info(dev);
        if (!info) {
                dev_dbg(&dev->dev, "PCI INT %c not found in routing table\n",
-                       'A' + pin);
+                       'A' + pin - 1);
                return 0;
        }
-       pirq = info->irq[pin].link;
-       mask = info->irq[pin].bitmap;
+       pirq = info->irq[pin - 1].link;
+       mask = info->irq[pin - 1].bitmap;
        if (!pirq) {
-               dev_dbg(&dev->dev, "PCI INT %c not routed\n", 'A' + pin);
+               dev_dbg(&dev->dev, "PCI INT %c not routed\n", 'A' + pin - 1);
                return 0;
        }
        dev_dbg(&dev->dev, "PCI INT %c -> PIRQ %02x, mask %04x, excl %04x",
-               'A' + pin, pirq, mask, pirq_table->exclusive_irqs);
+               'A' + pin - 1, pirq, mask, pirq_table->exclusive_irqs);
        mask &= pcibios_irq_mask;
 
        /* Work around broken HP Pavilion Notebooks which assign USB to
@@ -949,7 +948,7 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
                                newirq = i;
                }
        }
-       dev_dbg(&dev->dev, "PCI INT %c -> newirq %d", 'A' + pin, newirq);
+       dev_dbg(&dev->dev, "PCI INT %c -> newirq %d", 'A' + pin - 1, newirq);
 
        /* Check if it is hardcoded */
        if ((pirq & 0xf0) == 0xf0) {
@@ -977,18 +976,18 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
                        return 0;
                }
        }
-       dev_info(&dev->dev, "%s PCI INT %c -> IRQ %d\n", msg, 'A' + pin, irq);
+       dev_info(&dev->dev, "%s PCI INT %c -> IRQ %d\n", msg, 'A' + pin - 1, irq);
 
        /* Update IRQ for all devices with the same pirq value */
        while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) {
                pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin);
                if (!pin)
                        continue;
-               pin--;
+
                info = pirq_get_info(dev2);
                if (!info)
                        continue;
-               if (info->irq[pin].link == pirq) {
+               if (info->irq[pin - 1].link == pirq) {
                        /*
                         * We refuse to override the dev->irq
                         * information. Give a warning!
@@ -1042,6 +1041,9 @@ static void __init pcibios_fixup_irqs(void)
        dev = NULL;
        while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
                pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
+               if (!pin)
+                       continue;
+
 #ifdef CONFIG_X86_IO_APIC
                /*
                 * Recalculate IRQ numbers if we use the I/O APIC.
@@ -1049,15 +1051,11 @@ static void __init pcibios_fixup_irqs(void)
                if (io_apic_assign_pci_irqs) {
                        int irq;
 
-                       if (!pin)
-                               continue;
-
                        /*
                         * interrupt pins are numbered starting from 1
                         */
-                       pin--;
                        irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
-                               PCI_SLOT(dev->devfn), pin);
+                               PCI_SLOT(dev->devfn), pin - 1);
                        /*
                         * Busses behind bridges are typically not listed in the
                         * MP-table.  In this case we have to look up the IRQ
@@ -1070,22 +1068,22 @@ static void __init pcibios_fixup_irqs(void)
                                struct pci_dev *bridge = dev->bus->self;
                                int bus;
 
-                               pin = (pin + PCI_SLOT(dev->devfn)) % 4;
+                               pin = pci_swizzle_interrupt_pin(dev, pin);
                                bus = bridge->bus->number;
                                irq = IO_APIC_get_PCI_irq_vector(bus,
-                                               PCI_SLOT(bridge->devfn), pin);
+                                               PCI_SLOT(bridge->devfn), pin - 1);
                                if (irq >= 0)
                                        dev_warn(&dev->dev,
                                                "using bridge %s INT %c to "
                                                        "get IRQ %d\n",
                                                 pci_name(bridge),
-                                                'A' + pin, irq);
+                                                'A' + pin - 1, irq);
                        }
                        if (irq >= 0) {
                                dev_info(&dev->dev,
                                        "PCI->APIC IRQ transform: INT %c "
                                                "-> IRQ %d\n",
-                                       'A' + pin, irq);
+                                       'A' + pin - 1, irq);
                                dev->irq = irq;
                        }
                }
@@ -1093,7 +1091,7 @@ static void __init pcibios_fixup_irqs(void)
                /*
                 * Still no IRQ? Try to lookup one...
                 */
-               if (pin && !dev->irq)
+               if (!dev->irq)
                        pcibios_lookup_irq(dev, 0);
        }
 }
@@ -1220,12 +1218,10 @@ static int pirq_enable_irq(struct pci_dev *dev)
        if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) {
                char *msg = "";
 
-               pin--; /* interrupt pins are numbered starting from 1 */
-
                if (io_apic_assign_pci_irqs) {
                        int irq;
 
-                       irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
+                       irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin - 1);
                        /*
                         * Busses behind bridges are typically not listed in the MP-table.
                         * In this case we have to look up the IRQ based on the parent bus,
@@ -1236,20 +1232,20 @@ static int pirq_enable_irq(struct pci_dev *dev)
                        while (irq < 0 && dev->bus->parent) { /* go back to the bridge */
                                struct pci_dev *bridge = dev->bus->self;
 
-                               pin = (pin + PCI_SLOT(dev->devfn)) % 4;
+                               pin = pci_swizzle_interrupt_pin(dev, pin);
                                irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number,
-                                               PCI_SLOT(bridge->devfn), pin);
+                                               PCI_SLOT(bridge->devfn), pin - 1);
                                if (irq >= 0)
                                        dev_warn(&dev->dev, "using bridge %s "
                                                 "INT %c to get IRQ %d\n",
-                                                pci_name(bridge), 'A' + pin,
+                                                pci_name(bridge), 'A' + pin - 1,
                                                 irq);
                                dev = bridge;
                        }
                        dev = temp_dev;
                        if (irq >= 0) {
                                dev_info(&dev->dev, "PCI->APIC IRQ transform: "
-                                        "INT %c -> IRQ %d\n", 'A' + pin, irq);
+                                        "INT %c -> IRQ %d\n", 'A' + pin - 1, irq);
                                dev->irq = irq;
                                return 0;
                        } else
@@ -1268,7 +1264,7 @@ static int pirq_enable_irq(struct pci_dev *dev)
                        return 0;
 
                dev_warn(&dev->dev, "can't find IRQ for PCI INT %c%s\n",
-                        'A' + pin, msg);
+                        'A' + pin - 1, msg);
        }
        return 0;
 }