diff options
Diffstat (limited to 'arch/alpha/kernel/irq_i8259.c')
-rw-r--r-- | arch/alpha/kernel/irq_i8259.c | 38 |
1 files changed, 11 insertions, 27 deletions
diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index 83a9ac280890..e1861c77dabc 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c | |||
@@ -33,10 +33,10 @@ i8259_update_irq_hw(unsigned int irq, unsigned long mask) | |||
33 | } | 33 | } |
34 | 34 | ||
35 | inline void | 35 | inline void |
36 | i8259a_enable_irq(unsigned int irq) | 36 | i8259a_enable_irq(struct irq_data *d) |
37 | { | 37 | { |
38 | spin_lock(&i8259_irq_lock); | 38 | spin_lock(&i8259_irq_lock); |
39 | i8259_update_irq_hw(irq, cached_irq_mask &= ~(1 << irq)); | 39 | i8259_update_irq_hw(d->irq, cached_irq_mask &= ~(1 << d->irq)); |
40 | spin_unlock(&i8259_irq_lock); | 40 | spin_unlock(&i8259_irq_lock); |
41 | } | 41 | } |
42 | 42 | ||
@@ -47,16 +47,18 @@ __i8259a_disable_irq(unsigned int irq) | |||
47 | } | 47 | } |
48 | 48 | ||
49 | void | 49 | void |
50 | i8259a_disable_irq(unsigned int irq) | 50 | i8259a_disable_irq(struct irq_data *d) |
51 | { | 51 | { |
52 | spin_lock(&i8259_irq_lock); | 52 | spin_lock(&i8259_irq_lock); |
53 | __i8259a_disable_irq(irq); | 53 | __i8259a_disable_irq(d->irq); |
54 | spin_unlock(&i8259_irq_lock); | 54 | spin_unlock(&i8259_irq_lock); |
55 | } | 55 | } |
56 | 56 | ||
57 | void | 57 | void |
58 | i8259a_mask_and_ack_irq(unsigned int irq) | 58 | i8259a_mask_and_ack_irq(struct irq_data *d) |
59 | { | 59 | { |
60 | unsigned int irq = d->irq; | ||
61 | |||
60 | spin_lock(&i8259_irq_lock); | 62 | spin_lock(&i8259_irq_lock); |
61 | __i8259a_disable_irq(irq); | 63 | __i8259a_disable_irq(irq); |
62 | 64 | ||
@@ -69,28 +71,11 @@ i8259a_mask_and_ack_irq(unsigned int irq) | |||
69 | spin_unlock(&i8259_irq_lock); | 71 | spin_unlock(&i8259_irq_lock); |
70 | } | 72 | } |
71 | 73 | ||
72 | unsigned int | ||
73 | i8259a_startup_irq(unsigned int irq) | ||
74 | { | ||
75 | i8259a_enable_irq(irq); | ||
76 | return 0; /* never anything pending */ | ||
77 | } | ||
78 | |||
79 | void | ||
80 | i8259a_end_irq(unsigned int irq) | ||
81 | { | ||
82 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
83 | i8259a_enable_irq(irq); | ||
84 | } | ||
85 | |||
86 | struct irq_chip i8259a_irq_type = { | 74 | struct irq_chip i8259a_irq_type = { |
87 | .name = "XT-PIC", | 75 | .name = "XT-PIC", |
88 | .startup = i8259a_startup_irq, | 76 | .irq_unmask = i8259a_enable_irq, |
89 | .shutdown = i8259a_disable_irq, | 77 | .irq_mask = i8259a_disable_irq, |
90 | .enable = i8259a_enable_irq, | 78 | .irq_mask_ack = i8259a_mask_and_ack_irq, |
91 | .disable = i8259a_disable_irq, | ||
92 | .ack = i8259a_mask_and_ack_irq, | ||
93 | .end = i8259a_end_irq, | ||
94 | }; | 79 | }; |
95 | 80 | ||
96 | void __init | 81 | void __init |
@@ -107,8 +92,7 @@ init_i8259a_irqs(void) | |||
107 | outb(0xff, 0xA1); /* mask all of 8259A-2 */ | 92 | outb(0xff, 0xA1); /* mask all of 8259A-2 */ |
108 | 93 | ||
109 | for (i = 0; i < 16; i++) { | 94 | for (i = 0; i < 16; i++) { |
110 | irq_desc[i].status = IRQ_DISABLED; | 95 | irq_set_chip_and_handler(i, &i8259a_irq_type, handle_level_irq); |
111 | irq_desc[i].chip = &i8259a_irq_type; | ||
112 | } | 96 | } |
113 | 97 | ||
114 | setup_irq(2, &cascade); | 98 | setup_irq(2, &cascade); |