xref: /openbmc/u-boot/board/ti/am43xx/board.c (revision fc69d472)
1 /*
2  * board.c
3  *
4  * Board functions for TI AM43XX based boards
5  *
6  * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
7  *
8  * SPDX-License-Identifier:	GPL-2.0+
9  */
10 
11 #include <common.h>
12 #include <i2c.h>
13 #include <linux/errno.h>
14 #include <spl.h>
15 #include <usb.h>
16 #include <asm/omap_sec_common.h>
17 #include <asm/arch/clock.h>
18 #include <asm/arch/sys_proto.h>
19 #include <asm/arch/mux.h>
20 #include <asm/arch/ddr_defs.h>
21 #include <asm/arch/gpio.h>
22 #include <asm/emif.h>
23 #include "../common/board_detect.h"
24 #include "board.h"
25 #include <power/pmic.h>
26 #include <power/tps65218.h>
27 #include <power/tps62362.h>
28 #include <miiphy.h>
29 #include <cpsw.h>
30 #include <linux/usb/gadget.h>
31 #include <dwc3-uboot.h>
32 #include <dwc3-omap-uboot.h>
33 #include <ti-usb-phy-uboot.h>
34 
35 DECLARE_GLOBAL_DATA_PTR;
36 
37 static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
38 
39 /*
40  * Read header information from EEPROM into global structure.
41  */
42 #ifdef CONFIG_TI_I2C_BOARD_DETECT
43 void do_board_detect(void)
44 {
45 	if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
46 				 CONFIG_EEPROM_CHIP_ADDRESS))
47 		printf("ti_i2c_eeprom_init failed\n");
48 }
49 #endif
50 
51 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
52 
53 const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
54 	{	/* 19.2 MHz */
55 		{125, 3, 2, -1, -1, -1, -1},	/* OPP 50 */
56 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
57 		{125, 3, 1, -1, -1, -1, -1},	/* OPP 100 */
58 		{150, 3, 1, -1, -1, -1, -1},	/* OPP 120 */
59 		{125, 2, 1, -1, -1, -1, -1},	/* OPP TB */
60 		{625, 11, 1, -1, -1, -1, -1}	/* OPP NT */
61 	},
62 	{	/* 24 MHz */
63 		{300, 23, 1, -1, -1, -1, -1},	/* OPP 50 */
64 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
65 		{600, 23, 1, -1, -1, -1, -1},	/* OPP 100 */
66 		{720, 23, 1, -1, -1, -1, -1},	/* OPP 120 */
67 		{800, 23, 1, -1, -1, -1, -1},	/* OPP TB */
68 		{1000, 23, 1, -1, -1, -1, -1}	/* OPP NT */
69 	},
70 	{	/* 25 MHz */
71 		{300, 24, 1, -1, -1, -1, -1},	/* OPP 50 */
72 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
73 		{600, 24, 1, -1, -1, -1, -1},	/* OPP 100 */
74 		{720, 24, 1, -1, -1, -1, -1},	/* OPP 120 */
75 		{800, 24, 1, -1, -1, -1, -1},	/* OPP TB */
76 		{1000, 24, 1, -1, -1, -1, -1}	/* OPP NT */
77 	},
78 	{	/* 26 MHz */
79 		{300, 25, 1, -1, -1, -1, -1},	/* OPP 50 */
80 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
81 		{600, 25, 1, -1, -1, -1, -1},	/* OPP 100 */
82 		{720, 25, 1, -1, -1, -1, -1},	/* OPP 120 */
83 		{800, 25, 1, -1, -1, -1, -1},	/* OPP TB */
84 		{1000, 25, 1, -1, -1, -1, -1}	/* OPP NT */
85 	},
86 };
87 
88 const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
89 		{625, 11, -1, -1, 10, 8, 4},	/* 19.2 MHz */
90 		{1000, 23, -1, -1, 10, 8, 4},	/* 24 MHz */
91 		{1000, 24, -1, -1, 10, 8, 4},	/* 25 MHz */
92 		{1000, 25, -1, -1, 10, 8, 4}	/* 26 MHz */
93 };
94 
95 const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
96 		{400, 7, 5, -1, -1, -1, -1},	/* 19.2 MHz */
97 		{400, 9, 5, -1, -1, -1, -1},	/* 24 MHz */
98 		{384, 9, 5, -1, -1, -1, -1},	/* 25 MHz */
99 		{480, 12, 5, -1, -1, -1, -1}	/* 26 MHz */
100 };
101 
102 const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
103 		{665, 47, 1, -1, 4, -1, -1}, /*19.2*/
104 		{133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
105 		{266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
106 		{133, 12, 1, -1, 4, -1, -1}  /* 26 MHz */
107 };
108 
109 const struct dpll_params gp_evm_dpll_ddr = {
110 		50, 2, 1, -1, 2, -1, -1};
111 
112 static const struct dpll_params idk_dpll_ddr = {
113 	400, 23, 1, -1, 2, -1, -1
114 };
115 
116 static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
117 	0x00500050,
118 	0x00350035,
119 	0x00350035,
120 	0x00350035,
121 	0x00350035,
122 	0x00350035,
123 	0x00000000,
124 	0x00000000,
125 	0x00000000,
126 	0x00000000,
127 	0x00000000,
128 	0x00000000,
129 	0x00000000,
130 	0x00000000,
131 	0x00000000,
132 	0x00000000,
133 	0x00000000,
134 	0x00000000,
135 	0x40001000,
136 	0x08102040
137 };
138 
139 const struct ctrl_ioregs ioregs_lpddr2 = {
140 	.cm0ioctl		= LPDDR2_ADDRCTRL_IOCTRL_VALUE,
141 	.cm1ioctl		= LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
142 	.cm2ioctl		= LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
143 	.dt0ioctl		= LPDDR2_DATA0_IOCTRL_VALUE,
144 	.dt1ioctl		= LPDDR2_DATA0_IOCTRL_VALUE,
145 	.dt2ioctrl		= LPDDR2_DATA0_IOCTRL_VALUE,
146 	.dt3ioctrl		= LPDDR2_DATA0_IOCTRL_VALUE,
147 	.emif_sdram_config_ext	= 0x1,
148 };
149 
150 const struct emif_regs emif_regs_lpddr2 = {
151 	.sdram_config			= 0x808012BA,
152 	.ref_ctrl			= 0x0000040D,
153 	.sdram_tim1			= 0xEA86B411,
154 	.sdram_tim2			= 0x103A094A,
155 	.sdram_tim3			= 0x0F6BA37F,
156 	.read_idle_ctrl			= 0x00050000,
157 	.zq_config			= 0x50074BE4,
158 	.temp_alert_config		= 0x0,
159 	.emif_rd_wr_lvl_rmp_win		= 0x0,
160 	.emif_rd_wr_lvl_rmp_ctl		= 0x0,
161 	.emif_rd_wr_lvl_ctl		= 0x0,
162 	.emif_ddr_phy_ctlr_1		= 0x0E284006,
163 	.emif_rd_wr_exec_thresh		= 0x80000405,
164 	.emif_ddr_ext_phy_ctrl_1	= 0x04010040,
165 	.emif_ddr_ext_phy_ctrl_2	= 0x00500050,
166 	.emif_ddr_ext_phy_ctrl_3	= 0x00500050,
167 	.emif_ddr_ext_phy_ctrl_4	= 0x00500050,
168 	.emif_ddr_ext_phy_ctrl_5	= 0x00500050,
169 	.emif_prio_class_serv_map	= 0x80000001,
170 	.emif_connect_id_serv_1_map	= 0x80000094,
171 	.emif_connect_id_serv_2_map	= 0x00000000,
172 	.emif_cos_config			= 0x000FFFFF
173 };
174 
175 const struct ctrl_ioregs ioregs_ddr3 = {
176 	.cm0ioctl		= DDR3_ADDRCTRL_IOCTRL_VALUE,
177 	.cm1ioctl		= DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
178 	.cm2ioctl		= DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
179 	.dt0ioctl		= DDR3_DATA0_IOCTRL_VALUE,
180 	.dt1ioctl		= DDR3_DATA0_IOCTRL_VALUE,
181 	.dt2ioctrl		= DDR3_DATA0_IOCTRL_VALUE,
182 	.dt3ioctrl		= DDR3_DATA0_IOCTRL_VALUE,
183 	.emif_sdram_config_ext	= 0xc163,
184 };
185 
186 const struct emif_regs ddr3_emif_regs_400Mhz = {
187 	.sdram_config			= 0x638413B2,
188 	.ref_ctrl			= 0x00000C30,
189 	.sdram_tim1			= 0xEAAAD4DB,
190 	.sdram_tim2			= 0x266B7FDA,
191 	.sdram_tim3			= 0x107F8678,
192 	.read_idle_ctrl			= 0x00050000,
193 	.zq_config			= 0x50074BE4,
194 	.temp_alert_config		= 0x0,
195 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
196 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
197 	.emif_ddr_ext_phy_ctrl_2	= 0x00400040,
198 	.emif_ddr_ext_phy_ctrl_3	= 0x00400040,
199 	.emif_ddr_ext_phy_ctrl_4	= 0x00400040,
200 	.emif_ddr_ext_phy_ctrl_5	= 0x00400040,
201 	.emif_rd_wr_lvl_rmp_win		= 0x0,
202 	.emif_rd_wr_lvl_rmp_ctl		= 0x0,
203 	.emif_rd_wr_lvl_ctl		= 0x0,
204 	.emif_rd_wr_exec_thresh		= 0x80000405,
205 	.emif_prio_class_serv_map	= 0x80000001,
206 	.emif_connect_id_serv_1_map	= 0x80000094,
207 	.emif_connect_id_serv_2_map	= 0x00000000,
208 	.emif_cos_config		= 0x000FFFFF
209 };
210 
211 /* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
212 const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
213 	.sdram_config			= 0x638413B2,
214 	.ref_ctrl			= 0x00000C30,
215 	.sdram_tim1			= 0xEAAAD4DB,
216 	.sdram_tim2			= 0x266B7FDA,
217 	.sdram_tim3			= 0x107F8678,
218 	.read_idle_ctrl			= 0x00050000,
219 	.zq_config			= 0x50074BE4,
220 	.temp_alert_config		= 0x0,
221 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
222 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
223 	.emif_ddr_ext_phy_ctrl_2	= 0x00000065,
224 	.emif_ddr_ext_phy_ctrl_3	= 0x00000091,
225 	.emif_ddr_ext_phy_ctrl_4	= 0x000000B5,
226 	.emif_ddr_ext_phy_ctrl_5	= 0x000000E5,
227 	.emif_rd_wr_exec_thresh		= 0x80000405,
228 	.emif_prio_class_serv_map	= 0x80000001,
229 	.emif_connect_id_serv_1_map	= 0x80000094,
230 	.emif_connect_id_serv_2_map	= 0x00000000,
231 	.emif_cos_config		= 0x000FFFFF
232 };
233 
234 /* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
235 const struct emif_regs ddr3_emif_regs_400Mhz_production = {
236 	.sdram_config			= 0x638413B2,
237 	.ref_ctrl			= 0x00000C30,
238 	.sdram_tim1			= 0xEAAAD4DB,
239 	.sdram_tim2			= 0x266B7FDA,
240 	.sdram_tim3			= 0x107F8678,
241 	.read_idle_ctrl			= 0x00050000,
242 	.zq_config			= 0x50074BE4,
243 	.temp_alert_config		= 0x0,
244 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
245 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
246 	.emif_ddr_ext_phy_ctrl_2	= 0x00000066,
247 	.emif_ddr_ext_phy_ctrl_3	= 0x00000091,
248 	.emif_ddr_ext_phy_ctrl_4	= 0x000000B9,
249 	.emif_ddr_ext_phy_ctrl_5	= 0x000000E6,
250 	.emif_rd_wr_exec_thresh		= 0x80000405,
251 	.emif_prio_class_serv_map	= 0x80000001,
252 	.emif_connect_id_serv_1_map	= 0x80000094,
253 	.emif_connect_id_serv_2_map	= 0x00000000,
254 	.emif_cos_config		= 0x000FFFFF
255 };
256 
257 static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
258 	.sdram_config			= 0x638413b2,
259 	.sdram_config2			= 0x00000000,
260 	.ref_ctrl			= 0x00000c30,
261 	.sdram_tim1			= 0xeaaad4db,
262 	.sdram_tim2			= 0x266b7fda,
263 	.sdram_tim3			= 0x107f8678,
264 	.read_idle_ctrl			= 0x00050000,
265 	.zq_config			= 0x50074be4,
266 	.temp_alert_config		= 0x0,
267 	.emif_ddr_phy_ctlr_1		= 0x0e084008,
268 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
269 	.emif_ddr_ext_phy_ctrl_2	= 0x89,
270 	.emif_ddr_ext_phy_ctrl_3	= 0x90,
271 	.emif_ddr_ext_phy_ctrl_4	= 0x8e,
272 	.emif_ddr_ext_phy_ctrl_5	= 0x8d,
273 	.emif_rd_wr_lvl_rmp_win		= 0x0,
274 	.emif_rd_wr_lvl_rmp_ctl		= 0x00000000,
275 	.emif_rd_wr_lvl_ctl		= 0x00000000,
276 	.emif_rd_wr_exec_thresh		= 0x80000000,
277 	.emif_prio_class_serv_map	= 0x80000001,
278 	.emif_connect_id_serv_1_map	= 0x80000094,
279 	.emif_connect_id_serv_2_map	= 0x00000000,
280 	.emif_cos_config		= 0x000FFFFF
281 };
282 
283 static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
284 	.sdram_config			= 0x61a11b32,
285 	.sdram_config2			= 0x00000000,
286 	.ref_ctrl			= 0x00000c30,
287 	.sdram_tim1			= 0xeaaad4db,
288 	.sdram_tim2			= 0x266b7fda,
289 	.sdram_tim3			= 0x107f8678,
290 	.read_idle_ctrl			= 0x00050000,
291 	.zq_config			= 0x50074be4,
292 	.temp_alert_config		= 0x00000000,
293 	.emif_ddr_phy_ctlr_1		= 0x00008009,
294 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
295 	.emif_ddr_ext_phy_ctrl_2	= 0x00000040,
296 	.emif_ddr_ext_phy_ctrl_3	= 0x0000003e,
297 	.emif_ddr_ext_phy_ctrl_4	= 0x00000051,
298 	.emif_ddr_ext_phy_ctrl_5	= 0x00000051,
299 	.emif_rd_wr_lvl_rmp_win		= 0x00000000,
300 	.emif_rd_wr_lvl_rmp_ctl		= 0x00000000,
301 	.emif_rd_wr_lvl_ctl		= 0x00000000,
302 	.emif_rd_wr_exec_thresh		= 0x00000405,
303 	.emif_prio_class_serv_map	= 0x00000000,
304 	.emif_connect_id_serv_1_map	= 0x00000000,
305 	.emif_connect_id_serv_2_map	= 0x00000000,
306 	.emif_cos_config		= 0x00ffffff
307 };
308 
309 void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
310 {
311 	if (board_is_eposevm()) {
312 		*regs = ext_phy_ctrl_const_base_lpddr2;
313 		*size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
314 	}
315 
316 	return;
317 }
318 
319 const struct dpll_params *get_dpll_ddr_params(void)
320 {
321 	int ind = get_sys_clk_index();
322 
323 	if (board_is_eposevm())
324 		return &epos_evm_dpll_ddr[ind];
325 	else if (board_is_evm() || board_is_sk())
326 		return &gp_evm_dpll_ddr;
327 	else if (board_is_idk())
328 		return &idk_dpll_ddr;
329 
330 	printf(" Board '%s' not supported\n", board_ti_get_name());
331 	return NULL;
332 }
333 
334 
335 /*
336  * get_opp_offset:
337  * Returns the index for safest OPP of the device to boot.
338  * max_off:	Index of the MAX OPP in DEV ATTRIBUTE register.
339  * min_off:	Index of the MIN OPP in DEV ATTRIBUTE register.
340  * This data is read from dev_attribute register which is e-fused.
341  * A'1' in bit indicates OPP disabled and not available, a '0' indicates
342  * OPP available. Lowest OPP starts with min_off. So returning the
343  * bit with rightmost '0'.
344  */
345 static int get_opp_offset(int max_off, int min_off)
346 {
347 	struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
348 	int opp, offset, i;
349 
350 	/* Bits 0:11 are defined to be the MPU_MAX_FREQ */
351 	opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
352 
353 	for (i = max_off; i >= min_off; i--) {
354 		offset = opp & (1 << i);
355 		if (!offset)
356 			return i;
357 	}
358 
359 	return min_off;
360 }
361 
362 const struct dpll_params *get_dpll_mpu_params(void)
363 {
364 	int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
365 	u32 ind = get_sys_clk_index();
366 
367 	return &dpll_mpu[ind][opp];
368 }
369 
370 const struct dpll_params *get_dpll_core_params(void)
371 {
372 	int ind = get_sys_clk_index();
373 
374 	return &dpll_core[ind];
375 }
376 
377 const struct dpll_params *get_dpll_per_params(void)
378 {
379 	int ind = get_sys_clk_index();
380 
381 	return &dpll_per[ind];
382 }
383 
384 void scale_vcores_generic(u32 m)
385 {
386 	int mpu_vdd;
387 
388 	if (i2c_probe(TPS65218_CHIP_PM))
389 		return;
390 
391 	switch (m) {
392 	case 1000:
393 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
394 		break;
395 	case 800:
396 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
397 		break;
398 	case 720:
399 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
400 		break;
401 	case 600:
402 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
403 		break;
404 	case 300:
405 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
406 		break;
407 	default:
408 		puts("Unknown MPU clock, not scaling\n");
409 		return;
410 	}
411 
412 	/* Set DCDC1 (CORE) voltage to 1.1V */
413 	if (tps65218_voltage_update(TPS65218_DCDC1,
414 				    TPS65218_DCDC_VOLT_SEL_1100MV)) {
415 		printf("%s failure\n", __func__);
416 		return;
417 	}
418 
419 	/* Set DCDC2 (MPU) voltage */
420 	if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
421 		printf("%s failure\n", __func__);
422 		return;
423 	}
424 
425 	/* Set DCDC3 (DDR) voltage */
426 	if (tps65218_voltage_update(TPS65218_DCDC3,
427 	    TPS65218_DCDC3_VOLT_SEL_1350MV)) {
428 		printf("%s failure\n", __func__);
429 		return;
430 	}
431 }
432 
433 void scale_vcores_idk(u32 m)
434 {
435 	int mpu_vdd;
436 
437 	if (i2c_probe(TPS62362_I2C_ADDR))
438 		return;
439 
440 	switch (m) {
441 	case 1000:
442 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
443 		break;
444 	case 800:
445 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
446 		break;
447 	case 720:
448 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
449 		break;
450 	case 600:
451 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
452 		break;
453 	case 300:
454 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
455 		break;
456 	default:
457 		puts("Unknown MPU clock, not scaling\n");
458 		return;
459 	}
460 
461 	/* Set VDD_MPU voltage */
462 	if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
463 		printf("%s failure\n", __func__);
464 		return;
465 	}
466 }
467 
468 void gpi2c_init(void)
469 {
470 	/* When needed to be invoked prior to BSS initialization */
471 	static bool first_time = true;
472 
473 	if (first_time) {
474 		enable_i2c0_pin_mux();
475 		i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
476 			 CONFIG_SYS_OMAP24_I2C_SLAVE);
477 		first_time = false;
478 	}
479 }
480 
481 void scale_vcores(void)
482 {
483 	const struct dpll_params *mpu_params;
484 
485 	/* Ensure I2C is initialized for PMIC configuration */
486 	gpi2c_init();
487 
488 	/* Get the frequency */
489 	mpu_params = get_dpll_mpu_params();
490 
491 	if (board_is_idk())
492 		scale_vcores_idk(mpu_params->m);
493 	else
494 		scale_vcores_generic(mpu_params->m);
495 }
496 
497 void set_uart_mux_conf(void)
498 {
499 	enable_uart0_pin_mux();
500 }
501 
502 void set_mux_conf_regs(void)
503 {
504 	enable_board_pin_mux();
505 }
506 
507 static void enable_vtt_regulator(void)
508 {
509 	u32 temp;
510 
511 	/* enable module */
512 	writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
513 
514 	/* enable output for GPIO5_7 */
515 	writel(GPIO_SETDATAOUT(7),
516 	       AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
517 	temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
518 	temp = temp & ~(GPIO_OE_ENABLE(7));
519 	writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
520 }
521 
522 void sdram_init(void)
523 {
524 	/*
525 	 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
526 	 * GP EMV has 1GB DDR3 connected to EMIF
527 	 * along with VTT regulator.
528 	 */
529 	if (board_is_eposevm()) {
530 		config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
531 	} else if (board_is_evm_14_or_later()) {
532 		enable_vtt_regulator();
533 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
534 			   &ddr3_emif_regs_400Mhz_production, 0);
535 	} else if (board_is_evm_12_or_later()) {
536 		enable_vtt_regulator();
537 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
538 			   &ddr3_emif_regs_400Mhz_beta, 0);
539 	} else if (board_is_evm()) {
540 		enable_vtt_regulator();
541 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
542 			   &ddr3_emif_regs_400Mhz, 0);
543 	} else if (board_is_sk()) {
544 		config_ddr(400, &ioregs_ddr3, NULL, NULL,
545 			   &ddr3_sk_emif_regs_400Mhz, 0);
546 	} else if (board_is_idk()) {
547 		config_ddr(400, &ioregs_ddr3, NULL, NULL,
548 			   &ddr3_idk_emif_regs_400Mhz, 0);
549 	}
550 }
551 #endif
552 
553 /* setup board specific PMIC */
554 int power_init_board(void)
555 {
556 	struct pmic *p;
557 
558 	if (board_is_idk()) {
559 		power_tps62362_init(I2C_PMIC);
560 		p = pmic_get("TPS62362");
561 		if (p && !pmic_probe(p))
562 			puts("PMIC:  TPS62362\n");
563 	} else {
564 		power_tps65218_init(I2C_PMIC);
565 		p = pmic_get("TPS65218_PMIC");
566 		if (p && !pmic_probe(p))
567 			puts("PMIC:  TPS65218\n");
568 	}
569 
570 	return 0;
571 }
572 
573 int board_init(void)
574 {
575 	struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
576 	u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
577 	    modena_init0_bw_integer, modena_init0_watermark_0;
578 
579 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
580 	gpmc_init();
581 
582 	/* Clear all important bits for DSS errata that may need to be tweaked*/
583 	mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
584 	                   MREQPRIO_0_SAB_INIT0_MASK;
585 
586 	mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
587 
588 	modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
589 	                                   BW_LIMITER_BW_FRAC_MASK;
590 
591 	modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
592 	                                BW_LIMITER_BW_INT_MASK;
593 
594 	modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
595 	                                 BW_LIMITER_BW_WATERMARK_MASK;
596 
597 	/* Setting MReq Priority of the DSS*/
598 	mreqprio_0 |= 0x77;
599 
600 	/*
601 	 * Set L3 Fast Configuration Register
602 	 * Limiting bandwith for ARM core to 700 MBPS
603 	 */
604 	modena_init0_bw_fractional |= 0x10;
605 	modena_init0_bw_integer |= 0x3;
606 
607 	writel(mreqprio_0, &cdev->mreqprio_0);
608 	writel(mreqprio_1, &cdev->mreqprio_1);
609 
610 	writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
611 	writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
612 	writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
613 
614 	return 0;
615 }
616 
617 #ifdef CONFIG_BOARD_LATE_INIT
618 int board_late_init(void)
619 {
620 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
621 	set_board_info_env(NULL);
622 
623 	/*
624 	 * Default FIT boot on HS devices. Non FIT images are not allowed
625 	 * on HS devices.
626 	 */
627 	if (get_device_type() == HS_DEVICE)
628 		setenv("boot_fit", "1");
629 #endif
630 	return 0;
631 }
632 #endif
633 
634 #ifdef CONFIG_USB_DWC3
635 static struct dwc3_device usb_otg_ss1 = {
636 	.maximum_speed = USB_SPEED_HIGH,
637 	.base = USB_OTG_SS1_BASE,
638 	.tx_fifo_resize = false,
639 	.index = 0,
640 };
641 
642 static struct dwc3_omap_device usb_otg_ss1_glue = {
643 	.base = (void *)USB_OTG_SS1_GLUE_BASE,
644 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
645 	.index = 0,
646 };
647 
648 static struct ti_usb_phy_device usb_phy1_device = {
649 	.usb2_phy_power = (void *)USB2_PHY1_POWER,
650 	.index = 0,
651 };
652 
653 static struct dwc3_device usb_otg_ss2 = {
654 	.maximum_speed = USB_SPEED_HIGH,
655 	.base = USB_OTG_SS2_BASE,
656 	.tx_fifo_resize = false,
657 	.index = 1,
658 };
659 
660 static struct dwc3_omap_device usb_otg_ss2_glue = {
661 	.base = (void *)USB_OTG_SS2_GLUE_BASE,
662 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
663 	.index = 1,
664 };
665 
666 static struct ti_usb_phy_device usb_phy2_device = {
667 	.usb2_phy_power = (void *)USB2_PHY2_POWER,
668 	.index = 1,
669 };
670 
671 int usb_gadget_handle_interrupts(int index)
672 {
673 	u32 status;
674 
675 	status = dwc3_omap_uboot_interrupt_status(index);
676 	if (status)
677 		dwc3_uboot_handle_interrupt(index);
678 
679 	return 0;
680 }
681 #endif /* CONFIG_USB_DWC3 */
682 
683 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
684 int omap_xhci_board_usb_init(int index, enum usb_init_type init)
685 {
686 	enable_usb_clocks(index);
687 #ifdef CONFIG_USB_DWC3
688 	switch (index) {
689 	case 0:
690 		if (init == USB_INIT_DEVICE) {
691 			usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
692 			usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
693 			dwc3_omap_uboot_init(&usb_otg_ss1_glue);
694 			ti_usb_phy_uboot_init(&usb_phy1_device);
695 			dwc3_uboot_init(&usb_otg_ss1);
696 		}
697 		break;
698 	case 1:
699 		if (init == USB_INIT_DEVICE) {
700 			usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
701 			usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
702 			ti_usb_phy_uboot_init(&usb_phy2_device);
703 			dwc3_omap_uboot_init(&usb_otg_ss2_glue);
704 			dwc3_uboot_init(&usb_otg_ss2);
705 		}
706 		break;
707 	default:
708 		printf("Invalid Controller Index\n");
709 	}
710 #endif
711 
712 	return 0;
713 }
714 
715 int omap_xhci_board_usb_cleanup(int index, enum usb_init_type init)
716 {
717 #ifdef CONFIG_USB_DWC3
718 	switch (index) {
719 	case 0:
720 	case 1:
721 		if (init == USB_INIT_DEVICE) {
722 			ti_usb_phy_uboot_exit(index);
723 			dwc3_uboot_exit(index);
724 			dwc3_omap_uboot_exit(index);
725 		}
726 		break;
727 	default:
728 		printf("Invalid Controller Index\n");
729 	}
730 #endif
731 	disable_usb_clocks(index);
732 
733 	return 0;
734 }
735 #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
736 
737 #ifdef CONFIG_DRIVER_TI_CPSW
738 
739 static void cpsw_control(int enabled)
740 {
741 	/* Additional controls can be added here */
742 	return;
743 }
744 
745 static struct cpsw_slave_data cpsw_slaves[] = {
746 	{
747 		.slave_reg_ofs	= 0x208,
748 		.sliver_reg_ofs	= 0xd80,
749 		.phy_addr	= 16,
750 	},
751 	{
752 		.slave_reg_ofs	= 0x308,
753 		.sliver_reg_ofs	= 0xdc0,
754 		.phy_addr	= 1,
755 	},
756 };
757 
758 static struct cpsw_platform_data cpsw_data = {
759 	.mdio_base		= CPSW_MDIO_BASE,
760 	.cpsw_base		= CPSW_BASE,
761 	.mdio_div		= 0xff,
762 	.channels		= 8,
763 	.cpdma_reg_ofs		= 0x800,
764 	.slaves			= 1,
765 	.slave_data		= cpsw_slaves,
766 	.ale_reg_ofs		= 0xd00,
767 	.ale_entries		= 1024,
768 	.host_port_reg_ofs	= 0x108,
769 	.hw_stats_reg_ofs	= 0x900,
770 	.bd_ram_ofs		= 0x2000,
771 	.mac_control		= (1 << 5),
772 	.control		= cpsw_control,
773 	.host_port_num		= 0,
774 	.version		= CPSW_CTRL_VERSION_2,
775 };
776 
777 int board_eth_init(bd_t *bis)
778 {
779 	int rv;
780 	uint8_t mac_addr[6];
781 	uint32_t mac_hi, mac_lo;
782 
783 	/* try reading mac address from efuse */
784 	mac_lo = readl(&cdev->macid0l);
785 	mac_hi = readl(&cdev->macid0h);
786 	mac_addr[0] = mac_hi & 0xFF;
787 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
788 	mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
789 	mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
790 	mac_addr[4] = mac_lo & 0xFF;
791 	mac_addr[5] = (mac_lo & 0xFF00) >> 8;
792 
793 	if (!getenv("ethaddr")) {
794 		puts("<ethaddr> not set. Validating first E-fuse MAC\n");
795 		if (is_valid_ethaddr(mac_addr))
796 			eth_setenv_enetaddr("ethaddr", mac_addr);
797 	}
798 
799 	mac_lo = readl(&cdev->macid1l);
800 	mac_hi = readl(&cdev->macid1h);
801 	mac_addr[0] = mac_hi & 0xFF;
802 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
803 	mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
804 	mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
805 	mac_addr[4] = mac_lo & 0xFF;
806 	mac_addr[5] = (mac_lo & 0xFF00) >> 8;
807 
808 	if (!getenv("eth1addr")) {
809 		if (is_valid_ethaddr(mac_addr))
810 			eth_setenv_enetaddr("eth1addr", mac_addr);
811 	}
812 
813 	if (board_is_eposevm()) {
814 		writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
815 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
816 		cpsw_slaves[0].phy_addr = 16;
817 	} else if (board_is_sk()) {
818 		writel(RGMII_MODE_ENABLE, &cdev->miisel);
819 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
820 		cpsw_slaves[0].phy_addr = 4;
821 		cpsw_slaves[1].phy_addr = 5;
822 	} else if (board_is_idk()) {
823 		writel(RGMII_MODE_ENABLE, &cdev->miisel);
824 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
825 		cpsw_slaves[0].phy_addr = 0;
826 	} else {
827 		writel(RGMII_MODE_ENABLE, &cdev->miisel);
828 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
829 		cpsw_slaves[0].phy_addr = 0;
830 	}
831 
832 	rv = cpsw_register(&cpsw_data);
833 	if (rv < 0)
834 		printf("Error %d registering CPSW switch\n", rv);
835 
836 	return rv;
837 }
838 #endif
839 
840 #ifdef CONFIG_SPL_LOAD_FIT
841 int board_fit_config_name_match(const char *name)
842 {
843 	if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
844 		return 0;
845 	else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
846 		return 0;
847 	else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
848 		return 0;
849 	else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
850 		return 0;
851 	else
852 		return -1;
853 }
854 #endif
855 
856 #ifdef CONFIG_TI_SECURE_DEVICE
857 void board_fit_image_post_process(void **p_image, size_t *p_size)
858 {
859 	secure_boot_verify_image(p_image, p_size);
860 }
861 #endif
862