Index: acpi.c =================================================================== RCS file: /data/cvsroot/linux/arch/ia64/kernel/acpi.c,v retrieving revision 1.1.1.9 diff -u -r1.1.1.9 acpi.c --- acpi.c 8 Dec 2001 03:03:40 -0000 1.1.1.9 +++ acpi.c 16 Jan 2002 02:40:13 -0000 @@ -101,7 +101,7 @@ acpi_legacy_irq (char *p) { acpi_entry_int_override_t *legacy = (acpi_entry_int_override_t *) p; - unsigned long polarity = 0, edge_triggered = 0; + unsigned long polarity = 0, trigger = 0; /* * If the platform we're running doesn't define @@ -110,17 +110,10 @@ if (!iosapic_register_legacy_irq) return; - switch (legacy->flags) { - case 0x5: polarity = 1; edge_triggered = 1; break; - case 0x7: polarity = 0; edge_triggered = 1; break; - case 0xd: polarity = 1; edge_triggered = 0; break; - case 0xf: polarity = 0; edge_triggered = 0; break; - default: - printk(" ACPI Legacy IRQ 0x%02x: Unknown flags 0x%x\n", legacy->isa_irq, - legacy->flags); - break; - } - iosapic_register_legacy_irq(legacy->isa_irq, legacy->pin, polarity, edge_triggered); + polarity = legacy->flags & 0x03; + trigger = (legacy->flags >> 2) & 0x03; + + iosapic_register_legacy_irq(legacy->isa_irq, legacy->pin, polarity, trigger); } /* Index: iosapic.c =================================================================== RCS file: /data/cvsroot/linux/arch/ia64/kernel/iosapic.c,v retrieving revision 1.1.1.10 diff -u -r1.1.1.10 iosapic.c --- iosapic.c 8 Dec 2001 03:10:42 -0000 1.1.1.10 +++ iosapic.c 16 Jan 2002 02:40:13 -0000 @@ -453,24 +453,43 @@ * ACPI calls this when it finds an entry for a legacy ISA interrupt. Note that the * irq_base and IOSAPIC address must be set in iosapic_init(). */ + +#define POLARITY_ACTIVE_HIGH (0x01) +#define POLARITY_ACTIVE_LOW (0x03) +#define TRIGGER_EDGE (0x01) +#define TRIGGER_LEVEL (0x03) + void iosapic_register_legacy_irq (unsigned long irq, unsigned long pin, unsigned long polarity, - unsigned long edge_triggered) + unsigned long trigger) { unsigned int vector = isa_irq_to_vector(irq); + irq_desc_t *idesc = irq_desc(vector); + struct hw_interrupt_type *irq_type; #ifdef DEBUG_IRQ_ROUTING printk("ISA: IRQ %u -> IOSAPIC irq 0x%02x (%s, %s) -> vector %02x\n", (unsigned) irq, (unsigned) pin, - polarity ? "high" : "low", edge_triggered ? "edge" : "level", + (polarity == POLARITY_ACTIVE_HIGH) ? "high" : "low", + (trigger == TRIGGER_EDGE) ? "edge" : "level", vector); #endif iosapic_irq[vector].pin = pin; iosapic_irq[vector].dmode = IOSAPIC_LOWEST_PRIORITY; - iosapic_irq[vector].polarity = polarity ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW; - iosapic_irq[vector].trigger = edge_triggered ? IOSAPIC_EDGE : IOSAPIC_LEVEL; + iosapic_irq[vector].polarity = (polarity == POLARITY_ACTIVE_HIGH) + ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW; + if (trigger == TRIGGER_EDGE) { + iosapic_irq[vector].trigger = IOSAPIC_EDGE; + idesc->handler = &irq_type_iosapic_edge; + } else { + iosapic_irq[vector].trigger = IOSAPIC_LEVEL; + idesc->handler = &irq_type_iosapic_level; + } + + /* reprogram IOSAPIC */ + set_rte(vector, (ia64_get_lid() >> 16) & 0xffff); } void __init