diff options
Diffstat (limited to 'arch/i386/kernel/i8259.c')
-rw-r--r-- | arch/i386/kernel/i8259.c | 45 |
1 files changed, 13 insertions, 32 deletions
diff --git a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c index ea5f4e7958d8..d07ed31f11e3 100644 --- a/arch/i386/kernel/i8259.c +++ b/arch/i386/kernel/i8259.c | |||
@@ -34,35 +34,15 @@ | |||
34 | * moves to arch independent land | 34 | * moves to arch independent land |
35 | */ | 35 | */ |
36 | 36 | ||
37 | DEFINE_SPINLOCK(i8259A_lock); | ||
38 | |||
39 | static void end_8259A_irq (unsigned int irq) | ||
40 | { | ||
41 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)) && | ||
42 | irq_desc[irq].action) | ||
43 | enable_8259A_irq(irq); | ||
44 | } | ||
45 | |||
46 | #define shutdown_8259A_irq disable_8259A_irq | ||
47 | |||
48 | static int i8259A_auto_eoi; | 37 | static int i8259A_auto_eoi; |
49 | 38 | DEFINE_SPINLOCK(i8259A_lock); | |
50 | static void mask_and_ack_8259A(unsigned int); | 39 | static void mask_and_ack_8259A(unsigned int); |
51 | 40 | ||
52 | unsigned int startup_8259A_irq(unsigned int irq) | 41 | static struct irq_chip i8259A_chip = { |
53 | { | 42 | .name = "XT-PIC", |
54 | enable_8259A_irq(irq); | 43 | .mask = disable_8259A_irq, |
55 | return 0; /* never anything pending */ | 44 | .unmask = enable_8259A_irq, |
56 | } | 45 | .mask_ack = mask_and_ack_8259A, |
57 | |||
58 | static struct hw_interrupt_type i8259A_irq_type = { | ||
59 | .typename = "XT-PIC", | ||
60 | .startup = startup_8259A_irq, | ||
61 | .shutdown = shutdown_8259A_irq, | ||
62 | .enable = enable_8259A_irq, | ||
63 | .disable = disable_8259A_irq, | ||
64 | .ack = mask_and_ack_8259A, | ||
65 | .end = end_8259A_irq, | ||
66 | }; | 46 | }; |
67 | 47 | ||
68 | /* | 48 | /* |
@@ -133,7 +113,7 @@ void make_8259A_irq(unsigned int irq) | |||
133 | { | 113 | { |
134 | disable_irq_nosync(irq); | 114 | disable_irq_nosync(irq); |
135 | io_apic_irqs &= ~(1<<irq); | 115 | io_apic_irqs &= ~(1<<irq); |
136 | irq_desc[irq].chip = &i8259A_irq_type; | 116 | set_irq_chip_and_handler(irq, &i8259A_chip, handle_level_irq); |
137 | enable_irq(irq); | 117 | enable_irq(irq); |
138 | } | 118 | } |
139 | 119 | ||
@@ -327,12 +307,12 @@ void init_8259A(int auto_eoi) | |||
327 | outb_p(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); /* (slave's support for AEOI in flat mode is to be investigated) */ | 307 | outb_p(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); /* (slave's support for AEOI in flat mode is to be investigated) */ |
328 | if (auto_eoi) | 308 | if (auto_eoi) |
329 | /* | 309 | /* |
330 | * in AEOI mode we just have to mask the interrupt | 310 | * In AEOI mode we just have to mask the interrupt |
331 | * when acking. | 311 | * when acking. |
332 | */ | 312 | */ |
333 | i8259A_irq_type.ack = disable_8259A_irq; | 313 | i8259A_chip.mask_ack = disable_8259A_irq; |
334 | else | 314 | else |
335 | i8259A_irq_type.ack = mask_and_ack_8259A; | 315 | i8259A_chip.mask_ack = mask_and_ack_8259A; |
336 | 316 | ||
337 | udelay(100); /* wait for 8259A to initialize */ | 317 | udelay(100); /* wait for 8259A to initialize */ |
338 | 318 | ||
@@ -389,12 +369,13 @@ void __init init_ISA_irqs (void) | |||
389 | /* | 369 | /* |
390 | * 16 old-style INTA-cycle interrupts: | 370 | * 16 old-style INTA-cycle interrupts: |
391 | */ | 371 | */ |
392 | irq_desc[i].chip = &i8259A_irq_type; | 372 | set_irq_chip_and_handler(i, &i8259A_chip, |
373 | handle_level_irq); | ||
393 | } else { | 374 | } else { |
394 | /* | 375 | /* |
395 | * 'high' PCI IRQs filled in on demand | 376 | * 'high' PCI IRQs filled in on demand |
396 | */ | 377 | */ |
397 | irq_desc[i].chip = &no_irq_type; | 378 | irq_desc[i].chip = &no_irq_chip; |
398 | } | 379 | } |
399 | } | 380 | } |
400 | } | 381 | } |