Skip to content

Commit

Permalink
m68k: Mac IRQ cleanup
Browse files Browse the repository at this point in the history
There are no slow IRQs on Macs since Roman Zippel's IRQ reorganisation that
went into 2.6.16 and removed mac_irq_list[] and the do_mac_irq_list()
dispatcher. (They were implemented in do_mac_irq_list() by lowering the IPL.)
Hence there's no more use for mutual exclusion in the Mac interrupt
dispatchers. Remove it.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Finn Thain authored and Linus Torvalds committed May 5, 2007
1 parent cd713dd commit 217f671
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 29 deletions.
20 changes: 7 additions & 13 deletions arch/m68k/mac/baboon.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
/* #define DEBUG_BABOON */
/* #define DEBUG_IRQS */

int baboon_present,baboon_active;
int baboon_present;
volatile struct baboon *baboon;

irqreturn_t baboon_irq(int, void *);
Expand All @@ -45,7 +45,6 @@ void __init baboon_init(void)

baboon = (struct baboon *) BABOON_BASE;
baboon_present = 1;
baboon_active = 0;

printk("Baboon detected at %p\n", baboon);
}
Expand All @@ -70,9 +69,9 @@ irqreturn_t baboon_irq(int irq, void *dev_id)
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))
Expand All @@ -81,11 +80,9 @@ irqreturn_t baboon_irq(int irq, void *dev_id)
irq_num = IRQ_BABOON_0;
irq_bit = 1;
do {
if (events & irq_bit/* & baboon_active*/) {
baboon_active &= ~irq_bit;
if (events & irq_bit) {
baboon->mb_ifr &= ~irq_bit;
m68k_handle_int(irq_num);
baboon_active |= irq_bit;
}
irq_bit <<= 1;
irq_num++;
Expand All @@ -99,21 +96,18 @@ irqreturn_t baboon_irq(int irq, void *dev_id)
}

void baboon_irq_enable(int irq) {
int irq_idx = IRQ_IDX(irq);

#ifdef DEBUG_IRQUSE
printk("baboon_irq_enable(%d)\n", irq);
#endif
baboon_active |= (1 << irq_idx);
/* FIXME: figure out how to mask and unmask baboon interrupt sources */
enable_irq(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_active &= ~(1 << irq_idx);
disable_irq(IRQ_NUBUS_C);
}

void baboon_irq_clear(int irq) {
Expand Down
4 changes: 0 additions & 4 deletions arch/m68k/mac/oss.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,8 @@ irqreturn_t oss_irq(int irq, void *dev_id)
oss->irq_pending &= ~OSS_IP_SOUND;
/* FIXME: call sound handler */
} else if (events & OSS_IP_SCSI) {
oss->irq_level[OSS_SCSI] = OSS_IRQLEV_DISABLED;
oss->irq_pending &= ~OSS_IP_SCSI;
m68k_handle_int(IRQ_MAC_SCSI);
oss->irq_level[OSS_SCSI] = OSS_IRQLEV_SCSI;
} else {
/* FIXME: error check here? */
}
Expand Down Expand Up @@ -149,10 +147,8 @@ irqreturn_t oss_nubus_irq(int irq, void *dev_id)
--i;
irq_bit >>= 1;
if (events & irq_bit) {
oss->irq_level[i] = OSS_IRQLEV_DISABLED;
oss->irq_pending &= ~irq_bit;
m68k_handle_int(NUBUS_SOURCE_BASE + i);
oss->irq_level[i] = OSS_IRQLEV_NUBUS;
}
} while(events & (irq_bit - 1));
return IRQ_HANDLED;
Expand Down
2 changes: 0 additions & 2 deletions arch/m68k/mac/psc.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,10 +147,8 @@ irqreturn_t psc_irq(int irq, void *dev_id)
irq_bit = 1;
do {
if (events & irq_bit) {
psc_write_byte(pIER, irq_bit);
psc_write_byte(pIFR, irq_bit);
m68k_handle_int(irq_num);
psc_write_byte(pIER, irq_bit | 0x80);
}
irq_num++;
irq_bit <<= 1;
Expand Down
10 changes: 0 additions & 10 deletions arch/m68k/mac/via.c
Original file line number Diff line number Diff line change
Expand Up @@ -443,11 +443,6 @@ void __init via_nubus_init(void)
/*
* The generic VIA interrupt routines (shamelessly stolen from Alan Cox's
* via6522.c :-), disable/pending masks added.
*
* The new interrupt architecture in macints.c takes care of a lot of the
* gruntwork for us, including tallying the interrupts and calling the
* handlers on the linked list. All we need to do here is basically generate
* the machspec interrupt number after clearing the interrupt.
*/

irqreturn_t via1_irq(int irq, void *dev_id)
Expand All @@ -463,10 +458,8 @@ irqreturn_t via1_irq(int irq, void *dev_id)
irq_bit = 1;
do {
if (events & irq_bit) {
via1[vIER] = irq_bit;
via1[vIFR] = irq_bit;
m68k_handle_int(irq_num);
via1[vIER] = irq_bit | 0x80;
}
++irq_num;
irq_bit <<= 1;
Expand Down Expand Up @@ -502,11 +495,8 @@ irqreturn_t via2_irq(int irq, void *dev_id)
irq_bit = 1;
do {
if (events & irq_bit) {
via2[gIER] = irq_bit;
via2[gIFR] = irq_bit | rbv_clear;
m68k_handle_int(irq_num);
if (irq_num != IRQ_MAC_NUBUS || nubus_disabled == 0)
via2[gIER] = irq_bit | 0x80;
}
++irq_num;
irq_bit <<= 1;
Expand Down

0 comments on commit 217f671

Please sign in to comment.