xref: /OK3568_Linux_fs/u-boot/board/renesas/salvator-x/salvator-x.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * board/renesas/salvator-x/salvator-x.c
3*4882a593Smuzhiyun  *     This file is Salvator-X/Salvator-XS board support.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2015-2017 Renesas Electronics Corporation
6*4882a593Smuzhiyun  * Copyright (C) 2015 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * SPDX-License-Identifier: GPL-2.0+
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <common.h>
12*4882a593Smuzhiyun #include <malloc.h>
13*4882a593Smuzhiyun #include <netdev.h>
14*4882a593Smuzhiyun #include <dm.h>
15*4882a593Smuzhiyun #include <dm/platform_data/serial_sh.h>
16*4882a593Smuzhiyun #include <asm/processor.h>
17*4882a593Smuzhiyun #include <asm/mach-types.h>
18*4882a593Smuzhiyun #include <asm/io.h>
19*4882a593Smuzhiyun #include <linux/errno.h>
20*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
21*4882a593Smuzhiyun #include <asm/gpio.h>
22*4882a593Smuzhiyun #include <asm/arch/gpio.h>
23*4882a593Smuzhiyun #include <asm/arch/rmobile.h>
24*4882a593Smuzhiyun #include <asm/arch/rcar-mstp.h>
25*4882a593Smuzhiyun #include <asm/arch/sh_sdhi.h>
26*4882a593Smuzhiyun #include <i2c.h>
27*4882a593Smuzhiyun #include <mmc.h>
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define CPGWPCR	0xE6150904
32*4882a593Smuzhiyun #define CPGWPR  0xE615090C
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define CLK2MHZ(clk)	(clk / 1000 / 1000)
s_init(void)35*4882a593Smuzhiyun void s_init(void)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun 	struct rcar_rwdt *rwdt = (struct rcar_rwdt *)RWDT_BASE;
38*4882a593Smuzhiyun 	struct rcar_swdt *swdt = (struct rcar_swdt *)SWDT_BASE;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	/* Watchdog init */
41*4882a593Smuzhiyun 	writel(0xA5A5A500, &rwdt->rwtcsra);
42*4882a593Smuzhiyun 	writel(0xA5A5A500, &swdt->swtcsra);
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	writel(0xA5A50000, CPGWPCR);
45*4882a593Smuzhiyun 	writel(0xFFFFFFFF, CPGWPR);
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define GSX_MSTP112		BIT(12)	/* 3DG */
49*4882a593Smuzhiyun #define TMU0_MSTP125		BIT(25)	/* secure */
50*4882a593Smuzhiyun #define TMU1_MSTP124		BIT(24)	/* non-secure */
51*4882a593Smuzhiyun #define SCIF2_MSTP310		BIT(10)	/* SCIF2 */
52*4882a593Smuzhiyun #define ETHERAVB_MSTP812	BIT(12)
53*4882a593Smuzhiyun #define DVFS_MSTP926		BIT(26)
54*4882a593Smuzhiyun #define SD0_MSTP314		BIT(14)
55*4882a593Smuzhiyun #define SD1_MSTP313		BIT(13)
56*4882a593Smuzhiyun #define SD2_MSTP312		BIT(12)	/* either MMC0 */
57*4882a593Smuzhiyun #define SD3_MSTP311		BIT(11)	/* either MMC1 */
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define SD0CKCR			0xE6150074
60*4882a593Smuzhiyun #define SD1CKCR			0xE6150078
61*4882a593Smuzhiyun #define SD2CKCR			0xE6150268
62*4882a593Smuzhiyun #define SD3CKCR			0xE615026C
63*4882a593Smuzhiyun 
board_early_init_f(void)64*4882a593Smuzhiyun int board_early_init_f(void)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun 	/* TMU0,1 */		/* which use ? */
67*4882a593Smuzhiyun 	mstp_clrbits_le32(MSTPSR1, SMSTPCR1, TMU0_MSTP125 | TMU1_MSTP124);
68*4882a593Smuzhiyun 	/* SCIF2 */
69*4882a593Smuzhiyun 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SCIF2_MSTP310);
70*4882a593Smuzhiyun 	/* EHTERAVB */
71*4882a593Smuzhiyun 	mstp_clrbits_le32(MSTPSR8, SMSTPCR8, ETHERAVB_MSTP812);
72*4882a593Smuzhiyun 	/* eMMC */
73*4882a593Smuzhiyun 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SD1_MSTP313 | SD2_MSTP312);
74*4882a593Smuzhiyun 	/* SDHI0, 3 */
75*4882a593Smuzhiyun 	mstp_clrbits_le32(MSTPSR3, SMSTPCR3, SD0_MSTP314 | SD3_MSTP311);
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	writel(1, SD0CKCR);
78*4882a593Smuzhiyun 	writel(1, SD1CKCR);
79*4882a593Smuzhiyun 	writel(1, SD2CKCR);
80*4882a593Smuzhiyun 	writel(1, SD3CKCR);
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #if defined(CONFIG_SYS_I2C) && defined(CONFIG_SYS_I2C_SH)
83*4882a593Smuzhiyun 	/* DVFS for reset */
84*4882a593Smuzhiyun 	mstp_clrbits_le32(MSTPSR9, SMSTPCR9, DVFS_MSTP926);
85*4882a593Smuzhiyun #endif
86*4882a593Smuzhiyun 	return 0;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* SYSC */
90*4882a593Smuzhiyun /* R/- 32 Power status register 2(3DG) */
91*4882a593Smuzhiyun #define	SYSC_PWRSR2	0xE6180100
92*4882a593Smuzhiyun /* -/W 32 Power resume control register 2 (3DG) */
93*4882a593Smuzhiyun #define	SYSC_PWRONCR2	0xE618010C
94*4882a593Smuzhiyun 
board_init(void)95*4882a593Smuzhiyun int board_init(void)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun 	/* adress of boot parameters */
98*4882a593Smuzhiyun 	gd->bd->bi_boot_params = CONFIG_SYS_TEXT_BASE + 0x50000;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	/* Init PFC controller */
101*4882a593Smuzhiyun #if defined(CONFIG_R8A7795)
102*4882a593Smuzhiyun 	r8a7795_pinmux_init();
103*4882a593Smuzhiyun #elif defined(CONFIG_R8A7796)
104*4882a593Smuzhiyun 	r8a7796_pinmux_init();
105*4882a593Smuzhiyun #endif
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #if defined(CONFIG_R8A7795)
108*4882a593Smuzhiyun 	/* GSX: force power and clock supply */
109*4882a593Smuzhiyun 	writel(0x0000001F, SYSC_PWRONCR2);
110*4882a593Smuzhiyun 	while (readl(SYSC_PWRSR2) != 0x000003E0)
111*4882a593Smuzhiyun 		mdelay(20);
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	mstp_clrbits_le32(MSTPSR1, SMSTPCR1, GSX_MSTP112);
114*4882a593Smuzhiyun #endif
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	/* USB1 pull-up */
117*4882a593Smuzhiyun 	setbits_le32(PFC_PUEN6, PUEN_USB1_OVC | PUEN_USB1_PWEN);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #ifdef CONFIG_RENESAS_RAVB
120*4882a593Smuzhiyun 	/* EtherAVB Enable */
121*4882a593Smuzhiyun 	/* GPSR2 */
122*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_AVB_AVTP_CAPTURE_A, NULL);
123*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_AVB_AVTP_MATCH_A, NULL);
124*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_AVB_LINK, NULL);
125*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_AVB_PHY_INT, NULL);
126*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_AVB_MAGIC, NULL);
127*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_AVB_MDC, NULL);
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	/* IPSR0 */
130*4882a593Smuzhiyun 	gpio_request(GPIO_IFN_AVB_MDC, NULL);
131*4882a593Smuzhiyun 	gpio_request(GPIO_IFN_AVB_MAGIC, NULL);
132*4882a593Smuzhiyun 	gpio_request(GPIO_IFN_AVB_PHY_INT, NULL);
133*4882a593Smuzhiyun 	gpio_request(GPIO_IFN_AVB_LINK, NULL);
134*4882a593Smuzhiyun 	gpio_request(GPIO_IFN_AVB_AVTP_MATCH_A, NULL);
135*4882a593Smuzhiyun 	gpio_request(GPIO_IFN_AVB_AVTP_CAPTURE_A, NULL);
136*4882a593Smuzhiyun 	/* IPSR1 */
137*4882a593Smuzhiyun 	gpio_request(GPIO_FN_AVB_AVTP_PPS, NULL);
138*4882a593Smuzhiyun 	/* IPSR2 */
139*4882a593Smuzhiyun 	gpio_request(GPIO_FN_AVB_AVTP_MATCH_B, NULL);
140*4882a593Smuzhiyun 	/* IPSR3 */
141*4882a593Smuzhiyun 	gpio_request(GPIO_FN_AVB_AVTP_CAPTURE_B, NULL);
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #if defined(CONFIG_R8A7795)
144*4882a593Smuzhiyun 	/* USB2_OVC */
145*4882a593Smuzhiyun 	gpio_request(GPIO_GP_6_15, NULL);
146*4882a593Smuzhiyun 	gpio_direction_input(GPIO_GP_6_15);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	/* USB2_PWEN */
149*4882a593Smuzhiyun 	gpio_request(GPIO_GP_6_14, NULL);
150*4882a593Smuzhiyun 	gpio_direction_output(GPIO_GP_6_14, 1);
151*4882a593Smuzhiyun 	gpio_set_value(GPIO_GP_6_14, 1);
152*4882a593Smuzhiyun #endif
153*4882a593Smuzhiyun 	/* AVB_PHY_RST */
154*4882a593Smuzhiyun 	gpio_request(GPIO_GP_2_10, NULL);
155*4882a593Smuzhiyun 	gpio_direction_output(GPIO_GP_2_10, 0);
156*4882a593Smuzhiyun 	mdelay(20);
157*4882a593Smuzhiyun 	gpio_set_value(GPIO_GP_2_10, 1);
158*4882a593Smuzhiyun 	udelay(1);
159*4882a593Smuzhiyun #endif
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #ifdef CONFIG_MMC
162*4882a593Smuzhiyun 	/* SDHI0 */
163*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD0_DAT0, NULL);
164*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD0_DAT1, NULL);
165*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD0_DAT2, NULL);
166*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD0_DAT3, NULL);
167*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD0_CLK, NULL);
168*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD0_CMD, NULL);
169*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD0_CD, NULL);
170*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD0_WP, NULL);
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	gpio_request(GPIO_GP_5_2, NULL);
173*4882a593Smuzhiyun 	gpio_request(GPIO_GP_5_1, NULL);
174*4882a593Smuzhiyun 	gpio_direction_output(GPIO_GP_5_2, 1);	/* power on */
175*4882a593Smuzhiyun 	gpio_direction_output(GPIO_GP_5_1, 1);	/* 1: 3.3V, 0: 1.8V */
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	/* SDHI1/SDHI2 eMMC */
178*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD1_DAT0, NULL);
179*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD1_DAT1, NULL);
180*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD1_DAT2, NULL);
181*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD1_DAT3, NULL);
182*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD2_DAT0, NULL);
183*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD2_DAT1, NULL);
184*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD2_DAT2, NULL);
185*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD2_DAT3, NULL);
186*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD2_CLK, NULL);
187*4882a593Smuzhiyun #if defined(CONFIG_R8A7795)
188*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD2_CMD, NULL);
189*4882a593Smuzhiyun #elif defined(CONFIG_R8A7796)
190*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD2_CMD, NULL);
191*4882a593Smuzhiyun #else
192*4882a593Smuzhiyun #error Only R8A7795 and R87796 is supported
193*4882a593Smuzhiyun #endif
194*4882a593Smuzhiyun 	gpio_request(GPIO_GP_5_3, NULL);
195*4882a593Smuzhiyun 	gpio_request(GPIO_GP_5_9, NULL);
196*4882a593Smuzhiyun 	gpio_direction_output(GPIO_GP_5_3, 0);	/* 1: 3.3V, 0: 1.8V */
197*4882a593Smuzhiyun 	gpio_direction_output(GPIO_GP_5_9, 0);	/* 1: 3.3V, 0: 1.8V */
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun #if defined(CONFIG_R8A7795)
200*4882a593Smuzhiyun 	/* SDHI3 */
201*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD3_DAT0, NULL);	/* GP_4_9 */
202*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD3_DAT1, NULL);	/* GP_4_10 */
203*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD3_DAT2, NULL);	/* GP_4_11 */
204*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD3_DAT3, NULL);	/* GP_4_12 */
205*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD3_CLK, NULL);	/* GP_4_7 */
206*4882a593Smuzhiyun 	gpio_request(GPIO_GFN_SD3_CMD, NULL);	/* GP_4_8 */
207*4882a593Smuzhiyun #elif defined(CONFIG_R8A7796)
208*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD3_DAT0, NULL);	/* GP_4_9 */
209*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD3_DAT1, NULL);	/* GP_4_10 */
210*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD3_DAT2, NULL);	/* GP_4_11 */
211*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD3_DAT3, NULL);	/* GP_4_12 */
212*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD3_CLK, NULL);	/* GP_4_7 */
213*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD3_CMD, NULL);	/* GP_4_8 */
214*4882a593Smuzhiyun #else
215*4882a593Smuzhiyun #error Only R8A7795 and R87796 is supported
216*4882a593Smuzhiyun #endif
217*4882a593Smuzhiyun 	/* IPSR10 */
218*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD3_CD, NULL);
219*4882a593Smuzhiyun 	gpio_request(GPIO_FN_SD3_WP, NULL);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	gpio_request(GPIO_GP_3_15, NULL);
222*4882a593Smuzhiyun 	gpio_request(GPIO_GP_3_14, NULL);
223*4882a593Smuzhiyun 	gpio_direction_output(GPIO_GP_3_15, 1);	/* power on */
224*4882a593Smuzhiyun 	gpio_direction_output(GPIO_GP_3_14, 1);	/* 1: 3.3V, 0: 1.8V */
225*4882a593Smuzhiyun #endif
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	return 0;
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun 
dram_init(void)230*4882a593Smuzhiyun int dram_init(void)
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun 	gd->ram_size = PHYS_SDRAM_1_SIZE;
233*4882a593Smuzhiyun #if (CONFIG_NR_DRAM_BANKS >= 2)
234*4882a593Smuzhiyun 	gd->ram_size += PHYS_SDRAM_2_SIZE;
235*4882a593Smuzhiyun #endif
236*4882a593Smuzhiyun #if (CONFIG_NR_DRAM_BANKS >= 3)
237*4882a593Smuzhiyun 	gd->ram_size += PHYS_SDRAM_3_SIZE;
238*4882a593Smuzhiyun #endif
239*4882a593Smuzhiyun #if (CONFIG_NR_DRAM_BANKS >= 4)
240*4882a593Smuzhiyun 	gd->ram_size += PHYS_SDRAM_4_SIZE;
241*4882a593Smuzhiyun #endif
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	return 0;
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun 
dram_init_banksize(void)246*4882a593Smuzhiyun int dram_init_banksize(void)
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun 	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
249*4882a593Smuzhiyun 	gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
250*4882a593Smuzhiyun #if (CONFIG_NR_DRAM_BANKS >= 2)
251*4882a593Smuzhiyun 	gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
252*4882a593Smuzhiyun 	gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
253*4882a593Smuzhiyun #endif
254*4882a593Smuzhiyun #if (CONFIG_NR_DRAM_BANKS >= 3)
255*4882a593Smuzhiyun 	gd->bd->bi_dram[2].start = PHYS_SDRAM_3;
256*4882a593Smuzhiyun 	gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE;
257*4882a593Smuzhiyun #endif
258*4882a593Smuzhiyun #if (CONFIG_NR_DRAM_BANKS >= 4)
259*4882a593Smuzhiyun 	gd->bd->bi_dram[3].start = PHYS_SDRAM_4;
260*4882a593Smuzhiyun 	gd->bd->bi_dram[3].size = PHYS_SDRAM_4_SIZE;
261*4882a593Smuzhiyun #endif
262*4882a593Smuzhiyun 	return 0;
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun const struct rmobile_sysinfo sysinfo = {
266*4882a593Smuzhiyun 	CONFIG_RCAR_BOARD_STRING
267*4882a593Smuzhiyun };
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun #define RST_BASE	0xE6160000
270*4882a593Smuzhiyun #define RST_CA57RESCNT	(RST_BASE + 0x40)
271*4882a593Smuzhiyun #define RST_CA53RESCNT	(RST_BASE + 0x44)
272*4882a593Smuzhiyun #define RST_RSTOUTCR	(RST_BASE + 0x58)
273*4882a593Smuzhiyun #define RST_CODE	0xA5A5000F
274*4882a593Smuzhiyun 
reset_cpu(ulong addr)275*4882a593Smuzhiyun void reset_cpu(ulong addr)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun #if defined(CONFIG_SYS_I2C) && defined(CONFIG_SYS_I2C_SH)
278*4882a593Smuzhiyun 	i2c_reg_write(CONFIG_SYS_I2C_POWERIC_ADDR, 0x20, 0x80);
279*4882a593Smuzhiyun #else
280*4882a593Smuzhiyun 	/* only CA57 ? */
281*4882a593Smuzhiyun 	writel(RST_CODE, RST_CA57RESCNT);
282*4882a593Smuzhiyun #endif
283*4882a593Smuzhiyun }
284