1/* 2 * sh73a0 processor support 3 * 4 * Copyright (C) 2010 Takashi Yoshii 5 * Copyright (C) 2010 Magnus Damm 6 * Copyright (C) 2008 Yoshihiro Shimoda 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; version 2 of the License. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21#include <linux/kernel.h> 22#include <linux/init.h> 23#include <linux/interrupt.h> 24#include <linux/irq.h> 25#include <linux/platform_device.h> 26#include <linux/delay.h> 27#include <linux/input.h> 28#include <linux/io.h> 29#include <linux/serial_sci.h> 30#include <linux/sh_dma.h> 31#include <linux/sh_intc.h> 32#include <linux/sh_timer.h> 33#include <mach/hardware.h> 34#include <mach/irqs.h> 35#include <mach/sh73a0.h> 36#include <mach/common.h> 37#include <asm/mach-types.h> 38#include <asm/mach/map.h> 39#include <asm/mach/arch.h> 40#include <asm/mach/time.h> 41 42static struct map_desc sh73a0_io_desc[] __initdata = { 43 /* create a 1:1 entity map for 0xe6xxxxxx 44 * used by CPGA, INTC and PFC. 45 */ 46 { 47 .virtual = 0xe6000000, 48 .pfn = __phys_to_pfn(0xe6000000), 49 .length = 256 << 20, 50 .type = MT_DEVICE_NONSHARED 51 }, 52}; 53 54void __init sh73a0_map_io(void) 55{ 56 iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc)); 57} 58 59static struct plat_sci_port scif0_platform_data = { 60 .mapbase = 0xe6c40000, 61 .flags = UPF_BOOT_AUTOCONF, 62 .scscr = SCSCR_RE | SCSCR_TE, 63 .scbrr_algo_id = SCBRR_ALGO_4, 64 .type = PORT_SCIFA, 65 .irqs = { gic_spi(72), gic_spi(72), 66 gic_spi(72), gic_spi(72) }, 67}; 68 69static struct platform_device scif0_device = { 70 .name = "sh-sci", 71 .id = 0, 72 .dev = { 73 .platform_data = &scif0_platform_data, 74 }, 75}; 76 77static struct plat_sci_port scif1_platform_data = { 78 .mapbase = 0xe6c50000, 79 .flags = UPF_BOOT_AUTOCONF, 80 .scscr = SCSCR_RE | SCSCR_TE, 81 .scbrr_algo_id = SCBRR_ALGO_4, 82 .type = PORT_SCIFA, 83 .irqs = { gic_spi(73), gic_spi(73), 84 gic_spi(73), gic_spi(73) }, 85}; 86 87static struct platform_device scif1_device = { 88 .name = "sh-sci", 89 .id = 1, 90 .dev = { 91 .platform_data = &scif1_platform_data, 92 }, 93}; 94 95static struct plat_sci_port scif2_platform_data = { 96 .mapbase = 0xe6c60000, 97 .flags = UPF_BOOT_AUTOCONF, 98 .scscr = SCSCR_RE | SCSCR_TE, 99 .scbrr_algo_id = SCBRR_ALGO_4, 100 .type = PORT_SCIFA, 101 .irqs = { gic_spi(74), gic_spi(74), 102 gic_spi(74), gic_spi(74) }, 103}; 104 105static struct platform_device scif2_device = { 106 .name = "sh-sci", 107 .id = 2, 108 .dev = { 109 .platform_data = &scif2_platform_data, 110 }, 111}; 112 113static struct plat_sci_port scif3_platform_data = { 114 .mapbase = 0xe6c70000, 115 .flags = UPF_BOOT_AUTOCONF, 116 .scscr = SCSCR_RE | SCSCR_TE, 117 .scbrr_algo_id = SCBRR_ALGO_4, 118 .type = PORT_SCIFA, 119 .irqs = { gic_spi(75), gic_spi(75), 120 gic_spi(75), gic_spi(75) }, 121}; 122 123static struct platform_device scif3_device = { 124 .name = "sh-sci", 125 .id = 3, 126 .dev = { 127 .platform_data = &scif3_platform_data, 128 }, 129}; 130 131static struct plat_sci_port scif4_platform_data = { 132 .mapbase = 0xe6c80000, 133 .flags = UPF_BOOT_AUTOCONF, 134 .scscr = SCSCR_RE | SCSCR_TE, 135 .scbrr_algo_id = SCBRR_ALGO_4, 136 .type = PORT_SCIFA, 137 .irqs = { gic_spi(78), gic_spi(78), 138 gic_spi(78), gic_spi(78) }, 139}; 140 141static struct platform_device scif4_device = { 142 .name = "sh-sci", 143 .id = 4, 144 .dev = { 145 .platform_data = &scif4_platform_data, 146 }, 147}; 148 149static struct plat_sci_port scif5_platform_data = { 150 .mapbase = 0xe6cb0000, 151 .flags = UPF_BOOT_AUTOCONF, 152 .scscr = SCSCR_RE | SCSCR_TE, 153 .scbrr_algo_id = SCBRR_ALGO_4, 154 .type = PORT_SCIFA, 155 .irqs = { gic_spi(79), gic_spi(79), 156 gic_spi(79), gic_spi(79) }, 157}; 158 159static struct platform_device scif5_device = { 160 .name = "sh-sci", 161 .id = 5, 162 .dev = { 163 .platform_data = &scif5_platform_data, 164 }, 165}; 166 167static struct plat_sci_port scif6_platform_data = { 168 .mapbase = 0xe6cc0000, 169 .flags = UPF_BOOT_AUTOCONF, 170 .scscr = SCSCR_RE | SCSCR_TE, 171 .scbrr_algo_id = SCBRR_ALGO_4, 172 .type = PORT_SCIFA, 173 .irqs = { gic_spi(156), gic_spi(156), 174 gic_spi(156), gic_spi(156) }, 175}; 176 177static struct platform_device scif6_device = { 178 .name = "sh-sci", 179 .id = 6, 180 .dev = { 181 .platform_data = &scif6_platform_data, 182 }, 183}; 184 185static struct plat_sci_port scif7_platform_data = { 186 .mapbase = 0xe6cd0000, 187 .flags = UPF_BOOT_AUTOCONF, 188 .scscr = SCSCR_RE | SCSCR_TE, 189 .scbrr_algo_id = SCBRR_ALGO_4, 190 .type = PORT_SCIFA, 191 .irqs = { gic_spi(143), gic_spi(143), 192 gic_spi(143), gic_spi(143) }, 193}; 194 195static struct platform_device scif7_device = { 196 .name = "sh-sci", 197 .id = 7, 198 .dev = { 199 .platform_data = &scif7_platform_data, 200 }, 201}; 202 203static struct plat_sci_port scif8_platform_data = { 204 .mapbase = 0xe6c30000, 205 .flags = UPF_BOOT_AUTOCONF, 206 .scscr = SCSCR_RE | SCSCR_TE, 207 .scbrr_algo_id = SCBRR_ALGO_4, 208 .type = PORT_SCIFB, 209 .irqs = { gic_spi(80), gic_spi(80), 210 gic_spi(80), gic_spi(80) }, 211}; 212 213static struct platform_device scif8_device = { 214 .name = "sh-sci", 215 .id = 8, 216 .dev = { 217 .platform_data = &scif8_platform_data, 218 }, 219}; 220 221static struct sh_timer_config cmt10_platform_data = { 222 .name = "CMT10", 223 .channel_offset = 0x10, 224 .timer_bit = 0, 225 .clockevent_rating = 125, 226 .clocksource_rating = 125, 227}; 228 229static struct resource cmt10_resources[] = { 230 [0] = { 231 .name = "CMT10", 232 .start = 0xe6138010, 233 .end = 0xe613801b, 234 .flags = IORESOURCE_MEM, 235 }, 236 [1] = { 237 .start = gic_spi(65), 238 .flags = IORESOURCE_IRQ, 239 }, 240}; 241 242static struct platform_device cmt10_device = { 243 .name = "sh_cmt", 244 .id = 10, 245 .dev = { 246 .platform_data = &cmt10_platform_data, 247 }, 248 .resource = cmt10_resources, 249 .num_resources = ARRAY_SIZE(cmt10_resources), 250}; 251 252/* TMU */ 253static struct sh_timer_config tmu00_platform_data = { 254 .name = "TMU00", 255 .channel_offset = 0x4, 256 .timer_bit = 0, 257 .clockevent_rating = 200, 258}; 259 260static struct resource tmu00_resources[] = { 261 [0] = { 262 .name = "TMU00", 263 .start = 0xfff60008, 264 .end = 0xfff60013, 265 .flags = IORESOURCE_MEM, 266 }, 267 [1] = { 268 .start = intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */ 269 .flags = IORESOURCE_IRQ, 270 }, 271}; 272 273static struct platform_device tmu00_device = { 274 .name = "sh_tmu", 275 .id = 0, 276 .dev = { 277 .platform_data = &tmu00_platform_data, 278 }, 279 .resource = tmu00_resources, 280 .num_resources = ARRAY_SIZE(tmu00_resources), 281}; 282 283static struct sh_timer_config tmu01_platform_data = { 284 .name = "TMU01", 285 .channel_offset = 0x10, 286 .timer_bit = 1, 287 .clocksource_rating = 200, 288}; 289 290static struct resource tmu01_resources[] = { 291 [0] = { 292 .name = "TMU01", 293 .start = 0xfff60014, 294 .end = 0xfff6001f, 295 .flags = IORESOURCE_MEM, 296 }, 297 [1] = { 298 .start = intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */ 299 .flags = IORESOURCE_IRQ, 300 }, 301}; 302 303static struct platform_device tmu01_device = { 304 .name = "sh_tmu", 305 .id = 1, 306 .dev = { 307 .platform_data = &tmu01_platform_data, 308 }, 309 .resource = tmu01_resources, 310 .num_resources = ARRAY_SIZE(tmu01_resources), 311}; 312 313static struct resource i2c0_resources[] = { 314 [0] = { 315 .name = "IIC0", 316 .start = 0xe6820000, 317 .end = 0xe6820425 - 1, 318 .flags = IORESOURCE_MEM, 319 }, 320 [1] = { 321 .start = gic_spi(167), 322 .end = gic_spi(170), 323 .flags = IORESOURCE_IRQ, 324 }, 325}; 326 327static struct resource i2c1_resources[] = { 328 [0] = { 329 .name = "IIC1", 330 .start = 0xe6822000, 331 .end = 0xe6822425 - 1, 332 .flags = IORESOURCE_MEM, 333 }, 334 [1] = { 335 .start = gic_spi(51), 336 .end = gic_spi(54), 337 .flags = IORESOURCE_IRQ, 338 }, 339}; 340 341static struct resource i2c2_resources[] = { 342 [0] = { 343 .name = "IIC2", 344 .start = 0xe6824000, 345 .end = 0xe6824425 - 1, 346 .flags = IORESOURCE_MEM, 347 }, 348 [1] = { 349 .start = gic_spi(171), 350 .end = gic_spi(174), 351 .flags = IORESOURCE_IRQ, 352 }, 353}; 354 355static struct resource i2c3_resources[] = { 356 [0] = { 357 .name = "IIC3", 358 .start = 0xe6826000, 359 .end = 0xe6826425 - 1, 360 .flags = IORESOURCE_MEM, 361 }, 362 [1] = { 363 .start = gic_spi(183), 364 .end = gic_spi(186), 365 .flags = IORESOURCE_IRQ, 366 }, 367}; 368 369static struct resource i2c4_resources[] = { 370 [0] = { 371 .name = "IIC4", 372 .start = 0xe6828000, 373 .end = 0xe6828425 - 1, 374 .flags = IORESOURCE_MEM, 375 }, 376 [1] = { 377 .start = gic_spi(187), 378 .end = gic_spi(190), 379 .flags = IORESOURCE_IRQ, 380 }, 381}; 382 383static struct platform_device i2c0_device = { 384 .name = "i2c-sh_mobile", 385 .id = 0, 386 .resource = i2c0_resources, 387 .num_resources = ARRAY_SIZE(i2c0_resources), 388}; 389 390static struct platform_device i2c1_device = { 391 .name = "i2c-sh_mobile", 392 .id = 1, 393 .resource = i2c1_resources, 394 .num_resources = ARRAY_SIZE(i2c1_resources), 395}; 396 397static struct platform_device i2c2_device = { 398 .name = "i2c-sh_mobile", 399 .id = 2, 400 .resource = i2c2_resources, 401 .num_resources = ARRAY_SIZE(i2c2_resources), 402}; 403 404static struct platform_device i2c3_device = { 405 .name = "i2c-sh_mobile", 406 .id = 3, 407 .resource = i2c3_resources, 408 .num_resources = ARRAY_SIZE(i2c3_resources), 409}; 410 411static struct platform_device i2c4_device = { 412 .name = "i2c-sh_mobile", 413 .id = 4, 414 .resource = i2c4_resources, 415 .num_resources = ARRAY_SIZE(i2c4_resources), 416}; 417 418/* Transmit sizes and respective CHCR register values */ 419enum { 420 XMIT_SZ_8BIT = 0, 421 XMIT_SZ_16BIT = 1, 422 XMIT_SZ_32BIT = 2, 423 XMIT_SZ_64BIT = 7, 424 XMIT_SZ_128BIT = 3, 425 XMIT_SZ_256BIT = 4, 426 XMIT_SZ_512BIT = 5, 427}; 428 429/* log2(size / 8) - used to calculate number of transfers */ 430#define TS_SHIFT { \ 431 [XMIT_SZ_8BIT] = 0, \ 432 [XMIT_SZ_16BIT] = 1, \ 433 [XMIT_SZ_32BIT] = 2, \ 434 [XMIT_SZ_64BIT] = 3, \ 435 [XMIT_SZ_128BIT] = 4, \ 436 [XMIT_SZ_256BIT] = 5, \ 437 [XMIT_SZ_512BIT] = 6, \ 438} 439 440#define TS_INDEX2VAL(i) ((((i) & 3) << 3) | (((i) & 0xc) << (20 - 2))) 441#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz))) 442#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz))) 443 444static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = { 445 { 446 .slave_id = SHDMA_SLAVE_SCIF0_TX, 447 .addr = 0xe6c40020, 448 .chcr = CHCR_TX(XMIT_SZ_8BIT), 449 .mid_rid = 0x21, 450 }, { 451 .slave_id = SHDMA_SLAVE_SCIF0_RX, 452 .addr = 0xe6c40024, 453 .chcr = CHCR_RX(XMIT_SZ_8BIT), 454 .mid_rid = 0x22, 455 }, { 456 .slave_id = SHDMA_SLAVE_SCIF1_TX, 457 .addr = 0xe6c50020, 458 .chcr = CHCR_TX(XMIT_SZ_8BIT), 459 .mid_rid = 0x25, 460 }, { 461 .slave_id = SHDMA_SLAVE_SCIF1_RX, 462 .addr = 0xe6c50024, 463 .chcr = CHCR_RX(XMIT_SZ_8BIT), 464 .mid_rid = 0x26, 465 }, { 466 .slave_id = SHDMA_SLAVE_SCIF2_TX, 467 .addr = 0xe6c60020, 468 .chcr = CHCR_TX(XMIT_SZ_8BIT), 469 .mid_rid = 0x29, 470 }, { 471 .slave_id = SHDMA_SLAVE_SCIF2_RX, 472 .addr = 0xe6c60024, 473 .chcr = CHCR_RX(XMIT_SZ_8BIT), 474 .mid_rid = 0x2a, 475 }, { 476 .slave_id = SHDMA_SLAVE_SCIF3_TX, 477 .addr = 0xe6c70020, 478 .chcr = CHCR_TX(XMIT_SZ_8BIT), 479 .mid_rid = 0x2d, 480 }, { 481 .slave_id = SHDMA_SLAVE_SCIF3_RX, 482 .addr = 0xe6c70024, 483 .chcr = CHCR_RX(XMIT_SZ_8BIT), 484 .mid_rid = 0x2e, 485 }, { 486 .slave_id = SHDMA_SLAVE_SCIF4_TX, 487 .addr = 0xe6c80020, 488 .chcr = CHCR_TX(XMIT_SZ_8BIT), 489 .mid_rid = 0x39, 490 }, { 491 .slave_id = SHDMA_SLAVE_SCIF4_RX, 492 .addr = 0xe6c80024, 493 .chcr = CHCR_RX(XMIT_SZ_8BIT), 494 .mid_rid = 0x3a, 495 }, { 496 .slave_id = SHDMA_SLAVE_SCIF5_TX, 497 .addr = 0xe6cb0020, 498 .chcr = CHCR_TX(XMIT_SZ_8BIT), 499 .mid_rid = 0x35, 500 }, { 501 .slave_id = SHDMA_SLAVE_SCIF5_RX, 502 .addr = 0xe6cb0024, 503 .chcr = CHCR_RX(XMIT_SZ_8BIT), 504 .mid_rid = 0x36, 505 }, { 506 .slave_id = SHDMA_SLAVE_SCIF6_TX, 507 .addr = 0xe6cc0020, 508 .chcr = CHCR_TX(XMIT_SZ_8BIT), 509 .mid_rid = 0x1d, 510 }, { 511 .slave_id = SHDMA_SLAVE_SCIF6_RX, 512 .addr = 0xe6cc0024, 513 .chcr = CHCR_RX(XMIT_SZ_8BIT), 514 .mid_rid = 0x1e, 515 }, { 516 .slave_id = SHDMA_SLAVE_SCIF7_TX, 517 .addr = 0xe6cd0020, 518 .chcr = CHCR_TX(XMIT_SZ_8BIT), 519 .mid_rid = 0x19, 520 }, { 521 .slave_id = SHDMA_SLAVE_SCIF7_RX, 522 .addr = 0xe6cd0024, 523 .chcr = CHCR_RX(XMIT_SZ_8BIT), 524 .mid_rid = 0x1a, 525 }, { 526 .slave_id = SHDMA_SLAVE_SCIF8_TX, 527 .addr = 0xe6c30040, 528 .chcr = CHCR_TX(XMIT_SZ_8BIT), 529 .mid_rid = 0x3d, 530 }, { 531 .slave_id = SHDMA_SLAVE_SCIF8_RX, 532 .addr = 0xe6c30060, 533 .chcr = CHCR_RX(XMIT_SZ_8BIT), 534 .mid_rid = 0x3e, 535 }, { 536 .slave_id = SHDMA_SLAVE_SDHI0_TX, 537 .addr = 0xee100030, 538 .chcr = CHCR_TX(XMIT_SZ_16BIT), 539 .mid_rid = 0xc1, 540 }, { 541 .slave_id = SHDMA_SLAVE_SDHI0_RX, 542 .addr = 0xee100030, 543 .chcr = CHCR_RX(XMIT_SZ_16BIT), 544 .mid_rid = 0xc2, 545 }, { 546 .slave_id = SHDMA_SLAVE_SDHI1_TX, 547 .addr = 0xee120030, 548 .chcr = CHCR_TX(XMIT_SZ_16BIT), 549 .mid_rid = 0xc9, 550 }, { 551 .slave_id = SHDMA_SLAVE_SDHI1_RX, 552 .addr = 0xee120030, 553 .chcr = CHCR_RX(XMIT_SZ_16BIT), 554 .mid_rid = 0xca, 555 }, { 556 .slave_id = SHDMA_SLAVE_SDHI2_TX, 557 .addr = 0xee140030, 558 .chcr = CHCR_TX(XMIT_SZ_16BIT), 559 .mid_rid = 0xcd, 560 }, { 561 .slave_id = SHDMA_SLAVE_SDHI2_RX, 562 .addr = 0xee140030, 563 .chcr = CHCR_RX(XMIT_SZ_16BIT), 564 .mid_rid = 0xce, 565 }, { 566 .slave_id = SHDMA_SLAVE_MMCIF_TX, 567 .addr = 0xe6bd0034, 568 .chcr = CHCR_TX(XMIT_SZ_32BIT), 569 .mid_rid = 0xd1, 570 }, { 571 .slave_id = SHDMA_SLAVE_MMCIF_RX, 572 .addr = 0xe6bd0034, 573 .chcr = CHCR_RX(XMIT_SZ_32BIT), 574 .mid_rid = 0xd2, 575 }, 576}; 577 578#define DMAE_CHANNEL(_offset) \ 579 { \ 580 .offset = _offset - 0x20, \ 581 .dmars = _offset - 0x20 + 0x40, \ 582 } 583 584static const struct sh_dmae_channel sh73a0_dmae_channels[] = { 585 DMAE_CHANNEL(0x8000), 586 DMAE_CHANNEL(0x8080), 587 DMAE_CHANNEL(0x8100), 588 DMAE_CHANNEL(0x8180), 589 DMAE_CHANNEL(0x8200), 590 DMAE_CHANNEL(0x8280), 591 DMAE_CHANNEL(0x8300), 592 DMAE_CHANNEL(0x8380), 593 DMAE_CHANNEL(0x8400), 594 DMAE_CHANNEL(0x8480), 595 DMAE_CHANNEL(0x8500), 596 DMAE_CHANNEL(0x8580), 597 DMAE_CHANNEL(0x8600), 598 DMAE_CHANNEL(0x8680), 599 DMAE_CHANNEL(0x8700), 600 DMAE_CHANNEL(0x8780), 601 DMAE_CHANNEL(0x8800), 602 DMAE_CHANNEL(0x8880), 603 DMAE_CHANNEL(0x8900), 604 DMAE_CHANNEL(0x8980), 605}; 606 607static const unsigned int ts_shift[] = TS_SHIFT; 608 609static struct sh_dmae_pdata sh73a0_dmae_platform_data = { 610 .slave = sh73a0_dmae_slaves, 611 .slave_num = ARRAY_SIZE(sh73a0_dmae_slaves), 612 .channel = sh73a0_dmae_channels, 613 .channel_num = ARRAY_SIZE(sh73a0_dmae_channels), 614 .ts_low_shift = 3, 615 .ts_low_mask = 0x18, 616 .ts_high_shift = (20 - 2), /* 2 bits for shifted low TS */ 617 .ts_high_mask = 0x00300000, 618 .ts_shift = ts_shift, 619 .ts_shift_num = ARRAY_SIZE(ts_shift), 620 .dmaor_init = DMAOR_DME, 621}; 622 623static struct resource sh73a0_dmae_resources[] = { 624 { 625 /* Registers including DMAOR and channels including DMARSx */ 626 .start = 0xfe000020, 627 .end = 0xfe008a00 - 1, 628 .flags = IORESOURCE_MEM, 629 }, 630 { 631 .name = "error_irq", 632 .start = gic_spi(129), 633 .end = gic_spi(129), 634 .flags = IORESOURCE_IRQ, 635 }, 636 { 637 /* IRQ for channels 0-19 */ 638 .start = gic_spi(109), 639 .end = gic_spi(128), 640 .flags = IORESOURCE_IRQ, 641 }, 642}; 643 644static struct platform_device dma0_device = { 645 .name = "sh-dma-engine", 646 .id = 0, 647 .resource = sh73a0_dmae_resources, 648 .num_resources = ARRAY_SIZE(sh73a0_dmae_resources), 649 .dev = { 650 .platform_data = &sh73a0_dmae_platform_data, 651 }, 652}; 653 654static struct platform_device *sh73a0_early_devices[] __initdata = { 655 &scif0_device, 656 &scif1_device, 657 &scif2_device, 658 &scif3_device, 659 &scif4_device, 660 &scif5_device, 661 &scif6_device, 662 &scif7_device, 663 &scif8_device, 664 &cmt10_device, 665 &tmu00_device, 666 &tmu01_device, 667}; 668 669static struct platform_device *sh73a0_late_devices[] __initdata = { 670 &i2c0_device, 671 &i2c1_device, 672 &i2c2_device, 673 &i2c3_device, 674 &i2c4_device, 675 &dma0_device, 676}; 677 678#define SRCR2 0xe61580b0 679 680void __init sh73a0_add_standard_devices(void) 681{ 682 /* Clear software reset bit on SY-DMAC module */ 683 __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2); 684 685 platform_add_devices(sh73a0_early_devices, 686 ARRAY_SIZE(sh73a0_early_devices)); 687 platform_add_devices(sh73a0_late_devices, 688 ARRAY_SIZE(sh73a0_late_devices)); 689} 690 691/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */ 692void __init __weak sh73a0_register_twd(void) { } 693 694static void __init sh73a0_earlytimer_init(void) 695{ 696 sh73a0_clock_init(); 697 shmobile_earlytimer_init(); 698 sh73a0_register_twd(); 699} 700 701void __init sh73a0_add_early_devices(void) 702{ 703 early_platform_add_devices(sh73a0_early_devices, 704 ARRAY_SIZE(sh73a0_early_devices)); 705 706 /* setup early console here as well */ 707 shmobile_setup_console(); 708 709 /* override timer setup with soc-specific code */ 710 shmobile_timer.init = sh73a0_earlytimer_init; 711} 712