xref: /openbmc/u-boot/board/ti/am57xx/board.c (revision ff6552e8)
1 /*
2  * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
3  *
4  * Author: Felipe Balbi <balbi@ti.com>
5  *
6  * Based on board/ti/dra7xx/evm.c
7  *
8  * SPDX-License-Identifier:	GPL-2.0+
9  */
10 
11 #include <common.h>
12 #include <palmas.h>
13 #include <sata.h>
14 #include <usb.h>
15 #include <asm/omap_common.h>
16 #include <asm/emif.h>
17 #include <asm/gpio.h>
18 #include <asm/arch/gpio.h>
19 #include <asm/arch/clock.h>
20 #include <asm/arch/dra7xx_iodelay.h>
21 #include <asm/arch/sys_proto.h>
22 #include <asm/arch/mmc_host_def.h>
23 #include <asm/arch/sata.h>
24 #include <asm/arch/gpio.h>
25 #include <asm/arch/omap.h>
26 #include <environment.h>
27 #include <usb.h>
28 #include <linux/usb/gadget.h>
29 #include <dwc3-uboot.h>
30 #include <dwc3-omap-uboot.h>
31 #include <ti-usb-phy-uboot.h>
32 
33 #include "../common/board_detect.h"
34 #include "mux_data.h"
35 
36 #define board_is_x15()		board_ti_is("BBRDX15_")
37 #define board_is_am572x_evm()	board_ti_is("AM572PM_")
38 
39 #ifdef CONFIG_DRIVER_TI_CPSW
40 #include <cpsw.h>
41 #endif
42 
43 DECLARE_GLOBAL_DATA_PTR;
44 
45 /* GPIO 7_11 */
46 #define GPIO_DDR_VTT_EN 203
47 
48 #define SYSINFO_BOARD_NAME_MAX_LEN	45
49 
50 const struct omap_sysinfo sysinfo = {
51 	"Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n"
52 };
53 
54 static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = {
55 	.dmm_lisa_map_3 = 0x80740300,
56 	.is_ma_present  = 0x1
57 };
58 
59 void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
60 {
61 	*dmm_lisa_regs = &beagle_x15_lisa_regs;
62 }
63 
64 static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
65 	.sdram_config_init	= 0x61851b32,
66 	.sdram_config		= 0x61851b32,
67 	.sdram_config2		= 0x08000000,
68 	.ref_ctrl		= 0x000040F1,
69 	.ref_ctrl_final		= 0x00001035,
70 	.sdram_tim1		= 0xcccf36ab,
71 	.sdram_tim2		= 0x308f7fda,
72 	.sdram_tim3		= 0x409f88a8,
73 	.read_idle_ctrl		= 0x00050000,
74 	.zq_config		= 0x5007190b,
75 	.temp_alert_config	= 0x00000000,
76 	.emif_ddr_phy_ctlr_1_init = 0x0024400b,
77 	.emif_ddr_phy_ctlr_1	= 0x0e24400b,
78 	.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
79 	.emif_ddr_ext_phy_ctrl_2 = 0x00910091,
80 	.emif_ddr_ext_phy_ctrl_3 = 0x00950095,
81 	.emif_ddr_ext_phy_ctrl_4 = 0x009b009b,
82 	.emif_ddr_ext_phy_ctrl_5 = 0x009e009e,
83 	.emif_rd_wr_lvl_rmp_win	= 0x00000000,
84 	.emif_rd_wr_lvl_rmp_ctl	= 0x80000000,
85 	.emif_rd_wr_lvl_ctl	= 0x00000000,
86 	.emif_rd_wr_exec_thresh	= 0x00000305
87 };
88 
89 /* Ext phy ctrl regs 1-35 */
90 static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
91 	0x10040100,
92 	0x00910091,
93 	0x00950095,
94 	0x009B009B,
95 	0x009E009E,
96 	0x00980098,
97 	0x00340034,
98 	0x00350035,
99 	0x00340034,
100 	0x00310031,
101 	0x00340034,
102 	0x007F007F,
103 	0x007F007F,
104 	0x007F007F,
105 	0x007F007F,
106 	0x007F007F,
107 	0x00480048,
108 	0x004A004A,
109 	0x00520052,
110 	0x00550055,
111 	0x00500050,
112 	0x00000000,
113 	0x00600020,
114 	0x40011080,
115 	0x08102040,
116 	0x0,
117 	0x0,
118 	0x0,
119 	0x0,
120 	0x0,
121 	0x0,
122 	0x0,
123 	0x0,
124 	0x0,
125 	0x0
126 };
127 
128 static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
129 	.sdram_config_init	= 0x61851b32,
130 	.sdram_config		= 0x61851b32,
131 	.sdram_config2		= 0x08000000,
132 	.ref_ctrl		= 0x000040F1,
133 	.ref_ctrl_final		= 0x00001035,
134 	.sdram_tim1		= 0xcccf36ab,
135 	.sdram_tim2		= 0x308f7fda,
136 	.sdram_tim3		= 0x409f88a8,
137 	.read_idle_ctrl		= 0x00050000,
138 	.zq_config		= 0x5007190b,
139 	.temp_alert_config	= 0x00000000,
140 	.emif_ddr_phy_ctlr_1_init = 0x0024400b,
141 	.emif_ddr_phy_ctlr_1	= 0x0e24400b,
142 	.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
143 	.emif_ddr_ext_phy_ctrl_2 = 0x00910091,
144 	.emif_ddr_ext_phy_ctrl_3 = 0x00950095,
145 	.emif_ddr_ext_phy_ctrl_4 = 0x009b009b,
146 	.emif_ddr_ext_phy_ctrl_5 = 0x009e009e,
147 	.emif_rd_wr_lvl_rmp_win	= 0x00000000,
148 	.emif_rd_wr_lvl_rmp_ctl	= 0x80000000,
149 	.emif_rd_wr_lvl_ctl	= 0x00000000,
150 	.emif_rd_wr_exec_thresh	= 0x00000305
151 };
152 
153 static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
154 	0x10040100,
155 	0x00910091,
156 	0x00950095,
157 	0x009B009B,
158 	0x009E009E,
159 	0x00980098,
160 	0x00340034,
161 	0x00350035,
162 	0x00340034,
163 	0x00310031,
164 	0x00340034,
165 	0x007F007F,
166 	0x007F007F,
167 	0x007F007F,
168 	0x007F007F,
169 	0x007F007F,
170 	0x00480048,
171 	0x004A004A,
172 	0x00520052,
173 	0x00550055,
174 	0x00500050,
175 	0x00000000,
176 	0x00600020,
177 	0x40011080,
178 	0x08102040,
179 	0x0,
180 	0x0,
181 	0x0,
182 	0x0,
183 	0x0,
184 	0x0,
185 	0x0,
186 	0x0,
187 	0x0,
188 	0x0
189 };
190 
191 void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
192 {
193 	switch (emif_nr) {
194 	case 1:
195 		*regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
196 		break;
197 	case 2:
198 		*regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs;
199 		break;
200 	}
201 }
202 
203 void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size)
204 {
205 	switch (emif_nr) {
206 	case 1:
207 		*regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs;
208 		*size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs);
209 		break;
210 	case 2:
211 		*regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs;
212 		*size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs);
213 		break;
214 	}
215 }
216 
217 struct vcores_data beagle_x15_volts = {
218 	.mpu.value		= VDD_MPU_DRA752,
219 	.mpu.efuse.reg		= STD_FUSE_OPP_VMIN_MPU_NOM,
220 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
221 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
222 	.mpu.pmic		= &tps659038,
223 
224 	.eve.value		= VDD_EVE_DRA752,
225 	.eve.efuse.reg		= STD_FUSE_OPP_VMIN_DSPEVE_NOM,
226 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
227 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
228 	.eve.pmic		= &tps659038,
229 
230 	.gpu.value		= VDD_GPU_DRA752,
231 	.gpu.efuse.reg		= STD_FUSE_OPP_VMIN_GPU_NOM,
232 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
233 	.gpu.addr		= TPS659038_REG_ADDR_SMPS45,
234 	.gpu.pmic		= &tps659038,
235 
236 	.core.value		= VDD_CORE_DRA752,
237 	.core.efuse.reg		= STD_FUSE_OPP_VMIN_CORE_NOM,
238 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
239 	.core.addr		= TPS659038_REG_ADDR_SMPS6,
240 	.core.pmic		= &tps659038,
241 
242 	.iva.value		= VDD_IVA_DRA752,
243 	.iva.efuse.reg		= STD_FUSE_OPP_VMIN_IVA_NOM,
244 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
245 	.iva.addr		= TPS659038_REG_ADDR_SMPS45,
246 	.iva.pmic		= &tps659038,
247 };
248 
249 #ifdef CONFIG_SPL_BUILD
250 /* No env to setup for SPL */
251 static inline void setup_board_eeprom_env(void) { }
252 
253 /* Override function to read eeprom information */
254 void do_board_detect(void)
255 {
256 	int rc;
257 
258 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
259 				  CONFIG_EEPROM_CHIP_ADDRESS);
260 	if (rc)
261 		printf("ti_i2c_eeprom_init failed %d\n", rc);
262 }
263 
264 #else	/* CONFIG_SPL_BUILD */
265 
266 /* Override function to read eeprom information: actual i2c read done by SPL*/
267 void do_board_detect(void)
268 {
269 	char *bname = NULL;
270 	int rc;
271 
272 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
273 				  CONFIG_EEPROM_CHIP_ADDRESS);
274 	if (rc)
275 		printf("ti_i2c_eeprom_init failed %d\n", rc);
276 
277 	if (board_is_x15())
278 		bname = "BeagleBoard X15";
279 	else if (board_is_am572x_evm())
280 		bname = "AM572x EVM";
281 
282 	if (bname)
283 		snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
284 			 "Board: %s REV %s\n", bname, board_ti_get_rev());
285 }
286 
287 static void setup_board_eeprom_env(void)
288 {
289 	char *name = "beagle_x15";
290 	int rc;
291 
292 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
293 				  CONFIG_EEPROM_CHIP_ADDRESS);
294 	if (rc)
295 		goto invalid_eeprom;
296 
297 	if (board_is_am572x_evm())
298 		name = "am57xx_evm";
299 	else
300 		printf("Unidentified board claims %s in eeprom header\n",
301 		       board_ti_get_name());
302 
303 invalid_eeprom:
304 	set_board_info_env(name);
305 }
306 
307 #endif	/* CONFIG_SPL_BUILD */
308 
309 void hw_data_init(void)
310 {
311 	*prcm = &dra7xx_prcm;
312 	*dplls_data = &dra7xx_dplls;
313 	*omap_vcores = &beagle_x15_volts;
314 	*ctrl = &dra7xx_ctrl;
315 }
316 
317 int board_init(void)
318 {
319 	gpmc_init();
320 	gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
321 
322 	return 0;
323 }
324 
325 int board_late_init(void)
326 {
327 	setup_board_eeprom_env();
328 
329 	/*
330 	 * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
331 	 * This is the POWERHOLD-in-Low behavior.
332 	 */
333 	palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
334 	return 0;
335 }
336 
337 void set_muxconf_regs(void)
338 {
339 	do_set_mux32((*ctrl)->control_padconf_core_base,
340 		     early_padconf, ARRAY_SIZE(early_padconf));
341 }
342 
343 #ifdef CONFIG_IODELAY_RECALIBRATION
344 void recalibrate_iodelay(void)
345 {
346 	__recalibrate_iodelay(core_padconf_array_essential,
347 			      ARRAY_SIZE(core_padconf_array_essential),
348 			      iodelay_cfg_array, ARRAY_SIZE(iodelay_cfg_array));
349 }
350 #endif
351 
352 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
353 int board_mmc_init(bd_t *bis)
354 {
355 	omap_mmc_init(0, 0, 0, -1, -1);
356 	omap_mmc_init(1, 0, 0, -1, -1);
357 	return 0;
358 }
359 #endif
360 
361 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
362 int spl_start_uboot(void)
363 {
364 	/* break into full u-boot on 'c' */
365 	if (serial_tstc() && serial_getc() == 'c')
366 		return 1;
367 
368 #ifdef CONFIG_SPL_ENV_SUPPORT
369 	env_init();
370 	env_relocate_spec();
371 	if (getenv_yesno("boot_os") != 1)
372 		return 1;
373 #endif
374 
375 	return 0;
376 }
377 #endif
378 
379 #ifdef CONFIG_USB_DWC3
380 static struct dwc3_device usb_otg_ss1 = {
381 	.maximum_speed = USB_SPEED_SUPER,
382 	.base = DRA7_USB_OTG_SS1_BASE,
383 	.tx_fifo_resize = false,
384 	.index = 0,
385 };
386 
387 static struct dwc3_omap_device usb_otg_ss1_glue = {
388 	.base = (void *)DRA7_USB_OTG_SS1_GLUE_BASE,
389 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
390 	.index = 0,
391 };
392 
393 static struct ti_usb_phy_device usb_phy1_device = {
394 	.pll_ctrl_base = (void *)DRA7_USB3_PHY1_PLL_CTRL,
395 	.usb2_phy_power = (void *)DRA7_USB2_PHY1_POWER,
396 	.usb3_phy_power = (void *)DRA7_USB3_PHY1_POWER,
397 	.index = 0,
398 };
399 
400 static struct dwc3_device usb_otg_ss2 = {
401 	.maximum_speed = USB_SPEED_HIGH,
402 	.base = DRA7_USB_OTG_SS2_BASE,
403 	.tx_fifo_resize = false,
404 	.index = 1,
405 };
406 
407 static struct dwc3_omap_device usb_otg_ss2_glue = {
408 	.base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
409 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
410 	.index = 1,
411 };
412 
413 static struct ti_usb_phy_device usb_phy2_device = {
414 	.usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
415 	.index = 1,
416 };
417 
418 int board_usb_init(int index, enum usb_init_type init)
419 {
420 	enable_usb_clocks(index);
421 	switch (index) {
422 	case 0:
423 		if (init == USB_INIT_DEVICE) {
424 			printf("port %d can't be used as device\n", index);
425 			disable_usb_clocks(index);
426 			return -EINVAL;
427 		} else {
428 			usb_otg_ss1.dr_mode = USB_DR_MODE_HOST;
429 			usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
430 			setbits_le32((*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
431 				     OTG_SS_CLKCTRL_MODULEMODE_HW |
432 				     OPTFCLKEN_REFCLK960M);
433 		}
434 
435 		ti_usb_phy_uboot_init(&usb_phy1_device);
436 		dwc3_omap_uboot_init(&usb_otg_ss1_glue);
437 		dwc3_uboot_init(&usb_otg_ss1);
438 		break;
439 	case 1:
440 		if (init == USB_INIT_DEVICE) {
441 			usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
442 			usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
443 		} else {
444 			printf("port %d can't be used as host\n", index);
445 			disable_usb_clocks(index);
446 			return -EINVAL;
447 		}
448 
449 		ti_usb_phy_uboot_init(&usb_phy2_device);
450 		dwc3_omap_uboot_init(&usb_otg_ss2_glue);
451 		dwc3_uboot_init(&usb_otg_ss2);
452 		break;
453 	default:
454 		printf("Invalid Controller Index\n");
455 	}
456 
457 	return 0;
458 }
459 
460 int board_usb_cleanup(int index, enum usb_init_type init)
461 {
462 	switch (index) {
463 	case 0:
464 	case 1:
465 		ti_usb_phy_uboot_exit(index);
466 		dwc3_uboot_exit(index);
467 		dwc3_omap_uboot_exit(index);
468 		break;
469 	default:
470 		printf("Invalid Controller Index\n");
471 	}
472 	disable_usb_clocks(index);
473 	return 0;
474 }
475 
476 int usb_gadget_handle_interrupts(int index)
477 {
478 	u32 status;
479 
480 	status = dwc3_omap_uboot_interrupt_status(index);
481 	if (status)
482 		dwc3_uboot_handle_interrupt(index);
483 
484 	return 0;
485 }
486 #endif
487 
488 #ifdef CONFIG_DRIVER_TI_CPSW
489 
490 /* Delay value to add to calibrated value */
491 #define RGMII0_TXCTL_DLY_VAL		((0x3 << 5) + 0x8)
492 #define RGMII0_TXD0_DLY_VAL		((0x3 << 5) + 0x8)
493 #define RGMII0_TXD1_DLY_VAL		((0x3 << 5) + 0x2)
494 #define RGMII0_TXD2_DLY_VAL		((0x4 << 5) + 0x0)
495 #define RGMII0_TXD3_DLY_VAL		((0x4 << 5) + 0x0)
496 #define VIN2A_D13_DLY_VAL		((0x3 << 5) + 0x8)
497 #define VIN2A_D17_DLY_VAL		((0x3 << 5) + 0x8)
498 #define VIN2A_D16_DLY_VAL		((0x3 << 5) + 0x2)
499 #define VIN2A_D15_DLY_VAL		((0x4 << 5) + 0x0)
500 #define VIN2A_D14_DLY_VAL		((0x4 << 5) + 0x0)
501 
502 static void cpsw_control(int enabled)
503 {
504 	/* VTP can be added here */
505 }
506 
507 static struct cpsw_slave_data cpsw_slaves[] = {
508 	{
509 		.slave_reg_ofs	= 0x208,
510 		.sliver_reg_ofs	= 0xd80,
511 		.phy_addr	= 1,
512 	},
513 	{
514 		.slave_reg_ofs	= 0x308,
515 		.sliver_reg_ofs	= 0xdc0,
516 		.phy_addr	= 2,
517 	},
518 };
519 
520 static struct cpsw_platform_data cpsw_data = {
521 	.mdio_base		= CPSW_MDIO_BASE,
522 	.cpsw_base		= CPSW_BASE,
523 	.mdio_div		= 0xff,
524 	.channels		= 8,
525 	.cpdma_reg_ofs		= 0x800,
526 	.slaves			= 1,
527 	.slave_data		= cpsw_slaves,
528 	.ale_reg_ofs		= 0xd00,
529 	.ale_entries		= 1024,
530 	.host_port_reg_ofs	= 0x108,
531 	.hw_stats_reg_ofs	= 0x900,
532 	.bd_ram_ofs		= 0x2000,
533 	.mac_control		= (1 << 5),
534 	.control		= cpsw_control,
535 	.host_port_num		= 0,
536 	.version		= CPSW_CTRL_VERSION_2,
537 };
538 
539 static u64 mac_to_u64(u8 mac[6])
540 {
541 	int i;
542 	u64 addr = 0;
543 
544 	for (i = 0; i < 6; i++) {
545 		addr <<= 8;
546 		addr |= mac[i];
547 	}
548 
549 	return addr;
550 }
551 
552 static void u64_to_mac(u64 addr, u8 mac[6])
553 {
554 	mac[5] = addr;
555 	mac[4] = addr >> 8;
556 	mac[3] = addr >> 16;
557 	mac[2] = addr >> 24;
558 	mac[1] = addr >> 32;
559 	mac[0] = addr >> 40;
560 }
561 
562 int board_eth_init(bd_t *bis)
563 {
564 	int ret;
565 	uint8_t mac_addr[6];
566 	uint32_t mac_hi, mac_lo;
567 	uint32_t ctrl_val;
568 	int i;
569 	u64 mac1, mac2;
570 	u8 mac_addr1[6], mac_addr2[6];
571 	int num_macs;
572 
573 	/* try reading mac address from efuse */
574 	mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
575 	mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
576 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
577 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
578 	mac_addr[2] = mac_hi & 0xFF;
579 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
580 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
581 	mac_addr[5] = mac_lo & 0xFF;
582 
583 	if (!getenv("ethaddr")) {
584 		printf("<ethaddr> not set. Validating first E-fuse MAC\n");
585 
586 		if (is_valid_ethaddr(mac_addr))
587 			eth_setenv_enetaddr("ethaddr", mac_addr);
588 	}
589 
590 	mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
591 	mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
592 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
593 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
594 	mac_addr[2] = mac_hi & 0xFF;
595 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
596 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
597 	mac_addr[5] = mac_lo & 0xFF;
598 
599 	if (!getenv("eth1addr")) {
600 		if (is_valid_ethaddr(mac_addr))
601 			eth_setenv_enetaddr("eth1addr", mac_addr);
602 	}
603 
604 	ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
605 	ctrl_val |= 0x22;
606 	writel(ctrl_val, (*ctrl)->control_core_control_io1);
607 
608 	ret = cpsw_register(&cpsw_data);
609 	if (ret < 0)
610 		printf("Error %d registering CPSW switch\n", ret);
611 
612 	/*
613 	 * Export any Ethernet MAC addresses from EEPROM.
614 	 * On AM57xx the 2 MAC addresses define the address range
615 	 */
616 	board_ti_get_eth_mac_addr(0, mac_addr1);
617 	board_ti_get_eth_mac_addr(1, mac_addr2);
618 
619 	if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
620 		mac1 = mac_to_u64(mac_addr1);
621 		mac2 = mac_to_u64(mac_addr2);
622 
623 		/* must contain an address range */
624 		num_macs = mac2 - mac1 + 1;
625 		/* <= 50 to protect against user programming error */
626 		if (num_macs > 0 && num_macs <= 50) {
627 			for (i = 0; i < num_macs; i++) {
628 				u64_to_mac(mac1 + i, mac_addr);
629 				if (is_valid_ethaddr(mac_addr)) {
630 					eth_setenv_enetaddr_by_index("eth",
631 								     i + 2,
632 								     mac_addr);
633 				}
634 			}
635 		}
636 	}
637 
638 	return ret;
639 }
640 #endif
641 
642 #ifdef CONFIG_BOARD_EARLY_INIT_F
643 /* VTT regulator enable */
644 static inline void vtt_regulator_enable(void)
645 {
646 	if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
647 		return;
648 
649 	gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
650 	gpio_direction_output(GPIO_DDR_VTT_EN, 1);
651 }
652 
653 int board_early_init_f(void)
654 {
655 	vtt_regulator_enable();
656 	return 0;
657 }
658 #endif
659