]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/pci/irq.c
Merge branch 'drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
[linux-2.6-omap-h63xx.git] / arch / x86 / pci / irq.c
index 8e077185e185cbc72e58be92fcbd29f05437ed23..bf69dbe08bff66b19b8e9a7558d152fd4fce62f7 100644 (file)
@@ -493,7 +493,7 @@ static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq
        if (pirq <= 4)
                irq = read_config_nybble(router, 0x56, pirq - 1);
        dev_info(&dev->dev,
-                "AMD756: dev [%04x/%04x], router PIRQ %d get IRQ %d\n",
+                "AMD756: dev [%04x:%04x], router PIRQ %d get IRQ %d\n",
                 dev->vendor, dev->device, pirq, irq);
        return irq;
 }
@@ -501,7 +501,7 @@ static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq
 static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 {
        dev_info(&dev->dev,
-                "AMD756: dev [%04x/%04x], router PIRQ %d set IRQ %d\n",
+                "AMD756: dev [%04x:%04x], router PIRQ %d set IRQ %d\n",
                 dev->vendor, dev->device, pirq, irq);
        if (pirq <= 4)
                write_config_nybble(router, 0x56, pirq - 1, irq);
@@ -590,13 +590,20 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
        case PCI_DEVICE_ID_INTEL_ICH10_1:
        case PCI_DEVICE_ID_INTEL_ICH10_2:
        case PCI_DEVICE_ID_INTEL_ICH10_3:
-       case PCI_DEVICE_ID_INTEL_PCH_0:
-       case PCI_DEVICE_ID_INTEL_PCH_1:
                r->name = "PIIX/ICH";
                r->get = pirq_piix_get;
                r->set = pirq_piix_set;
                return 1;
        }
+
+       if ((device >= PCI_DEVICE_ID_INTEL_PCH_LPC_MIN) && 
+               (device <= PCI_DEVICE_ID_INTEL_PCH_LPC_MAX)) {
+               r->name = "PIIX/ICH";
+               r->get = pirq_piix_get;
+               r->set = pirq_piix_set;
+               return 1;
+       }
+
        return 0;
 }
 
@@ -823,7 +830,7 @@ static void __init pirq_find_router(struct irq_router *r)
        r->get = NULL;
        r->set = NULL;
 
-       DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for %04x:%04x\n",
+       DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for [%04x:%04x]\n",
            rt->rtr_vendor, rt->rtr_device);
 
        pirq_router_dev = pci_get_bus_and_slot(rt->rtr_bus, rt->rtr_devfn);
@@ -843,7 +850,7 @@ static void __init pirq_find_router(struct irq_router *r)
                        h->probe(r, pirq_router_dev, pirq_router_dev->device))
                        break;
        }
-       dev_info(&pirq_router_dev->dev, "%s IRQ router [%04x/%04x]\n",
+       dev_info(&pirq_router_dev->dev, "%s IRQ router [%04x:%04x]\n",
                 pirq_router.name,
                 pirq_router_dev->vendor, pirq_router_dev->device);
 
@@ -1043,35 +1050,44 @@ static void __init pcibios_fixup_irqs(void)
                if (io_apic_assign_pci_irqs) {
                        int irq;
 
-                       if (pin) {
-                               /*
-                                * interrupt pins are numbered starting
-                                * from 1
-                                */
-                               pin--;
-                               irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
-                                       PCI_SLOT(dev->devfn), pin);
-       /*
-        * 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,
-        * parent slot, and pin number. The SMP code detects such bridged
-        * busses itself so we should get into this branch reliably.
-        */
-                               if (irq < 0 && dev->bus->parent) { /* go back to the bridge */
-                                       struct pci_dev *bridge = dev->bus->self;
-
-                                       pin = (pin + PCI_SLOT(dev->devfn)) % 4;
-                                       irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number,
-                                                       PCI_SLOT(bridge->devfn), pin);
-                                       if (irq >= 0)
-                                               dev_warn(&dev->dev, "using bridge %s INT %c to get IRQ %d\n",
-                                                        pci_name(bridge),
-                                                        'A' + pin, irq);
-                               }
-                               if (irq >= 0) {
-                                       dev_info(&dev->dev, "PCI->APIC IRQ transform: INT %c -> IRQ %d\n", 'A' + pin, irq);
-                                       dev->irq = 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);
+                       /*
+                        * 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, parent slot, and pin number.
+                        * The SMP code detects such bridged busses itself so we
+                        * should get into this branch reliably.
+                        */
+                       if (irq < 0 && dev->bus->parent) {
+                               /* go back to the bridge */
+                               struct pci_dev *bridge = dev->bus->self;
+                               int bus;
+
+                               pin = (pin + PCI_SLOT(dev->devfn)) % 4;
+                               bus = bridge->bus->number;
+                               irq = IO_APIC_get_PCI_irq_vector(bus,
+                                               PCI_SLOT(bridge->devfn), pin);
+                               if (irq >= 0)
+                                       dev_warn(&dev->dev,
+                                               "using bridge %s INT %c to "
+                                                       "get IRQ %d\n",
+                                                pci_name(bridge),
+                                                'A' + pin, irq);
+                       }
+                       if (irq >= 0) {
+                               dev_info(&dev->dev,
+                                       "PCI->APIC IRQ transform: INT %c "
+                                               "-> IRQ %d\n",
+                                       'A' + pin, irq);
+                               dev->irq = irq;
                        }
                }
 #endif