xref: /openbmc/u-boot/board/ti/am57xx/board.c (revision c9891660)
174cc8b09SKipisz, Steven /*
274cc8b09SKipisz, Steven  * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
374cc8b09SKipisz, Steven  *
474cc8b09SKipisz, Steven  * Author: Felipe Balbi <balbi@ti.com>
574cc8b09SKipisz, Steven  *
674cc8b09SKipisz, Steven  * Based on board/ti/dra7xx/evm.c
774cc8b09SKipisz, Steven  *
874cc8b09SKipisz, Steven  * SPDX-License-Identifier:	GPL-2.0+
974cc8b09SKipisz, Steven  */
1074cc8b09SKipisz, Steven 
1174cc8b09SKipisz, Steven #include <common.h>
1274cc8b09SKipisz, Steven #include <palmas.h>
1374cc8b09SKipisz, Steven #include <sata.h>
1474cc8b09SKipisz, Steven #include <usb.h>
1574cc8b09SKipisz, Steven #include <asm/omap_common.h>
1617c29873SAndreas Dannenberg #include <asm/omap_sec_common.h>
1774cc8b09SKipisz, Steven #include <asm/emif.h>
1874cc8b09SKipisz, Steven #include <asm/gpio.h>
1974cc8b09SKipisz, Steven #include <asm/arch/gpio.h>
2074cc8b09SKipisz, Steven #include <asm/arch/clock.h>
2174cc8b09SKipisz, Steven #include <asm/arch/dra7xx_iodelay.h>
2274cc8b09SKipisz, Steven #include <asm/arch/sys_proto.h>
2374cc8b09SKipisz, Steven #include <asm/arch/mmc_host_def.h>
2474cc8b09SKipisz, Steven #include <asm/arch/sata.h>
2574cc8b09SKipisz, Steven #include <asm/arch/gpio.h>
2674cc8b09SKipisz, Steven #include <asm/arch/omap.h>
2774cc8b09SKipisz, Steven #include <environment.h>
2874cc8b09SKipisz, Steven #include <usb.h>
2974cc8b09SKipisz, Steven #include <linux/usb/gadget.h>
3074cc8b09SKipisz, Steven #include <dwc3-uboot.h>
3174cc8b09SKipisz, Steven #include <dwc3-omap-uboot.h>
3274cc8b09SKipisz, Steven #include <ti-usb-phy-uboot.h>
3374cc8b09SKipisz, Steven 
34212f96f6SKipisz, Steven #include "../common/board_detect.h"
3574cc8b09SKipisz, Steven #include "mux_data.h"
3674cc8b09SKipisz, Steven 
37212f96f6SKipisz, Steven #define board_is_x15()		board_ti_is("BBRDX15_")
38212f96f6SKipisz, Steven #define board_is_am572x_evm()	board_ti_is("AM572PM_")
39c020d355SSteve Kipisz #define board_is_am572x_idk()	board_ti_is("AM572IDK")
40212f96f6SKipisz, Steven 
4174cc8b09SKipisz, Steven #ifdef CONFIG_DRIVER_TI_CPSW
4274cc8b09SKipisz, Steven #include <cpsw.h>
4374cc8b09SKipisz, Steven #endif
4474cc8b09SKipisz, Steven 
4574cc8b09SKipisz, Steven DECLARE_GLOBAL_DATA_PTR;
4674cc8b09SKipisz, Steven 
4774cc8b09SKipisz, Steven /* GPIO 7_11 */
4874cc8b09SKipisz, Steven #define GPIO_DDR_VTT_EN 203
4974cc8b09SKipisz, Steven 
50212f96f6SKipisz, Steven #define SYSINFO_BOARD_NAME_MAX_LEN	45
51212f96f6SKipisz, Steven 
5274cc8b09SKipisz, Steven const struct omap_sysinfo sysinfo = {
53212f96f6SKipisz, Steven 	"Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n"
5474cc8b09SKipisz, Steven };
5574cc8b09SKipisz, Steven 
5674cc8b09SKipisz, Steven static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = {
5774cc8b09SKipisz, Steven 	.dmm_lisa_map_3 = 0x80740300,
5874cc8b09SKipisz, Steven 	.is_ma_present  = 0x1
5974cc8b09SKipisz, Steven };
6074cc8b09SKipisz, Steven 
6174cc8b09SKipisz, Steven void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
6274cc8b09SKipisz, Steven {
6374cc8b09SKipisz, Steven 	*dmm_lisa_regs = &beagle_x15_lisa_regs;
6474cc8b09SKipisz, Steven }
6574cc8b09SKipisz, Steven 
6674cc8b09SKipisz, Steven static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
6774cc8b09SKipisz, Steven 	.sdram_config_init		= 0x61851b32,
6874cc8b09SKipisz, Steven 	.sdram_config			= 0x61851b32,
6911e2b043SLokesh Vutla 	.sdram_config2			= 0x08000000,
7074cc8b09SKipisz, Steven 	.ref_ctrl			= 0x000040F1,
7174cc8b09SKipisz, Steven 	.ref_ctrl_final			= 0x00001035,
7211e2b043SLokesh Vutla 	.sdram_tim1			= 0xcccf36ab,
7311e2b043SLokesh Vutla 	.sdram_tim2			= 0x308f7fda,
7411e2b043SLokesh Vutla 	.sdram_tim3			= 0x409f88a8,
7574cc8b09SKipisz, Steven 	.read_idle_ctrl			= 0x00050000,
7611e2b043SLokesh Vutla 	.zq_config			= 0x5007190b,
7774cc8b09SKipisz, Steven 	.temp_alert_config		= 0x00000000,
7874cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1_init 	= 0x0024400b,
7974cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1		= 0x0e24400b,
8074cc8b09SKipisz, Steven 	.emif_ddr_ext_phy_ctrl_1 	= 0x10040100,
8111e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_2 	= 0x00910091,
8211e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_3 	= 0x00950095,
8311e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_4 	= 0x009b009b,
8411e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_5 	= 0x009e009e,
8574cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_win		= 0x00000000,
8674cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_ctl		= 0x80000000,
8774cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_ctl		= 0x00000000,
8874cc8b09SKipisz, Steven 	.emif_rd_wr_exec_thresh		= 0x00000305
8974cc8b09SKipisz, Steven };
9074cc8b09SKipisz, Steven 
9174cc8b09SKipisz, Steven /* Ext phy ctrl regs 1-35 */
9274cc8b09SKipisz, Steven static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
9374cc8b09SKipisz, Steven 	0x10040100,
9411e2b043SLokesh Vutla 	0x00910091,
9511e2b043SLokesh Vutla 	0x00950095,
9611e2b043SLokesh Vutla 	0x009B009B,
9711e2b043SLokesh Vutla 	0x009E009E,
9811e2b043SLokesh Vutla 	0x00980098,
9974cc8b09SKipisz, Steven 	0x00340034,
10074cc8b09SKipisz, Steven 	0x00350035,
10111e2b043SLokesh Vutla 	0x00340034,
10211e2b043SLokesh Vutla 	0x00310031,
10311e2b043SLokesh Vutla 	0x00340034,
10411e2b043SLokesh Vutla 	0x007F007F,
10511e2b043SLokesh Vutla 	0x007F007F,
10611e2b043SLokesh Vutla 	0x007F007F,
10711e2b043SLokesh Vutla 	0x007F007F,
10811e2b043SLokesh Vutla 	0x007F007F,
10911e2b043SLokesh Vutla 	0x00480048,
11011e2b043SLokesh Vutla 	0x004A004A,
11111e2b043SLokesh Vutla 	0x00520052,
11211e2b043SLokesh Vutla 	0x00550055,
11311e2b043SLokesh Vutla 	0x00500050,
11474cc8b09SKipisz, Steven 	0x00000000,
11574cc8b09SKipisz, Steven 	0x00600020,
11674cc8b09SKipisz, Steven 	0x40011080,
11774cc8b09SKipisz, Steven 	0x08102040,
11811e2b043SLokesh Vutla 	0x0,
11911e2b043SLokesh Vutla 	0x0,
12011e2b043SLokesh Vutla 	0x0,
12111e2b043SLokesh Vutla 	0x0,
12211e2b043SLokesh Vutla 	0x0,
12374cc8b09SKipisz, Steven 	0x0,
12474cc8b09SKipisz, Steven 	0x0,
12574cc8b09SKipisz, Steven 	0x0,
12674cc8b09SKipisz, Steven 	0x0,
12774cc8b09SKipisz, Steven 	0x0
12874cc8b09SKipisz, Steven };
12974cc8b09SKipisz, Steven 
13074cc8b09SKipisz, Steven static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
13174cc8b09SKipisz, Steven 	.sdram_config_init		= 0x61851b32,
13274cc8b09SKipisz, Steven 	.sdram_config			= 0x61851b32,
13311e2b043SLokesh Vutla 	.sdram_config2			= 0x08000000,
13474cc8b09SKipisz, Steven 	.ref_ctrl			= 0x000040F1,
13574cc8b09SKipisz, Steven 	.ref_ctrl_final			= 0x00001035,
1365f405e7fSSchuyler Patton 	.sdram_tim1			= 0xcccf36b3,
13711e2b043SLokesh Vutla 	.sdram_tim2			= 0x308f7fda,
1385f405e7fSSchuyler Patton 	.sdram_tim3			= 0x407f88a8,
13974cc8b09SKipisz, Steven 	.read_idle_ctrl			= 0x00050000,
14011e2b043SLokesh Vutla 	.zq_config			= 0x5007190b,
14174cc8b09SKipisz, Steven 	.temp_alert_config		= 0x00000000,
14274cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1_init 	= 0x0024400b,
14374cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1		= 0x0e24400b,
14474cc8b09SKipisz, Steven 	.emif_ddr_ext_phy_ctrl_1 	= 0x10040100,
14511e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_2 	= 0x00910091,
14611e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_3 	= 0x00950095,
14711e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_4 	= 0x009b009b,
14811e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_5 	= 0x009e009e,
14974cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_win		= 0x00000000,
15074cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_ctl		= 0x80000000,
15174cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_ctl		= 0x00000000,
15274cc8b09SKipisz, Steven 	.emif_rd_wr_exec_thresh		= 0x00000305
15374cc8b09SKipisz, Steven };
15474cc8b09SKipisz, Steven 
15574cc8b09SKipisz, Steven static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
15674cc8b09SKipisz, Steven 	0x10040100,
15711e2b043SLokesh Vutla 	0x00910091,
15811e2b043SLokesh Vutla 	0x00950095,
15911e2b043SLokesh Vutla 	0x009B009B,
16011e2b043SLokesh Vutla 	0x009E009E,
16111e2b043SLokesh Vutla 	0x00980098,
16211e2b043SLokesh Vutla 	0x00340034,
16374cc8b09SKipisz, Steven 	0x00350035,
16411e2b043SLokesh Vutla 	0x00340034,
16511e2b043SLokesh Vutla 	0x00310031,
16611e2b043SLokesh Vutla 	0x00340034,
16711e2b043SLokesh Vutla 	0x007F007F,
16811e2b043SLokesh Vutla 	0x007F007F,
16911e2b043SLokesh Vutla 	0x007F007F,
17011e2b043SLokesh Vutla 	0x007F007F,
17111e2b043SLokesh Vutla 	0x007F007F,
17211e2b043SLokesh Vutla 	0x00480048,
17311e2b043SLokesh Vutla 	0x004A004A,
17411e2b043SLokesh Vutla 	0x00520052,
17511e2b043SLokesh Vutla 	0x00550055,
17611e2b043SLokesh Vutla 	0x00500050,
17774cc8b09SKipisz, Steven 	0x00000000,
17874cc8b09SKipisz, Steven 	0x00600020,
17974cc8b09SKipisz, Steven 	0x40011080,
18074cc8b09SKipisz, Steven 	0x08102040,
18111e2b043SLokesh Vutla 	0x0,
18211e2b043SLokesh Vutla 	0x0,
18311e2b043SLokesh Vutla 	0x0,
18411e2b043SLokesh Vutla 	0x0,
18511e2b043SLokesh Vutla 	0x0,
18674cc8b09SKipisz, Steven 	0x0,
18774cc8b09SKipisz, Steven 	0x0,
18874cc8b09SKipisz, Steven 	0x0,
18974cc8b09SKipisz, Steven 	0x0,
19074cc8b09SKipisz, Steven 	0x0
19174cc8b09SKipisz, Steven };
19274cc8b09SKipisz, Steven 
19374cc8b09SKipisz, Steven void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
19474cc8b09SKipisz, Steven {
19574cc8b09SKipisz, Steven 	switch (emif_nr) {
19674cc8b09SKipisz, Steven 	case 1:
19774cc8b09SKipisz, Steven 		*regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
19874cc8b09SKipisz, Steven 		break;
19974cc8b09SKipisz, Steven 	case 2:
20074cc8b09SKipisz, Steven 		*regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs;
20174cc8b09SKipisz, Steven 		break;
20274cc8b09SKipisz, Steven 	}
20374cc8b09SKipisz, Steven }
20474cc8b09SKipisz, Steven 
20574cc8b09SKipisz, Steven void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size)
20674cc8b09SKipisz, Steven {
20774cc8b09SKipisz, Steven 	switch (emif_nr) {
20874cc8b09SKipisz, Steven 	case 1:
20974cc8b09SKipisz, Steven 		*regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs;
21074cc8b09SKipisz, Steven 		*size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs);
21174cc8b09SKipisz, Steven 		break;
21274cc8b09SKipisz, Steven 	case 2:
21374cc8b09SKipisz, Steven 		*regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs;
21474cc8b09SKipisz, Steven 		*size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs);
21574cc8b09SKipisz, Steven 		break;
21674cc8b09SKipisz, Steven 	}
21774cc8b09SKipisz, Steven }
21874cc8b09SKipisz, Steven 
21974cc8b09SKipisz, Steven struct vcores_data beagle_x15_volts = {
220e42523f5SAnna, Suman 	.mpu.value		= VDD_MPU_DRA7,
22127c9596fSAnna, Suman 	.mpu.efuse.reg		= STD_FUSE_OPP_VMIN_MPU,
22274cc8b09SKipisz, Steven 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
22374cc8b09SKipisz, Steven 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
22474cc8b09SKipisz, Steven 	.mpu.pmic		= &tps659038,
2253708e78cSNishanth Menon 	.mpu.abb_tx_done_mask	= OMAP_ABB_MPU_TXDONE_MASK,
22674cc8b09SKipisz, Steven 
227e42523f5SAnna, Suman 	.eve.value		= VDD_EVE_DRA7,
22827c9596fSAnna, Suman 	.eve.efuse.reg		= STD_FUSE_OPP_VMIN_DSPEVE,
22974cc8b09SKipisz, Steven 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
23074cc8b09SKipisz, Steven 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
23174cc8b09SKipisz, Steven 	.eve.pmic		= &tps659038,
232e52e334eSNishanth Menon 	.eve.abb_tx_done_mask	= OMAP_ABB_EVE_TXDONE_MASK,
23374cc8b09SKipisz, Steven 
234e42523f5SAnna, Suman 	.gpu.value		= VDD_GPU_DRA7,
23527c9596fSAnna, Suman 	.gpu.efuse.reg		= STD_FUSE_OPP_VMIN_GPU,
23674cc8b09SKipisz, Steven 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
23774cc8b09SKipisz, Steven 	.gpu.addr		= TPS659038_REG_ADDR_SMPS45,
23874cc8b09SKipisz, Steven 	.gpu.pmic		= &tps659038,
239e52e334eSNishanth Menon 	.gpu.abb_tx_done_mask	= OMAP_ABB_GPU_TXDONE_MASK,
24074cc8b09SKipisz, Steven 
241e42523f5SAnna, Suman 	.core.value		= VDD_CORE_DRA7,
24227c9596fSAnna, Suman 	.core.efuse.reg		= STD_FUSE_OPP_VMIN_CORE,
24374cc8b09SKipisz, Steven 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
24474cc8b09SKipisz, Steven 	.core.addr		= TPS659038_REG_ADDR_SMPS6,
24574cc8b09SKipisz, Steven 	.core.pmic		= &tps659038,
24674cc8b09SKipisz, Steven 
247e42523f5SAnna, Suman 	.iva.value		= VDD_IVA_DRA7,
24827c9596fSAnna, Suman 	.iva.efuse.reg		= STD_FUSE_OPP_VMIN_IVA,
24974cc8b09SKipisz, Steven 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
25074cc8b09SKipisz, Steven 	.iva.addr		= TPS659038_REG_ADDR_SMPS45,
25174cc8b09SKipisz, Steven 	.iva.pmic		= &tps659038,
252e52e334eSNishanth Menon 	.iva.abb_tx_done_mask	= OMAP_ABB_IVA_TXDONE_MASK,
25374cc8b09SKipisz, Steven };
25474cc8b09SKipisz, Steven 
255d60198daSKeerthy struct vcores_data am572x_idk_volts = {
256d60198daSKeerthy 	.mpu.value		= VDD_MPU_DRA7,
257d60198daSKeerthy 	.mpu.efuse.reg		= STD_FUSE_OPP_VMIN_MPU,
258d60198daSKeerthy 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
259d60198daSKeerthy 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
260d60198daSKeerthy 	.mpu.pmic		= &tps659038,
261d60198daSKeerthy 	.mpu.abb_tx_done_mask	= OMAP_ABB_MPU_TXDONE_MASK,
262d60198daSKeerthy 
263d60198daSKeerthy 	.eve.value		= VDD_EVE_DRA7,
264d60198daSKeerthy 	.eve.efuse.reg		= STD_FUSE_OPP_VMIN_DSPEVE,
265d60198daSKeerthy 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
266d60198daSKeerthy 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
267d60198daSKeerthy 	.eve.pmic		= &tps659038,
268d60198daSKeerthy 	.eve.abb_tx_done_mask	= OMAP_ABB_EVE_TXDONE_MASK,
269d60198daSKeerthy 
270d60198daSKeerthy 	.gpu.value		= VDD_GPU_DRA7,
271d60198daSKeerthy 	.gpu.efuse.reg		= STD_FUSE_OPP_VMIN_GPU,
272d60198daSKeerthy 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
273d60198daSKeerthy 	.gpu.addr		= TPS659038_REG_ADDR_SMPS6,
274d60198daSKeerthy 	.gpu.pmic		= &tps659038,
275d60198daSKeerthy 	.gpu.abb_tx_done_mask	= OMAP_ABB_GPU_TXDONE_MASK,
276d60198daSKeerthy 
277d60198daSKeerthy 	.core.value		= VDD_CORE_DRA7,
278d60198daSKeerthy 	.core.efuse.reg		= STD_FUSE_OPP_VMIN_CORE,
279d60198daSKeerthy 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
280d60198daSKeerthy 	.core.addr		= TPS659038_REG_ADDR_SMPS7,
281d60198daSKeerthy 	.core.pmic		= &tps659038,
282d60198daSKeerthy 
283d60198daSKeerthy 	.iva.value		= VDD_IVA_DRA7,
284d60198daSKeerthy 	.iva.efuse.reg		= STD_FUSE_OPP_VMIN_IVA,
285d60198daSKeerthy 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
286d60198daSKeerthy 	.iva.addr		= TPS659038_REG_ADDR_SMPS8,
287d60198daSKeerthy 	.iva.pmic		= &tps659038,
288d60198daSKeerthy 	.iva.abb_tx_done_mask	= OMAP_ABB_IVA_TXDONE_MASK,
289d60198daSKeerthy };
290d60198daSKeerthy 
291212f96f6SKipisz, Steven #ifdef CONFIG_SPL_BUILD
292212f96f6SKipisz, Steven /* No env to setup for SPL */
293212f96f6SKipisz, Steven static inline void setup_board_eeprom_env(void) { }
294212f96f6SKipisz, Steven 
295212f96f6SKipisz, Steven /* Override function to read eeprom information */
296212f96f6SKipisz, Steven void do_board_detect(void)
297212f96f6SKipisz, Steven {
298212f96f6SKipisz, Steven 	int rc;
299212f96f6SKipisz, Steven 
300212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
301212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
302212f96f6SKipisz, Steven 	if (rc)
303212f96f6SKipisz, Steven 		printf("ti_i2c_eeprom_init failed %d\n", rc);
304212f96f6SKipisz, Steven }
305212f96f6SKipisz, Steven 
306212f96f6SKipisz, Steven #else	/* CONFIG_SPL_BUILD */
307212f96f6SKipisz, Steven 
308212f96f6SKipisz, Steven /* Override function to read eeprom information: actual i2c read done by SPL*/
309212f96f6SKipisz, Steven void do_board_detect(void)
310212f96f6SKipisz, Steven {
311212f96f6SKipisz, Steven 	char *bname = NULL;
312212f96f6SKipisz, Steven 	int rc;
313212f96f6SKipisz, Steven 
314212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
315212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
316212f96f6SKipisz, Steven 	if (rc)
317212f96f6SKipisz, Steven 		printf("ti_i2c_eeprom_init failed %d\n", rc);
318212f96f6SKipisz, Steven 
319212f96f6SKipisz, Steven 	if (board_is_x15())
320212f96f6SKipisz, Steven 		bname = "BeagleBoard X15";
321212f96f6SKipisz, Steven 	else if (board_is_am572x_evm())
322212f96f6SKipisz, Steven 		bname = "AM572x EVM";
323c020d355SSteve Kipisz 	else if (board_is_am572x_idk())
324c020d355SSteve Kipisz 		bname = "AM572x IDK";
325212f96f6SKipisz, Steven 
326212f96f6SKipisz, Steven 	if (bname)
327212f96f6SKipisz, Steven 		snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
328212f96f6SKipisz, Steven 			 "Board: %s REV %s\n", bname, board_ti_get_rev());
329212f96f6SKipisz, Steven }
330212f96f6SKipisz, Steven 
331212f96f6SKipisz, Steven static void setup_board_eeprom_env(void)
332212f96f6SKipisz, Steven {
333212f96f6SKipisz, Steven 	char *name = "beagle_x15";
334212f96f6SKipisz, Steven 	int rc;
335212f96f6SKipisz, Steven 
336212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
337212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
338212f96f6SKipisz, Steven 	if (rc)
339212f96f6SKipisz, Steven 		goto invalid_eeprom;
340212f96f6SKipisz, Steven 
341*c9891660SNishanth Menon 	if (board_is_x15())
342*c9891660SNishanth Menon 		name = "beagle_x15";
343*c9891660SNishanth Menon 	else if (board_is_am572x_evm())
344212f96f6SKipisz, Steven 		name = "am57xx_evm";
345c020d355SSteve Kipisz 	else if (board_is_am572x_idk())
346c020d355SSteve Kipisz 		name = "am572x_idk";
347212f96f6SKipisz, Steven 	else
348212f96f6SKipisz, Steven 		printf("Unidentified board claims %s in eeprom header\n",
349212f96f6SKipisz, Steven 		       board_ti_get_name());
350212f96f6SKipisz, Steven 
351212f96f6SKipisz, Steven invalid_eeprom:
352212f96f6SKipisz, Steven 	set_board_info_env(name);
353212f96f6SKipisz, Steven }
354212f96f6SKipisz, Steven 
355212f96f6SKipisz, Steven #endif	/* CONFIG_SPL_BUILD */
356212f96f6SKipisz, Steven 
357d60198daSKeerthy void vcores_init(void)
358d60198daSKeerthy {
359d60198daSKeerthy 	if (board_is_am572x_idk())
360d60198daSKeerthy 		*omap_vcores = &am572x_idk_volts;
361d60198daSKeerthy 	else
362d60198daSKeerthy 		*omap_vcores = &beagle_x15_volts;
363d60198daSKeerthy }
364d60198daSKeerthy 
36574cc8b09SKipisz, Steven void hw_data_init(void)
36674cc8b09SKipisz, Steven {
36774cc8b09SKipisz, Steven 	*prcm = &dra7xx_prcm;
36874cc8b09SKipisz, Steven 	*dplls_data = &dra7xx_dplls;
36974cc8b09SKipisz, Steven 	*ctrl = &dra7xx_ctrl;
37074cc8b09SKipisz, Steven }
37174cc8b09SKipisz, Steven 
37274cc8b09SKipisz, Steven int board_init(void)
37374cc8b09SKipisz, Steven {
37474cc8b09SKipisz, Steven 	gpmc_init();
37574cc8b09SKipisz, Steven 	gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
37674cc8b09SKipisz, Steven 
37774cc8b09SKipisz, Steven 	return 0;
37874cc8b09SKipisz, Steven }
37974cc8b09SKipisz, Steven 
38074cc8b09SKipisz, Steven int board_late_init(void)
38174cc8b09SKipisz, Steven {
382212f96f6SKipisz, Steven 	setup_board_eeprom_env();
383212f96f6SKipisz, Steven 
38474cc8b09SKipisz, Steven 	/*
38574cc8b09SKipisz, Steven 	 * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
38674cc8b09SKipisz, Steven 	 * This is the POWERHOLD-in-Low behavior.
38774cc8b09SKipisz, Steven 	 */
38874cc8b09SKipisz, Steven 	palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
38974cc8b09SKipisz, Steven 	return 0;
39074cc8b09SKipisz, Steven }
39174cc8b09SKipisz, Steven 
3923ef56e61SPaul Kocialkowski void set_muxconf_regs(void)
39374cc8b09SKipisz, Steven {
39474cc8b09SKipisz, Steven 	do_set_mux32((*ctrl)->control_padconf_core_base,
39574cc8b09SKipisz, Steven 		     early_padconf, ARRAY_SIZE(early_padconf));
39674cc8b09SKipisz, Steven }
39774cc8b09SKipisz, Steven 
39874cc8b09SKipisz, Steven #ifdef CONFIG_IODELAY_RECALIBRATION
39974cc8b09SKipisz, Steven void recalibrate_iodelay(void)
40074cc8b09SKipisz, Steven {
401c020d355SSteve Kipisz 	const struct pad_conf_entry *pconf;
402c020d355SSteve Kipisz 	const struct iodelay_cfg_entry *iod;
403c020d355SSteve Kipisz 	int pconf_sz, iod_sz;
404c020d355SSteve Kipisz 
405c020d355SSteve Kipisz 	if (board_is_am572x_idk()) {
406c020d355SSteve Kipisz 		pconf = core_padconf_array_essential_am572x_idk;
407c020d355SSteve Kipisz 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am572x_idk);
408c020d355SSteve Kipisz 		iod = iodelay_cfg_array_am572x_idk;
409c020d355SSteve Kipisz 		iod_sz = ARRAY_SIZE(iodelay_cfg_array_am572x_idk);
410c020d355SSteve Kipisz 	} else {
411c020d355SSteve Kipisz 		/* Common for X15/GPEVM */
412c020d355SSteve Kipisz 		pconf = core_padconf_array_essential_x15;
413c020d355SSteve Kipisz 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_x15);
414c020d355SSteve Kipisz 		iod = iodelay_cfg_array_x15;
415c020d355SSteve Kipisz 		iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15);
416c020d355SSteve Kipisz 	}
417c020d355SSteve Kipisz 
418c020d355SSteve Kipisz 	__recalibrate_iodelay(pconf, pconf_sz, iod, iod_sz);
41974cc8b09SKipisz, Steven }
42074cc8b09SKipisz, Steven #endif
42174cc8b09SKipisz, Steven 
42274cc8b09SKipisz, Steven #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
42374cc8b09SKipisz, Steven int board_mmc_init(bd_t *bis)
42474cc8b09SKipisz, Steven {
42574cc8b09SKipisz, Steven 	omap_mmc_init(0, 0, 0, -1, -1);
42674cc8b09SKipisz, Steven 	omap_mmc_init(1, 0, 0, -1, -1);
42774cc8b09SKipisz, Steven 	return 0;
42874cc8b09SKipisz, Steven }
42974cc8b09SKipisz, Steven #endif
43074cc8b09SKipisz, Steven 
43174cc8b09SKipisz, Steven #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
43274cc8b09SKipisz, Steven int spl_start_uboot(void)
43374cc8b09SKipisz, Steven {
43474cc8b09SKipisz, Steven 	/* break into full u-boot on 'c' */
43574cc8b09SKipisz, Steven 	if (serial_tstc() && serial_getc() == 'c')
43674cc8b09SKipisz, Steven 		return 1;
43774cc8b09SKipisz, Steven 
43874cc8b09SKipisz, Steven #ifdef CONFIG_SPL_ENV_SUPPORT
43974cc8b09SKipisz, Steven 	env_init();
44074cc8b09SKipisz, Steven 	env_relocate_spec();
44174cc8b09SKipisz, Steven 	if (getenv_yesno("boot_os") != 1)
44274cc8b09SKipisz, Steven 		return 1;
44374cc8b09SKipisz, Steven #endif
44474cc8b09SKipisz, Steven 
44574cc8b09SKipisz, Steven 	return 0;
44674cc8b09SKipisz, Steven }
44774cc8b09SKipisz, Steven #endif
44874cc8b09SKipisz, Steven 
44974cc8b09SKipisz, Steven #ifdef CONFIG_USB_DWC3
45074cc8b09SKipisz, Steven static struct dwc3_device usb_otg_ss1 = {
45174cc8b09SKipisz, Steven 	.maximum_speed = USB_SPEED_SUPER,
45274cc8b09SKipisz, Steven 	.base = DRA7_USB_OTG_SS1_BASE,
45374cc8b09SKipisz, Steven 	.tx_fifo_resize = false,
45474cc8b09SKipisz, Steven 	.index = 0,
45574cc8b09SKipisz, Steven };
45674cc8b09SKipisz, Steven 
45774cc8b09SKipisz, Steven static struct dwc3_omap_device usb_otg_ss1_glue = {
45874cc8b09SKipisz, Steven 	.base = (void *)DRA7_USB_OTG_SS1_GLUE_BASE,
45974cc8b09SKipisz, Steven 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
46074cc8b09SKipisz, Steven 	.index = 0,
46174cc8b09SKipisz, Steven };
46274cc8b09SKipisz, Steven 
46374cc8b09SKipisz, Steven static struct ti_usb_phy_device usb_phy1_device = {
46474cc8b09SKipisz, Steven 	.pll_ctrl_base = (void *)DRA7_USB3_PHY1_PLL_CTRL,
46574cc8b09SKipisz, Steven 	.usb2_phy_power = (void *)DRA7_USB2_PHY1_POWER,
46674cc8b09SKipisz, Steven 	.usb3_phy_power = (void *)DRA7_USB3_PHY1_POWER,
46774cc8b09SKipisz, Steven 	.index = 0,
46874cc8b09SKipisz, Steven };
46974cc8b09SKipisz, Steven 
47074cc8b09SKipisz, Steven static struct dwc3_device usb_otg_ss2 = {
47174cc8b09SKipisz, Steven 	.maximum_speed = USB_SPEED_HIGH,
47274cc8b09SKipisz, Steven 	.base = DRA7_USB_OTG_SS2_BASE,
47374cc8b09SKipisz, Steven 	.tx_fifo_resize = false,
47474cc8b09SKipisz, Steven 	.index = 1,
47574cc8b09SKipisz, Steven };
47674cc8b09SKipisz, Steven 
47774cc8b09SKipisz, Steven static struct dwc3_omap_device usb_otg_ss2_glue = {
47874cc8b09SKipisz, Steven 	.base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
47974cc8b09SKipisz, Steven 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
48074cc8b09SKipisz, Steven 	.index = 1,
48174cc8b09SKipisz, Steven };
48274cc8b09SKipisz, Steven 
48374cc8b09SKipisz, Steven static struct ti_usb_phy_device usb_phy2_device = {
48474cc8b09SKipisz, Steven 	.usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
48574cc8b09SKipisz, Steven 	.index = 1,
48674cc8b09SKipisz, Steven };
48774cc8b09SKipisz, Steven 
48874cc8b09SKipisz, Steven int usb_gadget_handle_interrupts(int index)
48974cc8b09SKipisz, Steven {
49074cc8b09SKipisz, Steven 	u32 status;
49174cc8b09SKipisz, Steven 
49274cc8b09SKipisz, Steven 	status = dwc3_omap_uboot_interrupt_status(index);
49374cc8b09SKipisz, Steven 	if (status)
49474cc8b09SKipisz, Steven 		dwc3_uboot_handle_interrupt(index);
49574cc8b09SKipisz, Steven 
49674cc8b09SKipisz, Steven 	return 0;
49774cc8b09SKipisz, Steven }
49855efaddeSRoger Quadros #endif /* CONFIG_USB_DWC3 */
49955efaddeSRoger Quadros 
50055efaddeSRoger Quadros #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
50155efaddeSRoger Quadros int board_usb_init(int index, enum usb_init_type init)
50255efaddeSRoger Quadros {
50355efaddeSRoger Quadros 	enable_usb_clocks(index);
50455efaddeSRoger Quadros 	switch (index) {
50555efaddeSRoger Quadros 	case 0:
50655efaddeSRoger Quadros 		if (init == USB_INIT_DEVICE) {
50755efaddeSRoger Quadros 			printf("port %d can't be used as device\n", index);
50855efaddeSRoger Quadros 			disable_usb_clocks(index);
50955efaddeSRoger Quadros 			return -EINVAL;
51055efaddeSRoger Quadros 		}
51155efaddeSRoger Quadros 		break;
51255efaddeSRoger Quadros 	case 1:
51355efaddeSRoger Quadros 		if (init == USB_INIT_DEVICE) {
51455efaddeSRoger Quadros #ifdef CONFIG_USB_DWC3
51555efaddeSRoger Quadros 			usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
51655efaddeSRoger Quadros 			usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
51755efaddeSRoger Quadros 			ti_usb_phy_uboot_init(&usb_phy2_device);
51855efaddeSRoger Quadros 			dwc3_omap_uboot_init(&usb_otg_ss2_glue);
51955efaddeSRoger Quadros 			dwc3_uboot_init(&usb_otg_ss2);
52074cc8b09SKipisz, Steven #endif
52155efaddeSRoger Quadros 		} else {
52255efaddeSRoger Quadros 			printf("port %d can't be used as host\n", index);
52355efaddeSRoger Quadros 			disable_usb_clocks(index);
52455efaddeSRoger Quadros 			return -EINVAL;
52555efaddeSRoger Quadros 		}
52655efaddeSRoger Quadros 
52755efaddeSRoger Quadros 		break;
52855efaddeSRoger Quadros 	default:
52955efaddeSRoger Quadros 		printf("Invalid Controller Index\n");
53055efaddeSRoger Quadros 	}
53155efaddeSRoger Quadros 
53255efaddeSRoger Quadros 	return 0;
53355efaddeSRoger Quadros }
53455efaddeSRoger Quadros 
53555efaddeSRoger Quadros int board_usb_cleanup(int index, enum usb_init_type init)
53655efaddeSRoger Quadros {
53755efaddeSRoger Quadros #ifdef CONFIG_USB_DWC3
53855efaddeSRoger Quadros 	switch (index) {
53955efaddeSRoger Quadros 	case 0:
54055efaddeSRoger Quadros 	case 1:
54155efaddeSRoger Quadros 		if (init == USB_INIT_DEVICE) {
54255efaddeSRoger Quadros 			ti_usb_phy_uboot_exit(index);
54355efaddeSRoger Quadros 			dwc3_uboot_exit(index);
54455efaddeSRoger Quadros 			dwc3_omap_uboot_exit(index);
54555efaddeSRoger Quadros 		}
54655efaddeSRoger Quadros 		break;
54755efaddeSRoger Quadros 	default:
54855efaddeSRoger Quadros 		printf("Invalid Controller Index\n");
54955efaddeSRoger Quadros 	}
55055efaddeSRoger Quadros #endif
55155efaddeSRoger Quadros 	disable_usb_clocks(index);
55255efaddeSRoger Quadros 	return 0;
55355efaddeSRoger Quadros }
55455efaddeSRoger Quadros #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
55574cc8b09SKipisz, Steven 
55674cc8b09SKipisz, Steven #ifdef CONFIG_DRIVER_TI_CPSW
55774cc8b09SKipisz, Steven 
55874cc8b09SKipisz, Steven /* Delay value to add to calibrated value */
55974cc8b09SKipisz, Steven #define RGMII0_TXCTL_DLY_VAL		((0x3 << 5) + 0x8)
56074cc8b09SKipisz, Steven #define RGMII0_TXD0_DLY_VAL		((0x3 << 5) + 0x8)
56174cc8b09SKipisz, Steven #define RGMII0_TXD1_DLY_VAL		((0x3 << 5) + 0x2)
56274cc8b09SKipisz, Steven #define RGMII0_TXD2_DLY_VAL		((0x4 << 5) + 0x0)
56374cc8b09SKipisz, Steven #define RGMII0_TXD3_DLY_VAL		((0x4 << 5) + 0x0)
56474cc8b09SKipisz, Steven #define VIN2A_D13_DLY_VAL		((0x3 << 5) + 0x8)
56574cc8b09SKipisz, Steven #define VIN2A_D17_DLY_VAL		((0x3 << 5) + 0x8)
56674cc8b09SKipisz, Steven #define VIN2A_D16_DLY_VAL		((0x3 << 5) + 0x2)
56774cc8b09SKipisz, Steven #define VIN2A_D15_DLY_VAL		((0x4 << 5) + 0x0)
56874cc8b09SKipisz, Steven #define VIN2A_D14_DLY_VAL		((0x4 << 5) + 0x0)
56974cc8b09SKipisz, Steven 
57074cc8b09SKipisz, Steven static void cpsw_control(int enabled)
57174cc8b09SKipisz, Steven {
57274cc8b09SKipisz, Steven 	/* VTP can be added here */
57374cc8b09SKipisz, Steven }
57474cc8b09SKipisz, Steven 
57574cc8b09SKipisz, Steven static struct cpsw_slave_data cpsw_slaves[] = {
57674cc8b09SKipisz, Steven 	{
57774cc8b09SKipisz, Steven 		.slave_reg_ofs	= 0x208,
57874cc8b09SKipisz, Steven 		.sliver_reg_ofs	= 0xd80,
57974cc8b09SKipisz, Steven 		.phy_addr	= 1,
58074cc8b09SKipisz, Steven 	},
58174cc8b09SKipisz, Steven 	{
58274cc8b09SKipisz, Steven 		.slave_reg_ofs	= 0x308,
58374cc8b09SKipisz, Steven 		.sliver_reg_ofs	= 0xdc0,
58474cc8b09SKipisz, Steven 		.phy_addr	= 2,
58574cc8b09SKipisz, Steven 	},
58674cc8b09SKipisz, Steven };
58774cc8b09SKipisz, Steven 
58874cc8b09SKipisz, Steven static struct cpsw_platform_data cpsw_data = {
58974cc8b09SKipisz, Steven 	.mdio_base		= CPSW_MDIO_BASE,
59074cc8b09SKipisz, Steven 	.cpsw_base		= CPSW_BASE,
59174cc8b09SKipisz, Steven 	.mdio_div		= 0xff,
59274cc8b09SKipisz, Steven 	.channels		= 8,
59374cc8b09SKipisz, Steven 	.cpdma_reg_ofs		= 0x800,
59474cc8b09SKipisz, Steven 	.slaves			= 1,
59574cc8b09SKipisz, Steven 	.slave_data		= cpsw_slaves,
59674cc8b09SKipisz, Steven 	.ale_reg_ofs		= 0xd00,
59774cc8b09SKipisz, Steven 	.ale_entries		= 1024,
59874cc8b09SKipisz, Steven 	.host_port_reg_ofs	= 0x108,
59974cc8b09SKipisz, Steven 	.hw_stats_reg_ofs	= 0x900,
60074cc8b09SKipisz, Steven 	.bd_ram_ofs		= 0x2000,
60174cc8b09SKipisz, Steven 	.mac_control		= (1 << 5),
60274cc8b09SKipisz, Steven 	.control		= cpsw_control,
60374cc8b09SKipisz, Steven 	.host_port_num		= 0,
60474cc8b09SKipisz, Steven 	.version		= CPSW_CTRL_VERSION_2,
60574cc8b09SKipisz, Steven };
60674cc8b09SKipisz, Steven 
60792667e89SRoger Quadros static u64 mac_to_u64(u8 mac[6])
60892667e89SRoger Quadros {
60992667e89SRoger Quadros 	int i;
61092667e89SRoger Quadros 	u64 addr = 0;
61192667e89SRoger Quadros 
61292667e89SRoger Quadros 	for (i = 0; i < 6; i++) {
61392667e89SRoger Quadros 		addr <<= 8;
61492667e89SRoger Quadros 		addr |= mac[i];
61592667e89SRoger Quadros 	}
61692667e89SRoger Quadros 
61792667e89SRoger Quadros 	return addr;
61892667e89SRoger Quadros }
61992667e89SRoger Quadros 
62092667e89SRoger Quadros static void u64_to_mac(u64 addr, u8 mac[6])
62192667e89SRoger Quadros {
62292667e89SRoger Quadros 	mac[5] = addr;
62392667e89SRoger Quadros 	mac[4] = addr >> 8;
62492667e89SRoger Quadros 	mac[3] = addr >> 16;
62592667e89SRoger Quadros 	mac[2] = addr >> 24;
62692667e89SRoger Quadros 	mac[1] = addr >> 32;
62792667e89SRoger Quadros 	mac[0] = addr >> 40;
62892667e89SRoger Quadros }
62992667e89SRoger Quadros 
63074cc8b09SKipisz, Steven int board_eth_init(bd_t *bis)
63174cc8b09SKipisz, Steven {
63274cc8b09SKipisz, Steven 	int ret;
63374cc8b09SKipisz, Steven 	uint8_t mac_addr[6];
63474cc8b09SKipisz, Steven 	uint32_t mac_hi, mac_lo;
63574cc8b09SKipisz, Steven 	uint32_t ctrl_val;
63692667e89SRoger Quadros 	int i;
63792667e89SRoger Quadros 	u64 mac1, mac2;
63892667e89SRoger Quadros 	u8 mac_addr1[6], mac_addr2[6];
63992667e89SRoger Quadros 	int num_macs;
64074cc8b09SKipisz, Steven 
64174cc8b09SKipisz, Steven 	/* try reading mac address from efuse */
64274cc8b09SKipisz, Steven 	mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
64374cc8b09SKipisz, Steven 	mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
64474cc8b09SKipisz, Steven 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
64574cc8b09SKipisz, Steven 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
64674cc8b09SKipisz, Steven 	mac_addr[2] = mac_hi & 0xFF;
64774cc8b09SKipisz, Steven 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
64874cc8b09SKipisz, Steven 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
64974cc8b09SKipisz, Steven 	mac_addr[5] = mac_lo & 0xFF;
65074cc8b09SKipisz, Steven 
65174cc8b09SKipisz, Steven 	if (!getenv("ethaddr")) {
65274cc8b09SKipisz, Steven 		printf("<ethaddr> not set. Validating first E-fuse MAC\n");
65374cc8b09SKipisz, Steven 
65474cc8b09SKipisz, Steven 		if (is_valid_ethaddr(mac_addr))
65574cc8b09SKipisz, Steven 			eth_setenv_enetaddr("ethaddr", mac_addr);
65674cc8b09SKipisz, Steven 	}
65774cc8b09SKipisz, Steven 
65874cc8b09SKipisz, Steven 	mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
65974cc8b09SKipisz, Steven 	mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
66074cc8b09SKipisz, Steven 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
66174cc8b09SKipisz, Steven 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
66274cc8b09SKipisz, Steven 	mac_addr[2] = mac_hi & 0xFF;
66374cc8b09SKipisz, Steven 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
66474cc8b09SKipisz, Steven 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
66574cc8b09SKipisz, Steven 	mac_addr[5] = mac_lo & 0xFF;
66674cc8b09SKipisz, Steven 
66774cc8b09SKipisz, Steven 	if (!getenv("eth1addr")) {
66874cc8b09SKipisz, Steven 		if (is_valid_ethaddr(mac_addr))
66974cc8b09SKipisz, Steven 			eth_setenv_enetaddr("eth1addr", mac_addr);
67074cc8b09SKipisz, Steven 	}
67174cc8b09SKipisz, Steven 
67274cc8b09SKipisz, Steven 	ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
67374cc8b09SKipisz, Steven 	ctrl_val |= 0x22;
67474cc8b09SKipisz, Steven 	writel(ctrl_val, (*ctrl)->control_core_control_io1);
67574cc8b09SKipisz, Steven 
676c020d355SSteve Kipisz 	/* The phy address for the AM572x IDK are different than x15 */
677c020d355SSteve Kipisz 	if (board_is_am572x_idk()) {
678c020d355SSteve Kipisz 		cpsw_data.slave_data[0].phy_addr = 0;
679c020d355SSteve Kipisz 		cpsw_data.slave_data[1].phy_addr = 1;
680c020d355SSteve Kipisz 	}
681c020d355SSteve Kipisz 
68274cc8b09SKipisz, Steven 	ret = cpsw_register(&cpsw_data);
68374cc8b09SKipisz, Steven 	if (ret < 0)
68474cc8b09SKipisz, Steven 		printf("Error %d registering CPSW switch\n", ret);
68574cc8b09SKipisz, Steven 
68692667e89SRoger Quadros 	/*
68792667e89SRoger Quadros 	 * Export any Ethernet MAC addresses from EEPROM.
68892667e89SRoger Quadros 	 * On AM57xx the 2 MAC addresses define the address range
68992667e89SRoger Quadros 	 */
69092667e89SRoger Quadros 	board_ti_get_eth_mac_addr(0, mac_addr1);
69192667e89SRoger Quadros 	board_ti_get_eth_mac_addr(1, mac_addr2);
69292667e89SRoger Quadros 
69392667e89SRoger Quadros 	if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
69492667e89SRoger Quadros 		mac1 = mac_to_u64(mac_addr1);
69592667e89SRoger Quadros 		mac2 = mac_to_u64(mac_addr2);
69692667e89SRoger Quadros 
69792667e89SRoger Quadros 		/* must contain an address range */
69892667e89SRoger Quadros 		num_macs = mac2 - mac1 + 1;
69992667e89SRoger Quadros 		/* <= 50 to protect against user programming error */
70092667e89SRoger Quadros 		if (num_macs > 0 && num_macs <= 50) {
70192667e89SRoger Quadros 			for (i = 0; i < num_macs; i++) {
70292667e89SRoger Quadros 				u64_to_mac(mac1 + i, mac_addr);
70392667e89SRoger Quadros 				if (is_valid_ethaddr(mac_addr)) {
70492667e89SRoger Quadros 					eth_setenv_enetaddr_by_index("eth",
70592667e89SRoger Quadros 								     i + 2,
70692667e89SRoger Quadros 								     mac_addr);
70792667e89SRoger Quadros 				}
70892667e89SRoger Quadros 			}
70992667e89SRoger Quadros 		}
71092667e89SRoger Quadros 	}
71192667e89SRoger Quadros 
71274cc8b09SKipisz, Steven 	return ret;
71374cc8b09SKipisz, Steven }
71474cc8b09SKipisz, Steven #endif
71574cc8b09SKipisz, Steven 
71674cc8b09SKipisz, Steven #ifdef CONFIG_BOARD_EARLY_INIT_F
71774cc8b09SKipisz, Steven /* VTT regulator enable */
71874cc8b09SKipisz, Steven static inline void vtt_regulator_enable(void)
71974cc8b09SKipisz, Steven {
72074cc8b09SKipisz, Steven 	if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
72174cc8b09SKipisz, Steven 		return;
72274cc8b09SKipisz, Steven 
72374cc8b09SKipisz, Steven 	gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
72474cc8b09SKipisz, Steven 	gpio_direction_output(GPIO_DDR_VTT_EN, 1);
72574cc8b09SKipisz, Steven }
72674cc8b09SKipisz, Steven 
72774cc8b09SKipisz, Steven int board_early_init_f(void)
72874cc8b09SKipisz, Steven {
72974cc8b09SKipisz, Steven 	vtt_regulator_enable();
73074cc8b09SKipisz, Steven 	return 0;
73174cc8b09SKipisz, Steven }
73274cc8b09SKipisz, Steven #endif
73362a09f05SDaniel Allred 
73462a09f05SDaniel Allred #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
73562a09f05SDaniel Allred int ft_board_setup(void *blob, bd_t *bd)
73662a09f05SDaniel Allred {
73762a09f05SDaniel Allred 	ft_cpu_setup(blob, bd);
73862a09f05SDaniel Allred 
73962a09f05SDaniel Allred 	return 0;
74062a09f05SDaniel Allred }
74162a09f05SDaniel Allred #endif
7427a0ea589SLokesh Vutla 
7437a0ea589SLokesh Vutla #ifdef CONFIG_SPL_LOAD_FIT
7447a0ea589SLokesh Vutla int board_fit_config_name_match(const char *name)
7457a0ea589SLokesh Vutla {
7467a0ea589SLokesh Vutla 	if (board_is_x15() && !strcmp(name, "am57xx-beagle-x15"))
7477a0ea589SLokesh Vutla 		return 0;
7487a0ea589SLokesh Vutla 	else if (board_is_am572x_evm() && !strcmp(name, "am57xx-beagle-x15"))
7497a0ea589SLokesh Vutla 		return 0;
750332dddc6SSchuyler Patton 	else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk"))
751332dddc6SSchuyler Patton 		return 0;
7527a0ea589SLokesh Vutla 	else
7537a0ea589SLokesh Vutla 		return -1;
7547a0ea589SLokesh Vutla }
7557a0ea589SLokesh Vutla #endif
75617c29873SAndreas Dannenberg 
75717c29873SAndreas Dannenberg #ifdef CONFIG_TI_SECURE_DEVICE
75817c29873SAndreas Dannenberg void board_fit_image_post_process(void **p_image, size_t *p_size)
75917c29873SAndreas Dannenberg {
76017c29873SAndreas Dannenberg 	secure_boot_verify_image(p_image, p_size);
76117c29873SAndreas Dannenberg }
76217c29873SAndreas Dannenberg #endif
763