xref: /openbmc/u-boot/board/ti/am57xx/board.c (revision cd4b0c5f)
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_DRA7,
220 	.mpu.efuse.reg		= STD_FUSE_OPP_VMIN_MPU,
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_DRA7,
227 	.eve.efuse.reg		= STD_FUSE_OPP_VMIN_DSPEVE,
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_DRA7,
234 	.gpu.efuse.reg		= STD_FUSE_OPP_VMIN_GPU,
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_DRA7,
241 	.core.efuse.reg		= STD_FUSE_OPP_VMIN_CORE,
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_DRA7,
247 	.iva.efuse.reg		= STD_FUSE_OPP_VMIN_IVA,
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 struct vcores_data am572x_idk_volts = {
255 	.mpu.value		= VDD_MPU_DRA7,
256 	.mpu.efuse.reg		= STD_FUSE_OPP_VMIN_MPU,
257 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
258 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
259 	.mpu.pmic		= &tps659038,
260 	.mpu.abb_tx_done_mask	= OMAP_ABB_MPU_TXDONE_MASK,
261 
262 	.eve.value		= VDD_EVE_DRA7,
263 	.eve.efuse.reg		= STD_FUSE_OPP_VMIN_DSPEVE,
264 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
265 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
266 	.eve.pmic		= &tps659038,
267 	.eve.abb_tx_done_mask	= OMAP_ABB_EVE_TXDONE_MASK,
268 
269 	.gpu.value		= VDD_GPU_DRA7,
270 	.gpu.efuse.reg		= STD_FUSE_OPP_VMIN_GPU,
271 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
272 	.gpu.addr		= TPS659038_REG_ADDR_SMPS6,
273 	.gpu.pmic		= &tps659038,
274 	.gpu.abb_tx_done_mask	= OMAP_ABB_GPU_TXDONE_MASK,
275 
276 	.core.value		= VDD_CORE_DRA7,
277 	.core.efuse.reg		= STD_FUSE_OPP_VMIN_CORE,
278 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
279 	.core.addr		= TPS659038_REG_ADDR_SMPS7,
280 	.core.pmic		= &tps659038,
281 
282 	.iva.value		= VDD_IVA_DRA7,
283 	.iva.efuse.reg		= STD_FUSE_OPP_VMIN_IVA,
284 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
285 	.iva.addr		= TPS659038_REG_ADDR_SMPS8,
286 	.iva.pmic		= &tps659038,
287 	.iva.abb_tx_done_mask	= OMAP_ABB_IVA_TXDONE_MASK,
288 };
289 
290 #ifdef CONFIG_SPL_BUILD
291 /* No env to setup for SPL */
292 static inline void setup_board_eeprom_env(void) { }
293 
294 /* Override function to read eeprom information */
295 void do_board_detect(void)
296 {
297 	int rc;
298 
299 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
300 				  CONFIG_EEPROM_CHIP_ADDRESS);
301 	if (rc)
302 		printf("ti_i2c_eeprom_init failed %d\n", rc);
303 }
304 
305 #else	/* CONFIG_SPL_BUILD */
306 
307 /* Override function to read eeprom information: actual i2c read done by SPL*/
308 void do_board_detect(void)
309 {
310 	char *bname = NULL;
311 	int rc;
312 
313 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
314 				  CONFIG_EEPROM_CHIP_ADDRESS);
315 	if (rc)
316 		printf("ti_i2c_eeprom_init failed %d\n", rc);
317 
318 	if (board_is_x15())
319 		bname = "BeagleBoard X15";
320 	else if (board_is_am572x_evm())
321 		bname = "AM572x EVM";
322 	else if (board_is_am572x_idk())
323 		bname = "AM572x IDK";
324 
325 	if (bname)
326 		snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
327 			 "Board: %s REV %s\n", bname, board_ti_get_rev());
328 }
329 
330 static void setup_board_eeprom_env(void)
331 {
332 	char *name = "beagle_x15";
333 	int rc;
334 
335 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
336 				  CONFIG_EEPROM_CHIP_ADDRESS);
337 	if (rc)
338 		goto invalid_eeprom;
339 
340 	if (board_is_am572x_evm())
341 		name = "am57xx_evm";
342 	else if (board_is_am572x_idk())
343 		name = "am572x_idk";
344 	else
345 		printf("Unidentified board claims %s in eeprom header\n",
346 		       board_ti_get_name());
347 
348 invalid_eeprom:
349 	set_board_info_env(name);
350 }
351 
352 #endif	/* CONFIG_SPL_BUILD */
353 
354 void vcores_init(void)
355 {
356 	if (board_is_am572x_idk())
357 		*omap_vcores = &am572x_idk_volts;
358 	else
359 		*omap_vcores = &beagle_x15_volts;
360 }
361 
362 void hw_data_init(void)
363 {
364 	*prcm = &dra7xx_prcm;
365 	*dplls_data = &dra7xx_dplls;
366 	*ctrl = &dra7xx_ctrl;
367 }
368 
369 int board_init(void)
370 {
371 	gpmc_init();
372 	gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
373 
374 	return 0;
375 }
376 
377 int board_late_init(void)
378 {
379 	setup_board_eeprom_env();
380 
381 	/*
382 	 * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
383 	 * This is the POWERHOLD-in-Low behavior.
384 	 */
385 	palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
386 	return 0;
387 }
388 
389 void set_muxconf_regs(void)
390 {
391 	do_set_mux32((*ctrl)->control_padconf_core_base,
392 		     early_padconf, ARRAY_SIZE(early_padconf));
393 }
394 
395 #ifdef CONFIG_IODELAY_RECALIBRATION
396 void recalibrate_iodelay(void)
397 {
398 	const struct pad_conf_entry *pconf;
399 	const struct iodelay_cfg_entry *iod;
400 	int pconf_sz, iod_sz;
401 
402 	if (board_is_am572x_idk()) {
403 		pconf = core_padconf_array_essential_am572x_idk;
404 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am572x_idk);
405 		iod = iodelay_cfg_array_am572x_idk;
406 		iod_sz = ARRAY_SIZE(iodelay_cfg_array_am572x_idk);
407 	} else {
408 		/* Common for X15/GPEVM */
409 		pconf = core_padconf_array_essential_x15;
410 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_x15);
411 		iod = iodelay_cfg_array_x15;
412 		iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15);
413 	}
414 
415 	__recalibrate_iodelay(pconf, pconf_sz, iod, iod_sz);
416 }
417 #endif
418 
419 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
420 int board_mmc_init(bd_t *bis)
421 {
422 	omap_mmc_init(0, 0, 0, -1, -1);
423 	omap_mmc_init(1, 0, 0, -1, -1);
424 	return 0;
425 }
426 #endif
427 
428 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
429 int spl_start_uboot(void)
430 {
431 	/* break into full u-boot on 'c' */
432 	if (serial_tstc() && serial_getc() == 'c')
433 		return 1;
434 
435 #ifdef CONFIG_SPL_ENV_SUPPORT
436 	env_init();
437 	env_relocate_spec();
438 	if (getenv_yesno("boot_os") != 1)
439 		return 1;
440 #endif
441 
442 	return 0;
443 }
444 #endif
445 
446 #ifdef CONFIG_USB_DWC3
447 static struct dwc3_device usb_otg_ss1 = {
448 	.maximum_speed = USB_SPEED_SUPER,
449 	.base = DRA7_USB_OTG_SS1_BASE,
450 	.tx_fifo_resize = false,
451 	.index = 0,
452 };
453 
454 static struct dwc3_omap_device usb_otg_ss1_glue = {
455 	.base = (void *)DRA7_USB_OTG_SS1_GLUE_BASE,
456 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
457 	.index = 0,
458 };
459 
460 static struct ti_usb_phy_device usb_phy1_device = {
461 	.pll_ctrl_base = (void *)DRA7_USB3_PHY1_PLL_CTRL,
462 	.usb2_phy_power = (void *)DRA7_USB2_PHY1_POWER,
463 	.usb3_phy_power = (void *)DRA7_USB3_PHY1_POWER,
464 	.index = 0,
465 };
466 
467 static struct dwc3_device usb_otg_ss2 = {
468 	.maximum_speed = USB_SPEED_HIGH,
469 	.base = DRA7_USB_OTG_SS2_BASE,
470 	.tx_fifo_resize = false,
471 	.index = 1,
472 };
473 
474 static struct dwc3_omap_device usb_otg_ss2_glue = {
475 	.base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
476 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
477 	.index = 1,
478 };
479 
480 static struct ti_usb_phy_device usb_phy2_device = {
481 	.usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
482 	.index = 1,
483 };
484 
485 int usb_gadget_handle_interrupts(int index)
486 {
487 	u32 status;
488 
489 	status = dwc3_omap_uboot_interrupt_status(index);
490 	if (status)
491 		dwc3_uboot_handle_interrupt(index);
492 
493 	return 0;
494 }
495 #endif /* CONFIG_USB_DWC3 */
496 
497 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
498 int board_usb_init(int index, enum usb_init_type init)
499 {
500 	enable_usb_clocks(index);
501 	switch (index) {
502 	case 0:
503 		if (init == USB_INIT_DEVICE) {
504 			printf("port %d can't be used as device\n", index);
505 			disable_usb_clocks(index);
506 			return -EINVAL;
507 		}
508 		break;
509 	case 1:
510 		if (init == USB_INIT_DEVICE) {
511 #ifdef CONFIG_USB_DWC3
512 			usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
513 			usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
514 			ti_usb_phy_uboot_init(&usb_phy2_device);
515 			dwc3_omap_uboot_init(&usb_otg_ss2_glue);
516 			dwc3_uboot_init(&usb_otg_ss2);
517 #endif
518 		} else {
519 			printf("port %d can't be used as host\n", index);
520 			disable_usb_clocks(index);
521 			return -EINVAL;
522 		}
523 
524 		break;
525 	default:
526 		printf("Invalid Controller Index\n");
527 	}
528 
529 	return 0;
530 }
531 
532 int board_usb_cleanup(int index, enum usb_init_type init)
533 {
534 #ifdef CONFIG_USB_DWC3
535 	switch (index) {
536 	case 0:
537 	case 1:
538 		if (init == USB_INIT_DEVICE) {
539 			ti_usb_phy_uboot_exit(index);
540 			dwc3_uboot_exit(index);
541 			dwc3_omap_uboot_exit(index);
542 		}
543 		break;
544 	default:
545 		printf("Invalid Controller Index\n");
546 	}
547 #endif
548 	disable_usb_clocks(index);
549 	return 0;
550 }
551 #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
552 
553 #ifdef CONFIG_DRIVER_TI_CPSW
554 
555 /* Delay value to add to calibrated value */
556 #define RGMII0_TXCTL_DLY_VAL		((0x3 << 5) + 0x8)
557 #define RGMII0_TXD0_DLY_VAL		((0x3 << 5) + 0x8)
558 #define RGMII0_TXD1_DLY_VAL		((0x3 << 5) + 0x2)
559 #define RGMII0_TXD2_DLY_VAL		((0x4 << 5) + 0x0)
560 #define RGMII0_TXD3_DLY_VAL		((0x4 << 5) + 0x0)
561 #define VIN2A_D13_DLY_VAL		((0x3 << 5) + 0x8)
562 #define VIN2A_D17_DLY_VAL		((0x3 << 5) + 0x8)
563 #define VIN2A_D16_DLY_VAL		((0x3 << 5) + 0x2)
564 #define VIN2A_D15_DLY_VAL		((0x4 << 5) + 0x0)
565 #define VIN2A_D14_DLY_VAL		((0x4 << 5) + 0x0)
566 
567 static void cpsw_control(int enabled)
568 {
569 	/* VTP can be added here */
570 }
571 
572 static struct cpsw_slave_data cpsw_slaves[] = {
573 	{
574 		.slave_reg_ofs	= 0x208,
575 		.sliver_reg_ofs	= 0xd80,
576 		.phy_addr	= 1,
577 	},
578 	{
579 		.slave_reg_ofs	= 0x308,
580 		.sliver_reg_ofs	= 0xdc0,
581 		.phy_addr	= 2,
582 	},
583 };
584 
585 static struct cpsw_platform_data cpsw_data = {
586 	.mdio_base		= CPSW_MDIO_BASE,
587 	.cpsw_base		= CPSW_BASE,
588 	.mdio_div		= 0xff,
589 	.channels		= 8,
590 	.cpdma_reg_ofs		= 0x800,
591 	.slaves			= 1,
592 	.slave_data		= cpsw_slaves,
593 	.ale_reg_ofs		= 0xd00,
594 	.ale_entries		= 1024,
595 	.host_port_reg_ofs	= 0x108,
596 	.hw_stats_reg_ofs	= 0x900,
597 	.bd_ram_ofs		= 0x2000,
598 	.mac_control		= (1 << 5),
599 	.control		= cpsw_control,
600 	.host_port_num		= 0,
601 	.version		= CPSW_CTRL_VERSION_2,
602 };
603 
604 static u64 mac_to_u64(u8 mac[6])
605 {
606 	int i;
607 	u64 addr = 0;
608 
609 	for (i = 0; i < 6; i++) {
610 		addr <<= 8;
611 		addr |= mac[i];
612 	}
613 
614 	return addr;
615 }
616 
617 static void u64_to_mac(u64 addr, u8 mac[6])
618 {
619 	mac[5] = addr;
620 	mac[4] = addr >> 8;
621 	mac[3] = addr >> 16;
622 	mac[2] = addr >> 24;
623 	mac[1] = addr >> 32;
624 	mac[0] = addr >> 40;
625 }
626 
627 int board_eth_init(bd_t *bis)
628 {
629 	int ret;
630 	uint8_t mac_addr[6];
631 	uint32_t mac_hi, mac_lo;
632 	uint32_t ctrl_val;
633 	int i;
634 	u64 mac1, mac2;
635 	u8 mac_addr1[6], mac_addr2[6];
636 	int num_macs;
637 
638 	/* try reading mac address from efuse */
639 	mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
640 	mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
641 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
642 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
643 	mac_addr[2] = mac_hi & 0xFF;
644 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
645 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
646 	mac_addr[5] = mac_lo & 0xFF;
647 
648 	if (!getenv("ethaddr")) {
649 		printf("<ethaddr> not set. Validating first E-fuse MAC\n");
650 
651 		if (is_valid_ethaddr(mac_addr))
652 			eth_setenv_enetaddr("ethaddr", mac_addr);
653 	}
654 
655 	mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
656 	mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
657 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
658 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
659 	mac_addr[2] = mac_hi & 0xFF;
660 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
661 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
662 	mac_addr[5] = mac_lo & 0xFF;
663 
664 	if (!getenv("eth1addr")) {
665 		if (is_valid_ethaddr(mac_addr))
666 			eth_setenv_enetaddr("eth1addr", mac_addr);
667 	}
668 
669 	ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
670 	ctrl_val |= 0x22;
671 	writel(ctrl_val, (*ctrl)->control_core_control_io1);
672 
673 	/* The phy address for the AM572x IDK are different than x15 */
674 	if (board_is_am572x_idk()) {
675 		cpsw_data.slave_data[0].phy_addr = 0;
676 		cpsw_data.slave_data[1].phy_addr = 1;
677 	}
678 
679 	ret = cpsw_register(&cpsw_data);
680 	if (ret < 0)
681 		printf("Error %d registering CPSW switch\n", ret);
682 
683 	/*
684 	 * Export any Ethernet MAC addresses from EEPROM.
685 	 * On AM57xx the 2 MAC addresses define the address range
686 	 */
687 	board_ti_get_eth_mac_addr(0, mac_addr1);
688 	board_ti_get_eth_mac_addr(1, mac_addr2);
689 
690 	if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
691 		mac1 = mac_to_u64(mac_addr1);
692 		mac2 = mac_to_u64(mac_addr2);
693 
694 		/* must contain an address range */
695 		num_macs = mac2 - mac1 + 1;
696 		/* <= 50 to protect against user programming error */
697 		if (num_macs > 0 && num_macs <= 50) {
698 			for (i = 0; i < num_macs; i++) {
699 				u64_to_mac(mac1 + i, mac_addr);
700 				if (is_valid_ethaddr(mac_addr)) {
701 					eth_setenv_enetaddr_by_index("eth",
702 								     i + 2,
703 								     mac_addr);
704 				}
705 			}
706 		}
707 	}
708 
709 	return ret;
710 }
711 #endif
712 
713 #ifdef CONFIG_BOARD_EARLY_INIT_F
714 /* VTT regulator enable */
715 static inline void vtt_regulator_enable(void)
716 {
717 	if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
718 		return;
719 
720 	gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
721 	gpio_direction_output(GPIO_DDR_VTT_EN, 1);
722 }
723 
724 int board_early_init_f(void)
725 {
726 	vtt_regulator_enable();
727 	return 0;
728 }
729 #endif
730 
731 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
732 int ft_board_setup(void *blob, bd_t *bd)
733 {
734 	ft_cpu_setup(blob, bd);
735 
736 	return 0;
737 }
738 #endif
739 
740 #ifdef CONFIG_SPL_LOAD_FIT
741 int board_fit_config_name_match(const char *name)
742 {
743 	if (board_is_x15() && !strcmp(name, "am57xx-beagle-x15"))
744 		return 0;
745 	else if (board_is_am572x_evm() && !strcmp(name, "am57xx-beagle-x15"))
746 		return 0;
747 	else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk"))
748 		return 0;
749 	else
750 		return -1;
751 }
752 #endif
753