diff options
| author | Len Brown <len.brown@intel.com> | 2004-03-31 19:11:21 -0500 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2004-03-31 19:11:21 -0500 |
| commit | 9bec1b880862ec38019602ddf0a4bdde5bc55ade (patch) | |
| tree | 319c7750bc6080d259b4c36552f68511e2728238 | |
| parent | 6dbea95899683b6dc73ae6626e24db7c9c4b4fbc (diff) | |
| parent | 112382a40b8fb3cd9555bb17db8741cd57524ea5 (diff) | |
Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.4
into intel.com:/home/lenb/src/linux-acpi-test-2.6.5
| -rw-r--r-- | drivers/acpi/bus.c | 5 | ||||
| -rw-r--r-- | drivers/acpi/pci_irq.c | 31 |
2 files changed, 22 insertions, 14 deletions
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 0b1e442c88cd..7d35c674d4ed 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -615,6 +615,11 @@ acpi_bus_init (void) #ifdef CONFIG_X86 if (!acpi_ioapic) { extern acpi_interrupt_flags acpi_sci_flags; + + /* compatible (0) means level (3) */ + if (acpi_sci_flags.trigger == 0) + acpi_sci_flags.trigger = 3; + /* Set PIC-mode SCI trigger type */ acpi_pic_sci_set_trigger(acpi_fadt.sci_int, acpi_sci_flags.trigger); } else { diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index a17f433c2a7a..8e991816632c 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c @@ -273,11 +273,6 @@ acpi_pci_irq_lookup (struct pci_bus *bus, int device, int pin) return_VALUE(entry->irq); } -/* - * current thinking is that acpi_pci_irq_derive() adds no value - * and should be deleted, so warn if it actually does something. - */ - static int acpi_pci_irq_derive ( struct pci_dev *dev, @@ -285,6 +280,7 @@ acpi_pci_irq_derive ( { struct pci_dev *bridge = dev; int irq = 0; + u8 bridge_pin = 0; ACPI_FUNCTION_TRACE("acpi_pci_irq_derive"); @@ -293,11 +289,25 @@ acpi_pci_irq_derive ( /* * Attempt to derive an IRQ for this device from a parent bridge's - * PCI interrupt routing entry (a.k.a. the "bridge swizzle"). + * PCI interrupt routing entry (eg. yenta bridge and add-in card bridge). */ while (!irq && bridge->bus->self) { pin = (pin + PCI_SLOT(bridge->devfn)) % 4; bridge = bridge->bus->self; + + if ((bridge->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) { + /* PC card has the same IRQ as its cardbridge */ + pci_read_config_byte(bridge, PCI_INTERRUPT_PIN, &bridge_pin); + if (!bridge_pin) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "No interrupt pin configured for device %s\n", pci_name(bridge))); + return_VALUE(0); + } + /* Pin is from 0 to 3 */ + bridge_pin --; + pin = bridge_pin; + } + irq = acpi_pci_irq_lookup(bridge->bus, PCI_SLOT(bridge->devfn), pin); } @@ -307,7 +317,7 @@ acpi_pci_irq_derive ( return_VALUE(0); } - ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Derive IRQ %d for device %s from %s\n", + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Derive IRQ %d for device %s from %s\n", irq, pci_name(dev), pci_name(bridge))); return_VALUE(irq); @@ -345,13 +355,6 @@ acpi_pci_irq_enable ( irq = acpi_pci_irq_lookup(dev->bus, PCI_SLOT(dev->devfn), pin); /* - * Check if the device has an IRQ, - * Hotplug devices may get IRQs by scanning - */ - if (!irq && dev->irq) - irq = dev->irq; - - /* * If no PRT entry was found, we'll try to derive an IRQ from the * device's parent bridge. */ |
