e2fee5723b
The built-in Loongson 2E/2F northbridge in is bonito64-compatible but not identical with it. To avoid influencing the original bonito64 support and make the loongson support more maintainable, it's better to separate the Bonito64 code from the Loongson code. This also prepares the kernel for the coming Loongson 2f machines family support. Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com> Cc: Linux-MIPS <linux-mips@linux-mips.org> Cc: yanh@lemote.com Cc: huhb@lemote.com Cc: Zhang Le <r0bertz@gentoo.org> Cc: zhangfx@lemote.com, Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
73 lines
1.7 KiB
C
73 lines
1.7 KiB
C
/*
|
|
* Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
|
|
* Author: Fuxin Zhang, zhangfx@lemote.com
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*/
|
|
#include <linux/delay.h>
|
|
#include <linux/interrupt.h>
|
|
|
|
#include <loongson.h>
|
|
/*
|
|
* the first level int-handler will jump here if it is a bonito irq
|
|
*/
|
|
void bonito_irqdispatch(void)
|
|
{
|
|
u32 int_status;
|
|
int i;
|
|
|
|
/* workaround the IO dma problem: let cpu looping to allow DMA finish */
|
|
int_status = LOONGSON_INTISR;
|
|
if (int_status & (1 << 10)) {
|
|
while (int_status & (1 << 10)) {
|
|
udelay(1);
|
|
int_status = LOONGSON_INTISR;
|
|
}
|
|
}
|
|
|
|
/* Get pending sources, masked by current enables */
|
|
int_status = LOONGSON_INTISR & LOONGSON_INTEN;
|
|
|
|
if (int_status != 0) {
|
|
i = __ffs(int_status);
|
|
int_status &= ~(1 << i);
|
|
do_IRQ(LOONGSON_IRQ_BASE + i);
|
|
}
|
|
}
|
|
|
|
asmlinkage void plat_irq_dispatch(void)
|
|
{
|
|
unsigned int pending;
|
|
|
|
pending = read_c0_cause() & read_c0_status() & ST0_IM;
|
|
|
|
/* machine-specific plat_irq_dispatch */
|
|
mach_irq_dispatch(pending);
|
|
}
|
|
|
|
void __init arch_init_irq(void)
|
|
{
|
|
/*
|
|
* Clear all of the interrupts while we change the able around a bit.
|
|
* int-handler is not on bootstrap
|
|
*/
|
|
clear_c0_status(ST0_IM | ST0_BEV);
|
|
|
|
/* setting irq trigger mode */
|
|
set_irq_trigger_mode();
|
|
|
|
/* no steer */
|
|
LOONGSON_INTSTEER = 0;
|
|
|
|
/*
|
|
* Mask out all interrupt by writing "1" to all bit position in
|
|
* the interrupt reset reg.
|
|
*/
|
|
LOONGSON_INTENCLR = ~0;
|
|
|
|
/* machine specific irq init */
|
|
mach_init_irq();
|
|
}
|