1 // SPDX-License-Identifier: GPL-2.0 1 2 /* 3 * arch/sh/kernel/cpu/sh4a/setup-sh7734.c 4 * 5 * SH7734 Setup 6 * 7 * Copyright (C) 2011,2012 Nobuhiro Iwamatsu < 8 * Copyright (C) 2011,2012 Renesas Solutions C 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_dat 26 .scscr = SCSCR_REIE, 27 .type = PORT_SCIF, 28 .regtype = SCIx_SH4_SCIF_BRG_RE 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_res 41 .dev = { 42 .platform_data = &scif0_platf 43 }, 44 }; 45 46 static struct plat_sci_port scif1_platform_dat 47 .scscr = SCSCR_REIE, 48 .type = PORT_SCIF, 49 .regtype = SCIx_SH4_SCIF_BRG_RE 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_res 62 .dev = { 63 .platform_data = &scif1_platfo 64 }, 65 }; 66 67 static struct plat_sci_port scif2_platform_dat 68 .scscr = SCSCR_REIE, 69 .type = PORT_SCIF, 70 .regtype = SCIx_SH4_SCIF_BRG_RE 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_res 83 .dev = { 84 .platform_data = &scif2_platfo 85 }, 86 }; 87 88 static struct plat_sci_port scif3_platform_dat 89 .scscr = SCSCR_REIE | SCSCR_T 90 .type = PORT_SCIF, 91 .regtype = SCIx_SH4_SCIF_BRG_RE 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_res 104 .dev = { 105 .platform_data = &scif3_platf 106 }, 107 }; 108 109 static struct plat_sci_port scif4_platform_dat 110 .scscr = SCSCR_REIE, 111 .type = PORT_SCIF, 112 .regtype = SCIx_SH4_SCIF_BRG_RE 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_res 125 .dev = { 126 .platform_data = &scif4_platf 127 }, 128 }; 129 130 static struct plat_sci_port scif5_platform_dat 131 .scscr = SCSCR_REIE, 132 .type = PORT_SCIF, 133 .regtype = SCIx_SH4_SCIF_BRG_RE 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_res 146 .dev = { 147 .platform_data = &scif5_platf 148 }, 149 }; 150 151 /* RTC */ 152 static struct resource rtc_resources[] = { 153 [0] = { 154 .name = "rtc", 155 .start = 0xFFFC5000, 156 .end = 0xFFFC5000 + 0x26 - 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_resou 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_reso 190 .resource = i2c0_resources, 191 }; 192 193 /* TMU */ 194 static struct sh_timer_config tmu0_platform_da 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_platfo 210 }, 211 .resource = tmu0_resources, 212 .num_resources = ARRAY_SIZE(tmu0_reso 213 }; 214 215 static struct sh_timer_config tmu1_platform_da 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_platfo 231 }, 232 .resource = tmu1_resources, 233 .num_resources = ARRAY_SIZE(tmu1_reso 234 }; 235 236 static struct sh_timer_config tmu2_platform_da 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_platfo 252 }, 253 .resource = tmu2_resources, 254 .num_resources = ARRAY_SIZE(tmu2_reso 255 }; 256 257 static struct platform_device *sh7734_devices[ 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_de 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_e 285 ARRAY_SIZE(sh7734_early_device 286 } 287 288 #define GROUP 0 289 enum { 290 UNUSED = 0, 291 292 /* interrupt sources */ 293 294 IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_ 295 IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_ 296 IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_ 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, SCI 319 LBSCDMAC0, LBSCDMAC1, LBSCDMAC2, 320 RCAN1, 321 SDHI0, SDHI1, 322 IEBUS, 323 HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, 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), /* 2 443 INTC_GROUP(GPIO_M, GPIO0_3, GPIO4_5), 444 INTC_GROUP(HPBDMAC_M, HPBDMAC0_3, HPBD 445 HPBDMAC19_22, HPBDMAC2 446 INTC_GROUP(LBSCDMAC_M, LBSCDMAC0, LBSC 447 INTC_GROUP(RCAN_M, RCAN0, RCAN1, IEBUS 448 INTC_GROUP(SRC_M, SRC0, SRC1), /* 16 * 449 INTC_GROUP(SCIF_M, SCIF0, SCIF1, SCIF2 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, TMU5 455 TMU60, TMU60, TMU70, T 456 INTC_GROUP(TMU_0_M, TMU00, TMU10, TMU2 457 458 /* Priority group*/ 459 INTC_GROUP(RCAN_P, RCAN0, RCAN1), /* I 460 INTC_GROUP(LBSCDMAC_P, LBSCDMAC0, LBSC 461 }; 462 463 static struct intc_mask_reg mask_registers[] _ 464 { 0xFF804040, 0xFF804044, 32, /* INT2M 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 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[] _ 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, LBSCDMAC 512 { 0xFF804018, 0, 32, 8, /* INT2PRI6 */ 513 { HPBDMAC0_3, HPBDMAC4_10, HPB 514 { 0xFF80401C, 0, 32, 8, /* INT2PRI7 */ 515 { HPBDMAC23_25_27_28, I2C0, SR 516 { 0xFF804020, 0, 32, 8, /* INT2PRI8 */ 517 { 0 /* ADIF */, VIN1, RESET_WD 518 { 0xFF804024, 0, 32, 8, /* INT2PRI9 */ 519 { ADMAC, FLCTL, GPIO0_3, GPIO4 520 { 0xFF804028, 0, 32, 8, /* INT2PRI10 * 521 { STIF0, STIF1, VEU3F_VE3, GET 522 { 0xFF80402C, 0, 32, 8, /* INT2PRI11 * 523 { MTU2, RGPVG, MIMLB, IEBUS } 524 }; 525 526 static DECLARE_INTC_DESC(intc_desc, "sh7734", 527 mask_registers, prio_registers, NULL); 528 529 /* Support for external interrupt pins in IRQ 530 531 static struct intc_vect irq3210_vectors[] __in 532 INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1 533 INTC_VECT(IRQ2, 0x2C0), INTC_VECT(IRQ3 534 }; 535 536 static struct intc_sense_reg irq3210_sense_reg 537 { 0xFF80201C, 32, 2, /* ICR1 */ 538 { IRQ0, IRQ1, IRQ2, IRQ3, } }, 539 }; 540 541 static struct intc_mask_reg irq3210_ack_regist 542 { 0xFF802024, 0, 32, /* INTREQ */ 543 { IRQ0, IRQ1, IRQ2, IRQ3, } }, 544 }; 545 546 static struct intc_mask_reg irq3210_mask_regis 547 { 0xFF802044, 0xFF802064, 32, /* INTMS 548 { IRQ0, IRQ1, IRQ2, IRQ3, } }, 549 }; 550 551 static struct intc_prio_reg irq3210_prio_regis 552 { 0xFF802010, 0, 32, 4, /* INTPRI */ 553 { IRQ0, IRQ1, IRQ2, IRQ3, } }, 554 }; 555 556 static DECLARE_INTC_DESC_ACK(intc_desc_irq3210 557 irq3210_vectors, NULL, 558 irq3210_mask_registers, irq3210_prio_r 559 irq3210_sense_registers, irq3210_ack_r 560 561 /* External interrupt pins in IRL mode */ 562 563 static struct intc_vect vectors_irl3210[] __in 564 INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT 565 INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT 566 INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT 567 INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT 568 INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT 569 INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT 570 INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT 571 INTC_VECT(IRL0_HHHL, 0x3c0), 572 }; 573 574 static DECLARE_INTC_DESC(intc_desc_irl3210, "s 575 vectors_irl3210, NULL, mask_registers, 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) & 593 594 /* disable holding function, ie enable 595 __raw_writel(__raw_readl(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_ 606 register_intc_controller(&intc 607 break; 608 case IRQ_MODE_IRL3210: 609 /* enable IRL0-3 but don't pro 610 __raw_writel(0x80000000, INTC_ 611 __raw_writel(0xf0000000, INTC_ 612 break; 613 case IRQ_MODE_IRL3210_MASK: 614 /* enable IRL0-3 and mask usin 615 __raw_writel(0x80000000, INTC_ 616 register_intc_controller(&intc 617 break; 618 default: 619 BUG(); 620 } 621 } 622
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.