0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #include "bcm47xx_private.h"
0026
0027 #include <linux/types.h>
0028 #include <linux/interrupt.h>
0029 #include <linux/irq.h>
0030 #include <asm/setup.h>
0031 #include <asm/irq_cpu.h>
0032 #include <bcm47xx.h>
0033
0034 asmlinkage void plat_irq_dispatch(void)
0035 {
0036 u32 cause;
0037
0038 cause = read_c0_cause() & read_c0_status() & CAUSEF_IP;
0039
0040 clear_c0_status(cause);
0041
0042 if (cause & CAUSEF_IP7)
0043 do_IRQ(7);
0044 if (cause & CAUSEF_IP2)
0045 do_IRQ(2);
0046 if (cause & CAUSEF_IP3)
0047 do_IRQ(3);
0048 if (cause & CAUSEF_IP4)
0049 do_IRQ(4);
0050 if (cause & CAUSEF_IP5)
0051 do_IRQ(5);
0052 if (cause & CAUSEF_IP6)
0053 do_IRQ(6);
0054 }
0055
0056 #define DEFINE_HWx_IRQDISPATCH(x) \
0057 static void bcm47xx_hw ## x ## _irqdispatch(void) \
0058 { \
0059 do_IRQ(x); \
0060 }
0061 DEFINE_HWx_IRQDISPATCH(2)
0062 DEFINE_HWx_IRQDISPATCH(3)
0063 DEFINE_HWx_IRQDISPATCH(4)
0064 DEFINE_HWx_IRQDISPATCH(5)
0065 DEFINE_HWx_IRQDISPATCH(6)
0066 DEFINE_HWx_IRQDISPATCH(7)
0067
0068 void __init arch_init_irq(void)
0069 {
0070
0071
0072
0073
0074 bcm47xx_bus_setup();
0075
0076 #ifdef CONFIG_BCM47XX_BCMA
0077 if (bcm47xx_bus_type == BCM47XX_BUS_TYPE_BCMA) {
0078 bcma_write32(bcm47xx_bus.bcma.bus.drv_mips.core,
0079 BCMA_MIPS_MIPS74K_INTMASK(5), 1 << 31);
0080
0081
0082
0083
0084 cp0_compare_irq = 7;
0085 }
0086 #endif
0087 mips_cpu_irq_init();
0088
0089 if (cpu_has_vint) {
0090 pr_info("Setting up vectored interrupts\n");
0091 set_vi_handler(2, bcm47xx_hw2_irqdispatch);
0092 set_vi_handler(3, bcm47xx_hw3_irqdispatch);
0093 set_vi_handler(4, bcm47xx_hw4_irqdispatch);
0094 set_vi_handler(5, bcm47xx_hw5_irqdispatch);
0095 set_vi_handler(6, bcm47xx_hw6_irqdispatch);
0096 set_vi_handler(7, bcm47xx_hw7_irqdispatch);
0097 }
0098 }