aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68k/mac/baboon.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/m68k/mac/baboon.c')
-rw-r--r--arch/m68k/mac/baboon.c41
1 files changed, 8 insertions, 33 deletions
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c
index b403924a1cad..3fe0e43d44f6 100644
--- a/arch/m68k/mac/baboon.c
+++ b/arch/m68k/mac/baboon.c
@@ -8,13 +8,8 @@
8 8
9#include <linux/types.h> 9#include <linux/types.h>
10#include <linux/kernel.h> 10#include <linux/kernel.h>
11#include <linux/mm.h>
12#include <linux/delay.h>
13#include <linux/init.h>
14#include <linux/irq.h> 11#include <linux/irq.h>
15 12
16#include <asm/traps.h>
17#include <asm/bootinfo.h>
18#include <asm/macintosh.h> 13#include <asm/macintosh.h>
19#include <asm/macints.h> 14#include <asm/macints.h>
20#include <asm/mac_baboon.h> 15#include <asm/mac_baboon.h>
@@ -23,7 +18,6 @@
23 18
24int baboon_present; 19int baboon_present;
25static volatile struct baboon *baboon; 20static volatile struct baboon *baboon;
26static unsigned char baboon_disabled;
27 21
28#if 0 22#if 0
29extern int macide_ack_intr(struct ata_channel *); 23extern int macide_ack_intr(struct ata_channel *);
@@ -89,51 +83,32 @@ static void baboon_irq(unsigned int irq, struct irq_desc *desc)
89 83
90void __init baboon_register_interrupts(void) 84void __init baboon_register_interrupts(void)
91{ 85{
92 baboon_disabled = 0;
93 irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq); 86 irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq);
94} 87}
95 88
96/* 89/*
97 * The means for masking individual baboon interrupts remains a mystery, so 90 * The means for masking individual Baboon interrupts remains a mystery.
98 * enable the umbrella interrupt only when no baboon interrupt is disabled. 91 * However, since we only use the IDE IRQ, we can just enable/disable all
92 * Baboon interrupts. If/when we handle more than one Baboon IRQ, we must
93 * either figure out how to mask them individually or else implement the
94 * same workaround that's used for NuBus slots (see nubus_disabled and
95 * via_nubus_irq_shutdown).
99 */ 96 */
100 97
101void baboon_irq_enable(int irq) 98void baboon_irq_enable(int irq)
102{ 99{
103 int irq_idx = IRQ_IDX(irq);
104
105#ifdef DEBUG_IRQUSE 100#ifdef DEBUG_IRQUSE
106 printk("baboon_irq_enable(%d)\n", irq); 101 printk("baboon_irq_enable(%d)\n", irq);
107#endif 102#endif
108 103
109 baboon_disabled &= ~(1 << irq_idx); 104 mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C));
110 if (!baboon_disabled)
111 mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C));
112} 105}
113 106
114void baboon_irq_disable(int irq) 107void baboon_irq_disable(int irq)
115{ 108{
116 int irq_idx = IRQ_IDX(irq);
117
118#ifdef DEBUG_IRQUSE 109#ifdef DEBUG_IRQUSE
119 printk("baboon_irq_disable(%d)\n", irq); 110 printk("baboon_irq_disable(%d)\n", irq);
120#endif 111#endif
121 112
122 baboon_disabled |= 1 << irq_idx; 113 mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C));
123 if (baboon_disabled)
124 mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C));
125}
126
127void baboon_irq_clear(int irq)
128{
129 int irq_idx = IRQ_IDX(irq);
130
131 baboon->mb_ifr &= ~(1 << irq_idx);
132}
133
134int baboon_irq_pending(int irq)
135{
136 int irq_idx = IRQ_IDX(irq);
137
138 return baboon->mb_ifr & (1 << irq_idx);
139} 114}