Commit 64706886 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://linux-acpi.bkbits.net/linux-acpi-release-2.6.5

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 4a10600a 8660e3d9
...@@ -67,6 +67,10 @@ int acpi_sci_override_gsi __initdata; ...@@ -67,6 +67,10 @@ int acpi_sci_override_gsi __initdata;
static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
#endif #endif
#ifndef __HAVE_ARCH_CMPXCHG
#warning ACPI uses CMPXCHG, i486 and later hardware
#endif
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
Boot-time Configuration Boot-time Configuration
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
......
...@@ -2440,6 +2440,10 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a ...@@ -2440,6 +2440,10 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
entry.polarity = active_high_low; entry.polarity = active_high_low;
entry.mask = 1; entry.mask = 1;
/*
* IRQs < 16 are already in the irq_2_pin[] map
*/
if (irq >= 16)
add_pin_to_irq(irq, ioapic, pin); add_pin_to_irq(irq, ioapic, pin);
entry.vector = assign_irq_vector(irq); entry.vector = assign_irq_vector(irq);
......
...@@ -1891,6 +1891,10 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a ...@@ -1891,6 +1891,10 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
entry.polarity = active_high_low; entry.polarity = active_high_low;
entry.mask = 1; /* Disabled (masked) */ entry.mask = 1; /* Disabled (masked) */
/*
* IRQs < 16 are already in the irq_2_pin[] map
*/
if (irq >= 16)
add_pin_to_irq(irq, ioapic, pin); add_pin_to_irq(irq, ioapic, pin);
entry.vector = assign_irq_vector(irq); entry.vector = assign_irq_vector(irq);
......
...@@ -615,6 +615,11 @@ acpi_bus_init (void) ...@@ -615,6 +615,11 @@ acpi_bus_init (void)
#ifdef CONFIG_X86 #ifdef CONFIG_X86
if (!acpi_ioapic) { if (!acpi_ioapic) {
extern acpi_interrupt_flags acpi_sci_flags; 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 */ /* Set PIC-mode SCI trigger type */
acpi_pic_sci_set_trigger(acpi_fadt.sci_int, acpi_sci_flags.trigger); acpi_pic_sci_set_trigger(acpi_fadt.sci_int, acpi_sci_flags.trigger);
} else { } else {
......
...@@ -273,11 +273,6 @@ acpi_pci_irq_lookup (struct pci_bus *bus, int device, int pin) ...@@ -273,11 +273,6 @@ acpi_pci_irq_lookup (struct pci_bus *bus, int device, int pin)
return_VALUE(entry->irq); 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 static int
acpi_pci_irq_derive ( acpi_pci_irq_derive (
struct pci_dev *dev, struct pci_dev *dev,
...@@ -285,6 +280,7 @@ acpi_pci_irq_derive ( ...@@ -285,6 +280,7 @@ acpi_pci_irq_derive (
{ {
struct pci_dev *bridge = dev; struct pci_dev *bridge = dev;
int irq = 0; int irq = 0;
u8 bridge_pin = 0;
ACPI_FUNCTION_TRACE("acpi_pci_irq_derive"); ACPI_FUNCTION_TRACE("acpi_pci_irq_derive");
...@@ -293,11 +289,25 @@ 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 * 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) { while (!irq && bridge->bus->self) {
pin = (pin + PCI_SLOT(bridge->devfn)) % 4; pin = (pin + PCI_SLOT(bridge->devfn)) % 4;
bridge = bridge->bus->self; 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, irq = acpi_pci_irq_lookup(bridge->bus,
PCI_SLOT(bridge->devfn), pin); PCI_SLOT(bridge->devfn), pin);
} }
...@@ -307,7 +317,7 @@ acpi_pci_irq_derive ( ...@@ -307,7 +317,7 @@ acpi_pci_irq_derive (
return_VALUE(0); 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))); irq, pci_name(dev), pci_name(bridge)));
return_VALUE(irq); return_VALUE(irq);
...@@ -344,13 +354,6 @@ acpi_pci_irq_enable ( ...@@ -344,13 +354,6 @@ acpi_pci_irq_enable (
*/ */
irq = acpi_pci_irq_lookup(dev->bus, PCI_SLOT(dev->devfn), pin); 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 * If no PRT entry was found, we'll try to derive an IRQ from the
* device's parent bridge. * device's parent bridge.
......
...@@ -54,15 +54,6 @@ ...@@ -54,15 +54,6 @@
#define ACPI_ENABLE_IRQS() local_irq_enable() #define ACPI_ENABLE_IRQS() local_irq_enable()
#define ACPI_FLUSH_CPU_CACHE() wbinvd() #define ACPI_FLUSH_CPU_CACHE() wbinvd()
/*
* A brief explanation as GNU inline assembly is a bit hairy
* %0 is the output parameter in EAX ("=a")
* %1 and %2 are the input parameters in ECX ("c")
* and an immediate value ("i") respectively
* All actual register references are preceded with "%%" as in "%%edx"
* Immediate values in the assembly are preceded by "$" as in "$0x1"
* The final asm parameter are the operation altered non-output registers.
*/
static inline int static inline int
__acpi_acquire_global_lock (unsigned int *lock) __acpi_acquire_global_lock (unsigned int *lock)
......
...@@ -241,6 +241,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz ...@@ -241,6 +241,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
#ifdef CONFIG_X86_CMPXCHG #ifdef CONFIG_X86_CMPXCHG
#define __HAVE_ARCH_CMPXCHG 1 #define __HAVE_ARCH_CMPXCHG 1
#endif
static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
unsigned long new, int size) unsigned long new, int size)
...@@ -273,10 +274,6 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, ...@@ -273,10 +274,6 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
(unsigned long)(n),sizeof(*(ptr)))) (unsigned long)(n),sizeof(*(ptr))))
#else
/* Compiling for a 386 proper. Is it worth implementing via cli/sti? */
#endif
#ifdef __KERNEL__ #ifdef __KERNEL__
struct alt_instr { struct alt_instr {
__u8 *instr; /* original instruction */ __u8 *instr; /* original instruction */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment