>From d0431e4d83ec7f852d631f80aaca4b66586b4db2 Mon Sep 17 00:00:00 2001 From: Wu Zhangjin <wuzhangjin@xxxxxxxxx> Date: Sat, 16 May 2009 04:54:27 +0800 Subject: [PATCH 26/30] loongson: flush irq write operation read back after write, otherwise, there will be many spurious irqs from it --- arch/mips/kernel/i8259.c | 5 +++++ arch/mips/loongson/common/bonito-irq.c | 4 ++++ 2 files changed, 9 insertions(+), 0 deletions(-) diff --git a/arch/mips/kernel/i8259.c b/arch/mips/kernel/i8259.c index 413bd1d..f7c3a2b 100644 --- a/arch/mips/kernel/i8259.c +++ b/arch/mips/kernel/i8259.c @@ -175,12 +175,17 @@ handle_real_irq: if (irq & 8) { inb(PIC_SLAVE_IMR); /* DUMMY - (do we need this?) */ outb(cached_slave_mask, PIC_SLAVE_IMR); + inb(PIC_SLAVE_IMR); outb(0x60+(irq&7), PIC_SLAVE_CMD);/* 'Specific EOI' to slave */ + inb(PIC_SLAVE_CMD); outb(0x60+PIC_CASCADE_IR, PIC_MASTER_CMD); /* 'Specific EOI' to master-IRQ2 */ + inb(PIC_MASTER_CMD); } else { inb(PIC_MASTER_IMR); /* DUMMY - (do we need this?) */ outb(cached_master_mask, PIC_MASTER_IMR); + inb(PIC_SLAVE_IMR); outb(0x60+irq, PIC_MASTER_CMD); /* 'Specific EOI to master */ + inb(PIC_MASTER_CMD); } smtc_im_ack_irq(irq); spin_unlock_irqrestore(&i8259A_lock, flags); diff --git a/arch/mips/loongson/common/bonito-irq.c b/arch/mips/loongson/common/bonito-irq.c index d5a5ae8..cfbeaf5 100644 --- a/arch/mips/loongson/common/bonito-irq.c +++ b/arch/mips/loongson/common/bonito-irq.c @@ -36,12 +36,16 @@ static inline void bonito_irq_enable(unsigned int irq) { LOONGSON_INTENSET = (1 << (irq - LOONGSON_IRQ_BASE)); + /* flush the write operation via a following read operation */ + (void)LOONGSON_INTENSET; mmiowb(); } static inline void bonito_irq_disable(unsigned int irq) { LOONGSON_INTENCLR = (1 << (irq - LOONGSON_IRQ_BASE)); + /* flush the write operation via a following read operation */ + (void)LOONGSON_INTENCLR; mmiowb(); } -- 1.6.2.1