diff options
Diffstat (limited to 'arch/m68k/apollo/dn_ints.c')
-rw-r--r-- | arch/m68k/apollo/dn_ints.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c index 5d47f3aa3810..17be1e7e2df2 100644 --- a/arch/m68k/apollo/dn_ints.c +++ b/arch/m68k/apollo/dn_ints.c | |||
@@ -1,19 +1,13 @@ | |||
1 | #include <linux/interrupt.h> | 1 | #include <linux/interrupt.h> |
2 | #include <linux/irq.h> | ||
2 | 3 | ||
3 | #include <asm/irq.h> | ||
4 | #include <asm/traps.h> | 4 | #include <asm/traps.h> |
5 | #include <asm/apollohw.h> | 5 | #include <asm/apollohw.h> |
6 | 6 | ||
7 | void dn_process_int(unsigned int irq, struct pt_regs *fp) | 7 | unsigned int apollo_irq_startup(struct irq_data *data) |
8 | { | 8 | { |
9 | __m68k_handle_int(irq, fp); | 9 | unsigned int irq = data->irq; |
10 | 10 | ||
11 | *(volatile unsigned char *)(pica)=0x20; | ||
12 | *(volatile unsigned char *)(picb)=0x20; | ||
13 | } | ||
14 | |||
15 | int apollo_irq_startup(unsigned int irq) | ||
16 | { | ||
17 | if (irq < 8) | 11 | if (irq < 8) |
18 | *(volatile unsigned char *)(pica+1) &= ~(1 << irq); | 12 | *(volatile unsigned char *)(pica+1) &= ~(1 << irq); |
19 | else | 13 | else |
@@ -21,24 +15,33 @@ int apollo_irq_startup(unsigned int irq) | |||
21 | return 0; | 15 | return 0; |
22 | } | 16 | } |
23 | 17 | ||
24 | void apollo_irq_shutdown(unsigned int irq) | 18 | void apollo_irq_shutdown(struct irq_data *data) |
25 | { | 19 | { |
20 | unsigned int irq = data->irq; | ||
21 | |||
26 | if (irq < 8) | 22 | if (irq < 8) |
27 | *(volatile unsigned char *)(pica+1) |= (1 << irq); | 23 | *(volatile unsigned char *)(pica+1) |= (1 << irq); |
28 | else | 24 | else |
29 | *(volatile unsigned char *)(picb+1) |= (1 << (irq - 8)); | 25 | *(volatile unsigned char *)(picb+1) |= (1 << (irq - 8)); |
30 | } | 26 | } |
31 | 27 | ||
32 | static struct irq_controller apollo_irq_controller = { | 28 | void apollo_irq_eoi(struct irq_data *data) |
29 | { | ||
30 | *(volatile unsigned char *)(pica) = 0x20; | ||
31 | *(volatile unsigned char *)(picb) = 0x20; | ||
32 | } | ||
33 | |||
34 | static struct irq_chip apollo_irq_chip = { | ||
33 | .name = "apollo", | 35 | .name = "apollo", |
34 | .lock = __SPIN_LOCK_UNLOCKED(apollo_irq_controller.lock), | 36 | .irq_startup = apollo_irq_startup, |
35 | .startup = apollo_irq_startup, | 37 | .irq_shutdown = apollo_irq_shutdown, |
36 | .shutdown = apollo_irq_shutdown, | 38 | .irq_eoi = apollo_irq_eoi, |
37 | }; | 39 | }; |
38 | 40 | ||
39 | 41 | ||
40 | void __init dn_init_IRQ(void) | 42 | void __init dn_init_IRQ(void) |
41 | { | 43 | { |
42 | m68k_setup_user_interrupt(VEC_USER + 96, 16, dn_process_int); | 44 | m68k_setup_user_interrupt(VEC_USER + 96, 16); |
43 | m68k_setup_irq_controller(&apollo_irq_controller, IRQ_APOLLO, 16); | 45 | m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq, |
46 | IRQ_APOLLO, 16); | ||
44 | } | 47 | } |