diff options
author | Manuel Lauss <mano@roarinelk.homelinux.net> | 2008-12-21 03:26:17 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2009-01-11 04:57:26 -0500 |
commit | 785e3268e2951d4c0c21417c8e5d8004b2ab2480 (patch) | |
tree | 3e7e98dbaf2592f22f65090325a823d36caa13f7 /arch/mips/alchemy/devboards | |
parent | 7179380ee9bdeb5fa2ff07581f512fe0f5382e5b (diff) |
MIPS: Alchemy: update core interrupt code.
This patch attempts to modernize core Alchemy interrupt handling code.
- add irq_chips for irq controllers instead of irq type,
- add a set_type() hook to change irq trigger type during runtime,
- add a set_wake() hook to control GPIO0..7 based wakeup,
- use linux' IRQF_TRIGGER_ constants instead of homebrew ones,
- enable GENERIC_HARDIRQS_NO__DO_IRQ.
- simplify plat_irq_dispatch
- merge au1xxx_irqmap into irq.c file, the only place where its
contents are referenced.
- board_init_irq() is now mandatory for every board; use it to register
the remaining (gpio-based) interrupt sources; update all boards
accordingly.
Run-tested on Db1200 and other Au1200 based platforms.
Signed-off-by: Manuel Lauss <mano@roarinelk.homelinux.net>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
delete mode 100644 arch/mips/alchemy/common/au1xxx_irqmap.c
Diffstat (limited to 'arch/mips/alchemy/devboards')
-rw-r--r-- | arch/mips/alchemy/devboards/db1x00/irqmap.c | 24 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1000/board_setup.c | 9 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1100/board_setup.c | 16 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1200/board_setup.c | 5 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1200/irqmap.c | 7 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1500/board_setup.c | 18 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1550/board_setup.c | 13 |
7 files changed, 53 insertions, 39 deletions
diff --git a/arch/mips/alchemy/devboards/db1x00/irqmap.c b/arch/mips/alchemy/devboards/db1x00/irqmap.c index 94c090e8bf7a..0b09025087c6 100644 --- a/arch/mips/alchemy/devboards/db1x00/irqmap.c +++ b/arch/mips/alchemy/devboards/db1x00/irqmap.c | |||
@@ -27,6 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/interrupt.h> | ||
30 | 31 | ||
31 | #include <asm/mach-au1x00/au1000.h> | 32 | #include <asm/mach-au1x00/au1000.h> |
32 | 33 | ||
@@ -66,21 +67,24 @@ struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { | |||
66 | 67 | ||
67 | #ifndef CONFIG_MIPS_MIRAGE | 68 | #ifndef CONFIG_MIPS_MIRAGE |
68 | #ifdef CONFIG_MIPS_DB1550 | 69 | #ifdef CONFIG_MIPS_DB1550 |
69 | { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 IRQ# */ | 70 | { AU1000_GPIO_3, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card 0 IRQ# */ |
70 | { AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 IRQ# */ | 71 | { AU1000_GPIO_5, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card 1 IRQ# */ |
71 | #else | 72 | #else |
72 | { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 Fully_Interted# */ | 73 | { AU1000_GPIO_0, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card 0 Fully_Interted# */ |
73 | { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 STSCHG# */ | 74 | { AU1000_GPIO_1, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card 0 STSCHG# */ |
74 | { AU1000_GPIO_2, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 IRQ# */ | 75 | { AU1000_GPIO_2, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card 0 IRQ# */ |
75 | 76 | ||
76 | { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 Fully_Interted# */ | 77 | { AU1000_GPIO_3, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card 1 Fully_Interted# */ |
77 | { AU1000_GPIO_4, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 STSCHG# */ | 78 | { AU1000_GPIO_4, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card 1 STSCHG# */ |
78 | { AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 IRQ# */ | 79 | { AU1000_GPIO_5, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card 1 IRQ# */ |
79 | #endif | 80 | #endif |
80 | #else | 81 | #else |
81 | { AU1000_GPIO_7, INTC_INT_RISE_EDGE, 0 }, /* touchscreen pen down */ | 82 | { AU1000_GPIO_7, IRQF_TRIGGER_RISING, 0 }, /* touchscreen pen down */ |
82 | #endif | 83 | #endif |
83 | 84 | ||
84 | }; | 85 | }; |
85 | 86 | ||
86 | int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map); | 87 | void __init board_init_irq(void) |
88 | { | ||
89 | au1xxx_setup_irqmap(au1xxx_irq_map, ARRAY_SIZE(au1xxx_irq_map)); | ||
90 | } | ||
diff --git a/arch/mips/alchemy/devboards/pb1000/board_setup.c b/arch/mips/alchemy/devboards/pb1000/board_setup.c index 889c8fda2ab1..aed2fdecc709 100644 --- a/arch/mips/alchemy/devboards/pb1000/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1000/board_setup.c | |||
@@ -32,11 +32,9 @@ | |||
32 | 32 | ||
33 | 33 | ||
34 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { | 34 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { |
35 | { AU1000_GPIO_15, INTC_INT_LOW_LEVEL, 0 }, | 35 | { AU1000_GPIO_15, IRQF_TRIGGER_LOW, 0 }, |
36 | }; | 36 | }; |
37 | 37 | ||
38 | int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map); | ||
39 | |||
40 | 38 | ||
41 | const char *get_system_type(void) | 39 | const char *get_system_type(void) |
42 | { | 40 | { |
@@ -47,6 +45,11 @@ void board_reset(void) | |||
47 | { | 45 | { |
48 | } | 46 | } |
49 | 47 | ||
48 | void __init board_init_irq(void) | ||
49 | { | ||
50 | au1xxx_setup_irqmap(au1xxx_irq_map, ARRAY_SIZE(au1xxx_irq_map)); | ||
51 | } | ||
52 | |||
50 | void __init board_setup(void) | 53 | void __init board_setup(void) |
51 | { | 54 | { |
52 | u32 pin_func, static_cfg0; | 55 | u32 pin_func, static_cfg0; |
diff --git a/arch/mips/alchemy/devboards/pb1100/board_setup.c b/arch/mips/alchemy/devboards/pb1100/board_setup.c index fbd211e13489..4df57fae15d4 100644 --- a/arch/mips/alchemy/devboards/pb1100/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1100/board_setup.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/interrupt.h> | ||
28 | 29 | ||
29 | #include <asm/mach-au1x00/au1000.h> | 30 | #include <asm/mach-au1x00/au1000.h> |
30 | #include <asm/mach-pb1x00/pb1100.h> | 31 | #include <asm/mach-pb1x00/pb1100.h> |
@@ -33,14 +34,12 @@ | |||
33 | 34 | ||
34 | 35 | ||
35 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { | 36 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { |
36 | { AU1000_GPIO_9, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card Fully_Inserted# */ | 37 | { AU1000_GPIO_9, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card Fully_Inserted# */ |
37 | { AU1000_GPIO_10, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card STSCHG# */ | 38 | { AU1000_GPIO_10, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card STSCHG# */ |
38 | { AU1000_GPIO_11, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card IRQ# */ | 39 | { AU1000_GPIO_11, IRQF_TRIGGER_LOW, 0 }, /* PCMCIA Card IRQ# */ |
39 | { AU1000_GPIO_13, INTC_INT_LOW_LEVEL, 0 }, /* DC_IRQ# */ | 40 | { AU1000_GPIO_13, IRQF_TRIGGER_LOW, 0 }, /* DC_IRQ# */ |
40 | }; | 41 | }; |
41 | 42 | ||
42 | int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map); | ||
43 | |||
44 | 43 | ||
45 | const char *get_system_type(void) | 44 | const char *get_system_type(void) |
46 | { | 45 | { |
@@ -53,6 +52,11 @@ void board_reset(void) | |||
53 | au_writel(0x00000000, PB1100_RST_VDDI); | 52 | au_writel(0x00000000, PB1100_RST_VDDI); |
54 | } | 53 | } |
55 | 54 | ||
55 | void __init board_init_irq(void) | ||
56 | { | ||
57 | au1xxx_setup_irqmap(au1xxx_irq_map, ARRAY_SIZE(au1xxx_irq_map)); | ||
58 | } | ||
59 | |||
56 | void __init board_setup(void) | 60 | void __init board_setup(void) |
57 | { | 61 | { |
58 | volatile void __iomem *base = (volatile void __iomem *)0xac000000UL; | 62 | volatile void __iomem *base = (volatile void __iomem *)0xac000000UL; |
diff --git a/arch/mips/alchemy/devboards/pb1200/board_setup.c b/arch/mips/alchemy/devboards/pb1200/board_setup.c index b5585e462004..94e6b7e7753d 100644 --- a/arch/mips/alchemy/devboards/pb1200/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1200/board_setup.c | |||
@@ -30,8 +30,6 @@ | |||
30 | #include <prom.h> | 30 | #include <prom.h> |
31 | #include <au1xxx.h> | 31 | #include <au1xxx.h> |
32 | 32 | ||
33 | extern void _board_init_irq(void); | ||
34 | extern void (*board_init_irq)(void); | ||
35 | 33 | ||
36 | const char *get_system_type(void) | 34 | const char *get_system_type(void) |
37 | { | 35 | { |
@@ -131,9 +129,6 @@ void __init board_setup(void) | |||
131 | #ifdef CONFIG_MIPS_DB1200 | 129 | #ifdef CONFIG_MIPS_DB1200 |
132 | printk(KERN_INFO "AMD Alchemy Db1200 Board\n"); | 130 | printk(KERN_INFO "AMD Alchemy Db1200 Board\n"); |
133 | #endif | 131 | #endif |
134 | |||
135 | /* Setup Pb1200 External Interrupt Controller */ | ||
136 | board_init_irq = _board_init_irq; | ||
137 | } | 132 | } |
138 | 133 | ||
139 | int board_au1200fb_panel(void) | 134 | int board_au1200fb_panel(void) |
diff --git a/arch/mips/alchemy/devboards/pb1200/irqmap.c b/arch/mips/alchemy/devboards/pb1200/irqmap.c index 2a505ad8715b..1f92fec24a33 100644 --- a/arch/mips/alchemy/devboards/pb1200/irqmap.c +++ b/arch/mips/alchemy/devboards/pb1200/irqmap.c | |||
@@ -40,10 +40,9 @@ | |||
40 | 40 | ||
41 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { | 41 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { |
42 | /* This is external interrupt cascade */ | 42 | /* This is external interrupt cascade */ |
43 | { AU1000_GPIO_7, INTC_INT_LOW_LEVEL, 0 }, | 43 | { AU1000_GPIO_7, IRQF_TRIGGER_LOW, 0 }, |
44 | }; | 44 | }; |
45 | 45 | ||
46 | int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map); | ||
47 | 46 | ||
48 | /* | 47 | /* |
49 | * Support for External interrupts on the Pb1200 Development platform. | 48 | * Support for External interrupts on the Pb1200 Development platform. |
@@ -121,10 +120,12 @@ static struct irq_chip external_irq_type = { | |||
121 | .unmask = pb1200_enable_irq, | 120 | .unmask = pb1200_enable_irq, |
122 | }; | 121 | }; |
123 | 122 | ||
124 | void _board_init_irq(void) | 123 | void __init board_init_irq(void) |
125 | { | 124 | { |
126 | unsigned int irq; | 125 | unsigned int irq; |
127 | 126 | ||
127 | au1xxx_setup_irqmap(au1xxx_irq_map, ARRAY_SIZE(au1xxx_irq_map)); | ||
128 | |||
128 | #ifdef CONFIG_MIPS_PB1200 | 129 | #ifdef CONFIG_MIPS_PB1200 |
129 | /* We have a problem with CPLD rev 3. */ | 130 | /* We have a problem with CPLD rev 3. */ |
130 | if (((bcsr->whoami & BCSR_WHOAMI_CPLD) >> 4) <= 3) { | 131 | if (((bcsr->whoami & BCSR_WHOAMI_CPLD) >> 4) <= 3) { |
diff --git a/arch/mips/alchemy/devboards/pb1500/board_setup.c b/arch/mips/alchemy/devboards/pb1500/board_setup.c index dcb36a66442f..fed3b093156a 100644 --- a/arch/mips/alchemy/devboards/pb1500/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1500/board_setup.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/interrupt.h> | ||
28 | 29 | ||
29 | #include <asm/mach-au1x00/au1000.h> | 30 | #include <asm/mach-au1x00/au1000.h> |
30 | #include <asm/mach-pb1x00/pb1500.h> | 31 | #include <asm/mach-pb1x00/pb1500.h> |
@@ -38,15 +39,13 @@ char irq_tab_alchemy[][5] __initdata = { | |||
38 | }; | 39 | }; |
39 | 40 | ||
40 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { | 41 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { |
41 | { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0 }, | 42 | { AU1500_GPIO_204, IRQF_TRIGGER_HIGH, 0 }, |
42 | { AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 }, | 43 | { AU1500_GPIO_201, IRQF_TRIGGER_LOW, 0 }, |
43 | { AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 }, | 44 | { AU1500_GPIO_202, IRQF_TRIGGER_LOW, 0 }, |
44 | { AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 }, | 45 | { AU1500_GPIO_203, IRQF_TRIGGER_LOW, 0 }, |
45 | { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 }, | 46 | { AU1500_GPIO_205, IRQF_TRIGGER_LOW, 0 }, |
46 | }; | 47 | }; |
47 | 48 | ||
48 | int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map); | ||
49 | |||
50 | 49 | ||
51 | const char *get_system_type(void) | 50 | const char *get_system_type(void) |
52 | { | 51 | { |
@@ -59,6 +58,11 @@ void board_reset(void) | |||
59 | au_writel(0x00000000, PB1500_RST_VDDI); | 58 | au_writel(0x00000000, PB1500_RST_VDDI); |
60 | } | 59 | } |
61 | 60 | ||
61 | void __init board_init_irq(void) | ||
62 | { | ||
63 | au1xxx_setup_irqmap(au1xxx_irq_map, ARRAY_SIZE(au1xxx_irq_map)); | ||
64 | } | ||
65 | |||
62 | void __init board_setup(void) | 66 | void __init board_setup(void) |
63 | { | 67 | { |
64 | u32 pin_func; | 68 | u32 pin_func; |
diff --git a/arch/mips/alchemy/devboards/pb1550/board_setup.c b/arch/mips/alchemy/devboards/pb1550/board_setup.c index f462652d762a..b6e9e7d247a3 100644 --- a/arch/mips/alchemy/devboards/pb1550/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1550/board_setup.c | |||
@@ -28,6 +28,7 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
31 | #include <linux/interrupt.h> | ||
31 | 32 | ||
32 | #include <asm/mach-au1x00/au1000.h> | 33 | #include <asm/mach-au1x00/au1000.h> |
33 | #include <asm/mach-pb1x00/pb1550.h> | 34 | #include <asm/mach-pb1x00/pb1550.h> |
@@ -41,13 +42,10 @@ char irq_tab_alchemy[][5] __initdata = { | |||
41 | }; | 42 | }; |
42 | 43 | ||
43 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { | 44 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { |
44 | { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 }, | 45 | { AU1000_GPIO_0, IRQF_TRIGGER_LOW, 0 }, |
45 | { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 }, | 46 | { AU1000_GPIO_1, IRQF_TRIGGER_LOW, 0 }, |
46 | }; | 47 | }; |
47 | 48 | ||
48 | int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map); | ||
49 | |||
50 | |||
51 | const char *get_system_type(void) | 49 | const char *get_system_type(void) |
52 | { | 50 | { |
53 | return "Alchemy Pb1550"; | 51 | return "Alchemy Pb1550"; |
@@ -59,6 +57,11 @@ void board_reset(void) | |||
59 | au_writew(au_readw(0xAF00001C) & ~BCSR_SYSTEM_RESET, 0xAF00001C); | 57 | au_writew(au_readw(0xAF00001C) & ~BCSR_SYSTEM_RESET, 0xAF00001C); |
60 | } | 58 | } |
61 | 59 | ||
60 | void __init board_init_irq(void) | ||
61 | { | ||
62 | au1xxx_setup_irqmap(au1xxx_irq_map, ARRAY_SIZE(au1xxx_irq_map)); | ||
63 | } | ||
64 | |||
62 | void __init board_setup(void) | 65 | void __init board_setup(void) |
63 | { | 66 | { |
64 | u32 pin_func; | 67 | u32 pin_func; |