diff options
author | Magnus Damm <damm@igel.co.jp> | 2007-07-20 05:44:49 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2007-07-20 05:44:49 -0400 |
commit | 56386f6424f242cff46e2cfd7be44624cd37dce1 (patch) | |
tree | a8dd5193063e892fc424f8b2da247c020ec54496 | |
parent | 339547bf5de1212c9c7b89b0e0d69620709729d2 (diff) |
sh: intc - add support for SH7750 and its variants
This patch converts the cpu specific 7750 setup code to use the
new intc controller. Many new vectors are added and multiple
processor variants including 7091, 7750, 7750s, 7750r, 7751 and
7751r should all have the correct vectors hooked up.
IRLM interrupts can be enabled using ipr_irq_enable_irlm() which
now is marked as __init.
Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
-rw-r--r-- | arch/sh/Kconfig | 6 | ||||
-rw-r--r-- | arch/sh/configs/landisk_defconfig | 2 | ||||
-rw-r--r-- | arch/sh/configs/lboxre2_defconfig | 2 | ||||
-rw-r--r-- | arch/sh/configs/rts7751r2d_defconfig | 2 | ||||
-rw-r--r-- | arch/sh/configs/se7750_defconfig | 2 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4/setup-sh7750.c | 253 | ||||
-rw-r--r-- | arch/sh/mm/Kconfig | 12 | ||||
-rw-r--r-- | include/asm-sh/hw_irq.h | 2 |
8 files changed, 206 insertions, 75 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index ddfd358a67c1..f87f429e0b24 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -212,6 +212,7 @@ config SOLUTION_ENGINE | |||
212 | config SH_SOLUTION_ENGINE | 212 | config SH_SOLUTION_ENGINE |
213 | bool "SolutionEngine" | 213 | bool "SolutionEngine" |
214 | select SOLUTION_ENGINE | 214 | select SOLUTION_ENGINE |
215 | select CPU_HAS_IPR_IRQ | ||
215 | depends on CPU_SUBTYPE_SH7709 || CPU_SUBTYPE_SH7750 | 216 | depends on CPU_SUBTYPE_SH7709 || CPU_SUBTYPE_SH7750 |
216 | help | 217 | help |
217 | Select SolutionEngine if configuring for a Hitachi SH7709 | 218 | Select SolutionEngine if configuring for a Hitachi SH7709 |
@@ -244,6 +245,7 @@ config SH_7722_SOLUTION_ENGINE | |||
244 | config SH_7751_SOLUTION_ENGINE | 245 | config SH_7751_SOLUTION_ENGINE |
245 | bool "SolutionEngine7751" | 246 | bool "SolutionEngine7751" |
246 | select SOLUTION_ENGINE | 247 | select SOLUTION_ENGINE |
248 | select CPU_HAS_IPR_IRQ | ||
247 | depends on CPU_SUBTYPE_SH7751 | 249 | depends on CPU_SUBTYPE_SH7751 |
248 | help | 250 | help |
249 | Select 7751 SolutionEngine if configuring for a Hitachi SH7751 | 251 | Select 7751 SolutionEngine if configuring for a Hitachi SH7751 |
@@ -321,6 +323,7 @@ config SH_MPC1211 | |||
321 | config SH_SH03 | 323 | config SH_SH03 |
322 | bool "Interface CTP/PCI-SH03" | 324 | bool "Interface CTP/PCI-SH03" |
323 | depends on CPU_SUBTYPE_SH7751 && BROKEN | 325 | depends on CPU_SUBTYPE_SH7751 && BROKEN |
326 | select CPU_HAS_IPR_IRQ | ||
324 | select SYS_SUPPORTS_PCI | 327 | select SYS_SUPPORTS_PCI |
325 | help | 328 | help |
326 | CTP/PCI-SH03 is a CPU module computer that is produced | 329 | CTP/PCI-SH03 is a CPU module computer that is produced |
@@ -330,6 +333,7 @@ config SH_SH03 | |||
330 | config SH_SECUREEDGE5410 | 333 | config SH_SECUREEDGE5410 |
331 | bool "SecureEdge5410" | 334 | bool "SecureEdge5410" |
332 | depends on CPU_SUBTYPE_SH7751R | 335 | depends on CPU_SUBTYPE_SH7751R |
336 | select CPU_HAS_IPR_IRQ | ||
333 | select SYS_SUPPORTS_PCI | 337 | select SYS_SUPPORTS_PCI |
334 | help | 338 | help |
335 | Select SecureEdge5410 if configuring for a SnapGear SH board. | 339 | Select SecureEdge5410 if configuring for a SnapGear SH board. |
@@ -384,6 +388,7 @@ config SH_LANDISK | |||
384 | config SH_TITAN | 388 | config SH_TITAN |
385 | bool "TITAN" | 389 | bool "TITAN" |
386 | depends on CPU_SUBTYPE_SH7751R | 390 | depends on CPU_SUBTYPE_SH7751R |
391 | select CPU_HAS_IPR_IRQ | ||
387 | select SYS_SUPPORTS_PCI | 392 | select SYS_SUPPORTS_PCI |
388 | help | 393 | help |
389 | Select Titan if you are configuring for a Nimble Microsystems | 394 | Select Titan if you are configuring for a Nimble Microsystems |
@@ -392,6 +397,7 @@ config SH_TITAN | |||
392 | config SH_SHMIN | 397 | config SH_SHMIN |
393 | bool "SHMIN" | 398 | bool "SHMIN" |
394 | depends on CPU_SUBTYPE_SH7706 | 399 | depends on CPU_SUBTYPE_SH7706 |
400 | select CPU_HAS_IPR_IRQ | ||
395 | help | 401 | help |
396 | Select SHMIN if configuring for the SHMIN board. | 402 | Select SHMIN if configuring for the SHMIN board. |
397 | 403 | ||
diff --git a/arch/sh/configs/landisk_defconfig b/arch/sh/configs/landisk_defconfig index e7f8ddb0ada4..07310fa03250 100644 --- a/arch/sh/configs/landisk_defconfig +++ b/arch/sh/configs/landisk_defconfig | |||
@@ -217,7 +217,7 @@ CONFIG_SH_FPU=y | |||
217 | # CONFIG_SH_DSP is not set | 217 | # CONFIG_SH_DSP is not set |
218 | # CONFIG_SH_STORE_QUEUES is not set | 218 | # CONFIG_SH_STORE_QUEUES is not set |
219 | CONFIG_CPU_HAS_INTEVT=y | 219 | CONFIG_CPU_HAS_INTEVT=y |
220 | CONFIG_CPU_HAS_IPR_IRQ=y | 220 | CONFIG_CPU_HAS_INTC_IRQ=y |
221 | CONFIG_CPU_HAS_SR_RB=y | 221 | CONFIG_CPU_HAS_SR_RB=y |
222 | CONFIG_CPU_HAS_PTEA=y | 222 | CONFIG_CPU_HAS_PTEA=y |
223 | 223 | ||
diff --git a/arch/sh/configs/lboxre2_defconfig b/arch/sh/configs/lboxre2_defconfig index be86414dcc87..fa09d68d057a 100644 --- a/arch/sh/configs/lboxre2_defconfig +++ b/arch/sh/configs/lboxre2_defconfig | |||
@@ -222,7 +222,7 @@ CONFIG_SH_FPU=y | |||
222 | # CONFIG_SH_DSP is not set | 222 | # CONFIG_SH_DSP is not set |
223 | # CONFIG_SH_STORE_QUEUES is not set | 223 | # CONFIG_SH_STORE_QUEUES is not set |
224 | CONFIG_CPU_HAS_INTEVT=y | 224 | CONFIG_CPU_HAS_INTEVT=y |
225 | CONFIG_CPU_HAS_IPR_IRQ=y | 225 | CONFIG_CPU_HAS_INTC_IRQ=y |
226 | CONFIG_CPU_HAS_SR_RB=y | 226 | CONFIG_CPU_HAS_SR_RB=y |
227 | CONFIG_CPU_HAS_PTEA=y | 227 | CONFIG_CPU_HAS_PTEA=y |
228 | 228 | ||
diff --git a/arch/sh/configs/rts7751r2d_defconfig b/arch/sh/configs/rts7751r2d_defconfig index 3701030dbb83..f1e979b1e495 100644 --- a/arch/sh/configs/rts7751r2d_defconfig +++ b/arch/sh/configs/rts7751r2d_defconfig | |||
@@ -218,7 +218,7 @@ CONFIG_SH_FPU=y | |||
218 | # CONFIG_SH_DSP is not set | 218 | # CONFIG_SH_DSP is not set |
219 | # CONFIG_SH_STORE_QUEUES is not set | 219 | # CONFIG_SH_STORE_QUEUES is not set |
220 | CONFIG_CPU_HAS_INTEVT=y | 220 | CONFIG_CPU_HAS_INTEVT=y |
221 | CONFIG_CPU_HAS_IPR_IRQ=y | 221 | CONFIG_CPU_HAS_INTC_IRQ=y |
222 | CONFIG_CPU_HAS_SR_RB=y | 222 | CONFIG_CPU_HAS_SR_RB=y |
223 | CONFIG_CPU_HAS_PTEA=y | 223 | CONFIG_CPU_HAS_PTEA=y |
224 | 224 | ||
diff --git a/arch/sh/configs/se7750_defconfig b/arch/sh/configs/se7750_defconfig index 4e6e77fa4ce7..c60b6fd4fc42 100644 --- a/arch/sh/configs/se7750_defconfig +++ b/arch/sh/configs/se7750_defconfig | |||
@@ -226,7 +226,7 @@ CONFIG_SH_FPU=y | |||
226 | # CONFIG_SH_DSP is not set | 226 | # CONFIG_SH_DSP is not set |
227 | # CONFIG_SH_STORE_QUEUES is not set | 227 | # CONFIG_SH_STORE_QUEUES is not set |
228 | CONFIG_CPU_HAS_INTEVT=y | 228 | CONFIG_CPU_HAS_INTEVT=y |
229 | CONFIG_CPU_HAS_IPR_IRQ=y | 229 | CONFIG_CPU_HAS_INTC_IRQ=y |
230 | CONFIG_CPU_HAS_SR_RB=y | 230 | CONFIG_CPU_HAS_SR_RB=y |
231 | CONFIG_CPU_HAS_PTEA=y | 231 | CONFIG_CPU_HAS_PTEA=y |
232 | 232 | ||
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c index b0cd6e0b8539..f2286de22bd5 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7750.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c | |||
@@ -82,88 +82,213 @@ static int __init sh7750_devices_setup(void) | |||
82 | } | 82 | } |
83 | __initcall(sh7750_devices_setup); | 83 | __initcall(sh7750_devices_setup); |
84 | 84 | ||
85 | static struct ipr_data ipr_irq_table[] = { | 85 | enum { |
86 | /* IRQ, IPR-idx, shift, priority */ | 86 | UNUSED = 0, |
87 | { 16, 0, 12, 2 }, /* TMU0 TUNI*/ | 87 | |
88 | { 17, 0, 12, 2 }, /* TMU1 TUNI */ | 88 | /* interrupt sources */ |
89 | { 18, 0, 4, 2 }, /* TMU2 TUNI */ | 89 | IRL0, IRL1, IRL2, IRL3, /* only IRLM mode supported */ |
90 | { 19, 0, 4, 2 }, /* TMU2 TIPCI */ | 90 | HUDI, GPIOI, |
91 | { 27, 1, 12, 2 }, /* WDT ITI */ | 91 | DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2, DMAC_DMTE3, |
92 | { 20, 0, 0, 2 }, /* RTC ATI (alarm) */ | 92 | DMAC_DMTE4, DMAC_DMTE5, DMAC_DMTE6, DMAC_DMTE7, |
93 | { 21, 0, 0, 2 }, /* RTC PRI (period) */ | 93 | DMAC_DMAE, |
94 | { 22, 0, 0, 2 }, /* RTC CUI (carry) */ | 94 | PCIC0_PCISERR, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON, |
95 | { 23, 1, 4, 3 }, /* SCI ERI */ | 95 | PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3, |
96 | { 24, 1, 4, 3 }, /* SCI RXI */ | 96 | TMU3, TMU4, TMU0, TMU1, TMU2_TUNI, TMU2_TICPI, |
97 | { 25, 1, 4, 3 }, /* SCI TXI */ | 97 | RTC_ATI, RTC_PRI, RTC_CUI, |
98 | { 40, 2, 4, 3 }, /* SCIF ERI */ | 98 | SCI1_ERI, SCI1_RXI, SCI1_TXI, SCI1_TEI, |
99 | { 41, 2, 4, 3 }, /* SCIF RXI */ | 99 | SCIF_ERI, SCIF_RXI, SCIF_BRI, SCIF_TXI, |
100 | { 42, 2, 4, 3 }, /* SCIF BRI */ | 100 | WDT, |
101 | { 43, 2, 4, 3 }, /* SCIF TXI */ | 101 | REF_RCMI, REF_ROVI, |
102 | { 34, 2, 8, 7 }, /* DMAC DMTE0 */ | 102 | |
103 | { 35, 2, 8, 7 }, /* DMAC DMTE1 */ | 103 | /* interrupt groups */ |
104 | { 36, 2, 8, 7 }, /* DMAC DMTE2 */ | 104 | DMAC, PCIC1, TMU2, RTC, SCI1, SCIF, REF, |
105 | { 37, 2, 8, 7 }, /* DMAC DMTE3 */ | ||
106 | { 38, 2, 8, 7 }, /* DMAC DMAE */ | ||
107 | }; | ||
108 | |||
109 | static unsigned long ipr_offsets[] = { | ||
110 | 0xffd00004UL, /* 0: IPRA */ | ||
111 | 0xffd00008UL, /* 1: IPRB */ | ||
112 | 0xffd0000cUL, /* 2: IPRC */ | ||
113 | 0xffd00010UL, /* 3: IPRD */ | ||
114 | }; | ||
115 | |||
116 | static struct ipr_desc ipr_irq_desc = { | ||
117 | .ipr_offsets = ipr_offsets, | ||
118 | .nr_offsets = ARRAY_SIZE(ipr_offsets), | ||
119 | |||
120 | .ipr_data = ipr_irq_table, | ||
121 | .nr_irqs = ARRAY_SIZE(ipr_irq_table), | ||
122 | |||
123 | .chip = { | ||
124 | .name = "IPR-sh7750", | ||
125 | }, | ||
126 | }; | 105 | }; |
127 | 106 | ||
128 | #ifdef CONFIG_CPU_SUBTYPE_SH7751 | 107 | static struct intc_vect vectors[] = { |
129 | static struct ipr_data ipr_irq_table_sh7751[] = { | 108 | INTC_VECT(HUDI, 0x600), INTC_VECT(GPIOI, 0x620), |
130 | { 44, 2, 8, 7 }, /* DMAC DMTE4 */ | 109 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), |
131 | { 45, 2, 8, 7 }, /* DMAC DMTE5 */ | 110 | INTC_VECT(TMU2_TUNI, 0x440), INTC_VECT(TMU2_TICPI, 0x460), |
132 | { 46, 2, 8, 7 }, /* DMAC DMTE6 */ | 111 | INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), |
133 | { 47, 2, 8, 7 }, /* DMAC DMTE7 */ | 112 | INTC_VECT(RTC_CUI, 0x4c0), |
134 | /* The following use INTC_INPRI00 for masking, which is a 32-bit | 113 | INTC_VECT(SCI1_ERI, 0x4e0), INTC_VECT(SCI1_RXI, 0x500), |
135 | register, not a 16-bit register like the IPRx registers, so it | 114 | INTC_VECT(SCI1_TXI, 0x520), INTC_VECT(SCI1_TEI, 0x540), |
136 | would need special support */ | 115 | INTC_VECT(SCIF_ERI, 0x700), INTC_VECT(SCIF_RXI, 0x720), |
137 | /*{ 72, INTPRI00, 8, ? },*/ /* TMU3 TUNI */ | 116 | INTC_VECT(SCIF_BRI, 0x740), INTC_VECT(SCIF_TXI, 0x760), |
138 | /*{ 76, INTPRI00, 12, ? },*/ /* TMU4 TUNI */ | 117 | INTC_VECT(WDT, 0x560), |
118 | INTC_VECT(REF_RCMI, 0x580), INTC_VECT(REF_ROVI, 0x5a0), | ||
139 | }; | 119 | }; |
140 | 120 | ||
141 | static struct ipr_desc ipr_irq_desc_sh7751 = { | 121 | static struct intc_group groups[] = { |
142 | .ipr_offsets = ipr_offsets, | 122 | INTC_GROUP(TMU2, TMU2_TUNI, TMU2_TICPI), |
143 | .nr_offsets = ARRAY_SIZE(ipr_offsets), | 123 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), |
124 | INTC_GROUP(SCI1, SCI1_ERI, SCI1_RXI, SCI1_TXI, SCI1_TEI), | ||
125 | INTC_GROUP(SCIF, SCIF_ERI, SCIF_RXI, SCIF_BRI, SCIF_TXI), | ||
126 | INTC_GROUP(REF, REF_RCMI, REF_ROVI), | ||
127 | }; | ||
144 | 128 | ||
145 | .ipr_data = ipr_irq_table_sh7751, | 129 | static struct intc_prio priorities[] = { |
146 | .nr_irqs = ARRAY_SIZE(ipr_irq_table_sh7751), | 130 | INTC_PRIO(SCIF, 3), |
131 | INTC_PRIO(SCI1, 3), | ||
132 | INTC_PRIO(DMAC, 7), | ||
133 | }; | ||
147 | 134 | ||
148 | .chip = { | 135 | static struct intc_prio_reg prio_registers[] = { |
149 | .name = "IPR-sh7751", | 136 | { 0xffd00004, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, |
150 | }, | 137 | { 0xffd00008, 16, 4, /* IPRB */ { WDT, REF, SCI1, 0 } }, |
138 | { 0xffd0000c, 16, 4, /* IPRC */ { GPIOI, DMAC, SCIF, HUDI } }, | ||
139 | { 0xffd00010, 16, 4, /* IPRD */ { IRL0, IRL1, IRL2, IRL3 } }, | ||
140 | { 0xfe080000, 32, 4, /* INTPRI00 */ { 0, 0, 0, 0, | ||
141 | TMU4, TMU3, | ||
142 | PCIC1, PCIC0_PCISERR } }, | ||
143 | }; | ||
144 | |||
145 | static DECLARE_INTC_DESC(intc_desc, "sh7750", vectors, groups, | ||
146 | priorities, NULL, prio_registers, NULL); | ||
147 | |||
148 | /* SH7750, SH7750S, SH7751 and SH7091 all have 4-channel DMA controllers */ | ||
149 | #if defined(CONFIG_CPU_SUBTYPE_SH7750) || \ | ||
150 | defined(CONFIG_CPU_SUBTYPE_SH7750S) || \ | ||
151 | defined(CONFIG_CPU_SUBTYPE_SH7751) || \ | ||
152 | defined(CONFIG_CPU_SUBTYPE_SH7091) | ||
153 | static struct intc_vect vectors_dma4[] = { | ||
154 | INTC_VECT(DMAC_DMTE0, 0x640), INTC_VECT(DMAC_DMTE1, 0x660), | ||
155 | INTC_VECT(DMAC_DMTE2, 0x680), INTC_VECT(DMAC_DMTE3, 0x6a0), | ||
156 | INTC_VECT(DMAC_DMAE, 0x6c0), | ||
157 | }; | ||
158 | |||
159 | static struct intc_group groups_dma4[] = { | ||
160 | INTC_GROUP(DMAC, DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2, | ||
161 | DMAC_DMTE3, DMAC_DMAE), | ||
162 | }; | ||
163 | |||
164 | static DECLARE_INTC_DESC(intc_desc_dma4, "sh7750_dma4", | ||
165 | vectors_dma4, groups_dma4, | ||
166 | priorities, NULL, prio_registers, NULL); | ||
167 | #endif | ||
168 | |||
169 | /* SH7750R and SH7751R both have 8-channel DMA controllers */ | ||
170 | #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || defined(CONFIG_CPU_SUBTYPE_SH7751R) | ||
171 | static struct intc_vect vectors_dma8[] = { | ||
172 | INTC_VECT(DMAC_DMTE0, 0x640), INTC_VECT(DMAC_DMTE1, 0x660), | ||
173 | INTC_VECT(DMAC_DMTE2, 0x680), INTC_VECT(DMAC_DMTE3, 0x6a0), | ||
174 | INTC_VECT(DMAC_DMTE4, 0x780), INTC_VECT(DMAC_DMTE5, 0x7a0), | ||
175 | INTC_VECT(DMAC_DMTE6, 0x7c0), INTC_VECT(DMAC_DMTE7, 0x7e0), | ||
176 | INTC_VECT(DMAC_DMAE, 0x6c0), | ||
177 | }; | ||
178 | |||
179 | static struct intc_group groups_dma8[] = { | ||
180 | INTC_GROUP(DMAC, DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2, | ||
181 | DMAC_DMTE3, DMAC_DMTE4, DMAC_DMTE5, | ||
182 | DMAC_DMTE6, DMAC_DMTE7, DMAC_DMAE), | ||
183 | }; | ||
184 | |||
185 | static DECLARE_INTC_DESC(intc_desc_dma8, "sh7750_dma8", | ||
186 | vectors_dma8, groups_dma8, | ||
187 | priorities, NULL, prio_registers, NULL); | ||
188 | #endif | ||
189 | |||
190 | /* SH7750R, SH7751 and SH7751R all have two extra timer channels */ | ||
191 | #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \ | ||
192 | defined(CONFIG_CPU_SUBTYPE_SH7751) || \ | ||
193 | defined(CONFIG_CPU_SUBTYPE_SH7751R) | ||
194 | static struct intc_vect vectors_tmu34[] = { | ||
195 | INTC_VECT(TMU3, 0xb00), INTC_VECT(TMU4, 0xb80), | ||
196 | }; | ||
197 | |||
198 | static struct intc_mask_reg mask_registers[] = { | ||
199 | { 0xfe080040, 0xfe080060, 32, /* INTMSK00 / INTMSKCLR00 */ | ||
200 | { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
201 | 0, 0, 0, 0, 0, 0, TMU4, TMU3, | ||
202 | PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON, | ||
203 | PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, | ||
204 | PCIC1_PCIDMA3, PCIC0_PCISERR } }, | ||
205 | }; | ||
206 | |||
207 | static DECLARE_INTC_DESC(intc_desc_tmu34, "sh7750_tmu34", | ||
208 | vectors_tmu34, NULL, priorities, | ||
209 | mask_registers, prio_registers, NULL); | ||
210 | #endif | ||
211 | |||
212 | /* SH7750S, SH7750R, SH7751 and SH7751R all have IRLM priority registers */ | ||
213 | static struct intc_vect vectors_irlm[] = { | ||
214 | INTC_VECT(IRL0, 0x240), INTC_VECT(IRL1, 0x2a0), | ||
215 | INTC_VECT(IRL2, 0x300), INTC_VECT(IRL3, 0x360), | ||
216 | }; | ||
217 | |||
218 | static DECLARE_INTC_DESC(intc_desc_irlm, "sh7750_irlm", vectors_irlm, NULL, | ||
219 | priorities, NULL, prio_registers, NULL); | ||
220 | |||
221 | /* SH7751 and SH7751R both have PCI */ | ||
222 | #if defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH7751R) | ||
223 | static struct intc_vect vectors_pci[] = { | ||
224 | INTC_VECT(PCIC0_PCISERR, 0xa00), INTC_VECT(PCIC1_PCIERR, 0xae0), | ||
225 | INTC_VECT(PCIC1_PCIPWDWN, 0xac0), INTC_VECT(PCIC1_PCIPWON, 0xaa0), | ||
226 | INTC_VECT(PCIC1_PCIDMA0, 0xa80), INTC_VECT(PCIC1_PCIDMA1, 0xa60), | ||
227 | INTC_VECT(PCIC1_PCIDMA2, 0xa40), INTC_VECT(PCIC1_PCIDMA3, 0xa20), | ||
228 | }; | ||
229 | |||
230 | static struct intc_group groups_pci[] = { | ||
231 | INTC_GROUP(PCIC1, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON, | ||
232 | PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3), | ||
151 | }; | 233 | }; |
234 | |||
235 | static DECLARE_INTC_DESC(intc_desc_pci, "sh7750_pci", vectors_pci, groups_pci, | ||
236 | priorities, mask_registers, prio_registers, NULL); | ||
152 | #endif | 237 | #endif |
153 | 238 | ||
239 | #if defined(CONFIG_CPU_SUBTYPE_SH7750) || \ | ||
240 | defined(CONFIG_CPU_SUBTYPE_SH7750S) || \ | ||
241 | defined(CONFIG_CPU_SUBTYPE_SH7091) | ||
154 | void __init plat_irq_setup(void) | 242 | void __init plat_irq_setup(void) |
155 | { | 243 | { |
156 | register_ipr_controller(&ipr_irq_desc); | 244 | /* |
157 | #ifdef CONFIG_CPU_SUBTYPE_SH7751 | 245 | * same vectors for SH7750, SH7750S and SH7091 except for IRLM, |
158 | register_ipr_controller(&ipr_irq_desc_sh7751); | 246 | * see below.. |
247 | */ | ||
248 | register_intc_controller(&intc_desc); | ||
249 | register_intc_controller(&intc_desc_dma4); | ||
250 | } | ||
159 | #endif | 251 | #endif |
252 | |||
253 | #if defined(CONFIG_CPU_SUBTYPE_SH7750R) | ||
254 | void __init plat_irq_setup(void) | ||
255 | { | ||
256 | register_intc_controller(&intc_desc); | ||
257 | register_intc_controller(&intc_desc_dma8); | ||
258 | register_intc_controller(&intc_desc_tmu34); | ||
160 | } | 259 | } |
260 | #endif | ||
261 | |||
262 | #if defined(CONFIG_CPU_SUBTYPE_SH7751) | ||
263 | void __init plat_irq_setup(void) | ||
264 | { | ||
265 | register_intc_controller(&intc_desc); | ||
266 | register_intc_controller(&intc_desc_dma4); | ||
267 | register_intc_controller(&intc_desc_tmu34); | ||
268 | register_intc_controller(&intc_desc_pci); | ||
269 | } | ||
270 | #endif | ||
271 | |||
272 | #if defined(CONFIG_CPU_SUBTYPE_SH7751R) | ||
273 | void __init plat_irq_setup(void) | ||
274 | { | ||
275 | register_intc_controller(&intc_desc); | ||
276 | register_intc_controller(&intc_desc_dma8); | ||
277 | register_intc_controller(&intc_desc_tmu34); | ||
278 | register_intc_controller(&intc_desc_pci); | ||
279 | } | ||
280 | #endif | ||
161 | 281 | ||
162 | #define INTC_ICR 0xffd00000UL | 282 | #define INTC_ICR 0xffd00000UL |
163 | #define INTC_ICR_IRLM (1<<7) | 283 | #define INTC_ICR_IRLM (1<<7) |
164 | 284 | ||
165 | /* enable individual interrupt mode for external interupts */ | 285 | /* enable individual interrupt mode for external interupts */ |
166 | void ipr_irq_enable_irlm(void) | 286 | void __init ipr_irq_enable_irlm(void) |
167 | { | 287 | { |
288 | #if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7091) | ||
289 | BUG(); /* impossible to mask interrupts on SH7750 and SH7091 */ | ||
290 | #endif | ||
291 | register_intc_controller(&intc_desc_irlm); | ||
292 | |||
168 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); | 293 | ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); |
169 | } | 294 | } |
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 697277aea23b..70da1c8d407e 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -120,14 +120,14 @@ config CPU_SUBTYPE_SH7712 | |||
120 | config CPU_SUBTYPE_SH7750 | 120 | config CPU_SUBTYPE_SH7750 |
121 | bool "Support SH7750 processor" | 121 | bool "Support SH7750 processor" |
122 | select CPU_SH4 | 122 | select CPU_SH4 |
123 | select CPU_HAS_IPR_IRQ | 123 | select CPU_HAS_INTC_IRQ |
124 | help | 124 | help |
125 | Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU. | 125 | Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU. |
126 | 126 | ||
127 | config CPU_SUBTYPE_SH7091 | 127 | config CPU_SUBTYPE_SH7091 |
128 | bool "Support SH7091 processor" | 128 | bool "Support SH7091 processor" |
129 | select CPU_SH4 | 129 | select CPU_SH4 |
130 | select CPU_HAS_IPR_IRQ | 130 | select CPU_HAS_INTC_IRQ |
131 | help | 131 | help |
132 | Select SH7091 if you have an SH-4 based Sega device (such as | 132 | Select SH7091 if you have an SH-4 based Sega device (such as |
133 | the Dreamcast, Naomi, and Naomi 2). | 133 | the Dreamcast, Naomi, and Naomi 2). |
@@ -135,17 +135,17 @@ config CPU_SUBTYPE_SH7091 | |||
135 | config CPU_SUBTYPE_SH7750R | 135 | config CPU_SUBTYPE_SH7750R |
136 | bool "Support SH7750R processor" | 136 | bool "Support SH7750R processor" |
137 | select CPU_SH4 | 137 | select CPU_SH4 |
138 | select CPU_HAS_IPR_IRQ | 138 | select CPU_HAS_INTC_IRQ |
139 | 139 | ||
140 | config CPU_SUBTYPE_SH7750S | 140 | config CPU_SUBTYPE_SH7750S |
141 | bool "Support SH7750S processor" | 141 | bool "Support SH7750S processor" |
142 | select CPU_SH4 | 142 | select CPU_SH4 |
143 | select CPU_HAS_IPR_IRQ | 143 | select CPU_HAS_INTC_IRQ |
144 | 144 | ||
145 | config CPU_SUBTYPE_SH7751 | 145 | config CPU_SUBTYPE_SH7751 |
146 | bool "Support SH7751 processor" | 146 | bool "Support SH7751 processor" |
147 | select CPU_SH4 | 147 | select CPU_SH4 |
148 | select CPU_HAS_IPR_IRQ | 148 | select CPU_HAS_INTC_IRQ |
149 | help | 149 | help |
150 | Select SH7751 if you have a 166 Mhz SH-4 HD6417751 CPU, | 150 | Select SH7751 if you have a 166 Mhz SH-4 HD6417751 CPU, |
151 | or if you have a HD6417751R CPU. | 151 | or if you have a HD6417751R CPU. |
@@ -153,7 +153,7 @@ config CPU_SUBTYPE_SH7751 | |||
153 | config CPU_SUBTYPE_SH7751R | 153 | config CPU_SUBTYPE_SH7751R |
154 | bool "Support SH7751R processor" | 154 | bool "Support SH7751R processor" |
155 | select CPU_SH4 | 155 | select CPU_SH4 |
156 | select CPU_HAS_IPR_IRQ | 156 | select CPU_HAS_INTC_IRQ |
157 | 157 | ||
158 | config CPU_SUBTYPE_SH7760 | 158 | config CPU_SUBTYPE_SH7760 |
159 | bool "Support SH7760 processor" | 159 | bool "Support SH7760 processor" |
diff --git a/include/asm-sh/hw_irq.h b/include/asm-sh/hw_irq.h index 8c5e11b3ae30..20d42959f52a 100644 --- a/include/asm-sh/hw_irq.h +++ b/include/asm-sh/hw_irq.h | |||
@@ -44,7 +44,7 @@ void register_ipr_controller(struct ipr_desc *); | |||
44 | /* | 44 | /* |
45 | * Enable individual interrupt mode for external IPR IRQs. | 45 | * Enable individual interrupt mode for external IPR IRQs. |
46 | */ | 46 | */ |
47 | void ipr_irq_enable_irlm(void); | 47 | void __init ipr_irq_enable_irlm(void); |
48 | 48 | ||
49 | typedef unsigned char intc_enum; | 49 | typedef unsigned char intc_enum; |
50 | 50 | ||