Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Magnus Damm and committed by
Paul Mundt
56386f64 339547bf

+205 -74
+6
arch/sh/Kconfig
··· 212 212 config SH_SOLUTION_ENGINE 213 213 bool "SolutionEngine" 214 214 select SOLUTION_ENGINE 215 + select CPU_HAS_IPR_IRQ 215 216 depends on CPU_SUBTYPE_SH7709 || CPU_SUBTYPE_SH7750 216 217 help 217 218 Select SolutionEngine if configuring for a Hitachi SH7709 ··· 245 244 config SH_7751_SOLUTION_ENGINE 246 245 bool "SolutionEngine7751" 247 246 select SOLUTION_ENGINE 247 + select CPU_HAS_IPR_IRQ 248 248 depends on CPU_SUBTYPE_SH7751 249 249 help 250 250 Select 7751 SolutionEngine if configuring for a Hitachi SH7751 ··· 323 321 config SH_SH03 324 322 bool "Interface CTP/PCI-SH03" 325 323 depends on CPU_SUBTYPE_SH7751 && BROKEN 324 + select CPU_HAS_IPR_IRQ 326 325 select SYS_SUPPORTS_PCI 327 326 help 328 327 CTP/PCI-SH03 is a CPU module computer that is produced ··· 333 330 config SH_SECUREEDGE5410 334 331 bool "SecureEdge5410" 335 332 depends on CPU_SUBTYPE_SH7751R 333 + select CPU_HAS_IPR_IRQ 336 334 select SYS_SUPPORTS_PCI 337 335 help 338 336 Select SecureEdge5410 if configuring for a SnapGear SH board. ··· 388 384 config SH_TITAN 389 385 bool "TITAN" 390 386 depends on CPU_SUBTYPE_SH7751R 387 + select CPU_HAS_IPR_IRQ 391 388 select SYS_SUPPORTS_PCI 392 389 help 393 390 Select Titan if you are configuring for a Nimble Microsystems ··· 397 392 config SH_SHMIN 398 393 bool "SHMIN" 399 394 depends on CPU_SUBTYPE_SH7706 395 + select CPU_HAS_IPR_IRQ 400 396 help 401 397 Select SHMIN if configuring for the SHMIN board. 402 398
+1 -1
arch/sh/configs/landisk_defconfig
··· 217 217 # CONFIG_SH_DSP is not set 218 218 # CONFIG_SH_STORE_QUEUES is not set 219 219 CONFIG_CPU_HAS_INTEVT=y 220 - CONFIG_CPU_HAS_IPR_IRQ=y 220 + CONFIG_CPU_HAS_INTC_IRQ=y 221 221 CONFIG_CPU_HAS_SR_RB=y 222 222 CONFIG_CPU_HAS_PTEA=y 223 223
+1 -1
arch/sh/configs/lboxre2_defconfig
··· 222 222 # CONFIG_SH_DSP is not set 223 223 # CONFIG_SH_STORE_QUEUES is not set 224 224 CONFIG_CPU_HAS_INTEVT=y 225 - CONFIG_CPU_HAS_IPR_IRQ=y 225 + CONFIG_CPU_HAS_INTC_IRQ=y 226 226 CONFIG_CPU_HAS_SR_RB=y 227 227 CONFIG_CPU_HAS_PTEA=y 228 228
+1 -1
arch/sh/configs/rts7751r2d_defconfig
··· 218 218 # CONFIG_SH_DSP is not set 219 219 # CONFIG_SH_STORE_QUEUES is not set 220 220 CONFIG_CPU_HAS_INTEVT=y 221 - CONFIG_CPU_HAS_IPR_IRQ=y 221 + CONFIG_CPU_HAS_INTC_IRQ=y 222 222 CONFIG_CPU_HAS_SR_RB=y 223 223 CONFIG_CPU_HAS_PTEA=y 224 224
+1 -1
arch/sh/configs/se7750_defconfig
··· 226 226 # CONFIG_SH_DSP is not set 227 227 # CONFIG_SH_STORE_QUEUES is not set 228 228 CONFIG_CPU_HAS_INTEVT=y 229 - CONFIG_CPU_HAS_IPR_IRQ=y 229 + CONFIG_CPU_HAS_INTC_IRQ=y 230 230 CONFIG_CPU_HAS_SR_RB=y 231 231 CONFIG_CPU_HAS_PTEA=y 232 232
+188 -63
arch/sh/kernel/cpu/sh4/setup-sh7750.c
··· 82 82 } 83 83 __initcall(sh7750_devices_setup); 84 84 85 - static struct ipr_data ipr_irq_table[] = { 86 - /* IRQ, IPR-idx, shift, priority */ 87 - { 16, 0, 12, 2 }, /* TMU0 TUNI*/ 88 - { 17, 0, 12, 2 }, /* TMU1 TUNI */ 89 - { 18, 0, 4, 2 }, /* TMU2 TUNI */ 90 - { 19, 0, 4, 2 }, /* TMU2 TIPCI */ 91 - { 27, 1, 12, 2 }, /* WDT ITI */ 92 - { 20, 0, 0, 2 }, /* RTC ATI (alarm) */ 93 - { 21, 0, 0, 2 }, /* RTC PRI (period) */ 94 - { 22, 0, 0, 2 }, /* RTC CUI (carry) */ 95 - { 23, 1, 4, 3 }, /* SCI ERI */ 96 - { 24, 1, 4, 3 }, /* SCI RXI */ 97 - { 25, 1, 4, 3 }, /* SCI TXI */ 98 - { 40, 2, 4, 3 }, /* SCIF ERI */ 99 - { 41, 2, 4, 3 }, /* SCIF RXI */ 100 - { 42, 2, 4, 3 }, /* SCIF BRI */ 101 - { 43, 2, 4, 3 }, /* SCIF TXI */ 102 - { 34, 2, 8, 7 }, /* DMAC DMTE0 */ 103 - { 35, 2, 8, 7 }, /* DMAC DMTE1 */ 104 - { 36, 2, 8, 7 }, /* DMAC DMTE2 */ 105 - { 37, 2, 8, 7 }, /* DMAC DMTE3 */ 106 - { 38, 2, 8, 7 }, /* DMAC DMAE */ 85 + enum { 86 + UNUSED = 0, 87 + 88 + /* interrupt sources */ 89 + IRL0, IRL1, IRL2, IRL3, /* only IRLM mode supported */ 90 + HUDI, GPIOI, 91 + DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2, DMAC_DMTE3, 92 + DMAC_DMTE4, DMAC_DMTE5, DMAC_DMTE6, DMAC_DMTE7, 93 + DMAC_DMAE, 94 + PCIC0_PCISERR, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON, 95 + PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3, 96 + TMU3, TMU4, TMU0, TMU1, TMU2_TUNI, TMU2_TICPI, 97 + RTC_ATI, RTC_PRI, RTC_CUI, 98 + SCI1_ERI, SCI1_RXI, SCI1_TXI, SCI1_TEI, 99 + SCIF_ERI, SCIF_RXI, SCIF_BRI, SCIF_TXI, 100 + WDT, 101 + REF_RCMI, REF_ROVI, 102 + 103 + /* interrupt groups */ 104 + DMAC, PCIC1, TMU2, RTC, SCI1, SCIF, REF, 107 105 }; 108 106 109 - static unsigned long ipr_offsets[] = { 110 - 0xffd00004UL, /* 0: IPRA */ 111 - 0xffd00008UL, /* 1: IPRB */ 112 - 0xffd0000cUL, /* 2: IPRC */ 113 - 0xffd00010UL, /* 3: IPRD */ 107 + static struct intc_vect vectors[] = { 108 + INTC_VECT(HUDI, 0x600), INTC_VECT(GPIOI, 0x620), 109 + INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), 110 + INTC_VECT(TMU2_TUNI, 0x440), INTC_VECT(TMU2_TICPI, 0x460), 111 + INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), 112 + INTC_VECT(RTC_CUI, 0x4c0), 113 + INTC_VECT(SCI1_ERI, 0x4e0), INTC_VECT(SCI1_RXI, 0x500), 114 + INTC_VECT(SCI1_TXI, 0x520), INTC_VECT(SCI1_TEI, 0x540), 115 + INTC_VECT(SCIF_ERI, 0x700), INTC_VECT(SCIF_RXI, 0x720), 116 + INTC_VECT(SCIF_BRI, 0x740), INTC_VECT(SCIF_TXI, 0x760), 117 + INTC_VECT(WDT, 0x560), 118 + INTC_VECT(REF_RCMI, 0x580), INTC_VECT(REF_ROVI, 0x5a0), 114 119 }; 115 120 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 - }, 121 + static struct intc_group groups[] = { 122 + INTC_GROUP(TMU2, TMU2_TUNI, TMU2_TICPI), 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), 126 127 }; 127 128 128 - #ifdef CONFIG_CPU_SUBTYPE_SH7751 129 - static struct ipr_data ipr_irq_table_sh7751[] = { 130 - { 44, 2, 8, 7 }, /* DMAC DMTE4 */ 131 - { 45, 2, 8, 7 }, /* DMAC DMTE5 */ 132 - { 46, 2, 8, 7 }, /* DMAC DMTE6 */ 133 - { 47, 2, 8, 7 }, /* DMAC DMTE7 */ 134 - /* The following use INTC_INPRI00 for masking, which is a 32-bit 135 - register, not a 16-bit register like the IPRx registers, so it 136 - would need special support */ 137 - /*{ 72, INTPRI00, 8, ? },*/ /* TMU3 TUNI */ 138 - /*{ 76, INTPRI00, 12, ? },*/ /* TMU4 TUNI */ 129 + static struct intc_prio priorities[] = { 130 + INTC_PRIO(SCIF, 3), 131 + INTC_PRIO(SCI1, 3), 132 + INTC_PRIO(DMAC, 7), 139 133 }; 140 134 141 - static struct ipr_desc ipr_irq_desc_sh7751 = { 142 - .ipr_offsets = ipr_offsets, 143 - .nr_offsets = ARRAY_SIZE(ipr_offsets), 144 - 145 - .ipr_data = ipr_irq_table_sh7751, 146 - .nr_irqs = ARRAY_SIZE(ipr_irq_table_sh7751), 147 - 148 - .chip = { 149 - .name = "IPR-sh7751", 150 - }, 135 + static struct intc_prio_reg prio_registers[] = { 136 + { 0xffd00004, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, 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 } }, 151 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); 152 167 #endif 153 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), 233 + }; 234 + 235 + static DECLARE_INTC_DESC(intc_desc_pci, "sh7750_pci", vectors_pci, groups_pci, 236 + priorities, mask_registers, prio_registers, NULL); 237 + #endif 238 + 239 + #if defined(CONFIG_CPU_SUBTYPE_SH7750) || \ 240 + defined(CONFIG_CPU_SUBTYPE_SH7750S) || \ 241 + defined(CONFIG_CPU_SUBTYPE_SH7091) 154 242 void __init plat_irq_setup(void) 155 243 { 156 - register_ipr_controller(&ipr_irq_desc); 157 - #ifdef CONFIG_CPU_SUBTYPE_SH7751 158 - register_ipr_controller(&ipr_irq_desc_sh7751); 159 - #endif 244 + /* 245 + * same vectors for SH7750, SH7750S and SH7091 except for IRLM, 246 + * see below.. 247 + */ 248 + register_intc_controller(&intc_desc); 249 + register_intc_controller(&intc_desc_dma4); 160 250 } 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); 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 282 #define INTC_ICR 0xffd00000UL 163 283 #define INTC_ICR_IRLM (1<<7) 164 284 165 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 293 ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); 169 294 }
+6 -6
arch/sh/mm/Kconfig
··· 120 120 config CPU_SUBTYPE_SH7750 121 121 bool "Support SH7750 processor" 122 122 select CPU_SH4 123 - select CPU_HAS_IPR_IRQ 123 + select CPU_HAS_INTC_IRQ 124 124 help 125 125 Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU. 126 126 127 127 config CPU_SUBTYPE_SH7091 128 128 bool "Support SH7091 processor" 129 129 select CPU_SH4 130 - select CPU_HAS_IPR_IRQ 130 + select CPU_HAS_INTC_IRQ 131 131 help 132 132 Select SH7091 if you have an SH-4 based Sega device (such as 133 133 the Dreamcast, Naomi, and Naomi 2). ··· 135 135 config CPU_SUBTYPE_SH7750R 136 136 bool "Support SH7750R processor" 137 137 select CPU_SH4 138 - select CPU_HAS_IPR_IRQ 138 + select CPU_HAS_INTC_IRQ 139 139 140 140 config CPU_SUBTYPE_SH7750S 141 141 bool "Support SH7750S processor" 142 142 select CPU_SH4 143 - select CPU_HAS_IPR_IRQ 143 + select CPU_HAS_INTC_IRQ 144 144 145 145 config CPU_SUBTYPE_SH7751 146 146 bool "Support SH7751 processor" 147 147 select CPU_SH4 148 - select CPU_HAS_IPR_IRQ 148 + select CPU_HAS_INTC_IRQ 149 149 help 150 150 Select SH7751 if you have a 166 Mhz SH-4 HD6417751 CPU, 151 151 or if you have a HD6417751R CPU. ··· 153 153 config CPU_SUBTYPE_SH7751R 154 154 bool "Support SH7751R processor" 155 155 select CPU_SH4 156 - select CPU_HAS_IPR_IRQ 156 + select CPU_HAS_INTC_IRQ 157 157 158 158 config CPU_SUBTYPE_SH7760 159 159 bool "Support SH7760 processor"
+1 -1
include/asm-sh/hw_irq.h
··· 44 44 /* 45 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 49 typedef unsigned char intc_enum; 50 50