xref: /rk3399_rockchip-uboot/board/freescale/ls1088a/ls1088a.c (revision f1ba13f8e2acf648740a4a8a3594509a3e16b3aa)
1*f1ba13f8SMasahiro Yamada /*
2*f1ba13f8SMasahiro Yamada  * Copyright 2017 NXP
3*f1ba13f8SMasahiro Yamada  *
4*f1ba13f8SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
5*f1ba13f8SMasahiro Yamada  */
6*f1ba13f8SMasahiro Yamada #include <common.h>
7*f1ba13f8SMasahiro Yamada #include <i2c.h>
8*f1ba13f8SMasahiro Yamada #include <malloc.h>
9*f1ba13f8SMasahiro Yamada #include <errno.h>
10*f1ba13f8SMasahiro Yamada #include <netdev.h>
11*f1ba13f8SMasahiro Yamada #include <fsl_ifc.h>
12*f1ba13f8SMasahiro Yamada #include <fsl_ddr.h>
13*f1ba13f8SMasahiro Yamada #include <fsl_sec.h>
14*f1ba13f8SMasahiro Yamada #include <asm/io.h>
15*f1ba13f8SMasahiro Yamada #include <fdt_support.h>
16*f1ba13f8SMasahiro Yamada #include <linux/libfdt.h>
17*f1ba13f8SMasahiro Yamada #include <fsl-mc/fsl_mc.h>
18*f1ba13f8SMasahiro Yamada #include <environment.h>
19*f1ba13f8SMasahiro Yamada #include <asm/arch-fsl-layerscape/soc.h>
20*f1ba13f8SMasahiro Yamada #include <asm/arch/ppa.h>
21*f1ba13f8SMasahiro Yamada #include <hwconfig.h>
22*f1ba13f8SMasahiro Yamada #include <asm/arch/fsl_serdes.h>
23*f1ba13f8SMasahiro Yamada #include <asm/arch/soc.h>
24*f1ba13f8SMasahiro Yamada 
25*f1ba13f8SMasahiro Yamada #include "../common/qixis.h"
26*f1ba13f8SMasahiro Yamada #include "ls1088a_qixis.h"
27*f1ba13f8SMasahiro Yamada #include "../common/vid.h"
28*f1ba13f8SMasahiro Yamada #include <fsl_immap.h>
29*f1ba13f8SMasahiro Yamada 
30*f1ba13f8SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR;
31*f1ba13f8SMasahiro Yamada 
board_early_init_f(void)32*f1ba13f8SMasahiro Yamada int board_early_init_f(void)
33*f1ba13f8SMasahiro Yamada {
34*f1ba13f8SMasahiro Yamada 	fsl_lsch3_early_init_f();
35*f1ba13f8SMasahiro Yamada 	return 0;
36*f1ba13f8SMasahiro Yamada }
37*f1ba13f8SMasahiro Yamada 
38*f1ba13f8SMasahiro Yamada #ifdef CONFIG_FSL_QIXIS
get_qixis_addr(void)39*f1ba13f8SMasahiro Yamada unsigned long long get_qixis_addr(void)
40*f1ba13f8SMasahiro Yamada {
41*f1ba13f8SMasahiro Yamada 	unsigned long long addr;
42*f1ba13f8SMasahiro Yamada 
43*f1ba13f8SMasahiro Yamada 	if (gd->flags & GD_FLG_RELOC)
44*f1ba13f8SMasahiro Yamada 		addr = QIXIS_BASE_PHYS;
45*f1ba13f8SMasahiro Yamada 	else
46*f1ba13f8SMasahiro Yamada 		addr = QIXIS_BASE_PHYS_EARLY;
47*f1ba13f8SMasahiro Yamada 
48*f1ba13f8SMasahiro Yamada 	/*
49*f1ba13f8SMasahiro Yamada 	 * IFC address under 256MB is mapped to 0x30000000, any address above
50*f1ba13f8SMasahiro Yamada 	 * is mapped to 0x5_10000000 up to 4GB.
51*f1ba13f8SMasahiro Yamada 	 */
52*f1ba13f8SMasahiro Yamada 	addr = addr  > 0x10000000 ? addr + 0x500000000ULL : addr + 0x30000000;
53*f1ba13f8SMasahiro Yamada 
54*f1ba13f8SMasahiro Yamada 	return addr;
55*f1ba13f8SMasahiro Yamada }
56*f1ba13f8SMasahiro Yamada #endif
57*f1ba13f8SMasahiro Yamada 
58*f1ba13f8SMasahiro Yamada #if defined(CONFIG_VID)
init_func_vid(void)59*f1ba13f8SMasahiro Yamada int init_func_vid(void)
60*f1ba13f8SMasahiro Yamada {
61*f1ba13f8SMasahiro Yamada 	if (adjust_vdd(0) < 0)
62*f1ba13f8SMasahiro Yamada 		printf("core voltage not adjusted\n");
63*f1ba13f8SMasahiro Yamada 
64*f1ba13f8SMasahiro Yamada 	return 0;
65*f1ba13f8SMasahiro Yamada }
66*f1ba13f8SMasahiro Yamada #endif
67*f1ba13f8SMasahiro Yamada 
68*f1ba13f8SMasahiro Yamada #if !defined(CONFIG_SPL_BUILD)
checkboard(void)69*f1ba13f8SMasahiro Yamada int checkboard(void)
70*f1ba13f8SMasahiro Yamada {
71*f1ba13f8SMasahiro Yamada 	char buf[64];
72*f1ba13f8SMasahiro Yamada 	u8 sw;
73*f1ba13f8SMasahiro Yamada 	static const char *const freq[] = {"100", "125", "156.25",
74*f1ba13f8SMasahiro Yamada 					    "100 separate SSCG"};
75*f1ba13f8SMasahiro Yamada 	int clock;
76*f1ba13f8SMasahiro Yamada 
77*f1ba13f8SMasahiro Yamada #ifdef CONFIG_TARGET_LS1088AQDS
78*f1ba13f8SMasahiro Yamada 	printf("Board: LS1088A-QDS, ");
79*f1ba13f8SMasahiro Yamada #else
80*f1ba13f8SMasahiro Yamada 	printf("Board: LS1088A-RDB, ");
81*f1ba13f8SMasahiro Yamada #endif
82*f1ba13f8SMasahiro Yamada 
83*f1ba13f8SMasahiro Yamada 	sw = QIXIS_READ(arch);
84*f1ba13f8SMasahiro Yamada 	printf("Board Arch: V%d, ", sw >> 4);
85*f1ba13f8SMasahiro Yamada 
86*f1ba13f8SMasahiro Yamada #ifdef CONFIG_TARGET_LS1088AQDS
87*f1ba13f8SMasahiro Yamada 	printf("Board version: %c, boot from ", (sw & 0xf) + 'A' - 1);
88*f1ba13f8SMasahiro Yamada #else
89*f1ba13f8SMasahiro Yamada 	printf("Board version: %c, boot from ", (sw & 0xf) + 'A');
90*f1ba13f8SMasahiro Yamada #endif
91*f1ba13f8SMasahiro Yamada 
92*f1ba13f8SMasahiro Yamada 	memset((u8 *)buf, 0x00, ARRAY_SIZE(buf));
93*f1ba13f8SMasahiro Yamada 
94*f1ba13f8SMasahiro Yamada 	sw = QIXIS_READ(brdcfg[0]);
95*f1ba13f8SMasahiro Yamada 	sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
96*f1ba13f8SMasahiro Yamada 
97*f1ba13f8SMasahiro Yamada #ifdef CONFIG_SD_BOOT
98*f1ba13f8SMasahiro Yamada 	puts("SD card\n");
99*f1ba13f8SMasahiro Yamada #endif
100*f1ba13f8SMasahiro Yamada 	switch (sw) {
101*f1ba13f8SMasahiro Yamada #ifdef CONFIG_TARGET_LS1088AQDS
102*f1ba13f8SMasahiro Yamada 	case 0:
103*f1ba13f8SMasahiro Yamada 	case 1:
104*f1ba13f8SMasahiro Yamada 	case 2:
105*f1ba13f8SMasahiro Yamada 	case 3:
106*f1ba13f8SMasahiro Yamada 	case 4:
107*f1ba13f8SMasahiro Yamada 	case 5:
108*f1ba13f8SMasahiro Yamada 	case 6:
109*f1ba13f8SMasahiro Yamada 	case 7:
110*f1ba13f8SMasahiro Yamada 		printf("vBank: %d\n", sw);
111*f1ba13f8SMasahiro Yamada 		break;
112*f1ba13f8SMasahiro Yamada 	case 8:
113*f1ba13f8SMasahiro Yamada 		puts("PromJet\n");
114*f1ba13f8SMasahiro Yamada 		break;
115*f1ba13f8SMasahiro Yamada 	case 15:
116*f1ba13f8SMasahiro Yamada 		puts("IFCCard\n");
117*f1ba13f8SMasahiro Yamada 		break;
118*f1ba13f8SMasahiro Yamada 	case 14:
119*f1ba13f8SMasahiro Yamada #else
120*f1ba13f8SMasahiro Yamada 	case 0:
121*f1ba13f8SMasahiro Yamada #endif
122*f1ba13f8SMasahiro Yamada 		puts("QSPI:");
123*f1ba13f8SMasahiro Yamada 		sw = QIXIS_READ(brdcfg[0]);
124*f1ba13f8SMasahiro Yamada 		sw = (sw & QIXIS_QMAP_MASK) >> QIXIS_QMAP_SHIFT;
125*f1ba13f8SMasahiro Yamada 		if (sw == 0 || sw == 4)
126*f1ba13f8SMasahiro Yamada 			puts("0\n");
127*f1ba13f8SMasahiro Yamada 		else if (sw == 1)
128*f1ba13f8SMasahiro Yamada 			puts("1\n");
129*f1ba13f8SMasahiro Yamada 		else
130*f1ba13f8SMasahiro Yamada 			puts("EMU\n");
131*f1ba13f8SMasahiro Yamada 		break;
132*f1ba13f8SMasahiro Yamada 
133*f1ba13f8SMasahiro Yamada 	default:
134*f1ba13f8SMasahiro Yamada 		printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
135*f1ba13f8SMasahiro Yamada 		break;
136*f1ba13f8SMasahiro Yamada 	}
137*f1ba13f8SMasahiro Yamada 
138*f1ba13f8SMasahiro Yamada #ifdef CONFIG_TARGET_LS1088AQDS
139*f1ba13f8SMasahiro Yamada 	printf("FPGA: v%d (%s), build %d",
140*f1ba13f8SMasahiro Yamada 	       (int)QIXIS_READ(scver), qixis_read_tag(buf),
141*f1ba13f8SMasahiro Yamada 	       (int)qixis_read_minor());
142*f1ba13f8SMasahiro Yamada 	/* the timestamp string contains "\n" at the end */
143*f1ba13f8SMasahiro Yamada 	printf(" on %s", qixis_read_time(buf));
144*f1ba13f8SMasahiro Yamada #else
145*f1ba13f8SMasahiro Yamada 	printf("CPLD: v%d.%d\n", QIXIS_READ(scver), QIXIS_READ(tagdata));
146*f1ba13f8SMasahiro Yamada #endif
147*f1ba13f8SMasahiro Yamada 
148*f1ba13f8SMasahiro Yamada 	/*
149*f1ba13f8SMasahiro Yamada 	 * Display the actual SERDES reference clocks as configured by the
150*f1ba13f8SMasahiro Yamada 	 * dip switches on the board.  Note that the SWx registers could
151*f1ba13f8SMasahiro Yamada 	 * technically be set to force the reference clocks to match the
152*f1ba13f8SMasahiro Yamada 	 * values that the SERDES expects (or vice versa).  For now, however,
153*f1ba13f8SMasahiro Yamada 	 * we just display both values and hope the user notices when they
154*f1ba13f8SMasahiro Yamada 	 * don't match.
155*f1ba13f8SMasahiro Yamada 	 */
156*f1ba13f8SMasahiro Yamada 	puts("SERDES1 Reference : ");
157*f1ba13f8SMasahiro Yamada 	sw = QIXIS_READ(brdcfg[2]);
158*f1ba13f8SMasahiro Yamada 	clock = (sw >> 6) & 3;
159*f1ba13f8SMasahiro Yamada 	printf("Clock1 = %sMHz ", freq[clock]);
160*f1ba13f8SMasahiro Yamada 	clock = (sw >> 4) & 3;
161*f1ba13f8SMasahiro Yamada 	printf("Clock2 = %sMHz", freq[clock]);
162*f1ba13f8SMasahiro Yamada 
163*f1ba13f8SMasahiro Yamada 	puts("\nSERDES2 Reference : ");
164*f1ba13f8SMasahiro Yamada 	clock = (sw >> 2) & 3;
165*f1ba13f8SMasahiro Yamada 	printf("Clock1 = %sMHz ", freq[clock]);
166*f1ba13f8SMasahiro Yamada 	clock = (sw >> 0) & 3;
167*f1ba13f8SMasahiro Yamada 	printf("Clock2 = %sMHz\n", freq[clock]);
168*f1ba13f8SMasahiro Yamada 
169*f1ba13f8SMasahiro Yamada 	return 0;
170*f1ba13f8SMasahiro Yamada }
171*f1ba13f8SMasahiro Yamada 
if_board_diff_clk(void)172*f1ba13f8SMasahiro Yamada bool if_board_diff_clk(void)
173*f1ba13f8SMasahiro Yamada {
174*f1ba13f8SMasahiro Yamada #ifdef CONFIG_TARGET_LS1088AQDS
175*f1ba13f8SMasahiro Yamada 	u8 diff_conf = QIXIS_READ(brdcfg[11]);
176*f1ba13f8SMasahiro Yamada 	return diff_conf & 0x40;
177*f1ba13f8SMasahiro Yamada #else
178*f1ba13f8SMasahiro Yamada 	u8 diff_conf = QIXIS_READ(dutcfg[11]);
179*f1ba13f8SMasahiro Yamada 	return diff_conf & 0x80;
180*f1ba13f8SMasahiro Yamada #endif
181*f1ba13f8SMasahiro Yamada }
182*f1ba13f8SMasahiro Yamada 
get_board_sys_clk(void)183*f1ba13f8SMasahiro Yamada unsigned long get_board_sys_clk(void)
184*f1ba13f8SMasahiro Yamada {
185*f1ba13f8SMasahiro Yamada 	u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
186*f1ba13f8SMasahiro Yamada 
187*f1ba13f8SMasahiro Yamada 	switch (sysclk_conf & 0x0f) {
188*f1ba13f8SMasahiro Yamada 	case QIXIS_SYSCLK_83:
189*f1ba13f8SMasahiro Yamada 		return 83333333;
190*f1ba13f8SMasahiro Yamada 	case QIXIS_SYSCLK_100:
191*f1ba13f8SMasahiro Yamada 		return 100000000;
192*f1ba13f8SMasahiro Yamada 	case QIXIS_SYSCLK_125:
193*f1ba13f8SMasahiro Yamada 		return 125000000;
194*f1ba13f8SMasahiro Yamada 	case QIXIS_SYSCLK_133:
195*f1ba13f8SMasahiro Yamada 		return 133333333;
196*f1ba13f8SMasahiro Yamada 	case QIXIS_SYSCLK_150:
197*f1ba13f8SMasahiro Yamada 		return 150000000;
198*f1ba13f8SMasahiro Yamada 	case QIXIS_SYSCLK_160:
199*f1ba13f8SMasahiro Yamada 		return 160000000;
200*f1ba13f8SMasahiro Yamada 	case QIXIS_SYSCLK_166:
201*f1ba13f8SMasahiro Yamada 		return 166666666;
202*f1ba13f8SMasahiro Yamada 	}
203*f1ba13f8SMasahiro Yamada 
204*f1ba13f8SMasahiro Yamada 	return 66666666;
205*f1ba13f8SMasahiro Yamada }
206*f1ba13f8SMasahiro Yamada 
get_board_ddr_clk(void)207*f1ba13f8SMasahiro Yamada unsigned long get_board_ddr_clk(void)
208*f1ba13f8SMasahiro Yamada {
209*f1ba13f8SMasahiro Yamada 	u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
210*f1ba13f8SMasahiro Yamada 
211*f1ba13f8SMasahiro Yamada 	if (if_board_diff_clk())
212*f1ba13f8SMasahiro Yamada 		return get_board_sys_clk();
213*f1ba13f8SMasahiro Yamada 	switch ((ddrclk_conf & 0x30) >> 4) {
214*f1ba13f8SMasahiro Yamada 	case QIXIS_DDRCLK_100:
215*f1ba13f8SMasahiro Yamada 		return 100000000;
216*f1ba13f8SMasahiro Yamada 	case QIXIS_DDRCLK_125:
217*f1ba13f8SMasahiro Yamada 		return 125000000;
218*f1ba13f8SMasahiro Yamada 	case QIXIS_DDRCLK_133:
219*f1ba13f8SMasahiro Yamada 		return 133333333;
220*f1ba13f8SMasahiro Yamada 	}
221*f1ba13f8SMasahiro Yamada 
222*f1ba13f8SMasahiro Yamada 	return 66666666;
223*f1ba13f8SMasahiro Yamada }
224*f1ba13f8SMasahiro Yamada #endif
225*f1ba13f8SMasahiro Yamada 
select_i2c_ch_pca9547(u8 ch)226*f1ba13f8SMasahiro Yamada int select_i2c_ch_pca9547(u8 ch)
227*f1ba13f8SMasahiro Yamada {
228*f1ba13f8SMasahiro Yamada 	int ret;
229*f1ba13f8SMasahiro Yamada 
230*f1ba13f8SMasahiro Yamada 	ret = i2c_write(I2C_MUX_PCA_ADDR_PRI, 0, 1, &ch, 1);
231*f1ba13f8SMasahiro Yamada 	if (ret) {
232*f1ba13f8SMasahiro Yamada 		puts("PCA: failed to select proper channel\n");
233*f1ba13f8SMasahiro Yamada 		return ret;
234*f1ba13f8SMasahiro Yamada 	}
235*f1ba13f8SMasahiro Yamada 
236*f1ba13f8SMasahiro Yamada 	return 0;
237*f1ba13f8SMasahiro Yamada }
238*f1ba13f8SMasahiro Yamada 
239*f1ba13f8SMasahiro Yamada #if !defined(CONFIG_SPL_BUILD)
board_retimer_init(void)240*f1ba13f8SMasahiro Yamada void board_retimer_init(void)
241*f1ba13f8SMasahiro Yamada {
242*f1ba13f8SMasahiro Yamada 	u8 reg;
243*f1ba13f8SMasahiro Yamada 
244*f1ba13f8SMasahiro Yamada 	/* Retimer is connected to I2C1_CH5 */
245*f1ba13f8SMasahiro Yamada 	select_i2c_ch_pca9547(I2C_MUX_CH5);
246*f1ba13f8SMasahiro Yamada 
247*f1ba13f8SMasahiro Yamada 	/* Access to Control/Shared register */
248*f1ba13f8SMasahiro Yamada 	reg = 0x0;
249*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0xff, 1, &reg, 1);
250*f1ba13f8SMasahiro Yamada 
251*f1ba13f8SMasahiro Yamada 	/* Read device revision and ID */
252*f1ba13f8SMasahiro Yamada 	i2c_read(I2C_RETIMER_ADDR, 1, 1, &reg, 1);
253*f1ba13f8SMasahiro Yamada 	debug("Retimer version id = 0x%x\n", reg);
254*f1ba13f8SMasahiro Yamada 
255*f1ba13f8SMasahiro Yamada 	/* Enable Broadcast. All writes target all channel register sets */
256*f1ba13f8SMasahiro Yamada 	reg = 0x0c;
257*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0xff, 1, &reg, 1);
258*f1ba13f8SMasahiro Yamada 
259*f1ba13f8SMasahiro Yamada 	/* Reset Channel Registers */
260*f1ba13f8SMasahiro Yamada 	i2c_read(I2C_RETIMER_ADDR, 0, 1, &reg, 1);
261*f1ba13f8SMasahiro Yamada 	reg |= 0x4;
262*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0, 1, &reg, 1);
263*f1ba13f8SMasahiro Yamada 
264*f1ba13f8SMasahiro Yamada 	/* Set data rate as 10.3125 Gbps */
265*f1ba13f8SMasahiro Yamada 	reg = 0x90;
266*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0x60, 1, &reg, 1);
267*f1ba13f8SMasahiro Yamada 	reg = 0xb3;
268*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0x61, 1, &reg, 1);
269*f1ba13f8SMasahiro Yamada 	reg = 0x90;
270*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0x62, 1, &reg, 1);
271*f1ba13f8SMasahiro Yamada 	reg = 0xb3;
272*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0x63, 1, &reg, 1);
273*f1ba13f8SMasahiro Yamada 	reg = 0xcd;
274*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0x64, 1, &reg, 1);
275*f1ba13f8SMasahiro Yamada 
276*f1ba13f8SMasahiro Yamada 	/* Select VCO Divider to full rate (000) */
277*f1ba13f8SMasahiro Yamada 	i2c_read(I2C_RETIMER_ADDR, 0x2F, 1, &reg, 1);
278*f1ba13f8SMasahiro Yamada 	reg &= 0x0f;
279*f1ba13f8SMasahiro Yamada 	reg |= 0x70;
280*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR, 0x2F, 1, &reg, 1);
281*f1ba13f8SMasahiro Yamada 
282*f1ba13f8SMasahiro Yamada #ifdef	CONFIG_TARGET_LS1088AQDS
283*f1ba13f8SMasahiro Yamada 	/* Retimer is connected to I2C1_CH5 */
284*f1ba13f8SMasahiro Yamada 	select_i2c_ch_pca9547(I2C_MUX_CH5);
285*f1ba13f8SMasahiro Yamada 
286*f1ba13f8SMasahiro Yamada 	/* Access to Control/Shared register */
287*f1ba13f8SMasahiro Yamada 	reg = 0x0;
288*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0xff, 1, &reg, 1);
289*f1ba13f8SMasahiro Yamada 
290*f1ba13f8SMasahiro Yamada 	/* Read device revision and ID */
291*f1ba13f8SMasahiro Yamada 	i2c_read(I2C_RETIMER_ADDR2, 1, 1, &reg, 1);
292*f1ba13f8SMasahiro Yamada 	debug("Retimer version id = 0x%x\n", reg);
293*f1ba13f8SMasahiro Yamada 
294*f1ba13f8SMasahiro Yamada 	/* Enable Broadcast. All writes target all channel register sets */
295*f1ba13f8SMasahiro Yamada 	reg = 0x0c;
296*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0xff, 1, &reg, 1);
297*f1ba13f8SMasahiro Yamada 
298*f1ba13f8SMasahiro Yamada 	/* Reset Channel Registers */
299*f1ba13f8SMasahiro Yamada 	i2c_read(I2C_RETIMER_ADDR2, 0, 1, &reg, 1);
300*f1ba13f8SMasahiro Yamada 	reg |= 0x4;
301*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0, 1, &reg, 1);
302*f1ba13f8SMasahiro Yamada 
303*f1ba13f8SMasahiro Yamada 	/* Set data rate as 10.3125 Gbps */
304*f1ba13f8SMasahiro Yamada 	reg = 0x90;
305*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0x60, 1, &reg, 1);
306*f1ba13f8SMasahiro Yamada 	reg = 0xb3;
307*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0x61, 1, &reg, 1);
308*f1ba13f8SMasahiro Yamada 	reg = 0x90;
309*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0x62, 1, &reg, 1);
310*f1ba13f8SMasahiro Yamada 	reg = 0xb3;
311*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0x63, 1, &reg, 1);
312*f1ba13f8SMasahiro Yamada 	reg = 0xcd;
313*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0x64, 1, &reg, 1);
314*f1ba13f8SMasahiro Yamada 
315*f1ba13f8SMasahiro Yamada 	/* Select VCO Divider to full rate (000) */
316*f1ba13f8SMasahiro Yamada 	i2c_read(I2C_RETIMER_ADDR2, 0x2F, 1, &reg, 1);
317*f1ba13f8SMasahiro Yamada 	reg &= 0x0f;
318*f1ba13f8SMasahiro Yamada 	reg |= 0x70;
319*f1ba13f8SMasahiro Yamada 	i2c_write(I2C_RETIMER_ADDR2, 0x2F, 1, &reg, 1);
320*f1ba13f8SMasahiro Yamada #endif
321*f1ba13f8SMasahiro Yamada 	/*return the default channel*/
322*f1ba13f8SMasahiro Yamada 	select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
323*f1ba13f8SMasahiro Yamada }
324*f1ba13f8SMasahiro Yamada 
325*f1ba13f8SMasahiro Yamada #ifdef CONFIG_MISC_INIT_R
misc_init_r(void)326*f1ba13f8SMasahiro Yamada int misc_init_r(void)
327*f1ba13f8SMasahiro Yamada {
328*f1ba13f8SMasahiro Yamada #ifdef CONFIG_TARGET_LS1088ARDB
329*f1ba13f8SMasahiro Yamada 	u8 brdcfg5;
330*f1ba13f8SMasahiro Yamada 
331*f1ba13f8SMasahiro Yamada 	if (hwconfig("esdhc-force-sd")) {
332*f1ba13f8SMasahiro Yamada 		brdcfg5 = QIXIS_READ(brdcfg[5]);
333*f1ba13f8SMasahiro Yamada 		brdcfg5 &= ~BRDCFG5_SPISDHC_MASK;
334*f1ba13f8SMasahiro Yamada 		brdcfg5 |= BRDCFG5_FORCE_SD;
335*f1ba13f8SMasahiro Yamada 		QIXIS_WRITE(brdcfg[5], brdcfg5);
336*f1ba13f8SMasahiro Yamada 	}
337*f1ba13f8SMasahiro Yamada #endif
338*f1ba13f8SMasahiro Yamada 	return 0;
339*f1ba13f8SMasahiro Yamada }
340*f1ba13f8SMasahiro Yamada #endif
341*f1ba13f8SMasahiro Yamada #endif
342*f1ba13f8SMasahiro Yamada 
i2c_multiplexer_select_vid_channel(u8 channel)343*f1ba13f8SMasahiro Yamada int i2c_multiplexer_select_vid_channel(u8 channel)
344*f1ba13f8SMasahiro Yamada {
345*f1ba13f8SMasahiro Yamada 	return select_i2c_ch_pca9547(channel);
346*f1ba13f8SMasahiro Yamada }
347*f1ba13f8SMasahiro Yamada 
348*f1ba13f8SMasahiro Yamada #ifdef CONFIG_TARGET_LS1088AQDS
349*f1ba13f8SMasahiro Yamada /* read the current value(SVDD) of the LTM Regulator Voltage */
get_serdes_volt(void)350*f1ba13f8SMasahiro Yamada int get_serdes_volt(void)
351*f1ba13f8SMasahiro Yamada {
352*f1ba13f8SMasahiro Yamada 	int  ret, vcode = 0;
353*f1ba13f8SMasahiro Yamada 	u8 chan = PWM_CHANNEL0;
354*f1ba13f8SMasahiro Yamada 
355*f1ba13f8SMasahiro Yamada 	/* Select the PAGE 0 using PMBus commands PAGE for VDD */
356*f1ba13f8SMasahiro Yamada 	ret = i2c_write(I2C_SVDD_MONITOR_ADDR,
357*f1ba13f8SMasahiro Yamada 			PMBUS_CMD_PAGE, 1, &chan, 1);
358*f1ba13f8SMasahiro Yamada 	if (ret) {
359*f1ba13f8SMasahiro Yamada 		printf("VID: failed to select VDD Page 0\n");
360*f1ba13f8SMasahiro Yamada 		return ret;
361*f1ba13f8SMasahiro Yamada 	}
362*f1ba13f8SMasahiro Yamada 
363*f1ba13f8SMasahiro Yamada 	/* Read the output voltage using PMBus command READ_VOUT */
364*f1ba13f8SMasahiro Yamada 	ret = i2c_read(I2C_SVDD_MONITOR_ADDR,
365*f1ba13f8SMasahiro Yamada 		       PMBUS_CMD_READ_VOUT, 1, (void *)&vcode, 2);
366*f1ba13f8SMasahiro Yamada 	if (ret) {
367*f1ba13f8SMasahiro Yamada 		printf("VID: failed to read the volatge\n");
368*f1ba13f8SMasahiro Yamada 		return ret;
369*f1ba13f8SMasahiro Yamada 	}
370*f1ba13f8SMasahiro Yamada 
371*f1ba13f8SMasahiro Yamada 	return vcode;
372*f1ba13f8SMasahiro Yamada }
373*f1ba13f8SMasahiro Yamada 
set_serdes_volt(int svdd)374*f1ba13f8SMasahiro Yamada int set_serdes_volt(int svdd)
375*f1ba13f8SMasahiro Yamada {
376*f1ba13f8SMasahiro Yamada 	int ret, vdd_last;
377*f1ba13f8SMasahiro Yamada 	u8 buff[5] = {0x04, PWM_CHANNEL0, PMBUS_CMD_VOUT_COMMAND,
378*f1ba13f8SMasahiro Yamada 			svdd & 0xFF, (svdd & 0xFF00) >> 8};
379*f1ba13f8SMasahiro Yamada 
380*f1ba13f8SMasahiro Yamada 	/* Write the desired voltage code to the SVDD regulator */
381*f1ba13f8SMasahiro Yamada 	ret = i2c_write(I2C_SVDD_MONITOR_ADDR,
382*f1ba13f8SMasahiro Yamada 			PMBUS_CMD_PAGE_PLUS_WRITE, 1, (void *)&buff, 5);
383*f1ba13f8SMasahiro Yamada 	if (ret) {
384*f1ba13f8SMasahiro Yamada 		printf("VID: I2C failed to write to the volatge regulator\n");
385*f1ba13f8SMasahiro Yamada 		return -1;
386*f1ba13f8SMasahiro Yamada 	}
387*f1ba13f8SMasahiro Yamada 
388*f1ba13f8SMasahiro Yamada 	/* Wait for the volatge to get to the desired value */
389*f1ba13f8SMasahiro Yamada 	do {
390*f1ba13f8SMasahiro Yamada 		vdd_last = get_serdes_volt();
391*f1ba13f8SMasahiro Yamada 		if (vdd_last < 0) {
392*f1ba13f8SMasahiro Yamada 			printf("VID: Couldn't read sensor abort VID adjust\n");
393*f1ba13f8SMasahiro Yamada 			return -1;
394*f1ba13f8SMasahiro Yamada 		}
395*f1ba13f8SMasahiro Yamada 	} while (vdd_last != svdd);
396*f1ba13f8SMasahiro Yamada 
397*f1ba13f8SMasahiro Yamada 	return 1;
398*f1ba13f8SMasahiro Yamada }
399*f1ba13f8SMasahiro Yamada #else
get_serdes_volt(void)400*f1ba13f8SMasahiro Yamada int get_serdes_volt(void)
401*f1ba13f8SMasahiro Yamada {
402*f1ba13f8SMasahiro Yamada 	return 0;
403*f1ba13f8SMasahiro Yamada }
404*f1ba13f8SMasahiro Yamada 
set_serdes_volt(int svdd)405*f1ba13f8SMasahiro Yamada int set_serdes_volt(int svdd)
406*f1ba13f8SMasahiro Yamada {
407*f1ba13f8SMasahiro Yamada 	int ret;
408*f1ba13f8SMasahiro Yamada 	u8 brdcfg4;
409*f1ba13f8SMasahiro Yamada 
410*f1ba13f8SMasahiro Yamada 	printf("SVDD changing of RDB\n");
411*f1ba13f8SMasahiro Yamada 
412*f1ba13f8SMasahiro Yamada 	/* Read the BRDCFG54 via CLPD */
413*f1ba13f8SMasahiro Yamada 	ret = i2c_read(CONFIG_SYS_I2C_FPGA_ADDR,
414*f1ba13f8SMasahiro Yamada 		       QIXIS_BRDCFG4_OFFSET, 1, (void *)&brdcfg4, 1);
415*f1ba13f8SMasahiro Yamada 	if (ret) {
416*f1ba13f8SMasahiro Yamada 		printf("VID: I2C failed to read the CPLD BRDCFG4\n");
417*f1ba13f8SMasahiro Yamada 		return -1;
418*f1ba13f8SMasahiro Yamada 	}
419*f1ba13f8SMasahiro Yamada 
420*f1ba13f8SMasahiro Yamada 	brdcfg4 = brdcfg4 | 0x08;
421*f1ba13f8SMasahiro Yamada 
422*f1ba13f8SMasahiro Yamada 	/* Write to the BRDCFG4 */
423*f1ba13f8SMasahiro Yamada 	ret = i2c_write(CONFIG_SYS_I2C_FPGA_ADDR,
424*f1ba13f8SMasahiro Yamada 			QIXIS_BRDCFG4_OFFSET, 1, (void *)&brdcfg4, 1);
425*f1ba13f8SMasahiro Yamada 	if (ret) {
426*f1ba13f8SMasahiro Yamada 		debug("VID: I2C failed to set the SVDD CPLD BRDCFG4\n");
427*f1ba13f8SMasahiro Yamada 		return -1;
428*f1ba13f8SMasahiro Yamada 	}
429*f1ba13f8SMasahiro Yamada 
430*f1ba13f8SMasahiro Yamada 	/* Wait for the volatge to get to the desired value */
431*f1ba13f8SMasahiro Yamada 	udelay(10000);
432*f1ba13f8SMasahiro Yamada 
433*f1ba13f8SMasahiro Yamada 	return 1;
434*f1ba13f8SMasahiro Yamada }
435*f1ba13f8SMasahiro Yamada #endif
436*f1ba13f8SMasahiro Yamada 
437*f1ba13f8SMasahiro Yamada /* this function disables the SERDES, changes the SVDD Voltage and enables it*/
board_adjust_vdd(int vdd)438*f1ba13f8SMasahiro Yamada int board_adjust_vdd(int vdd)
439*f1ba13f8SMasahiro Yamada {
440*f1ba13f8SMasahiro Yamada 	int ret = 0;
441*f1ba13f8SMasahiro Yamada 
442*f1ba13f8SMasahiro Yamada 	debug("%s: vdd = %d\n", __func__, vdd);
443*f1ba13f8SMasahiro Yamada 
444*f1ba13f8SMasahiro Yamada 	/* Special settings to be performed when voltage is 900mV */
445*f1ba13f8SMasahiro Yamada 	if (vdd == 900) {
446*f1ba13f8SMasahiro Yamada 		ret = setup_serdes_volt(vdd);
447*f1ba13f8SMasahiro Yamada 		if (ret < 0) {
448*f1ba13f8SMasahiro Yamada 			ret = -1;
449*f1ba13f8SMasahiro Yamada 			goto exit;
450*f1ba13f8SMasahiro Yamada 		}
451*f1ba13f8SMasahiro Yamada 	}
452*f1ba13f8SMasahiro Yamada exit:
453*f1ba13f8SMasahiro Yamada 	return ret;
454*f1ba13f8SMasahiro Yamada }
455*f1ba13f8SMasahiro Yamada 
456*f1ba13f8SMasahiro Yamada #if !defined(CONFIG_SPL_BUILD)
board_init(void)457*f1ba13f8SMasahiro Yamada int board_init(void)
458*f1ba13f8SMasahiro Yamada {
459*f1ba13f8SMasahiro Yamada 	init_final_memctl_regs();
460*f1ba13f8SMasahiro Yamada #if defined(CONFIG_TARGET_LS1088ARDB) && defined(CONFIG_FSL_MC_ENET)
461*f1ba13f8SMasahiro Yamada 	u32 __iomem *irq_ccsr = (u32 __iomem *)ISC_BASE;
462*f1ba13f8SMasahiro Yamada #endif
463*f1ba13f8SMasahiro Yamada 
464*f1ba13f8SMasahiro Yamada 	select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
465*f1ba13f8SMasahiro Yamada 	board_retimer_init();
466*f1ba13f8SMasahiro Yamada 
467*f1ba13f8SMasahiro Yamada #ifdef CONFIG_ENV_IS_NOWHERE
468*f1ba13f8SMasahiro Yamada 	gd->env_addr = (ulong)&default_environment[0];
469*f1ba13f8SMasahiro Yamada #endif
470*f1ba13f8SMasahiro Yamada 
471*f1ba13f8SMasahiro Yamada #if defined(CONFIG_TARGET_LS1088ARDB) && defined(CONFIG_FSL_MC_ENET)
472*f1ba13f8SMasahiro Yamada 	/* invert AQR105 IRQ pins polarity */
473*f1ba13f8SMasahiro Yamada 	out_le32(irq_ccsr + IRQCR_OFFSET / 4, AQR105_IRQ_MASK);
474*f1ba13f8SMasahiro Yamada #endif
475*f1ba13f8SMasahiro Yamada 
476*f1ba13f8SMasahiro Yamada #ifdef CONFIG_FSL_CAAM
477*f1ba13f8SMasahiro Yamada 	sec_init();
478*f1ba13f8SMasahiro Yamada #endif
479*f1ba13f8SMasahiro Yamada #ifdef CONFIG_FSL_LS_PPA
480*f1ba13f8SMasahiro Yamada 	ppa_init();
481*f1ba13f8SMasahiro Yamada #endif
482*f1ba13f8SMasahiro Yamada 	return 0;
483*f1ba13f8SMasahiro Yamada }
484*f1ba13f8SMasahiro Yamada 
detail_board_ddr_info(void)485*f1ba13f8SMasahiro Yamada void detail_board_ddr_info(void)
486*f1ba13f8SMasahiro Yamada {
487*f1ba13f8SMasahiro Yamada 	puts("\nDDR    ");
488*f1ba13f8SMasahiro Yamada 	print_size(gd->bd->bi_dram[0].size + gd->bd->bi_dram[1].size, "");
489*f1ba13f8SMasahiro Yamada 	print_ddr_info(0);
490*f1ba13f8SMasahiro Yamada }
491*f1ba13f8SMasahiro Yamada 
492*f1ba13f8SMasahiro Yamada #if defined(CONFIG_ARCH_MISC_INIT)
arch_misc_init(void)493*f1ba13f8SMasahiro Yamada int arch_misc_init(void)
494*f1ba13f8SMasahiro Yamada {
495*f1ba13f8SMasahiro Yamada 	return 0;
496*f1ba13f8SMasahiro Yamada }
497*f1ba13f8SMasahiro Yamada #endif
498*f1ba13f8SMasahiro Yamada 
499*f1ba13f8SMasahiro Yamada #ifdef CONFIG_FSL_MC_ENET
fdt_fixup_board_enet(void * fdt)500*f1ba13f8SMasahiro Yamada void fdt_fixup_board_enet(void *fdt)
501*f1ba13f8SMasahiro Yamada {
502*f1ba13f8SMasahiro Yamada 	int offset;
503*f1ba13f8SMasahiro Yamada 
504*f1ba13f8SMasahiro Yamada 	offset = fdt_path_offset(fdt, "/fsl-mc");
505*f1ba13f8SMasahiro Yamada 
506*f1ba13f8SMasahiro Yamada 	if (offset < 0)
507*f1ba13f8SMasahiro Yamada 		offset = fdt_path_offset(fdt, "/fsl,dprc@0");
508*f1ba13f8SMasahiro Yamada 
509*f1ba13f8SMasahiro Yamada 	if (offset < 0) {
510*f1ba13f8SMasahiro Yamada 		printf("%s: ERROR: fsl-mc node not found in device tree (error %d)\n",
511*f1ba13f8SMasahiro Yamada 		       __func__, offset);
512*f1ba13f8SMasahiro Yamada 		return;
513*f1ba13f8SMasahiro Yamada 	}
514*f1ba13f8SMasahiro Yamada 
515*f1ba13f8SMasahiro Yamada 	if ((get_mc_boot_status() == 0) && (get_dpl_apply_status() == 0))
516*f1ba13f8SMasahiro Yamada 		fdt_status_okay(fdt, offset);
517*f1ba13f8SMasahiro Yamada 	else
518*f1ba13f8SMasahiro Yamada 		fdt_status_fail(fdt, offset);
519*f1ba13f8SMasahiro Yamada }
520*f1ba13f8SMasahiro Yamada #endif
521*f1ba13f8SMasahiro Yamada 
522*f1ba13f8SMasahiro Yamada #ifdef CONFIG_OF_BOARD_SETUP
fsl_fdt_fixup_flash(void * fdt)523*f1ba13f8SMasahiro Yamada void fsl_fdt_fixup_flash(void *fdt)
524*f1ba13f8SMasahiro Yamada {
525*f1ba13f8SMasahiro Yamada 	int offset;
526*f1ba13f8SMasahiro Yamada 
527*f1ba13f8SMasahiro Yamada /*
528*f1ba13f8SMasahiro Yamada  * IFC-NOR and QSPI are muxed on SoC.
529*f1ba13f8SMasahiro Yamada  * So disable IFC node in dts if QSPI is enabled or
530*f1ba13f8SMasahiro Yamada  * disable QSPI node in dts in case QSPI is not enabled.
531*f1ba13f8SMasahiro Yamada  */
532*f1ba13f8SMasahiro Yamada 
533*f1ba13f8SMasahiro Yamada #ifdef CONFIG_FSL_QSPI
534*f1ba13f8SMasahiro Yamada 	offset = fdt_path_offset(fdt, "/soc/ifc/nor");
535*f1ba13f8SMasahiro Yamada 
536*f1ba13f8SMasahiro Yamada 	if (offset < 0)
537*f1ba13f8SMasahiro Yamada 		offset = fdt_path_offset(fdt, "/ifc/nor");
538*f1ba13f8SMasahiro Yamada #else
539*f1ba13f8SMasahiro Yamada 	offset = fdt_path_offset(fdt, "/soc/quadspi");
540*f1ba13f8SMasahiro Yamada 
541*f1ba13f8SMasahiro Yamada 	if (offset < 0)
542*f1ba13f8SMasahiro Yamada 		offset = fdt_path_offset(fdt, "/quadspi");
543*f1ba13f8SMasahiro Yamada #endif
544*f1ba13f8SMasahiro Yamada 	if (offset < 0)
545*f1ba13f8SMasahiro Yamada 		return;
546*f1ba13f8SMasahiro Yamada 
547*f1ba13f8SMasahiro Yamada 	fdt_status_disabled(fdt, offset);
548*f1ba13f8SMasahiro Yamada }
549*f1ba13f8SMasahiro Yamada 
ft_board_setup(void * blob,bd_t * bd)550*f1ba13f8SMasahiro Yamada int ft_board_setup(void *blob, bd_t *bd)
551*f1ba13f8SMasahiro Yamada {
552*f1ba13f8SMasahiro Yamada 	int err, i;
553*f1ba13f8SMasahiro Yamada 	u64 base[CONFIG_NR_DRAM_BANKS];
554*f1ba13f8SMasahiro Yamada 	u64 size[CONFIG_NR_DRAM_BANKS];
555*f1ba13f8SMasahiro Yamada 
556*f1ba13f8SMasahiro Yamada 	ft_cpu_setup(blob, bd);
557*f1ba13f8SMasahiro Yamada 
558*f1ba13f8SMasahiro Yamada 	/* fixup DT for the two GPP DDR banks */
559*f1ba13f8SMasahiro Yamada 	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
560*f1ba13f8SMasahiro Yamada 		base[i] = gd->bd->bi_dram[i].start;
561*f1ba13f8SMasahiro Yamada 		size[i] = gd->bd->bi_dram[i].size;
562*f1ba13f8SMasahiro Yamada 	}
563*f1ba13f8SMasahiro Yamada 
564*f1ba13f8SMasahiro Yamada #ifdef CONFIG_RESV_RAM
565*f1ba13f8SMasahiro Yamada 	/* reduce size if reserved memory is within this bank */
566*f1ba13f8SMasahiro Yamada 	if (gd->arch.resv_ram >= base[0] &&
567*f1ba13f8SMasahiro Yamada 	    gd->arch.resv_ram < base[0] + size[0])
568*f1ba13f8SMasahiro Yamada 		size[0] = gd->arch.resv_ram - base[0];
569*f1ba13f8SMasahiro Yamada 	else if (gd->arch.resv_ram >= base[1] &&
570*f1ba13f8SMasahiro Yamada 		 gd->arch.resv_ram < base[1] + size[1])
571*f1ba13f8SMasahiro Yamada 		size[1] = gd->arch.resv_ram - base[1];
572*f1ba13f8SMasahiro Yamada #endif
573*f1ba13f8SMasahiro Yamada 
574*f1ba13f8SMasahiro Yamada 	fdt_fixup_memory_banks(blob, base, size, CONFIG_NR_DRAM_BANKS);
575*f1ba13f8SMasahiro Yamada 
576*f1ba13f8SMasahiro Yamada 	fsl_fdt_fixup_flash(blob);
577*f1ba13f8SMasahiro Yamada 
578*f1ba13f8SMasahiro Yamada #ifdef CONFIG_FSL_MC_ENET
579*f1ba13f8SMasahiro Yamada 	fdt_fixup_board_enet(blob);
580*f1ba13f8SMasahiro Yamada 	err = fsl_mc_ldpaa_exit(bd);
581*f1ba13f8SMasahiro Yamada 	if (err)
582*f1ba13f8SMasahiro Yamada 		return err;
583*f1ba13f8SMasahiro Yamada #endif
584*f1ba13f8SMasahiro Yamada 
585*f1ba13f8SMasahiro Yamada 	return 0;
586*f1ba13f8SMasahiro Yamada }
587*f1ba13f8SMasahiro Yamada #endif
588*f1ba13f8SMasahiro Yamada #endif /* defined(CONFIG_SPL_BUILD) */
589