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> 1674cc8b09SKipisz, Steven #include <asm/emif.h> 1774cc8b09SKipisz, Steven #include <asm/gpio.h> 1874cc8b09SKipisz, Steven #include <asm/arch/gpio.h> 1974cc8b09SKipisz, Steven #include <asm/arch/clock.h> 2074cc8b09SKipisz, Steven #include <asm/arch/dra7xx_iodelay.h> 2174cc8b09SKipisz, Steven #include <asm/arch/sys_proto.h> 2274cc8b09SKipisz, Steven #include <asm/arch/mmc_host_def.h> 2374cc8b09SKipisz, Steven #include <asm/arch/sata.h> 2474cc8b09SKipisz, Steven #include <asm/arch/gpio.h> 2574cc8b09SKipisz, Steven #include <asm/arch/omap.h> 2674cc8b09SKipisz, Steven #include <environment.h> 2774cc8b09SKipisz, Steven #include <usb.h> 2874cc8b09SKipisz, Steven #include <linux/usb/gadget.h> 2974cc8b09SKipisz, Steven #include <dwc3-uboot.h> 3074cc8b09SKipisz, Steven #include <dwc3-omap-uboot.h> 3174cc8b09SKipisz, Steven #include <ti-usb-phy-uboot.h> 3274cc8b09SKipisz, Steven 33212f96f6SKipisz, Steven #include "../common/board_detect.h" 3474cc8b09SKipisz, Steven #include "mux_data.h" 3574cc8b09SKipisz, Steven 36212f96f6SKipisz, Steven #define board_is_x15() board_ti_is("BBRDX15_") 37212f96f6SKipisz, Steven #define board_is_am572x_evm() board_ti_is("AM572PM_") 38212f96f6SKipisz, Steven 3974cc8b09SKipisz, Steven #ifdef CONFIG_DRIVER_TI_CPSW 4074cc8b09SKipisz, Steven #include <cpsw.h> 4174cc8b09SKipisz, Steven #endif 4274cc8b09SKipisz, Steven 4374cc8b09SKipisz, Steven DECLARE_GLOBAL_DATA_PTR; 4474cc8b09SKipisz, Steven 4574cc8b09SKipisz, Steven /* GPIO 7_11 */ 4674cc8b09SKipisz, Steven #define GPIO_DDR_VTT_EN 203 4774cc8b09SKipisz, Steven 48212f96f6SKipisz, Steven #define SYSINFO_BOARD_NAME_MAX_LEN 45 49212f96f6SKipisz, Steven 5074cc8b09SKipisz, Steven const struct omap_sysinfo sysinfo = { 51212f96f6SKipisz, Steven "Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n" 5274cc8b09SKipisz, Steven }; 5374cc8b09SKipisz, Steven 5474cc8b09SKipisz, Steven static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = { 5574cc8b09SKipisz, Steven .dmm_lisa_map_3 = 0x80740300, 5674cc8b09SKipisz, Steven .is_ma_present = 0x1 5774cc8b09SKipisz, Steven }; 5874cc8b09SKipisz, Steven 5974cc8b09SKipisz, Steven void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs) 6074cc8b09SKipisz, Steven { 6174cc8b09SKipisz, Steven *dmm_lisa_regs = &beagle_x15_lisa_regs; 6274cc8b09SKipisz, Steven } 6374cc8b09SKipisz, Steven 6474cc8b09SKipisz, Steven static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = { 6574cc8b09SKipisz, Steven .sdram_config_init = 0x61851b32, 6674cc8b09SKipisz, Steven .sdram_config = 0x61851b32, 6711e2b043SLokesh Vutla .sdram_config2 = 0x08000000, 6874cc8b09SKipisz, Steven .ref_ctrl = 0x000040F1, 6974cc8b09SKipisz, Steven .ref_ctrl_final = 0x00001035, 7011e2b043SLokesh Vutla .sdram_tim1 = 0xcccf36ab, 7111e2b043SLokesh Vutla .sdram_tim2 = 0x308f7fda, 7211e2b043SLokesh Vutla .sdram_tim3 = 0x409f88a8, 7374cc8b09SKipisz, Steven .read_idle_ctrl = 0x00050000, 7411e2b043SLokesh Vutla .zq_config = 0x5007190b, 7574cc8b09SKipisz, Steven .temp_alert_config = 0x00000000, 7674cc8b09SKipisz, Steven .emif_ddr_phy_ctlr_1_init = 0x0024400b, 7774cc8b09SKipisz, Steven .emif_ddr_phy_ctlr_1 = 0x0e24400b, 7874cc8b09SKipisz, Steven .emif_ddr_ext_phy_ctrl_1 = 0x10040100, 7911e2b043SLokesh Vutla .emif_ddr_ext_phy_ctrl_2 = 0x00910091, 8011e2b043SLokesh Vutla .emif_ddr_ext_phy_ctrl_3 = 0x00950095, 8111e2b043SLokesh Vutla .emif_ddr_ext_phy_ctrl_4 = 0x009b009b, 8211e2b043SLokesh Vutla .emif_ddr_ext_phy_ctrl_5 = 0x009e009e, 8374cc8b09SKipisz, Steven .emif_rd_wr_lvl_rmp_win = 0x00000000, 8474cc8b09SKipisz, Steven .emif_rd_wr_lvl_rmp_ctl = 0x80000000, 8574cc8b09SKipisz, Steven .emif_rd_wr_lvl_ctl = 0x00000000, 8674cc8b09SKipisz, Steven .emif_rd_wr_exec_thresh = 0x00000305 8774cc8b09SKipisz, Steven }; 8874cc8b09SKipisz, Steven 8974cc8b09SKipisz, Steven /* Ext phy ctrl regs 1-35 */ 9074cc8b09SKipisz, Steven static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = { 9174cc8b09SKipisz, Steven 0x10040100, 9211e2b043SLokesh Vutla 0x00910091, 9311e2b043SLokesh Vutla 0x00950095, 9411e2b043SLokesh Vutla 0x009B009B, 9511e2b043SLokesh Vutla 0x009E009E, 9611e2b043SLokesh Vutla 0x00980098, 9774cc8b09SKipisz, Steven 0x00340034, 9874cc8b09SKipisz, Steven 0x00350035, 9911e2b043SLokesh Vutla 0x00340034, 10011e2b043SLokesh Vutla 0x00310031, 10111e2b043SLokesh Vutla 0x00340034, 10211e2b043SLokesh Vutla 0x007F007F, 10311e2b043SLokesh Vutla 0x007F007F, 10411e2b043SLokesh Vutla 0x007F007F, 10511e2b043SLokesh Vutla 0x007F007F, 10611e2b043SLokesh Vutla 0x007F007F, 10711e2b043SLokesh Vutla 0x00480048, 10811e2b043SLokesh Vutla 0x004A004A, 10911e2b043SLokesh Vutla 0x00520052, 11011e2b043SLokesh Vutla 0x00550055, 11111e2b043SLokesh Vutla 0x00500050, 11274cc8b09SKipisz, Steven 0x00000000, 11374cc8b09SKipisz, Steven 0x00600020, 11474cc8b09SKipisz, Steven 0x40011080, 11574cc8b09SKipisz, Steven 0x08102040, 11611e2b043SLokesh Vutla 0x0, 11711e2b043SLokesh Vutla 0x0, 11811e2b043SLokesh Vutla 0x0, 11911e2b043SLokesh Vutla 0x0, 12011e2b043SLokesh Vutla 0x0, 12174cc8b09SKipisz, Steven 0x0, 12274cc8b09SKipisz, Steven 0x0, 12374cc8b09SKipisz, Steven 0x0, 12474cc8b09SKipisz, Steven 0x0, 12574cc8b09SKipisz, Steven 0x0 12674cc8b09SKipisz, Steven }; 12774cc8b09SKipisz, Steven 12874cc8b09SKipisz, Steven static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = { 12974cc8b09SKipisz, Steven .sdram_config_init = 0x61851b32, 13074cc8b09SKipisz, Steven .sdram_config = 0x61851b32, 13111e2b043SLokesh Vutla .sdram_config2 = 0x08000000, 13274cc8b09SKipisz, Steven .ref_ctrl = 0x000040F1, 13374cc8b09SKipisz, Steven .ref_ctrl_final = 0x00001035, 13411e2b043SLokesh Vutla .sdram_tim1 = 0xcccf36ab, 13511e2b043SLokesh Vutla .sdram_tim2 = 0x308f7fda, 13611e2b043SLokesh Vutla .sdram_tim3 = 0x409f88a8, 13774cc8b09SKipisz, Steven .read_idle_ctrl = 0x00050000, 13811e2b043SLokesh Vutla .zq_config = 0x5007190b, 13974cc8b09SKipisz, Steven .temp_alert_config = 0x00000000, 14074cc8b09SKipisz, Steven .emif_ddr_phy_ctlr_1_init = 0x0024400b, 14174cc8b09SKipisz, Steven .emif_ddr_phy_ctlr_1 = 0x0e24400b, 14274cc8b09SKipisz, Steven .emif_ddr_ext_phy_ctrl_1 = 0x10040100, 14311e2b043SLokesh Vutla .emif_ddr_ext_phy_ctrl_2 = 0x00910091, 14411e2b043SLokesh Vutla .emif_ddr_ext_phy_ctrl_3 = 0x00950095, 14511e2b043SLokesh Vutla .emif_ddr_ext_phy_ctrl_4 = 0x009b009b, 14611e2b043SLokesh Vutla .emif_ddr_ext_phy_ctrl_5 = 0x009e009e, 14774cc8b09SKipisz, Steven .emif_rd_wr_lvl_rmp_win = 0x00000000, 14874cc8b09SKipisz, Steven .emif_rd_wr_lvl_rmp_ctl = 0x80000000, 14974cc8b09SKipisz, Steven .emif_rd_wr_lvl_ctl = 0x00000000, 15074cc8b09SKipisz, Steven .emif_rd_wr_exec_thresh = 0x00000305 15174cc8b09SKipisz, Steven }; 15274cc8b09SKipisz, Steven 15374cc8b09SKipisz, Steven static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = { 15474cc8b09SKipisz, Steven 0x10040100, 15511e2b043SLokesh Vutla 0x00910091, 15611e2b043SLokesh Vutla 0x00950095, 15711e2b043SLokesh Vutla 0x009B009B, 15811e2b043SLokesh Vutla 0x009E009E, 15911e2b043SLokesh Vutla 0x00980098, 16011e2b043SLokesh Vutla 0x00340034, 16174cc8b09SKipisz, Steven 0x00350035, 16211e2b043SLokesh Vutla 0x00340034, 16311e2b043SLokesh Vutla 0x00310031, 16411e2b043SLokesh Vutla 0x00340034, 16511e2b043SLokesh Vutla 0x007F007F, 16611e2b043SLokesh Vutla 0x007F007F, 16711e2b043SLokesh Vutla 0x007F007F, 16811e2b043SLokesh Vutla 0x007F007F, 16911e2b043SLokesh Vutla 0x007F007F, 17011e2b043SLokesh Vutla 0x00480048, 17111e2b043SLokesh Vutla 0x004A004A, 17211e2b043SLokesh Vutla 0x00520052, 17311e2b043SLokesh Vutla 0x00550055, 17411e2b043SLokesh Vutla 0x00500050, 17574cc8b09SKipisz, Steven 0x00000000, 17674cc8b09SKipisz, Steven 0x00600020, 17774cc8b09SKipisz, Steven 0x40011080, 17874cc8b09SKipisz, Steven 0x08102040, 17911e2b043SLokesh Vutla 0x0, 18011e2b043SLokesh Vutla 0x0, 18111e2b043SLokesh Vutla 0x0, 18211e2b043SLokesh Vutla 0x0, 18311e2b043SLokesh Vutla 0x0, 18474cc8b09SKipisz, Steven 0x0, 18574cc8b09SKipisz, Steven 0x0, 18674cc8b09SKipisz, Steven 0x0, 18774cc8b09SKipisz, Steven 0x0, 18874cc8b09SKipisz, Steven 0x0 18974cc8b09SKipisz, Steven }; 19074cc8b09SKipisz, Steven 19174cc8b09SKipisz, Steven void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs) 19274cc8b09SKipisz, Steven { 19374cc8b09SKipisz, Steven switch (emif_nr) { 19474cc8b09SKipisz, Steven case 1: 19574cc8b09SKipisz, Steven *regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs; 19674cc8b09SKipisz, Steven break; 19774cc8b09SKipisz, Steven case 2: 19874cc8b09SKipisz, Steven *regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs; 19974cc8b09SKipisz, Steven break; 20074cc8b09SKipisz, Steven } 20174cc8b09SKipisz, Steven } 20274cc8b09SKipisz, Steven 20374cc8b09SKipisz, Steven void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size) 20474cc8b09SKipisz, Steven { 20574cc8b09SKipisz, Steven switch (emif_nr) { 20674cc8b09SKipisz, Steven case 1: 20774cc8b09SKipisz, Steven *regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs; 20874cc8b09SKipisz, Steven *size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs); 20974cc8b09SKipisz, Steven break; 21074cc8b09SKipisz, Steven case 2: 21174cc8b09SKipisz, Steven *regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs; 21274cc8b09SKipisz, Steven *size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs); 21374cc8b09SKipisz, Steven break; 21474cc8b09SKipisz, Steven } 21574cc8b09SKipisz, Steven } 21674cc8b09SKipisz, Steven 21774cc8b09SKipisz, Steven struct vcores_data beagle_x15_volts = { 21874cc8b09SKipisz, Steven .mpu.value = VDD_MPU_DRA752, 21974cc8b09SKipisz, Steven .mpu.efuse.reg = STD_FUSE_OPP_VMIN_MPU_NOM, 22074cc8b09SKipisz, Steven .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS, 22174cc8b09SKipisz, Steven .mpu.addr = TPS659038_REG_ADDR_SMPS12, 22274cc8b09SKipisz, Steven .mpu.pmic = &tps659038, 22374cc8b09SKipisz, Steven 22474cc8b09SKipisz, Steven .eve.value = VDD_EVE_DRA752, 22574cc8b09SKipisz, Steven .eve.efuse.reg = STD_FUSE_OPP_VMIN_DSPEVE_NOM, 22674cc8b09SKipisz, Steven .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS, 22774cc8b09SKipisz, Steven .eve.addr = TPS659038_REG_ADDR_SMPS45, 22874cc8b09SKipisz, Steven .eve.pmic = &tps659038, 22974cc8b09SKipisz, Steven 23074cc8b09SKipisz, Steven .gpu.value = VDD_GPU_DRA752, 23174cc8b09SKipisz, Steven .gpu.efuse.reg = STD_FUSE_OPP_VMIN_GPU_NOM, 23274cc8b09SKipisz, Steven .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS, 23374cc8b09SKipisz, Steven .gpu.addr = TPS659038_REG_ADDR_SMPS45, 23474cc8b09SKipisz, Steven .gpu.pmic = &tps659038, 23574cc8b09SKipisz, Steven 23674cc8b09SKipisz, Steven .core.value = VDD_CORE_DRA752, 23774cc8b09SKipisz, Steven .core.efuse.reg = STD_FUSE_OPP_VMIN_CORE_NOM, 23874cc8b09SKipisz, Steven .core.efuse.reg_bits = DRA752_EFUSE_REGBITS, 23974cc8b09SKipisz, Steven .core.addr = TPS659038_REG_ADDR_SMPS6, 24074cc8b09SKipisz, Steven .core.pmic = &tps659038, 24174cc8b09SKipisz, Steven 24274cc8b09SKipisz, Steven .iva.value = VDD_IVA_DRA752, 24374cc8b09SKipisz, Steven .iva.efuse.reg = STD_FUSE_OPP_VMIN_IVA_NOM, 24474cc8b09SKipisz, Steven .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS, 24574cc8b09SKipisz, Steven .iva.addr = TPS659038_REG_ADDR_SMPS45, 24674cc8b09SKipisz, Steven .iva.pmic = &tps659038, 24774cc8b09SKipisz, Steven }; 24874cc8b09SKipisz, Steven 249212f96f6SKipisz, Steven #ifdef CONFIG_SPL_BUILD 250212f96f6SKipisz, Steven /* No env to setup for SPL */ 251212f96f6SKipisz, Steven static inline void setup_board_eeprom_env(void) { } 252212f96f6SKipisz, Steven 253212f96f6SKipisz, Steven /* Override function to read eeprom information */ 254212f96f6SKipisz, Steven void do_board_detect(void) 255212f96f6SKipisz, Steven { 256212f96f6SKipisz, Steven int rc; 257212f96f6SKipisz, Steven 258212f96f6SKipisz, Steven rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS, 259212f96f6SKipisz, Steven CONFIG_EEPROM_CHIP_ADDRESS); 260212f96f6SKipisz, Steven if (rc) 261212f96f6SKipisz, Steven printf("ti_i2c_eeprom_init failed %d\n", rc); 262212f96f6SKipisz, Steven } 263212f96f6SKipisz, Steven 264212f96f6SKipisz, Steven #else /* CONFIG_SPL_BUILD */ 265212f96f6SKipisz, Steven 266212f96f6SKipisz, Steven /* Override function to read eeprom information: actual i2c read done by SPL*/ 267212f96f6SKipisz, Steven void do_board_detect(void) 268212f96f6SKipisz, Steven { 269212f96f6SKipisz, Steven char *bname = NULL; 270212f96f6SKipisz, Steven int rc; 271212f96f6SKipisz, Steven 272212f96f6SKipisz, Steven rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS, 273212f96f6SKipisz, Steven CONFIG_EEPROM_CHIP_ADDRESS); 274212f96f6SKipisz, Steven if (rc) 275212f96f6SKipisz, Steven printf("ti_i2c_eeprom_init failed %d\n", rc); 276212f96f6SKipisz, Steven 277212f96f6SKipisz, Steven if (board_is_x15()) 278212f96f6SKipisz, Steven bname = "BeagleBoard X15"; 279212f96f6SKipisz, Steven else if (board_is_am572x_evm()) 280212f96f6SKipisz, Steven bname = "AM572x EVM"; 281212f96f6SKipisz, Steven 282212f96f6SKipisz, Steven if (bname) 283212f96f6SKipisz, Steven snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN, 284212f96f6SKipisz, Steven "Board: %s REV %s\n", bname, board_ti_get_rev()); 285212f96f6SKipisz, Steven } 286212f96f6SKipisz, Steven 287212f96f6SKipisz, Steven static void setup_board_eeprom_env(void) 288212f96f6SKipisz, Steven { 289212f96f6SKipisz, Steven char *name = "beagle_x15"; 290212f96f6SKipisz, Steven int rc; 291212f96f6SKipisz, Steven 292212f96f6SKipisz, Steven rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS, 293212f96f6SKipisz, Steven CONFIG_EEPROM_CHIP_ADDRESS); 294212f96f6SKipisz, Steven if (rc) 295212f96f6SKipisz, Steven goto invalid_eeprom; 296212f96f6SKipisz, Steven 297212f96f6SKipisz, Steven if (board_is_am572x_evm()) 298212f96f6SKipisz, Steven name = "am57xx_evm"; 299212f96f6SKipisz, Steven else 300212f96f6SKipisz, Steven printf("Unidentified board claims %s in eeprom header\n", 301212f96f6SKipisz, Steven board_ti_get_name()); 302212f96f6SKipisz, Steven 303212f96f6SKipisz, Steven invalid_eeprom: 304212f96f6SKipisz, Steven set_board_info_env(name); 305212f96f6SKipisz, Steven } 306212f96f6SKipisz, Steven 307212f96f6SKipisz, Steven #endif /* CONFIG_SPL_BUILD */ 308212f96f6SKipisz, Steven 30974cc8b09SKipisz, Steven void hw_data_init(void) 31074cc8b09SKipisz, Steven { 31174cc8b09SKipisz, Steven *prcm = &dra7xx_prcm; 31274cc8b09SKipisz, Steven *dplls_data = &dra7xx_dplls; 31374cc8b09SKipisz, Steven *omap_vcores = &beagle_x15_volts; 31474cc8b09SKipisz, Steven *ctrl = &dra7xx_ctrl; 31574cc8b09SKipisz, Steven } 31674cc8b09SKipisz, Steven 31774cc8b09SKipisz, Steven int board_init(void) 31874cc8b09SKipisz, Steven { 31974cc8b09SKipisz, Steven gpmc_init(); 32074cc8b09SKipisz, Steven gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100); 32174cc8b09SKipisz, Steven 32274cc8b09SKipisz, Steven return 0; 32374cc8b09SKipisz, Steven } 32474cc8b09SKipisz, Steven 32574cc8b09SKipisz, Steven int board_late_init(void) 32674cc8b09SKipisz, Steven { 32774cc8b09SKipisz, Steven init_sata(0); 328212f96f6SKipisz, Steven setup_board_eeprom_env(); 329212f96f6SKipisz, Steven 33074cc8b09SKipisz, Steven /* 33174cc8b09SKipisz, Steven * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds 33274cc8b09SKipisz, Steven * This is the POWERHOLD-in-Low behavior. 33374cc8b09SKipisz, Steven */ 33474cc8b09SKipisz, Steven palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1); 33574cc8b09SKipisz, Steven return 0; 33674cc8b09SKipisz, Steven } 33774cc8b09SKipisz, Steven 338*3ef56e61SPaul Kocialkowski void set_muxconf_regs(void) 33974cc8b09SKipisz, Steven { 34074cc8b09SKipisz, Steven do_set_mux32((*ctrl)->control_padconf_core_base, 34174cc8b09SKipisz, Steven early_padconf, ARRAY_SIZE(early_padconf)); 34274cc8b09SKipisz, Steven } 34374cc8b09SKipisz, Steven 34474cc8b09SKipisz, Steven #ifdef CONFIG_IODELAY_RECALIBRATION 34574cc8b09SKipisz, Steven void recalibrate_iodelay(void) 34674cc8b09SKipisz, Steven { 34774cc8b09SKipisz, Steven __recalibrate_iodelay(core_padconf_array_essential, 34874cc8b09SKipisz, Steven ARRAY_SIZE(core_padconf_array_essential), 34974cc8b09SKipisz, Steven iodelay_cfg_array, ARRAY_SIZE(iodelay_cfg_array)); 35074cc8b09SKipisz, Steven } 35174cc8b09SKipisz, Steven #endif 35274cc8b09SKipisz, Steven 35374cc8b09SKipisz, Steven #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC) 35474cc8b09SKipisz, Steven int board_mmc_init(bd_t *bis) 35574cc8b09SKipisz, Steven { 35674cc8b09SKipisz, Steven omap_mmc_init(0, 0, 0, -1, -1); 35774cc8b09SKipisz, Steven omap_mmc_init(1, 0, 0, -1, -1); 35874cc8b09SKipisz, Steven return 0; 35974cc8b09SKipisz, Steven } 36074cc8b09SKipisz, Steven #endif 36174cc8b09SKipisz, Steven 36274cc8b09SKipisz, Steven #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT) 36374cc8b09SKipisz, Steven int spl_start_uboot(void) 36474cc8b09SKipisz, Steven { 36574cc8b09SKipisz, Steven /* break into full u-boot on 'c' */ 36674cc8b09SKipisz, Steven if (serial_tstc() && serial_getc() == 'c') 36774cc8b09SKipisz, Steven return 1; 36874cc8b09SKipisz, Steven 36974cc8b09SKipisz, Steven #ifdef CONFIG_SPL_ENV_SUPPORT 37074cc8b09SKipisz, Steven env_init(); 37174cc8b09SKipisz, Steven env_relocate_spec(); 37274cc8b09SKipisz, Steven if (getenv_yesno("boot_os") != 1) 37374cc8b09SKipisz, Steven return 1; 37474cc8b09SKipisz, Steven #endif 37574cc8b09SKipisz, Steven 37674cc8b09SKipisz, Steven return 0; 37774cc8b09SKipisz, Steven } 37874cc8b09SKipisz, Steven #endif 37974cc8b09SKipisz, Steven 38074cc8b09SKipisz, Steven #ifdef CONFIG_USB_DWC3 38174cc8b09SKipisz, Steven static struct dwc3_device usb_otg_ss1 = { 38274cc8b09SKipisz, Steven .maximum_speed = USB_SPEED_SUPER, 38374cc8b09SKipisz, Steven .base = DRA7_USB_OTG_SS1_BASE, 38474cc8b09SKipisz, Steven .tx_fifo_resize = false, 38574cc8b09SKipisz, Steven .index = 0, 38674cc8b09SKipisz, Steven }; 38774cc8b09SKipisz, Steven 38874cc8b09SKipisz, Steven static struct dwc3_omap_device usb_otg_ss1_glue = { 38974cc8b09SKipisz, Steven .base = (void *)DRA7_USB_OTG_SS1_GLUE_BASE, 39074cc8b09SKipisz, Steven .utmi_mode = DWC3_OMAP_UTMI_MODE_SW, 39174cc8b09SKipisz, Steven .index = 0, 39274cc8b09SKipisz, Steven }; 39374cc8b09SKipisz, Steven 39474cc8b09SKipisz, Steven static struct ti_usb_phy_device usb_phy1_device = { 39574cc8b09SKipisz, Steven .pll_ctrl_base = (void *)DRA7_USB3_PHY1_PLL_CTRL, 39674cc8b09SKipisz, Steven .usb2_phy_power = (void *)DRA7_USB2_PHY1_POWER, 39774cc8b09SKipisz, Steven .usb3_phy_power = (void *)DRA7_USB3_PHY1_POWER, 39874cc8b09SKipisz, Steven .index = 0, 39974cc8b09SKipisz, Steven }; 40074cc8b09SKipisz, Steven 40174cc8b09SKipisz, Steven static struct dwc3_device usb_otg_ss2 = { 40274cc8b09SKipisz, Steven .maximum_speed = USB_SPEED_HIGH, 40374cc8b09SKipisz, Steven .base = DRA7_USB_OTG_SS2_BASE, 40474cc8b09SKipisz, Steven .tx_fifo_resize = false, 40574cc8b09SKipisz, Steven .index = 1, 40674cc8b09SKipisz, Steven }; 40774cc8b09SKipisz, Steven 40874cc8b09SKipisz, Steven static struct dwc3_omap_device usb_otg_ss2_glue = { 40974cc8b09SKipisz, Steven .base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE, 41074cc8b09SKipisz, Steven .utmi_mode = DWC3_OMAP_UTMI_MODE_SW, 41174cc8b09SKipisz, Steven .index = 1, 41274cc8b09SKipisz, Steven }; 41374cc8b09SKipisz, Steven 41474cc8b09SKipisz, Steven static struct ti_usb_phy_device usb_phy2_device = { 41574cc8b09SKipisz, Steven .usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER, 41674cc8b09SKipisz, Steven .index = 1, 41774cc8b09SKipisz, Steven }; 41874cc8b09SKipisz, Steven 41974cc8b09SKipisz, Steven int board_usb_init(int index, enum usb_init_type init) 42074cc8b09SKipisz, Steven { 42174cc8b09SKipisz, Steven enable_usb_clocks(index); 42274cc8b09SKipisz, Steven switch (index) { 42374cc8b09SKipisz, Steven case 0: 42474cc8b09SKipisz, Steven if (init == USB_INIT_DEVICE) { 42574cc8b09SKipisz, Steven printf("port %d can't be used as device\n", index); 42674cc8b09SKipisz, Steven disable_usb_clocks(index); 42774cc8b09SKipisz, Steven return -EINVAL; 42874cc8b09SKipisz, Steven } else { 42974cc8b09SKipisz, Steven usb_otg_ss1.dr_mode = USB_DR_MODE_HOST; 43074cc8b09SKipisz, Steven usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_ID_GROUND; 43174cc8b09SKipisz, Steven setbits_le32((*prcm)->cm_l3init_usb_otg_ss1_clkctrl, 43274cc8b09SKipisz, Steven OTG_SS_CLKCTRL_MODULEMODE_HW | 43374cc8b09SKipisz, Steven OPTFCLKEN_REFCLK960M); 43474cc8b09SKipisz, Steven } 43574cc8b09SKipisz, Steven 43674cc8b09SKipisz, Steven ti_usb_phy_uboot_init(&usb_phy1_device); 43774cc8b09SKipisz, Steven dwc3_omap_uboot_init(&usb_otg_ss1_glue); 43874cc8b09SKipisz, Steven dwc3_uboot_init(&usb_otg_ss1); 43974cc8b09SKipisz, Steven break; 44074cc8b09SKipisz, Steven case 1: 44174cc8b09SKipisz, Steven if (init == USB_INIT_DEVICE) { 44274cc8b09SKipisz, Steven usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL; 44374cc8b09SKipisz, Steven usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID; 44474cc8b09SKipisz, Steven } else { 44574cc8b09SKipisz, Steven printf("port %d can't be used as host\n", index); 44674cc8b09SKipisz, Steven disable_usb_clocks(index); 44774cc8b09SKipisz, Steven return -EINVAL; 44874cc8b09SKipisz, Steven } 44974cc8b09SKipisz, Steven 45074cc8b09SKipisz, Steven ti_usb_phy_uboot_init(&usb_phy2_device); 45174cc8b09SKipisz, Steven dwc3_omap_uboot_init(&usb_otg_ss2_glue); 45274cc8b09SKipisz, Steven dwc3_uboot_init(&usb_otg_ss2); 45374cc8b09SKipisz, Steven break; 45474cc8b09SKipisz, Steven default: 45574cc8b09SKipisz, Steven printf("Invalid Controller Index\n"); 45674cc8b09SKipisz, Steven } 45774cc8b09SKipisz, Steven 45874cc8b09SKipisz, Steven return 0; 45974cc8b09SKipisz, Steven } 46074cc8b09SKipisz, Steven 46174cc8b09SKipisz, Steven int board_usb_cleanup(int index, enum usb_init_type init) 46274cc8b09SKipisz, Steven { 46374cc8b09SKipisz, Steven switch (index) { 46474cc8b09SKipisz, Steven case 0: 46574cc8b09SKipisz, Steven case 1: 46674cc8b09SKipisz, Steven ti_usb_phy_uboot_exit(index); 46774cc8b09SKipisz, Steven dwc3_uboot_exit(index); 46874cc8b09SKipisz, Steven dwc3_omap_uboot_exit(index); 46974cc8b09SKipisz, Steven break; 47074cc8b09SKipisz, Steven default: 47174cc8b09SKipisz, Steven printf("Invalid Controller Index\n"); 47274cc8b09SKipisz, Steven } 47374cc8b09SKipisz, Steven disable_usb_clocks(index); 47474cc8b09SKipisz, Steven return 0; 47574cc8b09SKipisz, Steven } 47674cc8b09SKipisz, Steven 47774cc8b09SKipisz, Steven int usb_gadget_handle_interrupts(int index) 47874cc8b09SKipisz, Steven { 47974cc8b09SKipisz, Steven u32 status; 48074cc8b09SKipisz, Steven 48174cc8b09SKipisz, Steven status = dwc3_omap_uboot_interrupt_status(index); 48274cc8b09SKipisz, Steven if (status) 48374cc8b09SKipisz, Steven dwc3_uboot_handle_interrupt(index); 48474cc8b09SKipisz, Steven 48574cc8b09SKipisz, Steven return 0; 48674cc8b09SKipisz, Steven } 48774cc8b09SKipisz, Steven #endif 48874cc8b09SKipisz, Steven 48974cc8b09SKipisz, Steven #ifdef CONFIG_DRIVER_TI_CPSW 49074cc8b09SKipisz, Steven 49174cc8b09SKipisz, Steven /* Delay value to add to calibrated value */ 49274cc8b09SKipisz, Steven #define RGMII0_TXCTL_DLY_VAL ((0x3 << 5) + 0x8) 49374cc8b09SKipisz, Steven #define RGMII0_TXD0_DLY_VAL ((0x3 << 5) + 0x8) 49474cc8b09SKipisz, Steven #define RGMII0_TXD1_DLY_VAL ((0x3 << 5) + 0x2) 49574cc8b09SKipisz, Steven #define RGMII0_TXD2_DLY_VAL ((0x4 << 5) + 0x0) 49674cc8b09SKipisz, Steven #define RGMII0_TXD3_DLY_VAL ((0x4 << 5) + 0x0) 49774cc8b09SKipisz, Steven #define VIN2A_D13_DLY_VAL ((0x3 << 5) + 0x8) 49874cc8b09SKipisz, Steven #define VIN2A_D17_DLY_VAL ((0x3 << 5) + 0x8) 49974cc8b09SKipisz, Steven #define VIN2A_D16_DLY_VAL ((0x3 << 5) + 0x2) 50074cc8b09SKipisz, Steven #define VIN2A_D15_DLY_VAL ((0x4 << 5) + 0x0) 50174cc8b09SKipisz, Steven #define VIN2A_D14_DLY_VAL ((0x4 << 5) + 0x0) 50274cc8b09SKipisz, Steven 50374cc8b09SKipisz, Steven static void cpsw_control(int enabled) 50474cc8b09SKipisz, Steven { 50574cc8b09SKipisz, Steven /* VTP can be added here */ 50674cc8b09SKipisz, Steven } 50774cc8b09SKipisz, Steven 50874cc8b09SKipisz, Steven static struct cpsw_slave_data cpsw_slaves[] = { 50974cc8b09SKipisz, Steven { 51074cc8b09SKipisz, Steven .slave_reg_ofs = 0x208, 51174cc8b09SKipisz, Steven .sliver_reg_ofs = 0xd80, 51274cc8b09SKipisz, Steven .phy_addr = 1, 51374cc8b09SKipisz, Steven }, 51474cc8b09SKipisz, Steven { 51574cc8b09SKipisz, Steven .slave_reg_ofs = 0x308, 51674cc8b09SKipisz, Steven .sliver_reg_ofs = 0xdc0, 51774cc8b09SKipisz, Steven .phy_addr = 2, 51874cc8b09SKipisz, Steven }, 51974cc8b09SKipisz, Steven }; 52074cc8b09SKipisz, Steven 52174cc8b09SKipisz, Steven static struct cpsw_platform_data cpsw_data = { 52274cc8b09SKipisz, Steven .mdio_base = CPSW_MDIO_BASE, 52374cc8b09SKipisz, Steven .cpsw_base = CPSW_BASE, 52474cc8b09SKipisz, Steven .mdio_div = 0xff, 52574cc8b09SKipisz, Steven .channels = 8, 52674cc8b09SKipisz, Steven .cpdma_reg_ofs = 0x800, 52774cc8b09SKipisz, Steven .slaves = 1, 52874cc8b09SKipisz, Steven .slave_data = cpsw_slaves, 52974cc8b09SKipisz, Steven .ale_reg_ofs = 0xd00, 53074cc8b09SKipisz, Steven .ale_entries = 1024, 53174cc8b09SKipisz, Steven .host_port_reg_ofs = 0x108, 53274cc8b09SKipisz, Steven .hw_stats_reg_ofs = 0x900, 53374cc8b09SKipisz, Steven .bd_ram_ofs = 0x2000, 53474cc8b09SKipisz, Steven .mac_control = (1 << 5), 53574cc8b09SKipisz, Steven .control = cpsw_control, 53674cc8b09SKipisz, Steven .host_port_num = 0, 53774cc8b09SKipisz, Steven .version = CPSW_CTRL_VERSION_2, 53874cc8b09SKipisz, Steven }; 53974cc8b09SKipisz, Steven 54074cc8b09SKipisz, Steven int board_eth_init(bd_t *bis) 54174cc8b09SKipisz, Steven { 54274cc8b09SKipisz, Steven int ret; 54374cc8b09SKipisz, Steven uint8_t mac_addr[6]; 54474cc8b09SKipisz, Steven uint32_t mac_hi, mac_lo; 54574cc8b09SKipisz, Steven uint32_t ctrl_val; 54674cc8b09SKipisz, Steven 54774cc8b09SKipisz, Steven /* try reading mac address from efuse */ 54874cc8b09SKipisz, Steven mac_lo = readl((*ctrl)->control_core_mac_id_0_lo); 54974cc8b09SKipisz, Steven mac_hi = readl((*ctrl)->control_core_mac_id_0_hi); 55074cc8b09SKipisz, Steven mac_addr[0] = (mac_hi & 0xFF0000) >> 16; 55174cc8b09SKipisz, Steven mac_addr[1] = (mac_hi & 0xFF00) >> 8; 55274cc8b09SKipisz, Steven mac_addr[2] = mac_hi & 0xFF; 55374cc8b09SKipisz, Steven mac_addr[3] = (mac_lo & 0xFF0000) >> 16; 55474cc8b09SKipisz, Steven mac_addr[4] = (mac_lo & 0xFF00) >> 8; 55574cc8b09SKipisz, Steven mac_addr[5] = mac_lo & 0xFF; 55674cc8b09SKipisz, Steven 55774cc8b09SKipisz, Steven if (!getenv("ethaddr")) { 55874cc8b09SKipisz, Steven printf("<ethaddr> not set. Validating first E-fuse MAC\n"); 55974cc8b09SKipisz, Steven 56074cc8b09SKipisz, Steven if (is_valid_ethaddr(mac_addr)) 56174cc8b09SKipisz, Steven eth_setenv_enetaddr("ethaddr", mac_addr); 56274cc8b09SKipisz, Steven } 56374cc8b09SKipisz, Steven 56474cc8b09SKipisz, Steven mac_lo = readl((*ctrl)->control_core_mac_id_1_lo); 56574cc8b09SKipisz, Steven mac_hi = readl((*ctrl)->control_core_mac_id_1_hi); 56674cc8b09SKipisz, Steven mac_addr[0] = (mac_hi & 0xFF0000) >> 16; 56774cc8b09SKipisz, Steven mac_addr[1] = (mac_hi & 0xFF00) >> 8; 56874cc8b09SKipisz, Steven mac_addr[2] = mac_hi & 0xFF; 56974cc8b09SKipisz, Steven mac_addr[3] = (mac_lo & 0xFF0000) >> 16; 57074cc8b09SKipisz, Steven mac_addr[4] = (mac_lo & 0xFF00) >> 8; 57174cc8b09SKipisz, Steven mac_addr[5] = mac_lo & 0xFF; 57274cc8b09SKipisz, Steven 57374cc8b09SKipisz, Steven if (!getenv("eth1addr")) { 57474cc8b09SKipisz, Steven if (is_valid_ethaddr(mac_addr)) 57574cc8b09SKipisz, Steven eth_setenv_enetaddr("eth1addr", mac_addr); 57674cc8b09SKipisz, Steven } 57774cc8b09SKipisz, Steven 57874cc8b09SKipisz, Steven ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33); 57974cc8b09SKipisz, Steven ctrl_val |= 0x22; 58074cc8b09SKipisz, Steven writel(ctrl_val, (*ctrl)->control_core_control_io1); 58174cc8b09SKipisz, Steven 58274cc8b09SKipisz, Steven ret = cpsw_register(&cpsw_data); 58374cc8b09SKipisz, Steven if (ret < 0) 58474cc8b09SKipisz, Steven printf("Error %d registering CPSW switch\n", ret); 58574cc8b09SKipisz, Steven 58674cc8b09SKipisz, Steven return ret; 58774cc8b09SKipisz, Steven } 58874cc8b09SKipisz, Steven #endif 58974cc8b09SKipisz, Steven 59074cc8b09SKipisz, Steven #ifdef CONFIG_BOARD_EARLY_INIT_F 59174cc8b09SKipisz, Steven /* VTT regulator enable */ 59274cc8b09SKipisz, Steven static inline void vtt_regulator_enable(void) 59374cc8b09SKipisz, Steven { 59474cc8b09SKipisz, Steven if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL) 59574cc8b09SKipisz, Steven return; 59674cc8b09SKipisz, Steven 59774cc8b09SKipisz, Steven gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en"); 59874cc8b09SKipisz, Steven gpio_direction_output(GPIO_DDR_VTT_EN, 1); 59974cc8b09SKipisz, Steven } 60074cc8b09SKipisz, Steven 60174cc8b09SKipisz, Steven int board_early_init_f(void) 60274cc8b09SKipisz, Steven { 60374cc8b09SKipisz, Steven vtt_regulator_enable(); 60474cc8b09SKipisz, Steven return 0; 60574cc8b09SKipisz, Steven } 60674cc8b09SKipisz, Steven #endif 607