1171bb2f1SJohn Crispin /* 2171bb2f1SJohn Crispin * This program is free software; you can redistribute it and/or modify it 3171bb2f1SJohn Crispin * under the terms of the GNU General Public License version 2 as published 4171bb2f1SJohn Crispin * by the Free Software Foundation. 5171bb2f1SJohn Crispin * 6171bb2f1SJohn Crispin * Copyright (C) 2010 John Crispin <blogic@openwrt.org> 7171bb2f1SJohn Crispin * Copyright (C) 2010 Thomas Langer <thomas.langer@lantiq.com> 8171bb2f1SJohn Crispin */ 9171bb2f1SJohn Crispin 10171bb2f1SJohn Crispin #include <linux/interrupt.h> 11171bb2f1SJohn Crispin #include <linux/ioport.h> 12171bb2f1SJohn Crispin 13171bb2f1SJohn Crispin #include <asm/bootinfo.h> 14171bb2f1SJohn Crispin #include <asm/irq_cpu.h> 15171bb2f1SJohn Crispin 16171bb2f1SJohn Crispin #include <lantiq_soc.h> 17171bb2f1SJohn Crispin #include <irq.h> 18171bb2f1SJohn Crispin 19171bb2f1SJohn Crispin /* register definitions */ 20171bb2f1SJohn Crispin #define LTQ_ICU_IM0_ISR 0x0000 21171bb2f1SJohn Crispin #define LTQ_ICU_IM0_IER 0x0008 22171bb2f1SJohn Crispin #define LTQ_ICU_IM0_IOSR 0x0010 23171bb2f1SJohn Crispin #define LTQ_ICU_IM0_IRSR 0x0018 24171bb2f1SJohn Crispin #define LTQ_ICU_IM0_IMR 0x0020 25171bb2f1SJohn Crispin #define LTQ_ICU_IM1_ISR 0x0028 26171bb2f1SJohn Crispin #define LTQ_ICU_OFFSET (LTQ_ICU_IM1_ISR - LTQ_ICU_IM0_ISR) 27171bb2f1SJohn Crispin 28171bb2f1SJohn Crispin #define LTQ_EIU_EXIN_C 0x0000 29171bb2f1SJohn Crispin #define LTQ_EIU_EXIN_INIC 0x0004 30171bb2f1SJohn Crispin #define LTQ_EIU_EXIN_INEN 0x000C 31171bb2f1SJohn Crispin 32171bb2f1SJohn Crispin /* irq numbers used by the external interrupt unit (EIU) */ 33171bb2f1SJohn Crispin #define LTQ_EIU_IR0 (INT_NUM_IM4_IRL0 + 30) 34171bb2f1SJohn Crispin #define LTQ_EIU_IR1 (INT_NUM_IM3_IRL0 + 31) 35171bb2f1SJohn Crispin #define LTQ_EIU_IR2 (INT_NUM_IM1_IRL0 + 26) 36171bb2f1SJohn Crispin #define LTQ_EIU_IR3 INT_NUM_IM1_IRL0 37171bb2f1SJohn Crispin #define LTQ_EIU_IR4 (INT_NUM_IM1_IRL0 + 1) 38171bb2f1SJohn Crispin #define LTQ_EIU_IR5 (INT_NUM_IM1_IRL0 + 2) 39171bb2f1SJohn Crispin #define LTQ_EIU_IR6 (INT_NUM_IM2_IRL0 + 30) 40171bb2f1SJohn Crispin 41171bb2f1SJohn Crispin #define MAX_EIU 6 42171bb2f1SJohn Crispin 43*59c11579SJohn Crispin /* the performance counter */ 44*59c11579SJohn Crispin #define LTQ_PERF_IRQ (INT_NUM_IM4_IRL0 + 31) 45*59c11579SJohn Crispin 46171bb2f1SJohn Crispin /* irqs generated by device attached to the EBU need to be acked in 47171bb2f1SJohn Crispin * a special manner 48171bb2f1SJohn Crispin */ 49171bb2f1SJohn Crispin #define LTQ_ICU_EBU_IRQ 22 50171bb2f1SJohn Crispin 51171bb2f1SJohn Crispin #define ltq_icu_w32(x, y) ltq_w32((x), ltq_icu_membase + (y)) 52171bb2f1SJohn Crispin #define ltq_icu_r32(x) ltq_r32(ltq_icu_membase + (x)) 53171bb2f1SJohn Crispin 54171bb2f1SJohn Crispin #define ltq_eiu_w32(x, y) ltq_w32((x), ltq_eiu_membase + (y)) 55171bb2f1SJohn Crispin #define ltq_eiu_r32(x) ltq_r32(ltq_eiu_membase + (x)) 56171bb2f1SJohn Crispin 57171bb2f1SJohn Crispin static unsigned short ltq_eiu_irq[MAX_EIU] = { 58171bb2f1SJohn Crispin LTQ_EIU_IR0, 59171bb2f1SJohn Crispin LTQ_EIU_IR1, 60171bb2f1SJohn Crispin LTQ_EIU_IR2, 61171bb2f1SJohn Crispin LTQ_EIU_IR3, 62171bb2f1SJohn Crispin LTQ_EIU_IR4, 63171bb2f1SJohn Crispin LTQ_EIU_IR5, 64171bb2f1SJohn Crispin }; 65171bb2f1SJohn Crispin 66171bb2f1SJohn Crispin static struct resource ltq_icu_resource = { 67171bb2f1SJohn Crispin .name = "icu", 68171bb2f1SJohn Crispin .start = LTQ_ICU_BASE_ADDR, 69171bb2f1SJohn Crispin .end = LTQ_ICU_BASE_ADDR + LTQ_ICU_SIZE - 1, 70171bb2f1SJohn Crispin .flags = IORESOURCE_MEM, 71171bb2f1SJohn Crispin }; 72171bb2f1SJohn Crispin 73171bb2f1SJohn Crispin static struct resource ltq_eiu_resource = { 74171bb2f1SJohn Crispin .name = "eiu", 75171bb2f1SJohn Crispin .start = LTQ_EIU_BASE_ADDR, 76171bb2f1SJohn Crispin .end = LTQ_EIU_BASE_ADDR + LTQ_ICU_SIZE - 1, 77171bb2f1SJohn Crispin .flags = IORESOURCE_MEM, 78171bb2f1SJohn Crispin }; 79171bb2f1SJohn Crispin 80171bb2f1SJohn Crispin static void __iomem *ltq_icu_membase; 81171bb2f1SJohn Crispin static void __iomem *ltq_eiu_membase; 82171bb2f1SJohn Crispin 83171bb2f1SJohn Crispin void ltq_disable_irq(struct irq_data *d) 84171bb2f1SJohn Crispin { 85171bb2f1SJohn Crispin u32 ier = LTQ_ICU_IM0_IER; 86171bb2f1SJohn Crispin int irq_nr = d->irq - INT_NUM_IRQ0; 87171bb2f1SJohn Crispin 88171bb2f1SJohn Crispin ier += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 89171bb2f1SJohn Crispin irq_nr %= INT_NUM_IM_OFFSET; 90171bb2f1SJohn Crispin ltq_icu_w32(ltq_icu_r32(ier) & ~(1 << irq_nr), ier); 91171bb2f1SJohn Crispin } 92171bb2f1SJohn Crispin 93171bb2f1SJohn Crispin void ltq_mask_and_ack_irq(struct irq_data *d) 94171bb2f1SJohn Crispin { 95171bb2f1SJohn Crispin u32 ier = LTQ_ICU_IM0_IER; 96171bb2f1SJohn Crispin u32 isr = LTQ_ICU_IM0_ISR; 97171bb2f1SJohn Crispin int irq_nr = d->irq - INT_NUM_IRQ0; 98171bb2f1SJohn Crispin 99171bb2f1SJohn Crispin ier += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 100171bb2f1SJohn Crispin isr += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 101171bb2f1SJohn Crispin irq_nr %= INT_NUM_IM_OFFSET; 102171bb2f1SJohn Crispin ltq_icu_w32(ltq_icu_r32(ier) & ~(1 << irq_nr), ier); 103171bb2f1SJohn Crispin ltq_icu_w32((1 << irq_nr), isr); 104171bb2f1SJohn Crispin } 105171bb2f1SJohn Crispin 106171bb2f1SJohn Crispin static void ltq_ack_irq(struct irq_data *d) 107171bb2f1SJohn Crispin { 108171bb2f1SJohn Crispin u32 isr = LTQ_ICU_IM0_ISR; 109171bb2f1SJohn Crispin int irq_nr = d->irq - INT_NUM_IRQ0; 110171bb2f1SJohn Crispin 111171bb2f1SJohn Crispin isr += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 112171bb2f1SJohn Crispin irq_nr %= INT_NUM_IM_OFFSET; 113171bb2f1SJohn Crispin ltq_icu_w32((1 << irq_nr), isr); 114171bb2f1SJohn Crispin } 115171bb2f1SJohn Crispin 116171bb2f1SJohn Crispin void ltq_enable_irq(struct irq_data *d) 117171bb2f1SJohn Crispin { 118171bb2f1SJohn Crispin u32 ier = LTQ_ICU_IM0_IER; 119171bb2f1SJohn Crispin int irq_nr = d->irq - INT_NUM_IRQ0; 120171bb2f1SJohn Crispin 121171bb2f1SJohn Crispin ier += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 122171bb2f1SJohn Crispin irq_nr %= INT_NUM_IM_OFFSET; 123171bb2f1SJohn Crispin ltq_icu_w32(ltq_icu_r32(ier) | (1 << irq_nr), ier); 124171bb2f1SJohn Crispin } 125171bb2f1SJohn Crispin 126171bb2f1SJohn Crispin static unsigned int ltq_startup_eiu_irq(struct irq_data *d) 127171bb2f1SJohn Crispin { 128171bb2f1SJohn Crispin int i; 129171bb2f1SJohn Crispin 130171bb2f1SJohn Crispin ltq_enable_irq(d); 131171bb2f1SJohn Crispin for (i = 0; i < MAX_EIU; i++) { 13277fbdb30SJohn Crispin if (d->irq == ltq_eiu_irq[i]) { 133171bb2f1SJohn Crispin /* low level - we should really handle set_type */ 134171bb2f1SJohn Crispin ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_C) | 135171bb2f1SJohn Crispin (0x6 << (i * 4)), LTQ_EIU_EXIN_C); 136171bb2f1SJohn Crispin /* clear all pending */ 137171bb2f1SJohn Crispin ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_INIC) & ~(1 << i), 138171bb2f1SJohn Crispin LTQ_EIU_EXIN_INIC); 139171bb2f1SJohn Crispin /* enable */ 140171bb2f1SJohn Crispin ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_INEN) | (1 << i), 141171bb2f1SJohn Crispin LTQ_EIU_EXIN_INEN); 142171bb2f1SJohn Crispin break; 143171bb2f1SJohn Crispin } 144171bb2f1SJohn Crispin } 145171bb2f1SJohn Crispin 146171bb2f1SJohn Crispin return 0; 147171bb2f1SJohn Crispin } 148171bb2f1SJohn Crispin 149171bb2f1SJohn Crispin static void ltq_shutdown_eiu_irq(struct irq_data *d) 150171bb2f1SJohn Crispin { 151171bb2f1SJohn Crispin int i; 152171bb2f1SJohn Crispin 153171bb2f1SJohn Crispin ltq_disable_irq(d); 154171bb2f1SJohn Crispin for (i = 0; i < MAX_EIU; i++) { 15577fbdb30SJohn Crispin if (d->irq == ltq_eiu_irq[i]) { 156171bb2f1SJohn Crispin /* disable */ 157171bb2f1SJohn Crispin ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_INEN) & ~(1 << i), 158171bb2f1SJohn Crispin LTQ_EIU_EXIN_INEN); 159171bb2f1SJohn Crispin break; 160171bb2f1SJohn Crispin } 161171bb2f1SJohn Crispin } 162171bb2f1SJohn Crispin } 163171bb2f1SJohn Crispin 164171bb2f1SJohn Crispin static struct irq_chip ltq_irq_type = { 165171bb2f1SJohn Crispin "icu", 166171bb2f1SJohn Crispin .irq_enable = ltq_enable_irq, 167171bb2f1SJohn Crispin .irq_disable = ltq_disable_irq, 168171bb2f1SJohn Crispin .irq_unmask = ltq_enable_irq, 169171bb2f1SJohn Crispin .irq_ack = ltq_ack_irq, 170171bb2f1SJohn Crispin .irq_mask = ltq_disable_irq, 171171bb2f1SJohn Crispin .irq_mask_ack = ltq_mask_and_ack_irq, 172171bb2f1SJohn Crispin }; 173171bb2f1SJohn Crispin 174171bb2f1SJohn Crispin static struct irq_chip ltq_eiu_type = { 175171bb2f1SJohn Crispin "eiu", 176171bb2f1SJohn Crispin .irq_startup = ltq_startup_eiu_irq, 177171bb2f1SJohn Crispin .irq_shutdown = ltq_shutdown_eiu_irq, 178171bb2f1SJohn Crispin .irq_enable = ltq_enable_irq, 179171bb2f1SJohn Crispin .irq_disable = ltq_disable_irq, 180171bb2f1SJohn Crispin .irq_unmask = ltq_enable_irq, 181171bb2f1SJohn Crispin .irq_ack = ltq_ack_irq, 182171bb2f1SJohn Crispin .irq_mask = ltq_disable_irq, 183171bb2f1SJohn Crispin .irq_mask_ack = ltq_mask_and_ack_irq, 184171bb2f1SJohn Crispin }; 185171bb2f1SJohn Crispin 186171bb2f1SJohn Crispin static void ltq_hw_irqdispatch(int module) 187171bb2f1SJohn Crispin { 188171bb2f1SJohn Crispin u32 irq; 189171bb2f1SJohn Crispin 190171bb2f1SJohn Crispin irq = ltq_icu_r32(LTQ_ICU_IM0_IOSR + (module * LTQ_ICU_OFFSET)); 191171bb2f1SJohn Crispin if (irq == 0) 192171bb2f1SJohn Crispin return; 193171bb2f1SJohn Crispin 194171bb2f1SJohn Crispin /* silicon bug causes only the msb set to 1 to be valid. all 195171bb2f1SJohn Crispin * other bits might be bogus 196171bb2f1SJohn Crispin */ 197171bb2f1SJohn Crispin irq = __fls(irq); 198171bb2f1SJohn Crispin do_IRQ((int)irq + INT_NUM_IM0_IRL0 + (INT_NUM_IM_OFFSET * module)); 199171bb2f1SJohn Crispin 200171bb2f1SJohn Crispin /* if this is a EBU irq, we need to ack it or get a deadlock */ 201171bb2f1SJohn Crispin if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0)) 202171bb2f1SJohn Crispin ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_ISTAT) | 0x10, 203171bb2f1SJohn Crispin LTQ_EBU_PCC_ISTAT); 204171bb2f1SJohn Crispin } 205171bb2f1SJohn Crispin 206171bb2f1SJohn Crispin #define DEFINE_HWx_IRQDISPATCH(x) \ 207171bb2f1SJohn Crispin static void ltq_hw ## x ## _irqdispatch(void) \ 208171bb2f1SJohn Crispin { \ 209171bb2f1SJohn Crispin ltq_hw_irqdispatch(x); \ 210171bb2f1SJohn Crispin } 211171bb2f1SJohn Crispin DEFINE_HWx_IRQDISPATCH(0) 212171bb2f1SJohn Crispin DEFINE_HWx_IRQDISPATCH(1) 213171bb2f1SJohn Crispin DEFINE_HWx_IRQDISPATCH(2) 214171bb2f1SJohn Crispin DEFINE_HWx_IRQDISPATCH(3) 215171bb2f1SJohn Crispin DEFINE_HWx_IRQDISPATCH(4) 216171bb2f1SJohn Crispin 217171bb2f1SJohn Crispin static void ltq_hw5_irqdispatch(void) 218171bb2f1SJohn Crispin { 219171bb2f1SJohn Crispin do_IRQ(MIPS_CPU_TIMER_IRQ); 220171bb2f1SJohn Crispin } 221171bb2f1SJohn Crispin 222171bb2f1SJohn Crispin asmlinkage void plat_irq_dispatch(void) 223171bb2f1SJohn Crispin { 224171bb2f1SJohn Crispin unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; 225171bb2f1SJohn Crispin unsigned int i; 226171bb2f1SJohn Crispin 227171bb2f1SJohn Crispin if (pending & CAUSEF_IP7) { 228171bb2f1SJohn Crispin do_IRQ(MIPS_CPU_TIMER_IRQ); 229171bb2f1SJohn Crispin goto out; 230171bb2f1SJohn Crispin } else { 231171bb2f1SJohn Crispin for (i = 0; i < 5; i++) { 232171bb2f1SJohn Crispin if (pending & (CAUSEF_IP2 << i)) { 233171bb2f1SJohn Crispin ltq_hw_irqdispatch(i); 234171bb2f1SJohn Crispin goto out; 235171bb2f1SJohn Crispin } 236171bb2f1SJohn Crispin } 237171bb2f1SJohn Crispin } 238171bb2f1SJohn Crispin pr_alert("Spurious IRQ: CAUSE=0x%08x\n", read_c0_status()); 239171bb2f1SJohn Crispin 240171bb2f1SJohn Crispin out: 241171bb2f1SJohn Crispin return; 242171bb2f1SJohn Crispin } 243171bb2f1SJohn Crispin 244171bb2f1SJohn Crispin static struct irqaction cascade = { 245171bb2f1SJohn Crispin .handler = no_action, 246171bb2f1SJohn Crispin .name = "cascade", 247171bb2f1SJohn Crispin }; 248171bb2f1SJohn Crispin 249171bb2f1SJohn Crispin void __init arch_init_irq(void) 250171bb2f1SJohn Crispin { 251171bb2f1SJohn Crispin int i; 252171bb2f1SJohn Crispin 253171bb2f1SJohn Crispin if (insert_resource(&iomem_resource, <q_icu_resource) < 0) 254ab75dc02SRalf Baechle panic("Failed to insert icu memory"); 255171bb2f1SJohn Crispin 256171bb2f1SJohn Crispin if (request_mem_region(ltq_icu_resource.start, 257171bb2f1SJohn Crispin resource_size(<q_icu_resource), "icu") < 0) 258ab75dc02SRalf Baechle panic("Failed to request icu memory"); 259171bb2f1SJohn Crispin 260171bb2f1SJohn Crispin ltq_icu_membase = ioremap_nocache(ltq_icu_resource.start, 261171bb2f1SJohn Crispin resource_size(<q_icu_resource)); 262171bb2f1SJohn Crispin if (!ltq_icu_membase) 263ab75dc02SRalf Baechle panic("Failed to remap icu memory"); 264171bb2f1SJohn Crispin 265171bb2f1SJohn Crispin if (insert_resource(&iomem_resource, <q_eiu_resource) < 0) 266ab75dc02SRalf Baechle panic("Failed to insert eiu memory"); 267171bb2f1SJohn Crispin 268171bb2f1SJohn Crispin if (request_mem_region(ltq_eiu_resource.start, 269171bb2f1SJohn Crispin resource_size(<q_eiu_resource), "eiu") < 0) 270ab75dc02SRalf Baechle panic("Failed to request eiu memory"); 271171bb2f1SJohn Crispin 272171bb2f1SJohn Crispin ltq_eiu_membase = ioremap_nocache(ltq_eiu_resource.start, 273171bb2f1SJohn Crispin resource_size(<q_eiu_resource)); 274171bb2f1SJohn Crispin if (!ltq_eiu_membase) 275ab75dc02SRalf Baechle panic("Failed to remap eiu memory"); 276171bb2f1SJohn Crispin 27716f70b56SJohn Crispin /* turn off all irqs by default */ 27816f70b56SJohn Crispin for (i = 0; i < 5; i++) { 279171bb2f1SJohn Crispin /* make sure all irqs are turned off by default */ 280171bb2f1SJohn Crispin ltq_icu_w32(0, LTQ_ICU_IM0_IER + (i * LTQ_ICU_OFFSET)); 281171bb2f1SJohn Crispin /* clear all possibly pending interrupts */ 282171bb2f1SJohn Crispin ltq_icu_w32(~0, LTQ_ICU_IM0_ISR + (i * LTQ_ICU_OFFSET)); 28316f70b56SJohn Crispin } 284171bb2f1SJohn Crispin 285171bb2f1SJohn Crispin mips_cpu_irq_init(); 286171bb2f1SJohn Crispin 287171bb2f1SJohn Crispin for (i = 2; i <= 6; i++) 288171bb2f1SJohn Crispin setup_irq(i, &cascade); 289171bb2f1SJohn Crispin 290171bb2f1SJohn Crispin if (cpu_has_vint) { 291171bb2f1SJohn Crispin pr_info("Setting up vectored interrupts\n"); 292171bb2f1SJohn Crispin set_vi_handler(2, ltq_hw0_irqdispatch); 293171bb2f1SJohn Crispin set_vi_handler(3, ltq_hw1_irqdispatch); 294171bb2f1SJohn Crispin set_vi_handler(4, ltq_hw2_irqdispatch); 295171bb2f1SJohn Crispin set_vi_handler(5, ltq_hw3_irqdispatch); 296171bb2f1SJohn Crispin set_vi_handler(6, ltq_hw4_irqdispatch); 297171bb2f1SJohn Crispin set_vi_handler(7, ltq_hw5_irqdispatch); 298171bb2f1SJohn Crispin } 299171bb2f1SJohn Crispin 300171bb2f1SJohn Crispin for (i = INT_NUM_IRQ0; 301171bb2f1SJohn Crispin i <= (INT_NUM_IRQ0 + (5 * INT_NUM_IM_OFFSET)); i++) 302171bb2f1SJohn Crispin if ((i == LTQ_EIU_IR0) || (i == LTQ_EIU_IR1) || 303171bb2f1SJohn Crispin (i == LTQ_EIU_IR2)) 304171bb2f1SJohn Crispin irq_set_chip_and_handler(i, <q_eiu_type, 305171bb2f1SJohn Crispin handle_level_irq); 306171bb2f1SJohn Crispin /* EIU3-5 only exist on ar9 and vr9 */ 307171bb2f1SJohn Crispin else if (((i == LTQ_EIU_IR3) || (i == LTQ_EIU_IR4) || 308171bb2f1SJohn Crispin (i == LTQ_EIU_IR5)) && (ltq_is_ar9() || ltq_is_vr9())) 309171bb2f1SJohn Crispin irq_set_chip_and_handler(i, <q_eiu_type, 310171bb2f1SJohn Crispin handle_level_irq); 311171bb2f1SJohn Crispin else 312171bb2f1SJohn Crispin irq_set_chip_and_handler(i, <q_irq_type, 313171bb2f1SJohn Crispin handle_level_irq); 314171bb2f1SJohn Crispin 315171bb2f1SJohn Crispin #if !defined(CONFIG_MIPS_MT_SMP) && !defined(CONFIG_MIPS_MT_SMTC) 316171bb2f1SJohn Crispin set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | 317171bb2f1SJohn Crispin IE_IRQ3 | IE_IRQ4 | IE_IRQ5); 318171bb2f1SJohn Crispin #else 319171bb2f1SJohn Crispin set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ0 | IE_IRQ1 | 320171bb2f1SJohn Crispin IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5); 321171bb2f1SJohn Crispin #endif 322*59c11579SJohn Crispin 323*59c11579SJohn Crispin /* tell oprofile which irq to use */ 324*59c11579SJohn Crispin cp0_perfcount_irq = LTQ_PERF_IRQ; 325171bb2f1SJohn Crispin } 326171bb2f1SJohn Crispin 327171bb2f1SJohn Crispin unsigned int __cpuinit get_c0_compare_int(void) 328171bb2f1SJohn Crispin { 329171bb2f1SJohn Crispin return CP0_LEGACY_COMPARE_IRQ; 330171bb2f1SJohn Crispin } 331