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