diff options
Diffstat (limited to 'arch/sh/boards')
-rw-r--r-- | arch/sh/boards/se/7780/irq.c | 45 |
1 files changed, 14 insertions, 31 deletions
diff --git a/arch/sh/boards/se/7780/irq.c b/arch/sh/boards/se/7780/irq.c index 3d0625c2d07b..874914746009 100644 --- a/arch/sh/boards/se/7780/irq.c +++ b/arch/sh/boards/se/7780/irq.c | |||
@@ -16,28 +16,6 @@ | |||
16 | #include <asm/io.h> | 16 | #include <asm/io.h> |
17 | #include <asm/se7780.h> | 17 | #include <asm/se7780.h> |
18 | 18 | ||
19 | #define INTC_INTMSK0 0xFFD00044 | ||
20 | #define INTC_INTMSKCLR0 0xFFD00064 | ||
21 | |||
22 | static void disable_se7780_irq(unsigned int irq) | ||
23 | { | ||
24 | struct intc2_data *p = get_irq_chip_data(irq); | ||
25 | ctrl_outl(1 << p->msk_shift, INTC_INTMSK0 + p->msk_offset); | ||
26 | } | ||
27 | |||
28 | static void enable_se7780_irq(unsigned int irq) | ||
29 | { | ||
30 | struct intc2_data *p = get_irq_chip_data(irq); | ||
31 | ctrl_outl(1 << p->msk_shift, INTC_INTMSKCLR0 + p->msk_offset); | ||
32 | } | ||
33 | |||
34 | static struct irq_chip se7780_irq_chip __read_mostly = { | ||
35 | .name = "SE7780", | ||
36 | .mask = disable_se7780_irq, | ||
37 | .unmask = enable_se7780_irq, | ||
38 | .mask_ack = disable_se7780_irq, | ||
39 | }; | ||
40 | |||
41 | static struct intc2_data intc2_irq_table[] = { | 19 | static struct intc2_data intc2_irq_table[] = { |
42 | { 2, 0, 31, 0, 31, 3 }, /* daughter board EXTINT1 */ | 20 | { 2, 0, 31, 0, 31, 3 }, /* daughter board EXTINT1 */ |
43 | { 4, 0, 30, 0, 30, 3 }, /* daughter board EXTINT2 */ | 21 | { 4, 0, 30, 0, 30, 3 }, /* daughter board EXTINT2 */ |
@@ -51,13 +29,24 @@ static struct intc2_data intc2_irq_table[] = { | |||
51 | { 0 , 0, 24, 0, 24, 3 }, /* SM501 */ | 29 | { 0 , 0, 24, 0, 24, 3 }, /* SM501 */ |
52 | }; | 30 | }; |
53 | 31 | ||
32 | static struct intc2_desc intc2_irq_desc __read_mostly = { | ||
33 | .prio_base = 0, /* N/A */ | ||
34 | .msk_base = 0xffd00044, | ||
35 | .mskclr_base = 0xffd00064, | ||
36 | |||
37 | .intc2_data = intc2_irq_table, | ||
38 | .nr_irqs = ARRAY_SIZE(intc2_irq_table), | ||
39 | |||
40 | .chip = { | ||
41 | .name = "INTC2-se7780", | ||
42 | }, | ||
43 | }; | ||
44 | |||
54 | /* | 45 | /* |
55 | * Initialize IRQ setting | 46 | * Initialize IRQ setting |
56 | */ | 47 | */ |
57 | void __init init_se7780_IRQ(void) | 48 | void __init init_se7780_IRQ(void) |
58 | { | 49 | { |
59 | int i ; | ||
60 | |||
61 | /* enable all interrupt at FPGA */ | 50 | /* enable all interrupt at FPGA */ |
62 | ctrl_outw(0, FPGA_INTMSK1); | 51 | ctrl_outw(0, FPGA_INTMSK1); |
63 | /* mask SM501 interrupt */ | 52 | /* mask SM501 interrupt */ |
@@ -79,11 +68,5 @@ void __init init_se7780_IRQ(void) | |||
79 | /* FPGA + 0x0A */ | 68 | /* FPGA + 0x0A */ |
80 | ctrl_outw((IRQPIN_PCCPW << IRQPOS_PCCPW), FPGA_INTSEL3); | 69 | ctrl_outw((IRQPIN_PCCPW << IRQPOS_PCCPW), FPGA_INTSEL3); |
81 | 70 | ||
82 | for (i = 0; i < ARRAY_SIZE(intc2_irq_table); i++) { | 71 | register_intc2_controller(&intc2_irq_desc); |
83 | disable_irq_nosync(intc2_irq_table[i].irq); | ||
84 | set_irq_chip_and_handler_name( intc2_irq_table[i].irq, &se7780_irq_chip, | ||
85 | handle_level_irq, "level"); | ||
86 | set_irq_chip_data( intc2_irq_table[i].irq, &intc2_irq_table[i] ); | ||
87 | disable_se7780_irq(intc2_irq_table[i].irq); | ||
88 | } | ||
89 | } | 72 | } |