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