diff options
Diffstat (limited to 'arch/m68k/mac/baboon.c')
| -rw-r--r-- | arch/m68k/mac/baboon.c | 58 | 
1 files changed, 15 insertions, 43 deletions
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c index 2a96bebd896..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/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_IRQS */ -extern void mac_enable_irq(unsigned int); -extern void mac_disable_irq(unsigned int); -  int baboon_present;  static volatile struct baboon *baboon; -static unsigned char baboon_disabled;  #if 0  extern int macide_ack_intr(struct ata_channel *); @@ -53,7 +45,7 @@ void __init baboon_init(void)   * Baboon interrupt handler. This works a lot like a VIA.   */ -static irqreturn_t baboon_irq(int irq, void *dev_id) +static void baboon_irq(unsigned int irq, struct irq_desc *desc)  {  	int irq_bit, irq_num;  	unsigned char events; @@ -64,15 +56,16 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)  		(uint) baboon->mb_status);  #endif -	if (!(events = baboon->mb_ifr & 0x07)) -		return IRQ_NONE; +	events = baboon->mb_ifr & 0x07; +	if (!events) +		return;  	irq_num = IRQ_BABOON_0;  	irq_bit = 1;  	do {  	        if (events & irq_bit) {  			baboon->mb_ifr &= ~irq_bit; -			m68k_handle_int(irq_num); +			generic_handle_irq(irq_num);  		}  		irq_bit <<= 1;  		irq_num++; @@ -82,7 +75,6 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)  	/* for now we need to smash all interrupts */  	baboon->mb_ifr &= ~events;  #endif -	return IRQ_HANDLED;  }  /* @@ -91,52 +83,32 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)  void __init baboon_register_interrupts(void)  { -	baboon_disabled = 0; -	if (request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon)) -		pr_err("Couldn't register baboon interrupt\n"); +	irq_set_chained_handler(IRQ_NUBUS_C, baboon_irq);  }  /* - * The means for masking individual baboon interrupts remains a mystery, so - * enable the umbrella interrupt only when no baboon interrupt is disabled. + * 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)  { -	int irq_idx = IRQ_IDX(irq); -  #ifdef DEBUG_IRQUSE  	printk("baboon_irq_enable(%d)\n", irq);  #endif -	baboon_disabled &= ~(1 << irq_idx); -	if (!baboon_disabled) -		mac_enable_irq(IRQ_NUBUS_C); +	mac_irq_enable(irq_get_irq_data(IRQ_NUBUS_C));  }  void baboon_irq_disable(int irq)  { -	int irq_idx = IRQ_IDX(irq); -  #ifdef DEBUG_IRQUSE  	printk("baboon_irq_disable(%d)\n", irq);  #endif -	baboon_disabled |= 1 << irq_idx; -	if (baboon_disabled) -		mac_disable_irq(IRQ_NUBUS_C); -} - -void baboon_irq_clear(int irq) -{ -	int irq_idx = IRQ_IDX(irq); - -	baboon->mb_ifr &= ~(1 << irq_idx); -} - -int baboon_irq_pending(int irq) -{ -	int irq_idx = IRQ_IDX(irq); - -	return baboon->mb_ifr & (1 << irq_idx); +	mac_irq_disable(irq_get_irq_data(IRQ_NUBUS_C));  }  | 
