aboutsummaryrefslogtreecommitdiffstats
path: root/arch/alpha/kernel/irq_i8259.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/alpha/kernel/irq_i8259.c')
-rw-r--r--arch/alpha/kernel/irq_i8259.c38
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
35inline void 35inline void
36i8259a_enable_irq(unsigned int irq) 36i8259a_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
49void 49void
50i8259a_disable_irq(unsigned int irq) 50i8259a_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
57void 57void
58i8259a_mask_and_ack_irq(unsigned int irq) 58i8259a_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
72unsigned int
73i8259a_startup_irq(unsigned int irq)
74{
75 i8259a_enable_irq(irq);
76 return 0; /* never anything pending */
77}
78
79void
80i8259a_end_irq(unsigned int irq)
81{
82 if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
83 i8259a_enable_irq(irq);
84}
85
86struct irq_chip i8259a_irq_type = { 74struct 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
96void __init 81void __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);