1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * arch/sh/kernel/cpu/sh4a/setup-sh7734.c 4 * 5 * SH7734 Setup 6 * 7 * Copyright (C) 2011,2012 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com> 8 * Copyright (C) 2011,2012 Renesas Solutions Corp. 9 */ 10 11 #include <linux/platform_device.h> 12 #include <linux/init.h> 13 #include <linux/serial.h> 14 #include <linux/mm.h> 15 #include <linux/dma-mapping.h> 16 #include <linux/serial_sci.h> 17 #include <linux/sh_timer.h> 18 #include <linux/io.h> 19 #include <asm/clock.h> 20 #include <asm/irq.h> 21 #include <asm/platform_early.h> 22 #include <cpu/sh7734.h> 23 24 /* SCIF */ 25 static struct plat_sci_port scif0_platform_data = { 26 .scscr = SCSCR_REIE, 27 .type = PORT_SCIF, 28 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE, 29 }; 30 31 static struct resource scif0_resources[] = { 32 DEFINE_RES_MEM(0xffe40000, 0x100), 33 DEFINE_RES_IRQ(evt2irq(0x8c0)), 34 }; 35 36 static struct platform_device scif0_device = { 37 .name = "sh-sci", 38 .id = 0, 39 .resource = scif0_resources, 40 .num_resources = ARRAY_SIZE(scif0_resources), 41 .dev = { 42 .platform_data = &scif0_platform_data, 43 }, 44 }; 45 46 static struct plat_sci_port scif1_platform_data = { 47 .scscr = SCSCR_REIE, 48 .type = PORT_SCIF, 49 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE, 50 }; 51 52 static struct resource scif1_resources[] = { 53 DEFINE_RES_MEM(0xffe41000, 0x100), 54 DEFINE_RES_IRQ(evt2irq(0x8e0)), 55 }; 56 57 static struct platform_device scif1_device = { 58 .name = "sh-sci", 59 .id = 1, 60 .resource = scif1_resources, 61 .num_resources = ARRAY_SIZE(scif1_resources), 62 .dev = { 63 .platform_data = &scif1_platform_data, 64 }, 65 }; 66 67 static struct plat_sci_port scif2_platform_data = { 68 .scscr = SCSCR_REIE, 69 .type = PORT_SCIF, 70 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE, 71 }; 72 73 static struct resource scif2_resources[] = { 74 DEFINE_RES_MEM(0xffe42000, 0x100), 75 DEFINE_RES_IRQ(evt2irq(0x900)), 76 }; 77 78 static struct platform_device scif2_device = { 79 .name = "sh-sci", 80 .id = 2, 81 .resource = scif2_resources, 82 .num_resources = ARRAY_SIZE(scif2_resources), 83 .dev = { 84 .platform_data = &scif2_platform_data, 85 }, 86 }; 87 88 static struct plat_sci_port scif3_platform_data = { 89 .scscr = SCSCR_REIE | SCSCR_TOIE, 90 .type = PORT_SCIF, 91 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE, 92 }; 93 94 static struct resource scif3_resources[] = { 95 DEFINE_RES_MEM(0xffe43000, 0x100), 96 DEFINE_RES_IRQ(evt2irq(0x920)), 97 }; 98 99 static struct platform_device scif3_device = { 100 .name = "sh-sci", 101 .id = 3, 102 .resource = scif3_resources, 103 .num_resources = ARRAY_SIZE(scif3_resources), 104 .dev = { 105 .platform_data = &scif3_platform_data, 106 }, 107 }; 108 109 static struct plat_sci_port scif4_platform_data = { 110 .scscr = SCSCR_REIE, 111 .type = PORT_SCIF, 112 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE, 113 }; 114 115 static struct resource scif4_resources[] = { 116 DEFINE_RES_MEM(0xffe44000, 0x100), 117 DEFINE_RES_IRQ(evt2irq(0x940)), 118 }; 119 120 static struct platform_device scif4_device = { 121 .name = "sh-sci", 122 .id = 4, 123 .resource = scif4_resources, 124 .num_resources = ARRAY_SIZE(scif4_resources), 125 .dev = { 126 .platform_data = &scif4_platform_data, 127 }, 128 }; 129 130 static struct plat_sci_port scif5_platform_data = { 131 .scscr = SCSCR_REIE, 132 .type = PORT_SCIF, 133 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE, 134 }; 135 136 static struct resource scif5_resources[] = { 137 DEFINE_RES_MEM(0xffe43000, 0x100), 138 DEFINE_RES_IRQ(evt2irq(0x960)), 139 }; 140 141 static struct platform_device scif5_device = { 142 .name = "sh-sci", 143 .id = 5, 144 .resource = scif5_resources, 145 .num_resources = ARRAY_SIZE(scif5_resources), 146 .dev = { 147 .platform_data = &scif5_platform_data, 148 }, 149 }; 150 151 /* RTC */ 152 static struct resource rtc_resources[] = { 153 [0] = { 154 .name = "rtc", 155 .start = 0xFFFC5000, 156 .end = 0xFFFC5000 + 0x26 - 1, 157 .flags = IORESOURCE_IO, 158 }, 159 [1] = { 160 .start = evt2irq(0xC00), 161 .flags = IORESOURCE_IRQ, 162 }, 163 }; 164 165 static struct platform_device rtc_device = { 166 .name = "sh-rtc", 167 .id = -1, 168 .num_resources = ARRAY_SIZE(rtc_resources), 169 .resource = rtc_resources, 170 }; 171 172 /* I2C 0 */ 173 static struct resource i2c0_resources[] = { 174 [0] = { 175 .name = "IIC0", 176 .start = 0xFFC70000, 177 .end = 0xFFC7000A - 1, 178 .flags = IORESOURCE_MEM, 179 }, 180 [1] = { 181 .start = evt2irq(0x860), 182 .flags = IORESOURCE_IRQ, 183 }, 184 }; 185 186 static struct platform_device i2c0_device = { 187 .name = "i2c-sh7734", 188 .id = 0, 189 .num_resources = ARRAY_SIZE(i2c0_resources), 190 .resource = i2c0_resources, 191 }; 192 193 /* TMU */ 194 static struct sh_timer_config tmu0_platform_data = { 195 .channels_mask = 7, 196 }; 197 198 static struct resource tmu0_resources[] = { 199 DEFINE_RES_MEM(0xffd80000, 0x30), 200 DEFINE_RES_IRQ(evt2irq(0x400)), 201 DEFINE_RES_IRQ(evt2irq(0x420)), 202 DEFINE_RES_IRQ(evt2irq(0x440)), 203 }; 204 205 static struct platform_device tmu0_device = { 206 .name = "sh-tmu", 207 .id = 0, 208 .dev = { 209 .platform_data = &tmu0_platform_data, 210 }, 211 .resource = tmu0_resources, 212 .num_resources = ARRAY_SIZE(tmu0_resources), 213 }; 214 215 static struct sh_timer_config tmu1_platform_data = { 216 .channels_mask = 7, 217 }; 218 219 static struct resource tmu1_resources[] = { 220 DEFINE_RES_MEM(0xffd81000, 0x30), 221 DEFINE_RES_IRQ(evt2irq(0x480)), 222 DEFINE_RES_IRQ(evt2irq(0x4a0)), 223 DEFINE_RES_IRQ(evt2irq(0x4c0)), 224 }; 225 226 static struct platform_device tmu1_device = { 227 .name = "sh-tmu", 228 .id = 1, 229 .dev = { 230 .platform_data = &tmu1_platform_data, 231 }, 232 .resource = tmu1_resources, 233 .num_resources = ARRAY_SIZE(tmu1_resources), 234 }; 235 236 static struct sh_timer_config tmu2_platform_data = { 237 .channels_mask = 7, 238 }; 239 240 static struct resource tmu2_resources[] = { 241 DEFINE_RES_MEM(0xffd82000, 0x30), 242 DEFINE_RES_IRQ(evt2irq(0x500)), 243 DEFINE_RES_IRQ(evt2irq(0x520)), 244 DEFINE_RES_IRQ(evt2irq(0x540)), 245 }; 246 247 static struct platform_device tmu2_device = { 248 .name = "sh-tmu", 249 .id = 2, 250 .dev = { 251 .platform_data = &tmu2_platform_data, 252 }, 253 .resource = tmu2_resources, 254 .num_resources = ARRAY_SIZE(tmu2_resources), 255 }; 256 257 static struct platform_device *sh7734_devices[] __initdata = { 258 &scif0_device, 259 &scif1_device, 260 &scif2_device, 261 &scif3_device, 262 &scif4_device, 263 &scif5_device, 264 &tmu0_device, 265 &tmu1_device, 266 &tmu2_device, 267 &rtc_device, 268 }; 269 270 static struct platform_device *sh7734_early_devices[] __initdata = { 271 &scif0_device, 272 &scif1_device, 273 &scif2_device, 274 &scif3_device, 275 &scif4_device, 276 &scif5_device, 277 &tmu0_device, 278 &tmu1_device, 279 &tmu2_device, 280 }; 281 282 void __init plat_early_device_setup(void) 283 { 284 sh_early_platform_add_devices(sh7734_early_devices, 285 ARRAY_SIZE(sh7734_early_devices)); 286 } 287 288 #define GROUP 0 289 enum { 290 UNUSED = 0, 291 292 /* interrupt sources */ 293 294 IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH, 295 IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH, 296 IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH, 297 IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 298 299 IRQ0, IRQ1, IRQ2, IRQ3, 300 DU, 301 TMU00, TMU10, TMU20, TMU21, 302 TMU30, TMU40, TMU50, TMU51, 303 TMU60, TMU70, TMU80, 304 RESET_WDT, 305 USB, 306 HUDI, 307 SHDMAC, 308 SSI0, SSI1, SSI2, SSI3, 309 VIN0, 310 RGPVG, 311 _2DG, 312 MMC, 313 HSPI, 314 LBSCATA, 315 I2C0, 316 RCAN0, 317 MIMLB, 318 SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5, 319 LBSCDMAC0, LBSCDMAC1, LBSCDMAC2, 320 RCAN1, 321 SDHI0, SDHI1, 322 IEBUS, 323 HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22, HPBDMAC23_25_27_28, 324 RTC, 325 VIN1, 326 LCDC, 327 SRC0, SRC1, 328 GETHER, 329 SDHI2, 330 GPIO0_3, GPIO4_5, 331 STIF0, STIF1, 332 ADMAC, 333 HIF, 334 FLCTL, 335 ADC, 336 MTU2, 337 RSPI, 338 QSPI, 339 HSCIF, 340 VEU3F_VE3, 341 342 /* Group */ 343 /* Mask */ 344 STIF_M, 345 GPIO_M, 346 HPBDMAC_M, 347 LBSCDMAC_M, 348 RCAN_M, 349 SRC_M, 350 SCIF_M, 351 LCDC_M, 352 _2DG_M, 353 VIN_M, 354 TMU_3_M, 355 TMU_0_M, 356 357 /* Priority */ 358 RCAN_P, 359 LBSCDMAC_P, 360 361 /* Common */ 362 SDHI, 363 SSI, 364 SPI, 365 }; 366 367 static struct intc_vect vectors[] __initdata = { 368 INTC_VECT(DU, 0x3E0), 369 INTC_VECT(TMU00, 0x400), 370 INTC_VECT(TMU10, 0x420), 371 INTC_VECT(TMU20, 0x440), 372 INTC_VECT(TMU30, 0x480), 373 INTC_VECT(TMU40, 0x4A0), 374 INTC_VECT(TMU50, 0x4C0), 375 INTC_VECT(TMU51, 0x4E0), 376 INTC_VECT(TMU60, 0x500), 377 INTC_VECT(TMU70, 0x520), 378 INTC_VECT(TMU80, 0x540), 379 INTC_VECT(RESET_WDT, 0x560), 380 INTC_VECT(USB, 0x580), 381 INTC_VECT(HUDI, 0x600), 382 INTC_VECT(SHDMAC, 0x620), 383 INTC_VECT(SSI0, 0x6C0), 384 INTC_VECT(SSI1, 0x6E0), 385 INTC_VECT(SSI2, 0x700), 386 INTC_VECT(SSI3, 0x720), 387 INTC_VECT(VIN0, 0x740), 388 INTC_VECT(RGPVG, 0x760), 389 INTC_VECT(_2DG, 0x780), 390 INTC_VECT(MMC, 0x7A0), 391 INTC_VECT(HSPI, 0x7E0), 392 INTC_VECT(LBSCATA, 0x840), 393 INTC_VECT(I2C0, 0x860), 394 INTC_VECT(RCAN0, 0x880), 395 INTC_VECT(SCIF0, 0x8A0), 396 INTC_VECT(SCIF1, 0x8C0), 397 INTC_VECT(SCIF2, 0x900), 398 INTC_VECT(SCIF3, 0x920), 399 INTC_VECT(SCIF4, 0x940), 400 INTC_VECT(SCIF5, 0x960), 401 INTC_VECT(LBSCDMAC0, 0x9E0), 402 INTC_VECT(LBSCDMAC1, 0xA00), 403 INTC_VECT(LBSCDMAC2, 0xA20), 404 INTC_VECT(RCAN1, 0xA60), 405 INTC_VECT(SDHI0, 0xAE0), 406 INTC_VECT(SDHI1, 0xB00), 407 INTC_VECT(IEBUS, 0xB20), 408 INTC_VECT(HPBDMAC0_3, 0xB60), 409 INTC_VECT(HPBDMAC4_10, 0xB80), 410 INTC_VECT(HPBDMAC11_18, 0xBA0), 411 INTC_VECT(HPBDMAC19_22, 0xBC0), 412 INTC_VECT(HPBDMAC23_25_27_28, 0xBE0), 413 INTC_VECT(RTC, 0xC00), 414 INTC_VECT(VIN1, 0xC20), 415 INTC_VECT(LCDC, 0xC40), 416 INTC_VECT(SRC0, 0xC60), 417 INTC_VECT(SRC1, 0xC80), 418 INTC_VECT(GETHER, 0xCA0), 419 INTC_VECT(SDHI2, 0xCC0), 420 INTC_VECT(GPIO0_3, 0xCE0), 421 INTC_VECT(GPIO4_5, 0xD00), 422 INTC_VECT(STIF0, 0xD20), 423 INTC_VECT(STIF1, 0xD40), 424 INTC_VECT(ADMAC, 0xDA0), 425 INTC_VECT(HIF, 0xDC0), 426 INTC_VECT(FLCTL, 0xDE0), 427 INTC_VECT(ADC, 0xE00), 428 INTC_VECT(MTU2, 0xE20), 429 INTC_VECT(RSPI, 0xE40), 430 INTC_VECT(QSPI, 0xE60), 431 INTC_VECT(HSCIF, 0xFC0), 432 INTC_VECT(VEU3F_VE3, 0xF40), 433 }; 434 435 static struct intc_group groups[] __initdata = { 436 /* Common */ 437 INTC_GROUP(SDHI, SDHI0, SDHI1, SDHI2), 438 INTC_GROUP(SPI, HSPI, RSPI, QSPI), 439 INTC_GROUP(SSI, SSI0, SSI1, SSI2, SSI3), 440 441 /* Mask group */ 442 INTC_GROUP(STIF_M, STIF0, STIF1), /* 22 */ 443 INTC_GROUP(GPIO_M, GPIO0_3, GPIO4_5), /* 21 */ 444 INTC_GROUP(HPBDMAC_M, HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, 445 HPBDMAC19_22, HPBDMAC23_25_27_28), /* 19 */ 446 INTC_GROUP(LBSCDMAC_M, LBSCDMAC0, LBSCDMAC1, LBSCDMAC2), /* 18 */ 447 INTC_GROUP(RCAN_M, RCAN0, RCAN1, IEBUS), /* 17 */ 448 INTC_GROUP(SRC_M, SRC0, SRC1), /* 16 */ 449 INTC_GROUP(SCIF_M, SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5, 450 HSCIF), /* 14 */ 451 INTC_GROUP(LCDC_M, LCDC, MIMLB), /* 13 */ 452 INTC_GROUP(_2DG_M, _2DG, RGPVG), /* 12 */ 453 INTC_GROUP(VIN_M, VIN0, VIN1), /* 10 */ 454 INTC_GROUP(TMU_3_M, TMU30, TMU40, TMU50, TMU51, 455 TMU60, TMU60, TMU70, TMU80), /* 2 */ 456 INTC_GROUP(TMU_0_M, TMU00, TMU10, TMU20, TMU21), /* 1 */ 457 458 /* Priority group*/ 459 INTC_GROUP(RCAN_P, RCAN0, RCAN1), /* INT2PRI5 */ 460 INTC_GROUP(LBSCDMAC_P, LBSCDMAC0, LBSCDMAC1), /* INT2PRI5 */ 461 }; 462 463 static struct intc_mask_reg mask_registers[] __initdata = { 464 { 0xFF804040, 0xFF804044, 32, /* INT2MSKRG / INT2MSKCR */ 465 { 0, 466 VEU3F_VE3, 467 SDHI, /* SDHI 0-2 */ 468 ADMAC, 469 FLCTL, 470 RESET_WDT, 471 HIF, 472 ADC, 473 MTU2, 474 STIF_M, /* STIF 0,1 */ 475 GPIO_M, /* GPIO 0-5*/ 476 GETHER, 477 HPBDMAC_M, /* HPBDMAC 0_3 - 23_25_27_28 */ 478 LBSCDMAC_M, /* LBSCDMAC 0 - 2 */ 479 RCAN_M, /* RCAN, IEBUS */ 480 SRC_M, /* SRC 0,1 */ 481 LBSCATA, 482 SCIF_M, /* SCIF 0-5, HSCIF */ 483 LCDC_M, /* LCDC, MIMLB */ 484 _2DG_M, /* 2DG, RGPVG */ 485 SPI, /* HSPI, RSPI, QSPI */ 486 VIN_M, /* VIN0, 1 */ 487 SSI, /* SSI 0-3 */ 488 USB, 489 SHDMAC, 490 HUDI, 491 MMC, 492 RTC, 493 I2C0, /* I2C */ /* I2C 0, 1*/ 494 TMU_3_M, /* TMU30 - TMU80 */ 495 TMU_0_M, /* TMU00 - TMU21 */ 496 DU } }, 497 }; 498 499 static struct intc_prio_reg prio_registers[] __initdata = { 500 { 0xFF804000, 0, 32, 8, /* INT2PRI0 */ 501 { DU, TMU00, TMU10, TMU20 } }, 502 { 0xFF804004, 0, 32, 8, /* INT2PRI1 */ 503 { TMU30, TMU60, RTC, SDHI } }, 504 { 0xFF804008, 0, 32, 8, /* INT2PRI2 */ 505 { HUDI, SHDMAC, USB, SSI } }, 506 { 0xFF80400C, 0, 32, 8, /* INT2PRI3 */ 507 { VIN0, SPI, _2DG, LBSCATA } }, 508 { 0xFF804010, 0, 32, 8, /* INT2PRI4 */ 509 { SCIF0, SCIF3, HSCIF, LCDC } }, 510 { 0xFF804014, 0, 32, 8, /* INT2PRI5 */ 511 { RCAN_P, LBSCDMAC_P, LBSCDMAC2, MMC } }, 512 { 0xFF804018, 0, 32, 8, /* INT2PRI6 */ 513 { HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22 } }, 514 { 0xFF80401C, 0, 32, 8, /* INT2PRI7 */ 515 { HPBDMAC23_25_27_28, I2C0, SRC0, SRC1 } }, 516 { 0xFF804020, 0, 32, 8, /* INT2PRI8 */ 517 { 0 /* ADIF */, VIN1, RESET_WDT, HIF } }, 518 { 0xFF804024, 0, 32, 8, /* INT2PRI9 */ 519 { ADMAC, FLCTL, GPIO0_3, GPIO4_5 } }, 520 { 0xFF804028, 0, 32, 8, /* INT2PRI10 */ 521 { STIF0, STIF1, VEU3F_VE3, GETHER } }, 522 { 0xFF80402C, 0, 32, 8, /* INT2PRI11 */ 523 { MTU2, RGPVG, MIMLB, IEBUS } }, 524 }; 525 526 static DECLARE_INTC_DESC(intc_desc, "sh7734", vectors, groups, 527 mask_registers, prio_registers, NULL); 528 529 /* Support for external interrupt pins in IRQ mode */ 530 531 static struct intc_vect irq3210_vectors[] __initdata = { 532 INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280), 533 INTC_VECT(IRQ2, 0x2C0), INTC_VECT(IRQ3, 0x300), 534 }; 535 536 static struct intc_sense_reg irq3210_sense_registers[] __initdata = { 537 { 0xFF80201C, 32, 2, /* ICR1 */ 538 { IRQ0, IRQ1, IRQ2, IRQ3, } }, 539 }; 540 541 static struct intc_mask_reg irq3210_ack_registers[] __initdata = { 542 { 0xFF802024, 0, 32, /* INTREQ */ 543 { IRQ0, IRQ1, IRQ2, IRQ3, } }, 544 }; 545 546 static struct intc_mask_reg irq3210_mask_registers[] __initdata = { 547 { 0xFF802044, 0xFF802064, 32, /* INTMSK0 / INTMSKCLR0 */ 548 { IRQ0, IRQ1, IRQ2, IRQ3, } }, 549 }; 550 551 static struct intc_prio_reg irq3210_prio_registers[] __initdata = { 552 { 0xFF802010, 0, 32, 4, /* INTPRI */ 553 { IRQ0, IRQ1, IRQ2, IRQ3, } }, 554 }; 555 556 static DECLARE_INTC_DESC_ACK(intc_desc_irq3210, "sh7734-irq3210", 557 irq3210_vectors, NULL, 558 irq3210_mask_registers, irq3210_prio_registers, 559 irq3210_sense_registers, irq3210_ack_registers); 560 561 /* External interrupt pins in IRL mode */ 562 563 static struct intc_vect vectors_irl3210[] __initdata = { 564 INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220), 565 INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260), 566 INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0), 567 INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0), 568 INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320), 569 INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360), 570 INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0), 571 INTC_VECT(IRL0_HHHL, 0x3c0), 572 }; 573 574 static DECLARE_INTC_DESC(intc_desc_irl3210, "sh7734-irl3210", 575 vectors_irl3210, NULL, mask_registers, NULL, NULL); 576 577 #define INTC_ICR0 0xFF802000 578 #define INTC_INTMSK0 0xFF802044 579 #define INTC_INTMSK1 0xFF802048 580 #define INTC_INTMSKCLR0 0xFF802064 581 #define INTC_INTMSKCLR1 0xFF802068 582 583 void __init plat_irq_setup(void) 584 { 585 /* disable IRQ3-0 */ 586 __raw_writel(0xF0000000, INTC_INTMSK0); 587 588 /* disable IRL3-0 */ 589 __raw_writel(0x80000000, INTC_INTMSK1); 590 591 /* select IRL mode for IRL3-0 */ 592 __raw_writel(__raw_readl(INTC_ICR0) & ~0x00800000, INTC_ICR0); 593 594 /* disable holding function, ie enable "SH-4 Mode (LVLMODE)" */ 595 __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0); 596 597 register_intc_controller(&intc_desc); 598 } 599 600 void __init plat_irq_setup_pins(int mode) 601 { 602 switch (mode) { 603 case IRQ_MODE_IRQ3210: 604 /* select IRQ mode for IRL3-0 */ 605 __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0); 606 register_intc_controller(&intc_desc_irq3210); 607 break; 608 case IRQ_MODE_IRL3210: 609 /* enable IRL0-3 but don't provide any masking */ 610 __raw_writel(0x80000000, INTC_INTMSKCLR1); 611 __raw_writel(0xf0000000, INTC_INTMSKCLR0); 612 break; 613 case IRQ_MODE_IRL3210_MASK: 614 /* enable IRL0-3 and mask using cpu intc controller */ 615 __raw_writel(0x80000000, INTC_INTMSKCLR0); 616 register_intc_controller(&intc_desc_irl3210); 617 break; 618 default: 619 BUG(); 620 } 621 } 622