1 /* 2 * SH7785 Setup 3 * 4 * Copyright (C) 2007 Paul Mundt 5 * 6 * This file is subject to the terms and conditions of the GNU General Public 7 * License. See the file "COPYING" in the main directory of this archive 8 * for more details. 9 */ 10 #include <linux/platform_device.h> 11 #include <linux/init.h> 12 #include <linux/serial.h> 13 #include <linux/serial_sci.h> 14 #include <linux/io.h> 15 #include <linux/mm.h> 16 #include <linux/sh_dma.h> 17 #include <linux/sh_timer.h> 18 #include <linux/sh_intc.h> 19 #include <asm/mmzone.h> 20 #include <cpu/dma-register.h> 21 22 static struct plat_sci_port scif0_platform_data = { 23 .mapbase = 0xffea0000, 24 .flags = UPF_BOOT_AUTOCONF, 25 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1, 26 .scbrr_algo_id = SCBRR_ALGO_1, 27 .type = PORT_SCIF, 28 .irqs = SCIx_IRQ_MUXED(evt2irq(0x700)), 29 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE, 30 }; 31 32 static struct platform_device scif0_device = { 33 .name = "sh-sci", 34 .id = 0, 35 .dev = { 36 .platform_data = &scif0_platform_data, 37 }, 38 }; 39 40 static struct plat_sci_port scif1_platform_data = { 41 .mapbase = 0xffeb0000, 42 .flags = UPF_BOOT_AUTOCONF, 43 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1, 44 .scbrr_algo_id = SCBRR_ALGO_1, 45 .type = PORT_SCIF, 46 .irqs = SCIx_IRQ_MUXED(evt2irq(0x780)), 47 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE, 48 }; 49 50 static struct platform_device scif1_device = { 51 .name = "sh-sci", 52 .id = 1, 53 .dev = { 54 .platform_data = &scif1_platform_data, 55 }, 56 }; 57 58 static struct plat_sci_port scif2_platform_data = { 59 .mapbase = 0xffec0000, 60 .flags = UPF_BOOT_AUTOCONF, 61 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1, 62 .scbrr_algo_id = SCBRR_ALGO_1, 63 .type = PORT_SCIF, 64 .irqs = SCIx_IRQ_MUXED(evt2irq(0x980)), 65 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE, 66 }; 67 68 static struct platform_device scif2_device = { 69 .name = "sh-sci", 70 .id = 2, 71 .dev = { 72 .platform_data = &scif2_platform_data, 73 }, 74 }; 75 76 static struct plat_sci_port scif3_platform_data = { 77 .mapbase = 0xffed0000, 78 .flags = UPF_BOOT_AUTOCONF, 79 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1, 80 .scbrr_algo_id = SCBRR_ALGO_1, 81 .type = PORT_SCIF, 82 .irqs = SCIx_IRQ_MUXED(evt2irq(0x9a0)), 83 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE, 84 }; 85 86 static struct platform_device scif3_device = { 87 .name = "sh-sci", 88 .id = 3, 89 .dev = { 90 .platform_data = &scif3_platform_data, 91 }, 92 }; 93 94 static struct plat_sci_port scif4_platform_data = { 95 .mapbase = 0xffee0000, 96 .flags = UPF_BOOT_AUTOCONF, 97 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1, 98 .scbrr_algo_id = SCBRR_ALGO_1, 99 .type = PORT_SCIF, 100 .irqs = SCIx_IRQ_MUXED(evt2irq(0x9c0)), 101 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE, 102 }; 103 104 static struct platform_device scif4_device = { 105 .name = "sh-sci", 106 .id = 4, 107 .dev = { 108 .platform_data = &scif4_platform_data, 109 }, 110 }; 111 112 static struct plat_sci_port scif5_platform_data = { 113 .mapbase = 0xffef0000, 114 .flags = UPF_BOOT_AUTOCONF, 115 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1, 116 .scbrr_algo_id = SCBRR_ALGO_1, 117 .type = PORT_SCIF, 118 .irqs = SCIx_IRQ_MUXED(evt2irq(0x9e0)), 119 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE, 120 }; 121 122 static struct platform_device scif5_device = { 123 .name = "sh-sci", 124 .id = 5, 125 .dev = { 126 .platform_data = &scif5_platform_data, 127 }, 128 }; 129 130 static struct sh_timer_config tmu0_platform_data = { 131 .channel_offset = 0x04, 132 .timer_bit = 0, 133 .clockevent_rating = 200, 134 }; 135 136 static struct resource tmu0_resources[] = { 137 [0] = { 138 .start = 0xffd80008, 139 .end = 0xffd80013, 140 .flags = IORESOURCE_MEM, 141 }, 142 [1] = { 143 .start = evt2irq(0x580), 144 .flags = IORESOURCE_IRQ, 145 }, 146 }; 147 148 static struct platform_device tmu0_device = { 149 .name = "sh_tmu", 150 .id = 0, 151 .dev = { 152 .platform_data = &tmu0_platform_data, 153 }, 154 .resource = tmu0_resources, 155 .num_resources = ARRAY_SIZE(tmu0_resources), 156 }; 157 158 static struct sh_timer_config tmu1_platform_data = { 159 .channel_offset = 0x10, 160 .timer_bit = 1, 161 .clocksource_rating = 200, 162 }; 163 164 static struct resource tmu1_resources[] = { 165 [0] = { 166 .start = 0xffd80014, 167 .end = 0xffd8001f, 168 .flags = IORESOURCE_MEM, 169 }, 170 [1] = { 171 .start = evt2irq(0x5a0), 172 .flags = IORESOURCE_IRQ, 173 }, 174 }; 175 176 static struct platform_device tmu1_device = { 177 .name = "sh_tmu", 178 .id = 1, 179 .dev = { 180 .platform_data = &tmu1_platform_data, 181 }, 182 .resource = tmu1_resources, 183 .num_resources = ARRAY_SIZE(tmu1_resources), 184 }; 185 186 static struct sh_timer_config tmu2_platform_data = { 187 .channel_offset = 0x1c, 188 .timer_bit = 2, 189 }; 190 191 static struct resource tmu2_resources[] = { 192 [0] = { 193 .start = 0xffd80020, 194 .end = 0xffd8002f, 195 .flags = IORESOURCE_MEM, 196 }, 197 [1] = { 198 .start = evt2irq(0x5c0), 199 .flags = IORESOURCE_IRQ, 200 }, 201 }; 202 203 static struct platform_device tmu2_device = { 204 .name = "sh_tmu", 205 .id = 2, 206 .dev = { 207 .platform_data = &tmu2_platform_data, 208 }, 209 .resource = tmu2_resources, 210 .num_resources = ARRAY_SIZE(tmu2_resources), 211 }; 212 213 static struct sh_timer_config tmu3_platform_data = { 214 .channel_offset = 0x04, 215 .timer_bit = 0, 216 }; 217 218 static struct resource tmu3_resources[] = { 219 [0] = { 220 .start = 0xffdc0008, 221 .end = 0xffdc0013, 222 .flags = IORESOURCE_MEM, 223 }, 224 [1] = { 225 .start = evt2irq(0xe00), 226 .flags = IORESOURCE_IRQ, 227 }, 228 }; 229 230 static struct platform_device tmu3_device = { 231 .name = "sh_tmu", 232 .id = 3, 233 .dev = { 234 .platform_data = &tmu3_platform_data, 235 }, 236 .resource = tmu3_resources, 237 .num_resources = ARRAY_SIZE(tmu3_resources), 238 }; 239 240 static struct sh_timer_config tmu4_platform_data = { 241 .channel_offset = 0x10, 242 .timer_bit = 1, 243 }; 244 245 static struct resource tmu4_resources[] = { 246 [0] = { 247 .start = 0xffdc0014, 248 .end = 0xffdc001f, 249 .flags = IORESOURCE_MEM, 250 }, 251 [1] = { 252 .start = evt2irq(0xe20), 253 .flags = IORESOURCE_IRQ, 254 }, 255 }; 256 257 static struct platform_device tmu4_device = { 258 .name = "sh_tmu", 259 .id = 4, 260 .dev = { 261 .platform_data = &tmu4_platform_data, 262 }, 263 .resource = tmu4_resources, 264 .num_resources = ARRAY_SIZE(tmu4_resources), 265 }; 266 267 static struct sh_timer_config tmu5_platform_data = { 268 .channel_offset = 0x1c, 269 .timer_bit = 2, 270 }; 271 272 static struct resource tmu5_resources[] = { 273 [0] = { 274 .start = 0xffdc0020, 275 .end = 0xffdc002b, 276 .flags = IORESOURCE_MEM, 277 }, 278 [1] = { 279 .start = evt2irq(0xe40), 280 .flags = IORESOURCE_IRQ, 281 }, 282 }; 283 284 static struct platform_device tmu5_device = { 285 .name = "sh_tmu", 286 .id = 5, 287 .dev = { 288 .platform_data = &tmu5_platform_data, 289 }, 290 .resource = tmu5_resources, 291 .num_resources = ARRAY_SIZE(tmu5_resources), 292 }; 293 294 /* DMA */ 295 static const struct sh_dmae_channel sh7785_dmae0_channels[] = { 296 { 297 .offset = 0, 298 .dmars = 0, 299 .dmars_bit = 0, 300 }, { 301 .offset = 0x10, 302 .dmars = 0, 303 .dmars_bit = 8, 304 }, { 305 .offset = 0x20, 306 .dmars = 4, 307 .dmars_bit = 0, 308 }, { 309 .offset = 0x30, 310 .dmars = 4, 311 .dmars_bit = 8, 312 }, { 313 .offset = 0x50, 314 .dmars = 8, 315 .dmars_bit = 0, 316 }, { 317 .offset = 0x60, 318 .dmars = 8, 319 .dmars_bit = 8, 320 } 321 }; 322 323 static const struct sh_dmae_channel sh7785_dmae1_channels[] = { 324 { 325 .offset = 0, 326 }, { 327 .offset = 0x10, 328 }, { 329 .offset = 0x20, 330 }, { 331 .offset = 0x30, 332 }, { 333 .offset = 0x50, 334 }, { 335 .offset = 0x60, 336 } 337 }; 338 339 static const unsigned int ts_shift[] = TS_SHIFT; 340 341 static struct sh_dmae_pdata dma0_platform_data = { 342 .channel = sh7785_dmae0_channels, 343 .channel_num = ARRAY_SIZE(sh7785_dmae0_channels), 344 .ts_low_shift = CHCR_TS_LOW_SHIFT, 345 .ts_low_mask = CHCR_TS_LOW_MASK, 346 .ts_high_shift = CHCR_TS_HIGH_SHIFT, 347 .ts_high_mask = CHCR_TS_HIGH_MASK, 348 .ts_shift = ts_shift, 349 .ts_shift_num = ARRAY_SIZE(ts_shift), 350 .dmaor_init = DMAOR_INIT, 351 }; 352 353 static struct sh_dmae_pdata dma1_platform_data = { 354 .channel = sh7785_dmae1_channels, 355 .channel_num = ARRAY_SIZE(sh7785_dmae1_channels), 356 .ts_low_shift = CHCR_TS_LOW_SHIFT, 357 .ts_low_mask = CHCR_TS_LOW_MASK, 358 .ts_high_shift = CHCR_TS_HIGH_SHIFT, 359 .ts_high_mask = CHCR_TS_HIGH_MASK, 360 .ts_shift = ts_shift, 361 .ts_shift_num = ARRAY_SIZE(ts_shift), 362 .dmaor_init = DMAOR_INIT, 363 }; 364 365 static struct resource sh7785_dmae0_resources[] = { 366 [0] = { 367 /* Channel registers and DMAOR */ 368 .start = 0xfc808020, 369 .end = 0xfc80808f, 370 .flags = IORESOURCE_MEM, 371 }, 372 [1] = { 373 /* DMARSx */ 374 .start = 0xfc809000, 375 .end = 0xfc80900b, 376 .flags = IORESOURCE_MEM, 377 }, 378 { 379 /* 380 * Real DMA error vector is 0x6e0, and channel 381 * vectors are 0x620-0x6c0 382 */ 383 .name = "error_irq", 384 .start = evt2irq(0x620), 385 .end = evt2irq(0x620), 386 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE, 387 }, 388 }; 389 390 static struct resource sh7785_dmae1_resources[] = { 391 [0] = { 392 /* Channel registers and DMAOR */ 393 .start = 0xfcc08020, 394 .end = 0xfcc0808f, 395 .flags = IORESOURCE_MEM, 396 }, 397 /* DMAC1 has no DMARS */ 398 { 399 /* 400 * Real DMA error vector is 0x940, and channel 401 * vectors are 0x880-0x920 402 */ 403 .name = "error_irq", 404 .start = evt2irq(0x880), 405 .end = evt2irq(0x880), 406 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE, 407 }, 408 }; 409 410 static struct platform_device dma0_device = { 411 .name = "sh-dma-engine", 412 .id = 0, 413 .resource = sh7785_dmae0_resources, 414 .num_resources = ARRAY_SIZE(sh7785_dmae0_resources), 415 .dev = { 416 .platform_data = &dma0_platform_data, 417 }, 418 }; 419 420 static struct platform_device dma1_device = { 421 .name = "sh-dma-engine", 422 .id = 1, 423 .resource = sh7785_dmae1_resources, 424 .num_resources = ARRAY_SIZE(sh7785_dmae1_resources), 425 .dev = { 426 .platform_data = &dma1_platform_data, 427 }, 428 }; 429 430 static struct platform_device *sh7785_devices[] __initdata = { 431 &scif0_device, 432 &scif1_device, 433 &scif2_device, 434 &scif3_device, 435 &scif4_device, 436 &scif5_device, 437 &tmu0_device, 438 &tmu1_device, 439 &tmu2_device, 440 &tmu3_device, 441 &tmu4_device, 442 &tmu5_device, 443 &dma0_device, 444 &dma1_device, 445 }; 446 447 static int __init sh7785_devices_setup(void) 448 { 449 return platform_add_devices(sh7785_devices, 450 ARRAY_SIZE(sh7785_devices)); 451 } 452 arch_initcall(sh7785_devices_setup); 453 454 static struct platform_device *sh7785_early_devices[] __initdata = { 455 &scif0_device, 456 &scif1_device, 457 &scif2_device, 458 &scif3_device, 459 &scif4_device, 460 &scif5_device, 461 &tmu0_device, 462 &tmu1_device, 463 &tmu2_device, 464 &tmu3_device, 465 &tmu4_device, 466 &tmu5_device, 467 }; 468 469 void __init plat_early_device_setup(void) 470 { 471 early_platform_add_devices(sh7785_early_devices, 472 ARRAY_SIZE(sh7785_early_devices)); 473 } 474 475 enum { 476 UNUSED = 0, 477 478 /* interrupt sources */ 479 480 IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH, 481 IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH, 482 IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH, 483 IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 484 485 IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH, 486 IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH, 487 IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH, 488 IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 489 490 IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, 491 WDT, TMU0, TMU1, TMU2, TMU2_TICPI, 492 HUDI, DMAC0, SCIF0, SCIF1, DMAC1, HSPI, 493 SCIF2, SCIF3, SCIF4, SCIF5, 494 PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5, 495 SIOF, MMCIF, DU, GDTA, 496 TMU3, TMU4, TMU5, 497 SSI0, SSI1, 498 HAC0, HAC1, 499 FLCTL, GPIO, 500 501 /* interrupt groups */ 502 503 TMU012, TMU345 504 }; 505 506 static struct intc_vect vectors[] __initdata = { 507 INTC_VECT(WDT, 0x560), 508 INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0), 509 INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0), 510 INTC_VECT(HUDI, 0x600), 511 INTC_VECT(DMAC0, 0x620), INTC_VECT(DMAC0, 0x640), 512 INTC_VECT(DMAC0, 0x660), INTC_VECT(DMAC0, 0x680), 513 INTC_VECT(DMAC0, 0x6a0), INTC_VECT(DMAC0, 0x6c0), 514 INTC_VECT(DMAC0, 0x6e0), 515 INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720), 516 INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760), 517 INTC_VECT(SCIF1, 0x780), INTC_VECT(SCIF1, 0x7a0), 518 INTC_VECT(SCIF1, 0x7c0), INTC_VECT(SCIF1, 0x7e0), 519 INTC_VECT(DMAC1, 0x880), INTC_VECT(DMAC1, 0x8a0), 520 INTC_VECT(DMAC1, 0x8c0), INTC_VECT(DMAC1, 0x8e0), 521 INTC_VECT(DMAC1, 0x900), INTC_VECT(DMAC1, 0x920), 522 INTC_VECT(DMAC1, 0x940), 523 INTC_VECT(HSPI, 0x960), 524 INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0), 525 INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0), 526 INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20), 527 INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60), 528 INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0), 529 INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0), 530 INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20), 531 INTC_VECT(SIOF, 0xc00), 532 INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20), 533 INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60), 534 INTC_VECT(DU, 0xd80), 535 INTC_VECT(GDTA, 0xda0), INTC_VECT(GDTA, 0xdc0), 536 INTC_VECT(GDTA, 0xde0), 537 INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20), 538 INTC_VECT(TMU5, 0xe40), 539 INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0), 540 INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0), 541 INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20), 542 INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60), 543 INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0), 544 INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0), 545 }; 546 547 static struct intc_group groups[] __initdata = { 548 INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI), 549 INTC_GROUP(TMU345, TMU3, TMU4, TMU5), 550 }; 551 552 static struct intc_mask_reg mask_registers[] __initdata = { 553 { 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */ 554 { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, 555 556 { 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */ 557 { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH, 558 IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH, 559 IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH, 560 IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0, 561 IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH, 562 IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH, 563 IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH, 564 IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } }, 565 566 { 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */ 567 { 0, 0, 0, GDTA, DU, SSI0, SSI1, GPIO, 568 FLCTL, MMCIF, HSPI, SIOF, PCIC5, PCIINTD, PCIINTC, PCIINTB, 569 PCIINTA, PCISERR, HAC1, HAC0, DMAC1, DMAC0, HUDI, WDT, 570 SCIF5, SCIF4, SCIF3, SCIF2, SCIF1, SCIF0, TMU345, TMU012 } }, 571 }; 572 573 static struct intc_prio_reg prio_registers[] __initdata = { 574 { 0xffd00010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3, 575 IRQ4, IRQ5, IRQ6, IRQ7 } }, 576 { 0xffd40000, 0, 32, 8, /* INT2PRI0 */ { TMU0, TMU1, 577 TMU2, TMU2_TICPI } }, 578 { 0xffd40004, 0, 32, 8, /* INT2PRI1 */ { TMU3, TMU4, TMU5, } }, 579 { 0xffd40008, 0, 32, 8, /* INT2PRI2 */ { SCIF0, SCIF1, 580 SCIF2, SCIF3 } }, 581 { 0xffd4000c, 0, 32, 8, /* INT2PRI3 */ { SCIF4, SCIF5, WDT, } }, 582 { 0xffd40010, 0, 32, 8, /* INT2PRI4 */ { HUDI, DMAC0, DMAC1, } }, 583 { 0xffd40014, 0, 32, 8, /* INT2PRI5 */ { HAC0, HAC1, 584 PCISERR, PCIINTA } }, 585 { 0xffd40018, 0, 32, 8, /* INT2PRI6 */ { PCIINTB, PCIINTC, 586 PCIINTD, PCIC5 } }, 587 { 0xffd4001c, 0, 32, 8, /* INT2PRI7 */ { SIOF, HSPI, MMCIF, } }, 588 { 0xffd40020, 0, 32, 8, /* INT2PRI8 */ { FLCTL, GPIO, SSI0, SSI1, } }, 589 { 0xffd40024, 0, 32, 8, /* INT2PRI9 */ { DU, GDTA, } }, 590 }; 591 592 static DECLARE_INTC_DESC(intc_desc, "sh7785", vectors, groups, 593 mask_registers, prio_registers, NULL); 594 595 /* Support for external interrupt pins in IRQ mode */ 596 597 static struct intc_vect vectors_irq0123[] __initdata = { 598 INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280), 599 INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300), 600 }; 601 602 static struct intc_vect vectors_irq4567[] __initdata = { 603 INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380), 604 INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200), 605 }; 606 607 static struct intc_sense_reg sense_registers[] __initdata = { 608 { 0xffd0001c, 32, 2, /* ICR1 */ { IRQ0, IRQ1, IRQ2, IRQ3, 609 IRQ4, IRQ5, IRQ6, IRQ7 } }, 610 }; 611 612 static struct intc_mask_reg ack_registers[] __initdata = { 613 { 0xffd00024, 0, 32, /* INTREQ */ 614 { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, 615 }; 616 617 static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7785-irq0123", 618 vectors_irq0123, NULL, mask_registers, 619 prio_registers, sense_registers, ack_registers); 620 621 static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7785-irq4567", 622 vectors_irq4567, NULL, mask_registers, 623 prio_registers, sense_registers, ack_registers); 624 625 /* External interrupt pins in IRL mode */ 626 627 static struct intc_vect vectors_irl0123[] __initdata = { 628 INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220), 629 INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260), 630 INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0), 631 INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0), 632 INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320), 633 INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360), 634 INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0), 635 INTC_VECT(IRL0_HHHL, 0x3c0), 636 }; 637 638 static struct intc_vect vectors_irl4567[] __initdata = { 639 INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20), 640 INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60), 641 INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0), 642 INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0), 643 INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20), 644 INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60), 645 INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0), 646 INTC_VECT(IRL4_HHHL, 0xcc0), 647 }; 648 649 static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7785-irl0123", vectors_irl0123, 650 NULL, mask_registers, NULL, NULL); 651 652 static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7785-irl4567", vectors_irl4567, 653 NULL, mask_registers, NULL, NULL); 654 655 #define INTC_ICR0 0xffd00000 656 #define INTC_INTMSK0 0xffd00044 657 #define INTC_INTMSK1 0xffd00048 658 #define INTC_INTMSK2 0xffd40080 659 #define INTC_INTMSKCLR1 0xffd00068 660 #define INTC_INTMSKCLR2 0xffd40084 661 662 void __init plat_irq_setup(void) 663 { 664 /* disable IRQ3-0 + IRQ7-4 */ 665 __raw_writel(0xff000000, INTC_INTMSK0); 666 667 /* disable IRL3-0 + IRL7-4 */ 668 __raw_writel(0xc0000000, INTC_INTMSK1); 669 __raw_writel(0xfffefffe, INTC_INTMSK2); 670 671 /* select IRL mode for IRL3-0 + IRL7-4 */ 672 __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); 673 674 /* disable holding function, ie enable "SH-4 Mode" */ 675 __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0); 676 677 register_intc_controller(&intc_desc); 678 } 679 680 void __init plat_irq_setup_pins(int mode) 681 { 682 switch (mode) { 683 case IRQ_MODE_IRQ7654: 684 /* select IRQ mode for IRL7-4 */ 685 __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0); 686 register_intc_controller(&intc_desc_irq4567); 687 break; 688 case IRQ_MODE_IRQ3210: 689 /* select IRQ mode for IRL3-0 */ 690 __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0); 691 register_intc_controller(&intc_desc_irq0123); 692 break; 693 case IRQ_MODE_IRL7654: 694 /* enable IRL7-4 but don't provide any masking */ 695 __raw_writel(0x40000000, INTC_INTMSKCLR1); 696 __raw_writel(0x0000fffe, INTC_INTMSKCLR2); 697 break; 698 case IRQ_MODE_IRL3210: 699 /* enable IRL0-3 but don't provide any masking */ 700 __raw_writel(0x80000000, INTC_INTMSKCLR1); 701 __raw_writel(0xfffe0000, INTC_INTMSKCLR2); 702 break; 703 case IRQ_MODE_IRL7654_MASK: 704 /* enable IRL7-4 and mask using cpu intc controller */ 705 __raw_writel(0x40000000, INTC_INTMSKCLR1); 706 register_intc_controller(&intc_desc_irl4567); 707 break; 708 case IRQ_MODE_IRL3210_MASK: 709 /* enable IRL0-3 and mask using cpu intc controller */ 710 __raw_writel(0x80000000, INTC_INTMSKCLR1); 711 register_intc_controller(&intc_desc_irl0123); 712 break; 713 default: 714 BUG(); 715 } 716 } 717 718 void __init plat_mem_setup(void) 719 { 720 /* Register the URAM space as Node 1 */ 721 setup_bootmem_node(1, 0xe55f0000, 0xe5610000); 722 } 723