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		= &ether_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(&ether_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