diff options
Diffstat (limited to 'arch/m68k/mac/baboon.c')
| -rw-r--r-- | arch/m68k/mac/baboon.c | 94 |
1 files changed, 41 insertions, 53 deletions
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c index b19b7dd9bd2..3fe0e43d44f 100644 --- a/arch/m68k/mac/baboon.c +++ b/arch/m68k/mac/baboon.c @@ -8,24 +8,16 @@ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/mm.h> -#include <linux/delay.h> -#include <linux/init.h> -#include <linux/ide.h> +#include <linux/irq.h> -#include <asm/traps.h> -#include <asm/bootinfo.h> #include <asm/macintosh.h> #include <asm/macints.h> #include <asm/mac_baboon.h> -/* #define DEBUG_BABOON */ /* #define DEBUG_IRQS */ -int baboon_present,baboon_active; -volatile struct baboon *baboon; - -irqreturn_t baboon_irq(int, void *, struct pt_regs *); +int baboon_present; +static volatile struct baboon *baboon; #if 0 extern int macide_ack_intr(struct ata_channel *); @@ -45,82 +37,78 @@ void __init baboon_init(void) baboon = (struct baboon *) BABOON_BASE; baboon_present = 1; - baboon_active = 0; printk("Baboon detected at %p\n", baboon); } /* - * Register the Baboon interrupt dispatcher on nubus slot $C. - */ - -void __init baboon_register_interrupts(void) -{ - request_irq(IRQ_NUBUS_C, baboon_irq, IRQ_FLG_LOCK|IRQ_FLG_FAST, - "baboon", (void *) baboon); -} - -/* * Baboon interrupt handler. This works a lot like a VIA. */ -irqreturn_t baboon_irq(int irq, void *dev_id, struct pt_regs *regs) +static void baboon_irq(unsigned int irq, struct irq_desc *desc) { - int irq_bit,i; + int irq_bit, irq_num; unsigned char events; #ifdef DEBUG_IRQS - printk("baboon_irq: mb_control %02X mb_ifr %02X mb_status %02X active %02X\n", + printk("baboon_irq: mb_control %02X mb_ifr %02X mb_status %02X\n", (uint) baboon->mb_control, (uint) baboon->mb_ifr, - (uint) baboon->mb_status, baboon_active); + (uint) baboon->mb_status); #endif - if (!(events = baboon->mb_ifr & 0x07)) - return IRQ_NONE; + events = baboon->mb_ifr & 0x07; + if (!events) + return; - for (i = 0, irq_bit = 1 ; i < 3 ; i++, irq_bit <<= 1) { - if (events & irq_bit/* & baboon_active*/) { - baboon_active &= ~irq_bit; - mac_do_irq_list(IRQ_BABOON_0 + i, regs); - baboon_active |= irq_bit; + irq_num = IRQ_BABOON_0; + irq_bit = 1; + do { + if (events & irq_bit) { baboon->mb_ifr &= ~irq_bit; + generic_handle_irq(irq_num); } - } + irq_bit <<= 1; + irq_num++; + } while(events >= irq_bit); #if 0 if (baboon->mb_ifr & 0x02) macide_ack_intr(NULL); /* for now we need to smash all interrupts */ baboon->mb_ifr &= ~events; #endif - return IRQ_HANDLED; } -void baboon_irq_enable(int irq) { - int irq_idx = IRQ_IDX(irq); +/* + * Register the Baboon interrupt dispatcher on nubus slot $C. + */ -#ifdef DEBUG_IRQUSE - printk("baboon_irq_enable(%d)\n", irq); -#endif - baboon_active |= (1 << irq_idx); +void __init baboon_register_interrupts(void) +{ + irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq); } -void baboon_irq_disable(int irq) { - int irq_idx = IRQ_IDX(irq); +/* + * The means for masking individual Baboon interrupts remains a mystery. + * However, since we only use the IDE IRQ, we can just enable/disable all + * Baboon interrupts. If/when we handle more than one Baboon IRQ, we must + * either figure out how to mask them individually or else implement the + * same workaround that's used for NuBus slots (see nubus_disabled and + * via_nubus_irq_shutdown). + */ +void baboon_irq_enable(int irq) +{ #ifdef DEBUG_IRQUSE - printk("baboon_irq_disable(%d)\n", irq); + printk("baboon_irq_enable(%d)\n", irq); #endif - baboon_active &= ~(1 << irq_idx); -} - -void baboon_irq_clear(int irq) { - int irq_idx = IRQ_IDX(irq); - baboon->mb_ifr &= ~(1 << irq_idx); + mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C)); } -int baboon_irq_pending(int irq) +void baboon_irq_disable(int irq) { - int irq_idx = IRQ_IDX(irq); +#ifdef DEBUG_IRQUSE + printk("baboon_irq_disable(%d)\n", irq); +#endif - return baboon->mb_ifr & (1 << irq_idx); + mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C)); } |
