1/* 2 * Bock-W board support 3 * 4 * Copyright (C) 2013-2014 Renesas Solutions Corp. 5 * Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 6 * Copyright (C) 2013-2014 Cogent Embedded, Inc. 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 18#include <linux/mfd/tmio.h> 19#include <linux/mmc/host.h> 20#include <linux/mmc/sh_mobile_sdhi.h> 21#include <linux/mmc/sh_mmcif.h> 22#include <linux/mtd/partitions.h> 23#include <linux/pinctrl/machine.h> 24#include <linux/platform_data/camera-rcar.h> 25#include <linux/platform_data/usb-rcar-phy.h> 26#include <linux/platform_device.h> 27#include <linux/regulator/fixed.h> 28#include <linux/regulator/machine.h> 29#include <linux/smsc911x.h> 30#include <linux/spi/spi.h> 31#include <linux/spi/flash.h> 32#include <linux/usb/renesas_usbhs.h> 33 34#include <media/soc_camera.h> 35#include <asm/mach/arch.h> 36#include <sound/rcar_snd.h> 37#include <sound/simple_card.h> 38 39#include "common.h" 40#include "irqs.h" 41#include "r8a7778.h" 42 43#define FPGA 0x18200000 44#define IRQ0MR 0x30 45#define COMCTLR 0x101c 46static void __iomem *fpga; 47 48/* 49 * CN9(Upper side) SCIF/RCAN selection 50 * 51 * 1,4 3,6 52 * SW40 SCIF RCAN 53 * SW41 SCIF RCAN 54 */ 55 56/* 57 * MMC (CN26) pin 58 * 59 * SW6 (D2) 3 pin 60 * SW7 (D5) ON 61 * SW8 (D3) 3 pin 62 * SW10 (D4) 1 pin 63 * SW12 (CLK) 1 pin 64 * SW13 (D6) 3 pin 65 * SW14 (CMD) ON 66 * SW15 (D6) 1 pin 67 * SW16 (D0) ON 68 * SW17 (D1) ON 69 * SW18 (D7) 3 pin 70 * SW19 (MMC) 1 pin 71 */ 72 73/* 74 * SSI settings 75 * 76 * SW45: 1-4 side (SSI5 out, ROUT/LOUT CN19 Mid) 77 * SW46: 1101 (SSI6 Recorde) 78 * SW47: 1110 (SSI5 Playback) 79 * SW48: 11 (Recorde power) 80 * SW49: 1 (SSI slave mode) 81 * SW50: 1111 (SSI7, SSI8) 82 * SW51: 1111 (SSI3, SSI4) 83 * SW54: 1pin (ak4554 FPGA control) 84 * SW55: 1 (CLKB is 24.5760MHz) 85 * SW60: 1pin (ak4554 FPGA control) 86 * SW61: 3pin (use X11 clock) 87 * SW78: 3-6 (ak4642 connects I2C0) 88 * 89 * You can use sound as 90 * 91 * hw0: CN19: SSI56-AK4643 92 * hw1: CN21: SSI3-AK4554(playback) 93 * hw2: CN21: SSI4-AK4554(capture) 94 * hw3: CN20: SSI7-AK4554(playback) 95 * hw4: CN20: SSI8-AK4554(capture) 96 * 97 * this command is required when playback on hw0. 98 * 99 * # amixer set "LINEOUT Mixer DACL" on 100 */ 101 102/* 103 * USB 104 * 105 * USB1 (CN29) can be Host/Function 106 * 107 * Host Func 108 * SW98 1 2 109 * SW99 1 3 110 */ 111 112/* Dummy supplies, where voltage doesn't matter */ 113static struct regulator_consumer_supply dummy_supplies[] = { 114 REGULATOR_SUPPLY("vddvario", "smsc911x"), 115 REGULATOR_SUPPLY("vdd33a", "smsc911x"), 116}; 117 118static struct regulator_consumer_supply fixed3v3_power_consumers[] = { 119 REGULATOR_SUPPLY("vmmc", "sh_mmcif"), 120 REGULATOR_SUPPLY("vqmmc", "sh_mmcif"), 121}; 122 123static struct smsc911x_platform_config smsc911x_data __initdata = { 124 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, 125 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, 126 .flags = SMSC911X_USE_32BIT, 127 .phy_interface = PHY_INTERFACE_MODE_MII, 128}; 129 130static struct resource smsc911x_resources[] __initdata = { 131 DEFINE_RES_MEM(0x18300000, 0x1000), 132 DEFINE_RES_IRQ(irq_pin(0)), /* IRQ 0 */ 133}; 134 135#if IS_ENABLED(CONFIG_USB_RENESAS_USBHS_UDC) 136/* 137 * When USB1 is Func 138 */ 139static int usbhsf_get_id(struct platform_device *pdev) 140{ 141 return USBHS_GADGET; 142} 143 144#define SUSPMODE 0x102 145static int usbhsf_power_ctrl(struct platform_device *pdev, 146 void __iomem *base, int enable) 147{ 148 enable = !!enable; 149 150 r8a7778_usb_phy_power(enable); 151 152 iowrite16(enable << 14, base + SUSPMODE); 153 154 return 0; 155} 156 157static struct resource usbhsf_resources[] __initdata = { 158 DEFINE_RES_MEM(0xffe60000, 0x110), 159 DEFINE_RES_IRQ(gic_iid(0x4f)), 160}; 161 162static struct renesas_usbhs_platform_info usbhs_info __initdata = { 163 .platform_callback = { 164 .get_id = usbhsf_get_id, 165 .power_ctrl = usbhsf_power_ctrl, 166 }, 167 .driver_param = { 168 .buswait_bwait = 4, 169 .d0_tx_id = HPBDMA_SLAVE_USBFUNC_TX, 170 .d1_rx_id = HPBDMA_SLAVE_USBFUNC_RX, 171 }, 172}; 173 174#define USB_PHY_SETTING {.port1_func = 1, .ovc_pin[1].active_high = 1,} 175#define USB1_DEVICE "renesas_usbhs" 176#define ADD_USB_FUNC_DEVICE_IF_POSSIBLE() \ 177 platform_device_register_resndata( \ 178 NULL, "renesas_usbhs", -1, \ 179 usbhsf_resources, \ 180 ARRAY_SIZE(usbhsf_resources), \ 181 &usbhs_info, sizeof(struct renesas_usbhs_platform_info)) 182 183#else 184/* 185 * When USB1 is Host 186 */ 187#define USB_PHY_SETTING { } 188#define USB1_DEVICE "ehci-platform" 189#define ADD_USB_FUNC_DEVICE_IF_POSSIBLE() 190 191#endif 192 193/* USB */ 194static struct resource usb_phy_resources[] __initdata = { 195 DEFINE_RES_MEM(0xffe70800, 0x100), 196 DEFINE_RES_MEM(0xffe76000, 0x100), 197}; 198 199static struct rcar_phy_platform_data usb_phy_platform_data __initdata = 200 USB_PHY_SETTING; 201 202 203/* SDHI */ 204static struct tmio_mmc_data sdhi0_info __initdata = { 205 .chan_priv_tx = (void *)HPBDMA_SLAVE_SDHI0_TX, 206 .chan_priv_rx = (void *)HPBDMA_SLAVE_SDHI0_RX, 207 .capabilities = MMC_CAP_SD_HIGHSPEED, 208 .ocr_mask = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, 209 .flags = TMIO_MMC_HAS_IDLE_WAIT, 210}; 211 212static struct resource sdhi0_resources[] __initdata = { 213 DEFINE_RES_MEM(0xFFE4C000, 0x100), 214 DEFINE_RES_IRQ(gic_iid(0x77)), 215}; 216 217/* Ether */ 218static struct resource ether_resources[] __initdata = { 219 DEFINE_RES_MEM(0xfde00000, 0x400), 220 DEFINE_RES_IRQ(gic_iid(0x89)), 221}; 222 223static struct sh_eth_plat_data ether_platform_data __initdata = { 224 .phy = 0x01, 225 .edmac_endian = EDMAC_LITTLE_ENDIAN, 226 .phy_interface = PHY_INTERFACE_MODE_RMII, 227 /* 228 * Although the LINK signal is available on the board, it's connected to 229 * the link/activity LED output of the PHY, thus the link disappears and 230 * reappears after each packet. We'd be better off ignoring such signal 231 * and getting the link state from the PHY indirectly. 232 */ 233 .no_ether_link = 1, 234}; 235 236static struct platform_device_info ether_info __initdata = { 237 .name = "r8a777x-ether", 238 .id = -1, 239 .res = ether_resources, 240 .num_res = ARRAY_SIZE(ether_resources), 241 .data = ðer_platform_data, 242 .size_data = sizeof(ether_platform_data), 243 .dma_mask = DMA_BIT_MASK(32), 244}; 245 246/* I2C */ 247static struct i2c_board_info i2c0_devices[] = { 248 { 249 I2C_BOARD_INFO("rx8581", 0x51), 250 }, { 251 I2C_BOARD_INFO("ak4643", 0x12), 252 } 253}; 254 255/* HSPI*/ 256static struct mtd_partition m25p80_spi_flash_partitions[] = { 257 { 258 .name = "data(spi)", 259 .size = 0x0100000, 260 .offset = 0, 261 }, 262}; 263 264static struct flash_platform_data spi_flash_data = { 265 .name = "m25p80", 266 .type = "s25fl008k", 267 .parts = m25p80_spi_flash_partitions, 268 .nr_parts = ARRAY_SIZE(m25p80_spi_flash_partitions), 269}; 270 271static struct spi_board_info spi_board_info[] __initdata = { 272 { 273 .modalias = "m25p80", 274 .max_speed_hz = 104000000, 275 .chip_select = 0, 276 .bus_num = 0, 277 .mode = SPI_MODE_0, 278 .platform_data = &spi_flash_data, 279 }, 280}; 281 282/* MMC */ 283static struct resource mmc_resources[] __initdata = { 284 DEFINE_RES_MEM(0xffe4e000, 0x100), 285 DEFINE_RES_IRQ(gic_iid(0x5d)), 286}; 287 288static struct sh_mmcif_plat_data sh_mmcif_plat __initdata = { 289 .sup_pclk = 0, 290 .caps = MMC_CAP_4_BIT_DATA | 291 MMC_CAP_8_BIT_DATA | 292 MMC_CAP_NEEDS_POLL, 293}; 294 295/* In the default configuration both decoders reside on I2C bus 0 */ 296#define BOCKW_CAMERA(idx) \ 297static struct i2c_board_info camera##idx##_info = { \ 298 I2C_BOARD_INFO("ml86v7667", 0x41 + 2 * (idx)), \ 299}; \ 300 \ 301static struct soc_camera_link iclink##idx##_ml86v7667 __initdata = { \ 302 .bus_id = idx, \ 303 .i2c_adapter_id = 0, \ 304 .board_info = &camera##idx##_info, \ 305} 306 307BOCKW_CAMERA(0); 308BOCKW_CAMERA(1); 309 310/* VIN */ 311static struct rcar_vin_platform_data vin_platform_data __initdata = { 312 .flags = RCAR_VIN_BT656, 313}; 314 315#define R8A7778_VIN(idx) \ 316static struct resource vin##idx##_resources[] __initdata = { \ 317 DEFINE_RES_MEM(0xffc50000 + 0x1000 * (idx), 0x1000), \ 318 DEFINE_RES_IRQ(gic_iid(0x5a)), \ 319}; \ 320 \ 321static struct platform_device_info vin##idx##_info __initdata = { \ 322 .name = "r8a7778-vin", \ 323 .id = idx, \ 324 .res = vin##idx##_resources, \ 325 .num_res = ARRAY_SIZE(vin##idx##_resources), \ 326 .dma_mask = DMA_BIT_MASK(32), \ 327 .data = &vin_platform_data, \ 328 .size_data = sizeof(vin_platform_data), \ 329} 330R8A7778_VIN(0); 331R8A7778_VIN(1); 332 333/* Sound */ 334static struct resource rsnd_resources[] __initdata = { 335 [RSND_GEN1_SRU] = DEFINE_RES_MEM(0xffd90000, 0x1000), 336 [RSND_GEN1_SSI] = DEFINE_RES_MEM(0xffd91000, 0x1240), 337 [RSND_GEN1_ADG] = DEFINE_RES_MEM(0xfffe0000, 0x24), 338}; 339 340static struct rsnd_ssi_platform_info rsnd_ssi[] = { 341 RSND_SSI_UNUSED, /* SSI 0 */ 342 RSND_SSI_UNUSED, /* SSI 1 */ 343 RSND_SSI_UNUSED, /* SSI 2 */ 344 RSND_SSI(HPBDMA_SLAVE_HPBIF3_TX, gic_iid(0x85), 0), 345 RSND_SSI(HPBDMA_SLAVE_HPBIF4_RX, gic_iid(0x85), RSND_SSI_CLK_PIN_SHARE), 346 RSND_SSI(HPBDMA_SLAVE_HPBIF5_TX, gic_iid(0x86), 0), 347 RSND_SSI(HPBDMA_SLAVE_HPBIF6_RX, gic_iid(0x86), 0), 348 RSND_SSI(HPBDMA_SLAVE_HPBIF7_TX, gic_iid(0x86), 0), 349 RSND_SSI(HPBDMA_SLAVE_HPBIF8_RX, gic_iid(0x86), RSND_SSI_CLK_PIN_SHARE), 350}; 351 352static struct rsnd_src_platform_info rsnd_src[9] = { 353 RSND_SRC_UNUSED, /* SRU 0 */ 354 RSND_SRC_UNUSED, /* SRU 1 */ 355 RSND_SRC_UNUSED, /* SRU 2 */ 356 RSND_SRC(0, 0), 357 RSND_SRC(0, 0), 358 RSND_SRC(0, 0), 359 RSND_SRC(0, 0), 360 RSND_SRC(0, 0), 361 RSND_SRC(0, 0), 362}; 363 364static struct rsnd_dai_platform_info rsnd_dai[] = { 365 { 366 .playback = { .ssi = &rsnd_ssi[5], .src = &rsnd_src[5] }, 367 .capture = { .ssi = &rsnd_ssi[6], .src = &rsnd_src[6] }, 368 }, { 369 .playback = { .ssi = &rsnd_ssi[3], .src = &rsnd_src[3] }, 370 }, { 371 .capture = { .ssi = &rsnd_ssi[4], .src = &rsnd_src[4] }, 372 }, { 373 .playback = { .ssi = &rsnd_ssi[7], .src = &rsnd_src[7] }, 374 }, { 375 .capture = { .ssi = &rsnd_ssi[8], .src = &rsnd_src[8] }, 376 }, 377}; 378 379enum { 380 AK4554_34 = 0, 381 AK4643_56, 382 AK4554_78, 383 SOUND_MAX, 384}; 385 386static int rsnd_codec_power(int id, int enable) 387{ 388 static int sound_user[SOUND_MAX] = {0, 0, 0}; 389 int *usr = NULL; 390 u32 bit; 391 392 switch (id) { 393 case 3: 394 case 4: 395 usr = sound_user + AK4554_34; 396 bit = (1 << 10); 397 break; 398 case 5: 399 case 6: 400 usr = sound_user + AK4643_56; 401 bit = (1 << 6); 402 break; 403 case 7: 404 case 8: 405 usr = sound_user + AK4554_78; 406 bit = (1 << 7); 407 break; 408 } 409 410 if (!usr) 411 return -EIO; 412 413 if (enable) { 414 if (*usr == 0) { 415 u32 val = ioread16(fpga + COMCTLR); 416 val &= ~bit; 417 iowrite16(val, fpga + COMCTLR); 418 } 419 420 (*usr)++; 421 } else { 422 if (*usr == 0) 423 return 0; 424 425 (*usr)--; 426 427 if (*usr == 0) { 428 u32 val = ioread16(fpga + COMCTLR); 429 val |= bit; 430 iowrite16(val, fpga + COMCTLR); 431 } 432 } 433 434 return 0; 435} 436 437static int rsnd_start(int id) 438{ 439 return rsnd_codec_power(id, 1); 440} 441 442static int rsnd_stop(int id) 443{ 444 return rsnd_codec_power(id, 0); 445} 446 447static struct rcar_snd_info rsnd_info = { 448 .flags = RSND_GEN1, 449 .ssi_info = rsnd_ssi, 450 .ssi_info_nr = ARRAY_SIZE(rsnd_ssi), 451 .src_info = rsnd_src, 452 .src_info_nr = ARRAY_SIZE(rsnd_src), 453 .dai_info = rsnd_dai, 454 .dai_info_nr = ARRAY_SIZE(rsnd_dai), 455 .start = rsnd_start, 456 .stop = rsnd_stop, 457}; 458 459static struct asoc_simple_card_info rsnd_card_info[] = { 460 /* SSI5, SSI6 */ 461 { 462 .name = "AK4643", 463 .card = "SSI56-AK4643", 464 .codec = "ak4642-codec.0-0012", 465 .platform = "rcar_sound", 466 .daifmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBM_CFM, 467 .cpu_dai = { 468 .name = "rsnd-dai.0", 469 }, 470 .codec_dai = { 471 .name = "ak4642-hifi", 472 .sysclk = 11289600, 473 }, 474 }, 475 /* SSI3 */ 476 { 477 .name = "AK4554", 478 .card = "SSI3-AK4554(playback)", 479 .codec = "ak4554-adc-dac.0", 480 .platform = "rcar_sound", 481 .daifmt = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_RIGHT_J, 482 .cpu_dai = { 483 .name = "rsnd-dai.1", 484 }, 485 .codec_dai = { 486 .name = "ak4554-hifi", 487 }, 488 }, 489 /* SSI4 */ 490 { 491 .name = "AK4554", 492 .card = "SSI4-AK4554(capture)", 493 .codec = "ak4554-adc-dac.0", 494 .platform = "rcar_sound", 495 .daifmt = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_LEFT_J, 496 .cpu_dai = { 497 .name = "rsnd-dai.2", 498 }, 499 .codec_dai = { 500 .name = "ak4554-hifi", 501 }, 502 }, 503 /* SSI7 */ 504 { 505 .name = "AK4554", 506 .card = "SSI7-AK4554(playback)", 507 .codec = "ak4554-adc-dac.1", 508 .platform = "rcar_sound", 509 .daifmt = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_RIGHT_J, 510 .cpu_dai = { 511 .name = "rsnd-dai.3", 512 }, 513 .codec_dai = { 514 .name = "ak4554-hifi", 515 }, 516 }, 517 /* SSI8 */ 518 { 519 .name = "AK4554", 520 .card = "SSI8-AK4554(capture)", 521 .codec = "ak4554-adc-dac.1", 522 .platform = "rcar_sound", 523 .daifmt = SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_LEFT_J, 524 .cpu_dai = { 525 .name = "rsnd-dai.4", 526 }, 527 .codec_dai = { 528 .name = "ak4554-hifi", 529 }, 530 } 531}; 532 533static const struct pinctrl_map bockw_pinctrl_map[] = { 534 /* AUDIO */ 535 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 536 "audio_clk_a", "audio_clk"), 537 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 538 "audio_clk_b", "audio_clk"), 539 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 540 "ssi34_ctrl", "ssi"), 541 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 542 "ssi3_data", "ssi"), 543 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 544 "ssi4_data", "ssi"), 545 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 546 "ssi5_ctrl", "ssi"), 547 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 548 "ssi5_data", "ssi"), 549 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 550 "ssi6_ctrl", "ssi"), 551 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 552 "ssi6_data", "ssi"), 553 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 554 "ssi78_ctrl", "ssi"), 555 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 556 "ssi7_data", "ssi"), 557 PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", 558 "ssi8_data", "ssi"), 559 /* Ether */ 560 PIN_MAP_MUX_GROUP_DEFAULT("r8a777x-ether", "pfc-r8a7778", 561 "ether_rmii", "ether"), 562 /* HSPI0 */ 563 PIN_MAP_MUX_GROUP_DEFAULT("sh-hspi.0", "pfc-r8a7778", 564 "hspi0_a", "hspi0"), 565 /* MMC */ 566 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif", "pfc-r8a7778", 567 "mmc_data8", "mmc"), 568 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif", "pfc-r8a7778", 569 "mmc_ctrl", "mmc"), 570 /* SCIF0 */ 571 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a7778", 572 "scif0_data_a", "scif0"), 573 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a7778", 574 "scif0_ctrl", "scif0"), 575 /* USB */ 576 PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778", 577 "usb0", "usb0"), 578 PIN_MAP_MUX_GROUP_DEFAULT(USB1_DEVICE, "pfc-r8a7778", 579 "usb1", "usb1"), 580 /* SDHI0 */ 581 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778", 582 "sdhi0_data4", "sdhi0"), 583 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778", 584 "sdhi0_ctrl", "sdhi0"), 585 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778", 586 "sdhi0_cd", "sdhi0"), 587 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778", 588 "sdhi0_wp", "sdhi0"), 589 /* VIN0 */ 590 PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.0", "pfc-r8a7778", 591 "vin0_clk", "vin0"), 592 PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.0", "pfc-r8a7778", 593 "vin0_data8", "vin0"), 594 /* VIN1 */ 595 PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.1", "pfc-r8a7778", 596 "vin1_clk", "vin1"), 597 PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.1", "pfc-r8a7778", 598 "vin1_data8", "vin1"), 599}; 600 601#define PFC 0xfffc0000 602#define PUPR4 0x110 603static void __init bockw_init(void) 604{ 605 void __iomem *base; 606 struct clk *clk; 607 struct platform_device *pdev; 608 int i; 609 610 r8a7778_clock_init(); 611 r8a7778_init_irq_extpin(1); 612 r8a7778_add_standard_devices(); 613 614 platform_device_register_full(ðer_info); 615 616 platform_device_register_full(&vin0_info); 617 /* VIN1 has a pin conflict with Ether */ 618 if (!IS_ENABLED(CONFIG_SH_ETH)) 619 platform_device_register_full(&vin1_info); 620 platform_device_register_data(NULL, "soc-camera-pdrv", 0, 621 &iclink0_ml86v7667, 622 sizeof(iclink0_ml86v7667)); 623 platform_device_register_data(NULL, "soc-camera-pdrv", 1, 624 &iclink1_ml86v7667, 625 sizeof(iclink1_ml86v7667)); 626 627 i2c_register_board_info(0, i2c0_devices, 628 ARRAY_SIZE(i2c0_devices)); 629 spi_register_board_info(spi_board_info, 630 ARRAY_SIZE(spi_board_info)); 631 pinctrl_register_mappings(bockw_pinctrl_map, 632 ARRAY_SIZE(bockw_pinctrl_map)); 633 r8a7778_pinmux_init(); 634 635 platform_device_register_resndata( 636 NULL, "sh_mmcif", -1, 637 mmc_resources, ARRAY_SIZE(mmc_resources), 638 &sh_mmcif_plat, sizeof(struct sh_mmcif_plat_data)); 639 640 platform_device_register_resndata( 641 NULL, "rcar_usb_phy", -1, 642 usb_phy_resources, 643 ARRAY_SIZE(usb_phy_resources), 644 &usb_phy_platform_data, 645 sizeof(struct rcar_phy_platform_data)); 646 647 regulator_register_fixed(0, dummy_supplies, 648 ARRAY_SIZE(dummy_supplies)); 649 regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers, 650 ARRAY_SIZE(fixed3v3_power_consumers), 3300000); 651 652 /* for SMSC */ 653 fpga = ioremap_nocache(FPGA, SZ_1M); 654 if (fpga) { 655 /* 656 * CAUTION 657 * 658 * IRQ0/1 is cascaded interrupt from FPGA. 659 * it should be cared in the future 660 * Now, it is assuming IRQ0 was used only from SMSC. 661 */ 662 u16 val = ioread16(fpga + IRQ0MR); 663 val &= ~(1 << 4); /* enable SMSC911x */ 664 iowrite16(val, fpga + IRQ0MR); 665 666 platform_device_register_resndata( 667 NULL, "smsc911x", -1, 668 smsc911x_resources, ARRAY_SIZE(smsc911x_resources), 669 &smsc911x_data, sizeof(smsc911x_data)); 670 } 671 672 /* for SDHI */ 673 base = ioremap_nocache(PFC, 0x200); 674 if (base) { 675 /* 676 * FIXME 677 * 678 * SDHI CD/WP pin needs pull-up 679 */ 680 iowrite32(ioread32(base + PUPR4) | (3 << 26), base + PUPR4); 681 iounmap(base); 682 683 platform_device_register_resndata( 684 NULL, "sh_mobile_sdhi", 0, 685 sdhi0_resources, ARRAY_SIZE(sdhi0_resources), 686 &sdhi0_info, sizeof(struct tmio_mmc_data)); 687 } 688 689 /* for Audio */ 690 rsnd_codec_power(5, 1); /* enable ak4642 */ 691 692 platform_device_register_simple( 693 "ak4554-adc-dac", 0, NULL, 0); 694 695 platform_device_register_simple( 696 "ak4554-adc-dac", 1, NULL, 0); 697 698 pdev = platform_device_register_resndata( 699 NULL, "rcar_sound", -1, 700 rsnd_resources, ARRAY_SIZE(rsnd_resources), 701 &rsnd_info, sizeof(rsnd_info)); 702 703 clk = clk_get(&pdev->dev, "clk_b"); 704 clk_set_rate(clk, 24576000); 705 clk_put(clk); 706 707 for (i = 0; i < ARRAY_SIZE(rsnd_card_info); i++) { 708 struct platform_device_info cardinfo = { 709 .name = "asoc-simple-card", 710 .id = i, 711 .data = &rsnd_card_info[i], 712 .size_data = sizeof(struct asoc_simple_card_info), 713 .dma_mask = DMA_BIT_MASK(32), 714 }; 715 716 platform_device_register_full(&cardinfo); 717 } 718} 719 720static void __init bockw_init_late(void) 721{ 722 r8a7778_init_late(); 723 ADD_USB_FUNC_DEVICE_IF_POSSIBLE(); 724} 725 726static const char *bockw_boards_compat_dt[] __initdata = { 727 "renesas,bockw", 728 NULL, 729}; 730 731DT_MACHINE_START(BOCKW_DT, "bockw") 732 .init_early = shmobile_init_delay, 733 .init_irq = r8a7778_init_irq_dt, 734 .init_machine = bockw_init, 735 .dt_compat = bockw_boards_compat_dt, 736 .init_late = bockw_init_late, 737MACHINE_END 738