2 * arch/score/kernel/irq.c
4 * Score Processor version.
6 * Copyright (C) 2009 Sunplus Core Technology Co., Ltd.
7 * Chen Liqin <liqin.chen@sunplusct.com>
8 * Lennox Wu <lennox.wu@sunplusct.com>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, see the file COPYING, or write
22 * to the Free Software Foundation, Inc.,
23 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 #include <linux/interrupt.h>
27 #include <linux/kernel_stat.h>
28 #include <linux/seq_file.h>
32 /* the interrupt controller is hardcoded at this address */
33 #define SCORE_PIC ((u32 __iomem __force *)0x95F50000)
37 #define INT_PRIORITY_M 2
38 #define INT_PRIORITY_SG0 4
39 #define INT_PRIORITY_SG1 5
40 #define INT_PRIORITY_SG2 6
41 #define INT_PRIORITY_SG3 7
46 * handles all normal device IRQs
48 asmlinkage
void do_IRQ(int irq
)
51 generic_handle_irq(irq
);
55 static void score_mask(unsigned int irq_nr
)
57 unsigned int irq_source
= 63 - irq_nr
;
60 __raw_writel((__raw_readl(SCORE_PIC
+ INT_MASKL
) | \
61 (1 << irq_source
)), SCORE_PIC
+ INT_MASKL
);
63 __raw_writel((__raw_readl(SCORE_PIC
+ INT_MASKH
) | \
64 (1 << (irq_source
- 32))), SCORE_PIC
+ INT_MASKH
);
67 static void score_unmask(unsigned int irq_nr
)
69 unsigned int irq_source
= 63 - irq_nr
;
72 __raw_writel((__raw_readl(SCORE_PIC
+ INT_MASKL
) & \
73 ~(1 << irq_source
)), SCORE_PIC
+ INT_MASKL
);
75 __raw_writel((__raw_readl(SCORE_PIC
+ INT_MASKH
) & \
76 ~(1 << (irq_source
- 32))), SCORE_PIC
+ INT_MASKH
);
79 struct irq_chip score_irq_chip
= {
80 .name
= "Score7-level",
82 .mask_ack
= score_mask
,
83 .unmask
= score_unmask
,
87 * initialise the interrupt system
89 void __init
init_IRQ(void)
92 unsigned long target_addr
;
94 for (index
= 0; index
< NR_IRQS
; ++index
)
95 set_irq_chip_and_handler(index
, &score_irq_chip
,
98 for (target_addr
= IRQ_VECTOR_BASE_ADDR
;
99 target_addr
<= IRQ_VECTOR_END_ADDR
;
100 target_addr
+= IRQ_VECTOR_SIZE
)
101 memcpy((void *)target_addr
, \
102 interrupt_exception_vector
, IRQ_VECTOR_SIZE
);
104 __raw_writel(0xffffffff, SCORE_PIC
+ INT_MASKL
);
105 __raw_writel(0xffffffff, SCORE_PIC
+ INT_MASKH
);
107 __asm__
__volatile__(
109 : : "r" (EXCEPTION_VECTOR_BASE_ADDR
| \
110 VECTOR_ADDRESS_OFFSET_MODE16
));
114 * Generic, controller-independent functions:
116 int show_interrupts(struct seq_file
*p
, void *v
)
118 int i
= *(loff_t
*)v
, cpu
;
119 struct irqaction
*action
;
124 for_each_online_cpu(cpu
)
125 seq_printf(p
, "CPU%d ", cpu
);
130 spin_lock_irqsave(&irq_desc
[i
].lock
, flags
);
131 action
= irq_desc
[i
].action
;
135 seq_printf(p
, "%3d: ", i
);
136 seq_printf(p
, "%10u ", kstat_irqs(i
));
137 seq_printf(p
, " %8s", irq_desc
[i
].chip
->name
? : "-");
138 seq_printf(p
, " %s", action
->name
);
139 for (action
= action
->next
; action
; action
= action
->next
)
140 seq_printf(p
, ", %s", action
->name
);
144 spin_unlock_irqrestore(&irq_desc
[i
].lock
, flags
);