2 * Portions copyright (C) 2005-2009 Scientific Atlanta
3 * Portions copyright (C) 2009 Cisco Systems, Inc.
5 * Modified from arch/mips/kernel/irq-rm7000.c:
6 * Copyright (C) 2003 Ralf Baechle
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
13 #include <linux/init.h>
14 #include <linux/interrupt.h>
15 #include <linux/kernel.h>
16 #include <linux/irq.h>
18 #include <asm/irq_cpu.h>
19 #include <asm/mipsregs.h>
20 #include <asm/system.h>
22 #include <asm/mach-powertv/asic_regs.h>
24 static inline void unmask_asic_irq(unsigned int irq)
26 unsigned long enable_bit;
28 enable_bit = (1 << (irq & 0x1f));
32 asic_write(asic_read(ien_int_0) | enable_bit, ien_int_0);
35 asic_write(asic_read(ien_int_1) | enable_bit, ien_int_1);
38 asic_write(asic_read(ien_int_2) | enable_bit, ien_int_2);
41 asic_write(asic_read(ien_int_3) | enable_bit, ien_int_3);
48 static inline void mask_asic_irq(unsigned int irq)
50 unsigned long disable_mask;
52 disable_mask = ~(1 << (irq & 0x1f));
56 asic_write(asic_read(ien_int_0) & disable_mask, ien_int_0);
59 asic_write(asic_read(ien_int_1) & disable_mask, ien_int_1);
62 asic_write(asic_read(ien_int_2) & disable_mask, ien_int_2);
65 asic_write(asic_read(ien_int_3) & disable_mask, ien_int_3);
72 static struct irq_chip asic_irq_chip = {
75 .mask = mask_asic_irq,
76 .mask_ack = mask_asic_irq,
77 .unmask = unmask_asic_irq,
78 .eoi = unmask_asic_irq,
81 void __init asic_irq_init(void)
85 /* set priority to 0 */
86 write_c0_status(read_c0_status() & ~(0x0000fc00));
88 asic_write(0, ien_int_0);
89 asic_write(0, ien_int_1);
90 asic_write(0, ien_int_2);
91 asic_write(0, ien_int_3);
93 asic_write(0x0fffffff, int_level_3_3);
94 asic_write(0xffffffff, int_level_3_2);
95 asic_write(0xffffffff, int_level_3_1);
96 asic_write(0xffffffff, int_level_3_0);
97 asic_write(0xffffffff, int_level_2_3);
98 asic_write(0xffffffff, int_level_2_2);
99 asic_write(0xffffffff, int_level_2_1);
100 asic_write(0xffffffff, int_level_2_0);
101 asic_write(0xffffffff, int_level_1_3);
102 asic_write(0xffffffff, int_level_1_2);
103 asic_write(0xffffffff, int_level_1_1);
104 asic_write(0xffffffff, int_level_1_0);
105 asic_write(0xffffffff, int_level_0_3);
106 asic_write(0xffffffff, int_level_0_2);
107 asic_write(0xffffffff, int_level_0_1);
108 asic_write(0xffffffff, int_level_0_0);
110 asic_write(0xf, int_int_scan);
113 * Initialize interrupt handlers.
115 for (i = 0; i < NR_IRQS; i++)
116 set_irq_chip_and_handler(i, &asic_irq_chip, handle_level_irq);