diff options
Diffstat (limited to 'arch/arm/mach-shmobile/board-bockw.c')
-rw-r--r-- | arch/arm/mach-shmobile/board-bockw.c | 418 |
1 files changed, 400 insertions, 18 deletions
diff --git a/arch/arm/mach-shmobile/board-bockw.c b/arch/arm/mach-shmobile/board-bockw.c index 6b9faf3908f7..38611526fe9a 100644 --- a/arch/arm/mach-shmobile/board-bockw.c +++ b/arch/arm/mach-shmobile/board-bockw.c | |||
@@ -32,11 +32,19 @@ | |||
32 | #include <linux/smsc911x.h> | 32 | #include <linux/smsc911x.h> |
33 | #include <linux/spi/spi.h> | 33 | #include <linux/spi/spi.h> |
34 | #include <linux/spi/flash.h> | 34 | #include <linux/spi/flash.h> |
35 | #include <linux/usb/renesas_usbhs.h> | ||
35 | #include <media/soc_camera.h> | 36 | #include <media/soc_camera.h> |
36 | #include <mach/common.h> | 37 | #include <mach/common.h> |
37 | #include <mach/irqs.h> | 38 | #include <mach/irqs.h> |
38 | #include <mach/r8a7778.h> | 39 | #include <mach/r8a7778.h> |
39 | #include <asm/mach/arch.h> | 40 | #include <asm/mach/arch.h> |
41 | #include <sound/rcar_snd.h> | ||
42 | #include <sound/simple_card.h> | ||
43 | |||
44 | #define FPGA 0x18200000 | ||
45 | #define IRQ0MR 0x30 | ||
46 | #define COMCTLR 0x101c | ||
47 | static void __iomem *fpga; | ||
40 | 48 | ||
41 | /* | 49 | /* |
42 | * CN9(Upper side) SCIF/RCAN selection | 50 | * CN9(Upper side) SCIF/RCAN selection |
@@ -63,6 +71,45 @@ | |||
63 | * SW19 (MMC) 1 pin | 71 | * SW19 (MMC) 1 pin |
64 | */ | 72 | */ |
65 | 73 | ||
74 | /* | ||
75 | * SSI settings | ||
76 | * | ||
77 | * SW45: 1-4 side (SSI5 out, ROUT/LOUT CN19 Mid) | ||
78 | * SW46: 1101 (SSI6 Recorde) | ||
79 | * SW47: 1110 (SSI5 Playback) | ||
80 | * SW48: 11 (Recorde power) | ||
81 | * SW49: 1 (SSI slave mode) | ||
82 | * SW50: 1111 (SSI7, SSI8) | ||
83 | * SW51: 1111 (SSI3, SSI4) | ||
84 | * SW54: 1pin (ak4554 FPGA control) | ||
85 | * SW55: 1 (CLKB is 24.5760MHz) | ||
86 | * SW60: 1pin (ak4554 FPGA control) | ||
87 | * SW61: 3pin (use X11 clock) | ||
88 | * SW78: 3-6 (ak4642 connects I2C0) | ||
89 | * | ||
90 | * You can use sound as | ||
91 | * | ||
92 | * hw0: CN19: SSI56-AK4643 | ||
93 | * hw1: CN21: SSI3-AK4554(playback) | ||
94 | * hw2: CN21: SSI4-AK4554(capture) | ||
95 | * hw3: CN20: SSI7-AK4554(playback) | ||
96 | * hw4: CN20: SSI8-AK4554(capture) | ||
97 | * | ||
98 | * this command is required when playback on hw0. | ||
99 | * | ||
100 | * # amixer set "LINEOUT Mixer DACL" on | ||
101 | */ | ||
102 | |||
103 | /* | ||
104 | * USB | ||
105 | * | ||
106 | * USB1 (CN29) can be Host/Function | ||
107 | * | ||
108 | * Host Func | ||
109 | * SW98 1 2 | ||
110 | * SW99 1 3 | ||
111 | */ | ||
112 | |||
66 | /* Dummy supplies, where voltage doesn't matter */ | 113 | /* Dummy supplies, where voltage doesn't matter */ |
67 | static struct regulator_consumer_supply dummy_supplies[] = { | 114 | static struct regulator_consumer_supply dummy_supplies[] = { |
68 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | 115 | REGULATOR_SUPPLY("vddvario", "smsc911x"), |
@@ -81,16 +128,76 @@ static struct resource smsc911x_resources[] __initdata = { | |||
81 | DEFINE_RES_IRQ(irq_pin(0)), /* IRQ 0 */ | 128 | DEFINE_RES_IRQ(irq_pin(0)), /* IRQ 0 */ |
82 | }; | 129 | }; |
83 | 130 | ||
131 | #if IS_ENABLED(CONFIG_USB_RENESAS_USBHS_UDC) | ||
132 | /* | ||
133 | * When USB1 is Func | ||
134 | */ | ||
135 | static int usbhsf_get_id(struct platform_device *pdev) | ||
136 | { | ||
137 | return USBHS_GADGET; | ||
138 | } | ||
139 | |||
140 | #define SUSPMODE 0x102 | ||
141 | static int usbhsf_power_ctrl(struct platform_device *pdev, | ||
142 | void __iomem *base, int enable) | ||
143 | { | ||
144 | enable = !!enable; | ||
145 | |||
146 | r8a7778_usb_phy_power(enable); | ||
147 | |||
148 | iowrite16(enable << 14, base + SUSPMODE); | ||
149 | |||
150 | return 0; | ||
151 | } | ||
152 | |||
153 | static struct resource usbhsf_resources[] __initdata = { | ||
154 | DEFINE_RES_MEM(0xffe60000, 0x110), | ||
155 | DEFINE_RES_IRQ(gic_iid(0x4f)), | ||
156 | }; | ||
157 | |||
158 | static struct renesas_usbhs_platform_info usbhs_info __initdata = { | ||
159 | .platform_callback = { | ||
160 | .get_id = usbhsf_get_id, | ||
161 | .power_ctrl = usbhsf_power_ctrl, | ||
162 | }, | ||
163 | .driver_param = { | ||
164 | .buswait_bwait = 4, | ||
165 | }, | ||
166 | }; | ||
167 | |||
168 | #define USB_PHY_SETTING {.port1_func = 1, .ovc_pin[1].active_high = 1,} | ||
169 | #define USB1_DEVICE "renesas_usbhs" | ||
170 | #define ADD_USB_FUNC_DEVICE_IF_POSSIBLE() \ | ||
171 | platform_device_register_resndata( \ | ||
172 | &platform_bus, "renesas_usbhs", -1, \ | ||
173 | usbhsf_resources, \ | ||
174 | ARRAY_SIZE(usbhsf_resources), \ | ||
175 | &usbhs_info, sizeof(struct renesas_usbhs_platform_info)) | ||
176 | |||
177 | #else | ||
178 | /* | ||
179 | * When USB1 is Host | ||
180 | */ | ||
181 | #define USB_PHY_SETTING { } | ||
182 | #define USB1_DEVICE "ehci-platform" | ||
183 | #define ADD_USB_FUNC_DEVICE_IF_POSSIBLE() | ||
184 | |||
185 | #endif | ||
186 | |||
84 | /* USB */ | 187 | /* USB */ |
85 | static struct resource usb_phy_resources[] __initdata = { | 188 | static struct resource usb_phy_resources[] __initdata = { |
86 | DEFINE_RES_MEM(0xffe70800, 0x100), | 189 | DEFINE_RES_MEM(0xffe70800, 0x100), |
87 | DEFINE_RES_MEM(0xffe76000, 0x100), | 190 | DEFINE_RES_MEM(0xffe76000, 0x100), |
88 | }; | 191 | }; |
89 | 192 | ||
90 | static struct rcar_phy_platform_data usb_phy_platform_data __initdata; | 193 | static struct rcar_phy_platform_data usb_phy_platform_data __initdata = |
194 | USB_PHY_SETTING; | ||
195 | |||
91 | 196 | ||
92 | /* SDHI */ | 197 | /* SDHI */ |
93 | static struct sh_mobile_sdhi_info sdhi0_info __initdata = { | 198 | static struct sh_mobile_sdhi_info sdhi0_info __initdata = { |
199 | .dma_slave_tx = HPBDMA_SLAVE_SDHI0_TX, | ||
200 | .dma_slave_rx = HPBDMA_SLAVE_SDHI0_RX, | ||
94 | .tmio_caps = MMC_CAP_SD_HIGHSPEED, | 201 | .tmio_caps = MMC_CAP_SD_HIGHSPEED, |
95 | .tmio_ocr_mask = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, | 202 | .tmio_ocr_mask = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, |
96 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT, | 203 | .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT, |
@@ -101,6 +208,12 @@ static struct resource sdhi0_resources[] __initdata = { | |||
101 | DEFINE_RES_IRQ(gic_iid(0x77)), | 208 | DEFINE_RES_IRQ(gic_iid(0x77)), |
102 | }; | 209 | }; |
103 | 210 | ||
211 | /* Ether */ | ||
212 | static struct resource ether_resources[] __initdata = { | ||
213 | DEFINE_RES_MEM(0xfde00000, 0x400), | ||
214 | DEFINE_RES_IRQ(gic_iid(0x89)), | ||
215 | }; | ||
216 | |||
104 | static struct sh_eth_plat_data ether_platform_data __initdata = { | 217 | static struct sh_eth_plat_data ether_platform_data __initdata = { |
105 | .phy = 0x01, | 218 | .phy = 0x01, |
106 | .edmac_endian = EDMAC_LITTLE_ENDIAN, | 219 | .edmac_endian = EDMAC_LITTLE_ENDIAN, |
@@ -118,7 +231,9 @@ static struct sh_eth_plat_data ether_platform_data __initdata = { | |||
118 | static struct i2c_board_info i2c0_devices[] = { | 231 | static struct i2c_board_info i2c0_devices[] = { |
119 | { | 232 | { |
120 | I2C_BOARD_INFO("rx8581", 0x51), | 233 | I2C_BOARD_INFO("rx8581", 0x51), |
121 | }, | 234 | }, { |
235 | I2C_BOARD_INFO("ak4643", 0x12), | ||
236 | } | ||
122 | }; | 237 | }; |
123 | 238 | ||
124 | /* HSPI*/ | 239 | /* HSPI*/ |
@@ -162,10 +277,6 @@ static struct sh_mmcif_plat_data sh_mmcif_plat __initdata = { | |||
162 | MMC_CAP_NEEDS_POLL, | 277 | MMC_CAP_NEEDS_POLL, |
163 | }; | 278 | }; |
164 | 279 | ||
165 | static struct rcar_vin_platform_data vin_platform_data __initdata = { | ||
166 | .flags = RCAR_VIN_BT656, | ||
167 | }; | ||
168 | |||
169 | /* In the default configuration both decoders reside on I2C bus 0 */ | 280 | /* In the default configuration both decoders reside on I2C bus 0 */ |
170 | #define BOCKW_CAMERA(idx) \ | 281 | #define BOCKW_CAMERA(idx) \ |
171 | static struct i2c_board_info camera##idx##_info = { \ | 282 | static struct i2c_board_info camera##idx##_info = { \ |
@@ -181,7 +292,237 @@ static struct soc_camera_link iclink##idx##_ml86v7667 __initdata = { \ | |||
181 | BOCKW_CAMERA(0); | 292 | BOCKW_CAMERA(0); |
182 | BOCKW_CAMERA(1); | 293 | BOCKW_CAMERA(1); |
183 | 294 | ||
295 | /* VIN */ | ||
296 | static struct rcar_vin_platform_data vin_platform_data __initdata = { | ||
297 | .flags = RCAR_VIN_BT656, | ||
298 | }; | ||
299 | |||
300 | #define R8A7778_VIN(idx) \ | ||
301 | static struct resource vin##idx##_resources[] __initdata = { \ | ||
302 | DEFINE_RES_MEM(0xffc50000 + 0x1000 * (idx), 0x1000), \ | ||
303 | DEFINE_RES_IRQ(gic_iid(0x5a)), \ | ||
304 | }; \ | ||
305 | \ | ||
306 | static struct platform_device_info vin##idx##_info __initdata = { \ | ||
307 | .parent = &platform_bus, \ | ||
308 | .name = "r8a7778-vin", \ | ||
309 | .id = idx, \ | ||
310 | .res = vin##idx##_resources, \ | ||
311 | .num_res = ARRAY_SIZE(vin##idx##_resources), \ | ||
312 | .dma_mask = DMA_BIT_MASK(32), \ | ||
313 | .data = &vin_platform_data, \ | ||
314 | .size_data = sizeof(vin_platform_data), \ | ||
315 | } | ||
316 | R8A7778_VIN(0); | ||
317 | R8A7778_VIN(1); | ||
318 | |||
319 | /* Sound */ | ||
320 | static struct resource rsnd_resources[] __initdata = { | ||
321 | [RSND_GEN1_SRU] = DEFINE_RES_MEM(0xffd90000, 0x1000), | ||
322 | [RSND_GEN1_SSI] = DEFINE_RES_MEM(0xffd91000, 0x1240), | ||
323 | [RSND_GEN1_ADG] = DEFINE_RES_MEM(0xfffe0000, 0x24), | ||
324 | }; | ||
325 | |||
326 | static struct rsnd_ssi_platform_info rsnd_ssi[] = { | ||
327 | RSND_SSI_UNUSED, /* SSI 0 */ | ||
328 | RSND_SSI_UNUSED, /* SSI 1 */ | ||
329 | RSND_SSI_UNUSED, /* SSI 2 */ | ||
330 | RSND_SSI_SET(1, 0, gic_iid(0x85), RSND_SSI_PLAY), | ||
331 | RSND_SSI_SET(2, 0, gic_iid(0x85), RSND_SSI_CLK_PIN_SHARE | RSND_SSI_CLK_FROM_ADG), | ||
332 | RSND_SSI_SET(0, 0, gic_iid(0x86), RSND_SSI_PLAY), | ||
333 | RSND_SSI_SET(0, 0, gic_iid(0x86), 0), | ||
334 | RSND_SSI_SET(3, 0, gic_iid(0x86), RSND_SSI_PLAY), | ||
335 | RSND_SSI_SET(4, 0, gic_iid(0x86), RSND_SSI_CLK_PIN_SHARE | RSND_SSI_CLK_FROM_ADG), | ||
336 | }; | ||
337 | |||
338 | static struct rsnd_scu_platform_info rsnd_scu[9] = { | ||
339 | /* no member at this point */ | ||
340 | }; | ||
341 | |||
342 | enum { | ||
343 | AK4554_34 = 0, | ||
344 | AK4643_56, | ||
345 | AK4554_78, | ||
346 | SOUND_MAX, | ||
347 | }; | ||
348 | |||
349 | static int rsnd_codec_power(int id, int enable) | ||
350 | { | ||
351 | static int sound_user[SOUND_MAX] = {0, 0, 0}; | ||
352 | int *usr = NULL; | ||
353 | u32 bit; | ||
354 | |||
355 | switch (id) { | ||
356 | case 3: | ||
357 | case 4: | ||
358 | usr = sound_user + AK4554_34; | ||
359 | bit = (1 << 10); | ||
360 | break; | ||
361 | case 5: | ||
362 | case 6: | ||
363 | usr = sound_user + AK4643_56; | ||
364 | bit = (1 << 6); | ||
365 | break; | ||
366 | case 7: | ||
367 | case 8: | ||
368 | usr = sound_user + AK4554_78; | ||
369 | bit = (1 << 7); | ||
370 | break; | ||
371 | } | ||
372 | |||
373 | if (!usr) | ||
374 | return -EIO; | ||
375 | |||
376 | if (enable) { | ||
377 | if (*usr == 0) { | ||
378 | u32 val = ioread16(fpga + COMCTLR); | ||
379 | val &= ~bit; | ||
380 | iowrite16(val, fpga + COMCTLR); | ||
381 | } | ||
382 | |||
383 | (*usr)++; | ||
384 | } else { | ||
385 | if (*usr == 0) | ||
386 | return 0; | ||
387 | |||
388 | (*usr)--; | ||
389 | |||
390 | if (*usr == 0) { | ||
391 | u32 val = ioread16(fpga + COMCTLR); | ||
392 | val |= bit; | ||
393 | iowrite16(val, fpga + COMCTLR); | ||
394 | } | ||
395 | } | ||
396 | |||
397 | return 0; | ||
398 | } | ||
399 | |||
400 | static int rsnd_start(int id) | ||
401 | { | ||
402 | return rsnd_codec_power(id, 1); | ||
403 | } | ||
404 | |||
405 | static int rsnd_stop(int id) | ||
406 | { | ||
407 | return rsnd_codec_power(id, 0); | ||
408 | } | ||
409 | |||
410 | static struct rcar_snd_info rsnd_info = { | ||
411 | .flags = RSND_GEN1, | ||
412 | .ssi_info = rsnd_ssi, | ||
413 | .ssi_info_nr = ARRAY_SIZE(rsnd_ssi), | ||
414 | .scu_info = rsnd_scu, | ||
415 | .scu_info_nr = ARRAY_SIZE(rsnd_scu), | ||
416 | .start = rsnd_start, | ||
417 | .stop = rsnd_stop, | ||
418 | }; | ||
419 | |||
420 | static struct asoc_simple_card_info rsnd_card_info[] = { | ||
421 | /* SSI5, SSI6 */ | ||
422 | { | ||
423 | .name = "AK4643", | ||
424 | .card = "SSI56-AK4643", | ||
425 | .codec = "ak4642-codec.0-0012", | ||
426 | .platform = "rcar_sound", | ||
427 | .daifmt = SND_SOC_DAIFMT_LEFT_J, | ||
428 | .cpu_dai = { | ||
429 | .name = "rsnd-dai.0", | ||
430 | .fmt = SND_SOC_DAIFMT_CBS_CFS, | ||
431 | }, | ||
432 | .codec_dai = { | ||
433 | .name = "ak4642-hifi", | ||
434 | .fmt = SND_SOC_DAIFMT_CBM_CFM, | ||
435 | .sysclk = 11289600, | ||
436 | }, | ||
437 | }, | ||
438 | /* SSI3 */ | ||
439 | { | ||
440 | .name = "AK4554", | ||
441 | .card = "SSI3-AK4554(playback)", | ||
442 | .codec = "ak4554-adc-dac.0", | ||
443 | .platform = "rcar_sound", | ||
444 | .cpu_dai = { | ||
445 | .name = "rsnd-dai.1", | ||
446 | .fmt = SND_SOC_DAIFMT_CBM_CFM | | ||
447 | SND_SOC_DAIFMT_RIGHT_J, | ||
448 | }, | ||
449 | .codec_dai = { | ||
450 | .name = "ak4554-hifi", | ||
451 | }, | ||
452 | }, | ||
453 | /* SSI4 */ | ||
454 | { | ||
455 | .name = "AK4554", | ||
456 | .card = "SSI4-AK4554(capture)", | ||
457 | .codec = "ak4554-adc-dac.0", | ||
458 | .platform = "rcar_sound", | ||
459 | .cpu_dai = { | ||
460 | .name = "rsnd-dai.2", | ||
461 | .fmt = SND_SOC_DAIFMT_CBM_CFM | | ||
462 | SND_SOC_DAIFMT_LEFT_J, | ||
463 | }, | ||
464 | .codec_dai = { | ||
465 | .name = "ak4554-hifi", | ||
466 | }, | ||
467 | }, | ||
468 | /* SSI7 */ | ||
469 | { | ||
470 | .name = "AK4554", | ||
471 | .card = "SSI7-AK4554(playback)", | ||
472 | .codec = "ak4554-adc-dac.1", | ||
473 | .platform = "rcar_sound", | ||
474 | .cpu_dai = { | ||
475 | .name = "rsnd-dai.3", | ||
476 | .fmt = SND_SOC_DAIFMT_CBM_CFM | | ||
477 | SND_SOC_DAIFMT_RIGHT_J, | ||
478 | }, | ||
479 | .codec_dai = { | ||
480 | .name = "ak4554-hifi", | ||
481 | }, | ||
482 | }, | ||
483 | /* SSI8 */ | ||
484 | { | ||
485 | .name = "AK4554", | ||
486 | .card = "SSI8-AK4554(capture)", | ||
487 | .codec = "ak4554-adc-dac.1", | ||
488 | .platform = "rcar_sound", | ||
489 | .cpu_dai = { | ||
490 | .name = "rsnd-dai.4", | ||
491 | .fmt = SND_SOC_DAIFMT_CBM_CFM | | ||
492 | SND_SOC_DAIFMT_LEFT_J, | ||
493 | }, | ||
494 | .codec_dai = { | ||
495 | .name = "ak4554-hifi", | ||
496 | }, | ||
497 | } | ||
498 | }; | ||
499 | |||
184 | static const struct pinctrl_map bockw_pinctrl_map[] = { | 500 | static const struct pinctrl_map bockw_pinctrl_map[] = { |
501 | /* AUDIO */ | ||
502 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
503 | "audio_clk_a", "audio_clk"), | ||
504 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
505 | "audio_clk_b", "audio_clk"), | ||
506 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
507 | "ssi34_ctrl", "ssi"), | ||
508 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
509 | "ssi3_data", "ssi"), | ||
510 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
511 | "ssi4_data", "ssi"), | ||
512 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
513 | "ssi5_ctrl", "ssi"), | ||
514 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
515 | "ssi5_data", "ssi"), | ||
516 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
517 | "ssi6_ctrl", "ssi"), | ||
518 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
519 | "ssi6_data", "ssi"), | ||
520 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
521 | "ssi78_ctrl", "ssi"), | ||
522 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
523 | "ssi7_data", "ssi"), | ||
524 | PIN_MAP_MUX_GROUP_DEFAULT("rcar_sound", "pfc-r8a7778", | ||
525 | "ssi8_data", "ssi"), | ||
185 | /* Ether */ | 526 | /* Ether */ |
186 | PIN_MAP_MUX_GROUP_DEFAULT("r8a777x-ether", "pfc-r8a7778", | 527 | PIN_MAP_MUX_GROUP_DEFAULT("r8a777x-ether", "pfc-r8a7778", |
187 | "ether_rmii", "ether"), | 528 | "ether_rmii", "ether"), |
@@ -201,7 +542,7 @@ static const struct pinctrl_map bockw_pinctrl_map[] = { | |||
201 | /* USB */ | 542 | /* USB */ |
202 | PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778", | 543 | PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778", |
203 | "usb0", "usb0"), | 544 | "usb0", "usb0"), |
204 | PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778", | 545 | PIN_MAP_MUX_GROUP_DEFAULT(USB1_DEVICE, "pfc-r8a7778", |
205 | "usb1", "usb1"), | 546 | "usb1", "usb1"), |
206 | /* SDHI0 */ | 547 | /* SDHI0 */ |
207 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778", | 548 | PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778", |
@@ -224,22 +565,28 @@ static const struct pinctrl_map bockw_pinctrl_map[] = { | |||
224 | "vin1_data8", "vin1"), | 565 | "vin1_data8", "vin1"), |
225 | }; | 566 | }; |
226 | 567 | ||
227 | #define FPGA 0x18200000 | ||
228 | #define IRQ0MR 0x30 | ||
229 | #define PFC 0xfffc0000 | 568 | #define PFC 0xfffc0000 |
230 | #define PUPR4 0x110 | 569 | #define PUPR4 0x110 |
231 | static void __init bockw_init(void) | 570 | static void __init bockw_init(void) |
232 | { | 571 | { |
233 | void __iomem *base; | 572 | void __iomem *base; |
573 | struct clk *clk; | ||
574 | int i; | ||
234 | 575 | ||
235 | r8a7778_clock_init(); | 576 | r8a7778_clock_init(); |
236 | r8a7778_init_irq_extpin(1); | 577 | r8a7778_init_irq_extpin(1); |
237 | r8a7778_add_standard_devices(); | 578 | r8a7778_add_standard_devices(); |
238 | r8a7778_add_ether_device(ðer_platform_data); | 579 | |
239 | r8a7778_add_vin_device(0, &vin_platform_data); | 580 | platform_device_register_resndata(&platform_bus, "r8a777x-ether", -1, |
581 | ether_resources, | ||
582 | ARRAY_SIZE(ether_resources), | ||
583 | ðer_platform_data, | ||
584 | sizeof(ether_platform_data)); | ||
585 | |||
586 | platform_device_register_full(&vin0_info); | ||
240 | /* VIN1 has a pin conflict with Ether */ | 587 | /* VIN1 has a pin conflict with Ether */ |
241 | if (!IS_ENABLED(CONFIG_SH_ETH)) | 588 | if (!IS_ENABLED(CONFIG_SH_ETH)) |
242 | r8a7778_add_vin_device(1, &vin_platform_data); | 589 | platform_device_register_full(&vin1_info); |
243 | platform_device_register_data(&platform_bus, "soc-camera-pdrv", 0, | 590 | platform_device_register_data(&platform_bus, "soc-camera-pdrv", 0, |
244 | &iclink0_ml86v7667, | 591 | &iclink0_ml86v7667, |
245 | sizeof(iclink0_ml86v7667)); | 592 | sizeof(iclink0_ml86v7667)); |
@@ -269,8 +616,8 @@ static void __init bockw_init(void) | |||
269 | 616 | ||
270 | 617 | ||
271 | /* for SMSC */ | 618 | /* for SMSC */ |
272 | base = ioremap_nocache(FPGA, SZ_1M); | 619 | fpga = ioremap_nocache(FPGA, SZ_1M); |
273 | if (base) { | 620 | if (fpga) { |
274 | /* | 621 | /* |
275 | * CAUTION | 622 | * CAUTION |
276 | * | 623 | * |
@@ -278,10 +625,9 @@ static void __init bockw_init(void) | |||
278 | * it should be cared in the future | 625 | * it should be cared in the future |
279 | * Now, it is assuming IRQ0 was used only from SMSC. | 626 | * Now, it is assuming IRQ0 was used only from SMSC. |
280 | */ | 627 | */ |
281 | u16 val = ioread16(base + IRQ0MR); | 628 | u16 val = ioread16(fpga + IRQ0MR); |
282 | val &= ~(1 << 4); /* enable SMSC911x */ | 629 | val &= ~(1 << 4); /* enable SMSC911x */ |
283 | iowrite16(val, base + IRQ0MR); | 630 | iowrite16(val, fpga + IRQ0MR); |
284 | iounmap(base); | ||
285 | 631 | ||
286 | regulator_register_fixed(0, dummy_supplies, | 632 | regulator_register_fixed(0, dummy_supplies, |
287 | ARRAY_SIZE(dummy_supplies)); | 633 | ARRAY_SIZE(dummy_supplies)); |
@@ -308,6 +654,42 @@ static void __init bockw_init(void) | |||
308 | sdhi0_resources, ARRAY_SIZE(sdhi0_resources), | 654 | sdhi0_resources, ARRAY_SIZE(sdhi0_resources), |
309 | &sdhi0_info, sizeof(struct sh_mobile_sdhi_info)); | 655 | &sdhi0_info, sizeof(struct sh_mobile_sdhi_info)); |
310 | } | 656 | } |
657 | |||
658 | /* for Audio */ | ||
659 | clk = clk_get(NULL, "audio_clk_b"); | ||
660 | clk_set_rate(clk, 24576000); | ||
661 | clk_put(clk); | ||
662 | rsnd_codec_power(5, 1); /* enable ak4642 */ | ||
663 | |||
664 | platform_device_register_simple( | ||
665 | "ak4554-adc-dac", 0, NULL, 0); | ||
666 | |||
667 | platform_device_register_simple( | ||
668 | "ak4554-adc-dac", 1, NULL, 0); | ||
669 | |||
670 | platform_device_register_resndata( | ||
671 | &platform_bus, "rcar_sound", -1, | ||
672 | rsnd_resources, ARRAY_SIZE(rsnd_resources), | ||
673 | &rsnd_info, sizeof(rsnd_info)); | ||
674 | |||
675 | for (i = 0; i < ARRAY_SIZE(rsnd_card_info); i++) { | ||
676 | struct platform_device_info cardinfo = { | ||
677 | .parent = &platform_bus, | ||
678 | .name = "asoc-simple-card", | ||
679 | .id = i, | ||
680 | .data = &rsnd_card_info[i], | ||
681 | .size_data = sizeof(struct asoc_simple_card_info), | ||
682 | .dma_mask = ~0, | ||
683 | }; | ||
684 | |||
685 | platform_device_register_full(&cardinfo); | ||
686 | } | ||
687 | } | ||
688 | |||
689 | static void __init bockw_init_late(void) | ||
690 | { | ||
691 | r8a7778_init_late(); | ||
692 | ADD_USB_FUNC_DEVICE_IF_POSSIBLE(); | ||
311 | } | 693 | } |
312 | 694 | ||
313 | static const char *bockw_boards_compat_dt[] __initdata = { | 695 | static const char *bockw_boards_compat_dt[] __initdata = { |
@@ -320,5 +702,5 @@ DT_MACHINE_START(BOCKW_DT, "bockw") | |||
320 | .init_irq = r8a7778_init_irq_dt, | 702 | .init_irq = r8a7778_init_irq_dt, |
321 | .init_machine = bockw_init, | 703 | .init_machine = bockw_init, |
322 | .dt_compat = bockw_boards_compat_dt, | 704 | .dt_compat = bockw_boards_compat_dt, |
323 | .init_late = r8a7778_init_late, | 705 | .init_late = bockw_init_late, |
324 | MACHINE_END | 706 | MACHINE_END |