]>
Commit | Line | Data |
---|---|---|
6865f0ea RS |
1 | /* |
2 | * linux/arch/sh/boards/se/7722/irq.c | |
3 | * | |
4 | * Copyright (C) 2007 Nobuhiro Iwamatsu | |
5 | * | |
6 | * Hitachi UL SolutionEngine 7722 Support. | |
7 | * | |
8 | * This file is subject to the terms and conditions of the GNU General Public | |
9 | * License. See the file "COPYING" in the main directory of this archive | |
10 | * for more details. | |
11 | */ | |
12 | #include <linux/init.h> | |
13 | #include <linux/irq.h> | |
14 | #include <linux/interrupt.h> | |
15 | #include <asm/irq.h> | |
16 | #include <asm/io.h> | |
17 | #include <asm/se7722.h> | |
18 | ||
6865f0ea RS |
19 | static void disable_se7722_irq(unsigned int irq) |
20 | { | |
493a358e MD |
21 | unsigned int bit = irq - SE7722_FPGA_IRQ_BASE; |
22 | ctrl_outw(ctrl_inw(IRQ01_MASK) | 1 << bit, IRQ01_MASK); | |
6865f0ea RS |
23 | } |
24 | ||
25 | static void enable_se7722_irq(unsigned int irq) | |
26 | { | |
493a358e MD |
27 | unsigned int bit = irq - SE7722_FPGA_IRQ_BASE; |
28 | ctrl_outw(ctrl_inw(IRQ01_MASK) & ~(1 << bit), IRQ01_MASK); | |
6865f0ea RS |
29 | } |
30 | ||
31 | static struct irq_chip se7722_irq_chip __read_mostly = { | |
493a358e | 32 | .name = "SE7722-FPGA", |
6865f0ea RS |
33 | .mask = disable_se7722_irq, |
34 | .unmask = enable_se7722_irq, | |
35 | .mask_ack = disable_se7722_irq, | |
36 | }; | |
37 | ||
493a358e | 38 | static void se7722_irq_demux(unsigned int irq, struct irq_desc *desc) |
6865f0ea | 39 | { |
493a358e MD |
40 | unsigned short intv = ctrl_inw(IRQ01_STS); |
41 | struct irq_desc *ext_desc; | |
42 | unsigned int ext_irq = SE7722_FPGA_IRQ_BASE; | |
43 | ||
44 | intv &= (1 << SE7722_FPGA_IRQ_NR) - 1; | |
6865f0ea | 45 | |
493a358e MD |
46 | while (intv) { |
47 | if (intv & 1) { | |
48 | ext_desc = irq_desc + ext_irq; | |
49 | handle_level_irq(ext_irq, ext_desc); | |
6865f0ea | 50 | } |
493a358e MD |
51 | intv >>= 1; |
52 | ext_irq++; | |
6865f0ea | 53 | } |
6865f0ea | 54 | } |
493a358e | 55 | |
6865f0ea RS |
56 | /* |
57 | * Initialize IRQ setting | |
58 | */ | |
59 | void __init init_se7722_IRQ(void) | |
60 | { | |
493a358e MD |
61 | int i; |
62 | ||
63 | ctrl_outw(0, IRQ01_MASK); /* disable all irqs */ | |
6865f0ea | 64 | ctrl_outw(0x2000, 0xb03fffec); /* mrshpc irq enable */ |
6865f0ea | 65 | |
493a358e MD |
66 | for (i = 0; i < SE7722_FPGA_IRQ_NR; i++) |
67 | set_irq_chip_and_handler_name(SE7722_FPGA_IRQ_BASE + i, | |
68 | &se7722_irq_chip, | |
69 | handle_level_irq, "level"); | |
70 | ||
71 | set_irq_chained_handler(IRQ0_IRQ, se7722_irq_demux); | |
72 | set_irq_type(IRQ0_IRQ, IRQ_TYPE_LEVEL_LOW); | |
73 | ||
74 | set_irq_chained_handler(IRQ1_IRQ, se7722_irq_demux); | |
75 | set_irq_type(IRQ1_IRQ, IRQ_TYPE_LEVEL_LOW); | |
6865f0ea | 76 | } |