From: Wu Zhangjin <wuzj@xxxxxxxxxx> read back to flush the posted write, otherwise, there will be many spurious irqs. the previous talk: http://www.spinics.net/lists/mips/msg33749.html Reviewed-by: Ralf Baechle <ralf@xxxxxxxxxxxxxx> Signed-off-by: Wu Zhangjin <wuzhangjin@xxxxxxxxx> Signed-off-by: Yan Hua <yanh@xxxxxxxxxx> --- arch/mips/kernel/i8259.c | 2 ++ arch/mips/loongson/common/bonito-irq.c | 4 ++++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/arch/mips/kernel/i8259.c b/arch/mips/kernel/i8259.c index 01c0885..b0254c6 100644 --- a/arch/mips/kernel/i8259.c +++ b/arch/mips/kernel/i8259.c @@ -177,10 +177,12 @@ handle_real_irq: outb(cached_slave_mask, PIC_SLAVE_IMR); outb(0x60+(irq&7), PIC_SLAVE_CMD);/* 'Specific EOI' to slave */ outb(0x60+PIC_CASCADE_IR, PIC_MASTER_CMD); /* 'Specific EOI' to master-IRQ2 */ + inb(PIC_MASTER_CMD); /* flush posted write */ } else { inb(PIC_MASTER_IMR); /* DUMMY - (do we need this?) */ outb(cached_master_mask, PIC_MASTER_IMR); outb(0x60+irq, PIC_MASTER_CMD); /* 'Specific EOI to master */ + inb(PIC_MASTER_CMD); /* flush posted write */ } 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 940c1f0..8f5a455 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 posted write */ + (void)LOONGSON_INTENSET; mmiowb(); } static inline void bonito_irq_disable(unsigned int irq) { LOONGSON_INTENCLR = (1 << (irq - LOONGSON_IRQ_BASE)); + /* flush posted write */ + (void)LOONGSON_INTENCLR; mmiowb(); } -- 1.6.0.4