1 /* 2 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com 3 * 4 * Author: Felipe Balbi <balbi@ti.com> 5 * 6 * Based on board/ti/dra7xx/evm.c 7 * 8 * SPDX-License-Identifier: GPL-2.0+ 9 */ 10 11 #include <common.h> 12 #include <palmas.h> 13 #include <sata.h> 14 #include <usb.h> 15 #include <asm/omap_common.h> 16 #include <asm/omap_sec_common.h> 17 #include <asm/emif.h> 18 #include <asm/gpio.h> 19 #include <asm/arch/gpio.h> 20 #include <asm/arch/clock.h> 21 #include <asm/arch/dra7xx_iodelay.h> 22 #include <asm/arch/sys_proto.h> 23 #include <asm/arch/mmc_host_def.h> 24 #include <asm/arch/sata.h> 25 #include <asm/arch/gpio.h> 26 #include <asm/arch/omap.h> 27 #include <environment.h> 28 #include <usb.h> 29 #include <linux/usb/gadget.h> 30 #include <dwc3-uboot.h> 31 #include <dwc3-omap-uboot.h> 32 #include <ti-usb-phy-uboot.h> 33 34 #include "../common/board_detect.h" 35 #include "mux_data.h" 36 37 #define board_is_x15() board_ti_is("BBRDX15_") 38 #define board_is_x15_revb1() (board_ti_is("BBRDX15_") && \ 39 (strncmp("B.10", board_ti_get_rev(), 3) <= 0)) 40 #define board_is_am572x_evm() board_ti_is("AM572PM_") 41 #define board_is_am572x_evm_reva3() \ 42 (board_ti_is("AM572PM_") && \ 43 (strncmp("A.30", board_ti_get_rev(), 3) <= 0)) 44 #define board_is_am572x_idk() board_ti_is("AM572IDK") 45 #define board_is_am571x_idk() board_ti_is("AM571IDK") 46 47 #ifdef CONFIG_DRIVER_TI_CPSW 48 #include <cpsw.h> 49 #endif 50 51 DECLARE_GLOBAL_DATA_PTR; 52 53 #define GPIO_ETH_LCD GPIO_TO_PIN(2, 22) 54 /* GPIO 7_11 */ 55 #define GPIO_DDR_VTT_EN 203 56 57 /* Touch screen controller to identify the LCD */ 58 #define OSD_TS_FT_BUS_ADDRESS 0 59 #define OSD_TS_FT_CHIP_ADDRESS 0x38 60 #define OSD_TS_FT_REG_ID 0xA3 61 /* 62 * Touchscreen IDs for various OSD panels 63 * Ref: http://www.osddisplays.com/TI/OSD101T2587-53TS_A.1.pdf 64 */ 65 /* Used on newer osd101t2587 Panels */ 66 #define OSD_TS_FT_ID_5x46 0x54 67 /* Used on older osd101t2045 Panels */ 68 #define OSD_TS_FT_ID_5606 0x08 69 70 #define SYSINFO_BOARD_NAME_MAX_LEN 45 71 72 #define TPS65903X_PRIMARY_SECONDARY_PAD2 0xFB 73 #define TPS65903X_PAD2_POWERHOLD_MASK 0x20 74 75 const struct omap_sysinfo sysinfo = { 76 "Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n" 77 }; 78 79 static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = { 80 .dmm_lisa_map_3 = 0x80740300, 81 .is_ma_present = 0x1 82 }; 83 84 static const struct dmm_lisa_map_regs am571x_idk_lisa_regs = { 85 .dmm_lisa_map_3 = 0x80640100, 86 .is_ma_present = 0x1 87 }; 88 89 void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs) 90 { 91 if (board_is_am571x_idk()) 92 *dmm_lisa_regs = &am571x_idk_lisa_regs; 93 else 94 *dmm_lisa_regs = &beagle_x15_lisa_regs; 95 } 96 97 static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = { 98 .sdram_config_init = 0x61851b32, 99 .sdram_config = 0x61851b32, 100 .sdram_config2 = 0x08000000, 101 .ref_ctrl = 0x000040F1, 102 .ref_ctrl_final = 0x00001035, 103 .sdram_tim1 = 0xcccf36ab, 104 .sdram_tim2 = 0x308f7fda, 105 .sdram_tim3 = 0x409f88a8, 106 .read_idle_ctrl = 0x00050000, 107 .zq_config = 0x5007190b, 108 .temp_alert_config = 0x00000000, 109 .emif_ddr_phy_ctlr_1_init = 0x0024400b, 110 .emif_ddr_phy_ctlr_1 = 0x0e24400b, 111 .emif_ddr_ext_phy_ctrl_1 = 0x10040100, 112 .emif_ddr_ext_phy_ctrl_2 = 0x00910091, 113 .emif_ddr_ext_phy_ctrl_3 = 0x00950095, 114 .emif_ddr_ext_phy_ctrl_4 = 0x009b009b, 115 .emif_ddr_ext_phy_ctrl_5 = 0x009e009e, 116 .emif_rd_wr_lvl_rmp_win = 0x00000000, 117 .emif_rd_wr_lvl_rmp_ctl = 0x80000000, 118 .emif_rd_wr_lvl_ctl = 0x00000000, 119 .emif_rd_wr_exec_thresh = 0x00000305 120 }; 121 122 /* Ext phy ctrl regs 1-35 */ 123 static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = { 124 0x10040100, 125 0x00910091, 126 0x00950095, 127 0x009B009B, 128 0x009E009E, 129 0x00980098, 130 0x00340034, 131 0x00350035, 132 0x00340034, 133 0x00310031, 134 0x00340034, 135 0x007F007F, 136 0x007F007F, 137 0x007F007F, 138 0x007F007F, 139 0x007F007F, 140 0x00480048, 141 0x004A004A, 142 0x00520052, 143 0x00550055, 144 0x00500050, 145 0x00000000, 146 0x00600020, 147 0x40011080, 148 0x08102040, 149 0x0, 150 0x0, 151 0x0, 152 0x0, 153 0x0, 154 0x0, 155 0x0, 156 0x0, 157 0x0, 158 0x0 159 }; 160 161 static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = { 162 .sdram_config_init = 0x61851b32, 163 .sdram_config = 0x61851b32, 164 .sdram_config2 = 0x08000000, 165 .ref_ctrl = 0x000040F1, 166 .ref_ctrl_final = 0x00001035, 167 .sdram_tim1 = 0xcccf36b3, 168 .sdram_tim2 = 0x308f7fda, 169 .sdram_tim3 = 0x407f88a8, 170 .read_idle_ctrl = 0x00050000, 171 .zq_config = 0x5007190b, 172 .temp_alert_config = 0x00000000, 173 .emif_ddr_phy_ctlr_1_init = 0x0024400b, 174 .emif_ddr_phy_ctlr_1 = 0x0e24400b, 175 .emif_ddr_ext_phy_ctrl_1 = 0x10040100, 176 .emif_ddr_ext_phy_ctrl_2 = 0x00910091, 177 .emif_ddr_ext_phy_ctrl_3 = 0x00950095, 178 .emif_ddr_ext_phy_ctrl_4 = 0x009b009b, 179 .emif_ddr_ext_phy_ctrl_5 = 0x009e009e, 180 .emif_rd_wr_lvl_rmp_win = 0x00000000, 181 .emif_rd_wr_lvl_rmp_ctl = 0x80000000, 182 .emif_rd_wr_lvl_ctl = 0x00000000, 183 .emif_rd_wr_exec_thresh = 0x00000305 184 }; 185 186 static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = { 187 0x10040100, 188 0x00910091, 189 0x00950095, 190 0x009B009B, 191 0x009E009E, 192 0x00980098, 193 0x00340034, 194 0x00350035, 195 0x00340034, 196 0x00310031, 197 0x00340034, 198 0x007F007F, 199 0x007F007F, 200 0x007F007F, 201 0x007F007F, 202 0x007F007F, 203 0x00480048, 204 0x004A004A, 205 0x00520052, 206 0x00550055, 207 0x00500050, 208 0x00000000, 209 0x00600020, 210 0x40011080, 211 0x08102040, 212 0x0, 213 0x0, 214 0x0, 215 0x0, 216 0x0, 217 0x0, 218 0x0, 219 0x0, 220 0x0, 221 0x0 222 }; 223 224 void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs) 225 { 226 switch (emif_nr) { 227 case 1: 228 *regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs; 229 break; 230 case 2: 231 *regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs; 232 break; 233 } 234 } 235 236 void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size) 237 { 238 switch (emif_nr) { 239 case 1: 240 *regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs; 241 *size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs); 242 break; 243 case 2: 244 *regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs; 245 *size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs); 246 break; 247 } 248 } 249 250 struct vcores_data beagle_x15_volts = { 251 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM, 252 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM, 253 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS, 254 .mpu.addr = TPS659038_REG_ADDR_SMPS12, 255 .mpu.pmic = &tps659038, 256 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK, 257 258 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM, 259 .eve.value[OPP_OD] = VDD_EVE_DRA7_OD, 260 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH, 261 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM, 262 .eve.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_DSPEVE_OD, 263 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH, 264 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS, 265 .eve.addr = TPS659038_REG_ADDR_SMPS45, 266 .eve.pmic = &tps659038, 267 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK, 268 269 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM, 270 .gpu.value[OPP_OD] = VDD_GPU_DRA7_OD, 271 .gpu.value[OPP_HIGH] = VDD_GPU_DRA7_HIGH, 272 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM, 273 .gpu.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_GPU_OD, 274 .gpu.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_GPU_HIGH, 275 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS, 276 .gpu.addr = TPS659038_REG_ADDR_SMPS45, 277 .gpu.pmic = &tps659038, 278 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK, 279 280 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM, 281 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM, 282 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS, 283 .core.addr = TPS659038_REG_ADDR_SMPS6, 284 .core.pmic = &tps659038, 285 286 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM, 287 .iva.value[OPP_OD] = VDD_IVA_DRA7_OD, 288 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH, 289 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM, 290 .iva.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_IVA_OD, 291 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH, 292 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS, 293 .iva.addr = TPS659038_REG_ADDR_SMPS45, 294 .iva.pmic = &tps659038, 295 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK, 296 }; 297 298 struct vcores_data am572x_idk_volts = { 299 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM, 300 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM, 301 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS, 302 .mpu.addr = TPS659038_REG_ADDR_SMPS12, 303 .mpu.pmic = &tps659038, 304 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK, 305 306 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM, 307 .eve.value[OPP_OD] = VDD_EVE_DRA7_OD, 308 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH, 309 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM, 310 .eve.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_DSPEVE_OD, 311 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH, 312 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS, 313 .eve.addr = TPS659038_REG_ADDR_SMPS45, 314 .eve.pmic = &tps659038, 315 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK, 316 317 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM, 318 .gpu.value[OPP_OD] = VDD_GPU_DRA7_OD, 319 .gpu.value[OPP_HIGH] = VDD_GPU_DRA7_HIGH, 320 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM, 321 .gpu.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_GPU_OD, 322 .gpu.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_GPU_HIGH, 323 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS, 324 .gpu.addr = TPS659038_REG_ADDR_SMPS6, 325 .gpu.pmic = &tps659038, 326 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK, 327 328 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM, 329 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM, 330 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS, 331 .core.addr = TPS659038_REG_ADDR_SMPS7, 332 .core.pmic = &tps659038, 333 334 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM, 335 .iva.value[OPP_OD] = VDD_IVA_DRA7_OD, 336 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH, 337 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM, 338 .iva.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_IVA_OD, 339 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH, 340 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS, 341 .iva.addr = TPS659038_REG_ADDR_SMPS8, 342 .iva.pmic = &tps659038, 343 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK, 344 }; 345 346 struct vcores_data am571x_idk_volts = { 347 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM, 348 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM, 349 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS, 350 .mpu.addr = TPS659038_REG_ADDR_SMPS12, 351 .mpu.pmic = &tps659038, 352 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK, 353 354 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM, 355 .eve.value[OPP_OD] = VDD_EVE_DRA7_OD, 356 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH, 357 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM, 358 .eve.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_DSPEVE_OD, 359 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH, 360 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS, 361 .eve.addr = TPS659038_REG_ADDR_SMPS45, 362 .eve.pmic = &tps659038, 363 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK, 364 365 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM, 366 .gpu.value[OPP_OD] = VDD_GPU_DRA7_OD, 367 .gpu.value[OPP_HIGH] = VDD_GPU_DRA7_HIGH, 368 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM, 369 .gpu.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_GPU_OD, 370 .gpu.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_GPU_HIGH, 371 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS, 372 .gpu.addr = TPS659038_REG_ADDR_SMPS6, 373 .gpu.pmic = &tps659038, 374 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK, 375 376 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM, 377 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM, 378 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS, 379 .core.addr = TPS659038_REG_ADDR_SMPS7, 380 .core.pmic = &tps659038, 381 382 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM, 383 .iva.value[OPP_OD] = VDD_IVA_DRA7_OD, 384 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH, 385 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM, 386 .iva.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_IVA_OD, 387 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH, 388 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS, 389 .iva.addr = TPS659038_REG_ADDR_SMPS45, 390 .iva.pmic = &tps659038, 391 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK, 392 }; 393 394 int get_voltrail_opp(int rail_offset) 395 { 396 int opp; 397 398 switch (rail_offset) { 399 case VOLT_MPU: 400 opp = DRA7_MPU_OPP; 401 break; 402 case VOLT_CORE: 403 opp = DRA7_CORE_OPP; 404 break; 405 case VOLT_GPU: 406 opp = DRA7_GPU_OPP; 407 break; 408 case VOLT_EVE: 409 opp = DRA7_DSPEVE_OPP; 410 break; 411 case VOLT_IVA: 412 opp = DRA7_IVA_OPP; 413 break; 414 default: 415 opp = OPP_NOM; 416 } 417 418 return opp; 419 } 420 421 422 #ifdef CONFIG_SPL_BUILD 423 /* No env to setup for SPL */ 424 static inline void setup_board_eeprom_env(void) { } 425 426 /* Override function to read eeprom information */ 427 void do_board_detect(void) 428 { 429 int rc; 430 431 rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS, 432 CONFIG_EEPROM_CHIP_ADDRESS); 433 if (rc) 434 printf("ti_i2c_eeprom_init failed %d\n", rc); 435 } 436 437 #else /* CONFIG_SPL_BUILD */ 438 439 /* Override function to read eeprom information: actual i2c read done by SPL*/ 440 void do_board_detect(void) 441 { 442 char *bname = NULL; 443 int rc; 444 445 rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS, 446 CONFIG_EEPROM_CHIP_ADDRESS); 447 if (rc) 448 printf("ti_i2c_eeprom_init failed %d\n", rc); 449 450 if (board_is_x15()) 451 bname = "BeagleBoard X15"; 452 else if (board_is_am572x_evm()) 453 bname = "AM572x EVM"; 454 else if (board_is_am572x_idk()) 455 bname = "AM572x IDK"; 456 else if (board_is_am571x_idk()) 457 bname = "AM571x IDK"; 458 459 if (bname) 460 snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN, 461 "Board: %s REV %s\n", bname, board_ti_get_rev()); 462 } 463 464 static void setup_board_eeprom_env(void) 465 { 466 char *name = "beagle_x15"; 467 int rc; 468 469 rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS, 470 CONFIG_EEPROM_CHIP_ADDRESS); 471 if (rc) 472 goto invalid_eeprom; 473 474 if (board_is_x15()) { 475 if (board_is_x15_revb1()) 476 name = "beagle_x15_revb1"; 477 else 478 name = "beagle_x15"; 479 } else if (board_is_am572x_evm()) { 480 if (board_is_am572x_evm_reva3()) 481 name = "am57xx_evm_reva3"; 482 else 483 name = "am57xx_evm"; 484 } else if (board_is_am572x_idk()) { 485 name = "am572x_idk"; 486 } else if (board_is_am571x_idk()) { 487 name = "am571x_idk"; 488 } else { 489 printf("Unidentified board claims %s in eeprom header\n", 490 board_ti_get_name()); 491 } 492 493 invalid_eeprom: 494 set_board_info_env(name); 495 } 496 497 #endif /* CONFIG_SPL_BUILD */ 498 499 void vcores_init(void) 500 { 501 if (board_is_am572x_idk()) 502 *omap_vcores = &am572x_idk_volts; 503 else if (board_is_am571x_idk()) 504 *omap_vcores = &am571x_idk_volts; 505 else 506 *omap_vcores = &beagle_x15_volts; 507 } 508 509 void hw_data_init(void) 510 { 511 *prcm = &dra7xx_prcm; 512 *dplls_data = &dra7xx_dplls; 513 *ctrl = &dra7xx_ctrl; 514 } 515 516 bool am571x_idk_needs_lcd(void) 517 { 518 bool needs_lcd; 519 520 gpio_request(GPIO_ETH_LCD, "nLCD_Detect"); 521 if (gpio_get_value(GPIO_ETH_LCD)) 522 needs_lcd = false; 523 else 524 needs_lcd = true; 525 526 gpio_free(GPIO_ETH_LCD); 527 528 return needs_lcd; 529 } 530 531 int board_init(void) 532 { 533 gpmc_init(); 534 gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100); 535 536 return 0; 537 } 538 539 void am57x_idk_lcd_detect(void) 540 { 541 int r = -ENODEV; 542 char *idk_lcd = "no"; 543 uint8_t buf = 0; 544 545 /* Only valid for IDKs */ 546 if (board_is_x15() || board_is_am572x_evm()) 547 return; 548 549 /* Only AM571x IDK has gpio control detect.. so check that */ 550 if (board_is_am571x_idk() && !am571x_idk_needs_lcd()) 551 goto out; 552 553 r = i2c_set_bus_num(OSD_TS_FT_BUS_ADDRESS); 554 if (r) { 555 printf("%s: Failed to set bus address to %d: %d\n", 556 __func__, OSD_TS_FT_BUS_ADDRESS, r); 557 goto out; 558 } 559 r = i2c_probe(OSD_TS_FT_CHIP_ADDRESS); 560 if (r) { 561 /* AM572x IDK has no explicit settings for optional LCD kit */ 562 if (board_is_am571x_idk()) { 563 printf("%s: Touch screen detect failed: %d!\n", 564 __func__, r); 565 } 566 goto out; 567 } 568 569 /* Read FT ID */ 570 r = i2c_read(OSD_TS_FT_CHIP_ADDRESS, OSD_TS_FT_REG_ID, 1, &buf, 1); 571 if (r) { 572 printf("%s: Touch screen ID read %d:0x%02x[0x%02x] failed:%d\n", 573 __func__, OSD_TS_FT_BUS_ADDRESS, OSD_TS_FT_CHIP_ADDRESS, 574 OSD_TS_FT_REG_ID, r); 575 goto out; 576 } 577 578 switch (buf) { 579 case OSD_TS_FT_ID_5606: 580 idk_lcd = "osd101t2045"; 581 break; 582 case OSD_TS_FT_ID_5x46: 583 idk_lcd = "osd101t2587"; 584 break; 585 default: 586 printf("%s: Unidentifed Touch screen ID 0x%02x\n", 587 __func__, buf); 588 /* we will let default be "no lcd" */ 589 } 590 out: 591 setenv("idk_lcd", idk_lcd); 592 return; 593 } 594 595 int board_late_init(void) 596 { 597 setup_board_eeprom_env(); 598 u8 val; 599 600 /* 601 * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds 602 * This is the POWERHOLD-in-Low behavior. 603 */ 604 palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1); 605 606 /* 607 * Default FIT boot on HS devices. Non FIT images are not allowed 608 * on HS devices. 609 */ 610 if (get_device_type() == HS_DEVICE) 611 setenv("boot_fit", "1"); 612 613 /* 614 * Set the GPIO7 Pad to POWERHOLD. This has higher priority 615 * over DEV_CTRL.DEV_ON bit. This can be reset in case of 616 * PMIC Power off. So to be on the safer side set it back 617 * to POWERHOLD mode irrespective of the current state. 618 */ 619 palmas_i2c_read_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2, 620 &val); 621 val = val | TPS65903X_PAD2_POWERHOLD_MASK; 622 palmas_i2c_write_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2, 623 val); 624 625 omap_die_id_serial(); 626 627 am57x_idk_lcd_detect(); 628 629 #if !defined(CONFIG_SPL_BUILD) 630 board_ti_set_ethaddr(2); 631 #endif 632 633 return 0; 634 } 635 636 void set_muxconf_regs(void) 637 { 638 do_set_mux32((*ctrl)->control_padconf_core_base, 639 early_padconf, ARRAY_SIZE(early_padconf)); 640 } 641 642 #ifdef CONFIG_IODELAY_RECALIBRATION 643 void recalibrate_iodelay(void) 644 { 645 const struct pad_conf_entry *pconf; 646 const struct iodelay_cfg_entry *iod; 647 int pconf_sz, iod_sz; 648 int ret; 649 650 if (board_is_am572x_idk()) { 651 pconf = core_padconf_array_essential_am572x_idk; 652 pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am572x_idk); 653 iod = iodelay_cfg_array_am572x_idk; 654 iod_sz = ARRAY_SIZE(iodelay_cfg_array_am572x_idk); 655 } else if (board_is_am571x_idk()) { 656 pconf = core_padconf_array_essential_am571x_idk; 657 pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am571x_idk); 658 iod = iodelay_cfg_array_am571x_idk; 659 iod_sz = ARRAY_SIZE(iodelay_cfg_array_am571x_idk); 660 } else { 661 /* Common for X15/GPEVM */ 662 pconf = core_padconf_array_essential_x15; 663 pconf_sz = ARRAY_SIZE(core_padconf_array_essential_x15); 664 /* There never was an SR1.0 X15.. So.. */ 665 if (omap_revision() == DRA752_ES1_1) { 666 iod = iodelay_cfg_array_x15_sr1_1; 667 iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr1_1); 668 } else { 669 /* Since full production should switch to SR2.0 */ 670 iod = iodelay_cfg_array_x15_sr2_0; 671 iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr2_0); 672 } 673 } 674 675 /* Setup I/O isolation */ 676 ret = __recalibrate_iodelay_start(); 677 if (ret) 678 goto err; 679 680 /* Do the muxing here */ 681 do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz); 682 683 /* Now do the weird minor deltas that should be safe */ 684 if (board_is_x15() || board_is_am572x_evm()) { 685 if (board_is_x15_revb1() || board_is_am572x_evm_reva3()) { 686 pconf = core_padconf_array_delta_x15_sr2_0; 687 pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr2_0); 688 } else { 689 pconf = core_padconf_array_delta_x15_sr1_1; 690 pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr1_1); 691 } 692 do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz); 693 } 694 695 if (board_is_am571x_idk()) { 696 if (am571x_idk_needs_lcd()) { 697 pconf = core_padconf_array_vout_am571x_idk; 698 pconf_sz = ARRAY_SIZE(core_padconf_array_vout_am571x_idk); 699 } else { 700 pconf = core_padconf_array_icss1eth_am571x_idk; 701 pconf_sz = ARRAY_SIZE(core_padconf_array_icss1eth_am571x_idk); 702 } 703 do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz); 704 } 705 706 /* Setup IOdelay configuration */ 707 ret = do_set_iodelay((*ctrl)->iodelay_config_base, iod, iod_sz); 708 err: 709 /* Closeup.. remove isolation */ 710 __recalibrate_iodelay_end(ret); 711 } 712 #endif 713 714 #if defined(CONFIG_MMC) 715 int board_mmc_init(bd_t *bis) 716 { 717 omap_mmc_init(0, 0, 0, -1, -1); 718 omap_mmc_init(1, 0, 0, -1, -1); 719 return 0; 720 } 721 #endif 722 723 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT) 724 int spl_start_uboot(void) 725 { 726 /* break into full u-boot on 'c' */ 727 if (serial_tstc() && serial_getc() == 'c') 728 return 1; 729 730 #ifdef CONFIG_SPL_ENV_SUPPORT 731 env_init(); 732 env_relocate_spec(); 733 if (getenv_yesno("boot_os") != 1) 734 return 1; 735 #endif 736 737 return 0; 738 } 739 #endif 740 741 #ifdef CONFIG_USB_DWC3 742 static struct dwc3_device usb_otg_ss2 = { 743 .maximum_speed = USB_SPEED_HIGH, 744 .base = DRA7_USB_OTG_SS2_BASE, 745 .tx_fifo_resize = false, 746 .index = 1, 747 }; 748 749 static struct dwc3_omap_device usb_otg_ss2_glue = { 750 .base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE, 751 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW, 752 .index = 1, 753 }; 754 755 static struct ti_usb_phy_device usb_phy2_device = { 756 .usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER, 757 .index = 1, 758 }; 759 760 int usb_gadget_handle_interrupts(int index) 761 { 762 u32 status; 763 764 status = dwc3_omap_uboot_interrupt_status(index); 765 if (status) 766 dwc3_uboot_handle_interrupt(index); 767 768 return 0; 769 } 770 #endif /* CONFIG_USB_DWC3 */ 771 772 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) 773 int omap_xhci_board_usb_init(int index, enum usb_init_type init) 774 { 775 enable_usb_clocks(index); 776 switch (index) { 777 case 0: 778 if (init == USB_INIT_DEVICE) { 779 printf("port %d can't be used as device\n", index); 780 disable_usb_clocks(index); 781 return -EINVAL; 782 } 783 break; 784 case 1: 785 if (init == USB_INIT_DEVICE) { 786 #ifdef CONFIG_USB_DWC3 787 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL; 788 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID; 789 ti_usb_phy_uboot_init(&usb_phy2_device); 790 dwc3_omap_uboot_init(&usb_otg_ss2_glue); 791 dwc3_uboot_init(&usb_otg_ss2); 792 #endif 793 } else { 794 printf("port %d can't be used as host\n", index); 795 disable_usb_clocks(index); 796 return -EINVAL; 797 } 798 799 break; 800 default: 801 printf("Invalid Controller Index\n"); 802 } 803 804 return 0; 805 } 806 807 int omap_xhci_board_usb_cleanup(int index, enum usb_init_type init) 808 { 809 #ifdef CONFIG_USB_DWC3 810 switch (index) { 811 case 0: 812 case 1: 813 if (init == USB_INIT_DEVICE) { 814 ti_usb_phy_uboot_exit(index); 815 dwc3_uboot_exit(index); 816 dwc3_omap_uboot_exit(index); 817 } 818 break; 819 default: 820 printf("Invalid Controller Index\n"); 821 } 822 #endif 823 disable_usb_clocks(index); 824 return 0; 825 } 826 #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */ 827 828 #ifdef CONFIG_DRIVER_TI_CPSW 829 830 /* Delay value to add to calibrated value */ 831 #define RGMII0_TXCTL_DLY_VAL ((0x3 << 5) + 0x8) 832 #define RGMII0_TXD0_DLY_VAL ((0x3 << 5) + 0x8) 833 #define RGMII0_TXD1_DLY_VAL ((0x3 << 5) + 0x2) 834 #define RGMII0_TXD2_DLY_VAL ((0x4 << 5) + 0x0) 835 #define RGMII0_TXD3_DLY_VAL ((0x4 << 5) + 0x0) 836 #define VIN2A_D13_DLY_VAL ((0x3 << 5) + 0x8) 837 #define VIN2A_D17_DLY_VAL ((0x3 << 5) + 0x8) 838 #define VIN2A_D16_DLY_VAL ((0x3 << 5) + 0x2) 839 #define VIN2A_D15_DLY_VAL ((0x4 << 5) + 0x0) 840 #define VIN2A_D14_DLY_VAL ((0x4 << 5) + 0x0) 841 842 static void cpsw_control(int enabled) 843 { 844 /* VTP can be added here */ 845 } 846 847 static struct cpsw_slave_data cpsw_slaves[] = { 848 { 849 .slave_reg_ofs = 0x208, 850 .sliver_reg_ofs = 0xd80, 851 .phy_addr = 1, 852 }, 853 { 854 .slave_reg_ofs = 0x308, 855 .sliver_reg_ofs = 0xdc0, 856 .phy_addr = 2, 857 }, 858 }; 859 860 static struct cpsw_platform_data cpsw_data = { 861 .mdio_base = CPSW_MDIO_BASE, 862 .cpsw_base = CPSW_BASE, 863 .mdio_div = 0xff, 864 .channels = 8, 865 .cpdma_reg_ofs = 0x800, 866 .slaves = 1, 867 .slave_data = cpsw_slaves, 868 .ale_reg_ofs = 0xd00, 869 .ale_entries = 1024, 870 .host_port_reg_ofs = 0x108, 871 .hw_stats_reg_ofs = 0x900, 872 .bd_ram_ofs = 0x2000, 873 .mac_control = (1 << 5), 874 .control = cpsw_control, 875 .host_port_num = 0, 876 .version = CPSW_CTRL_VERSION_2, 877 }; 878 879 static u64 mac_to_u64(u8 mac[6]) 880 { 881 int i; 882 u64 addr = 0; 883 884 for (i = 0; i < 6; i++) { 885 addr <<= 8; 886 addr |= mac[i]; 887 } 888 889 return addr; 890 } 891 892 static void u64_to_mac(u64 addr, u8 mac[6]) 893 { 894 mac[5] = addr; 895 mac[4] = addr >> 8; 896 mac[3] = addr >> 16; 897 mac[2] = addr >> 24; 898 mac[1] = addr >> 32; 899 mac[0] = addr >> 40; 900 } 901 902 int board_eth_init(bd_t *bis) 903 { 904 int ret; 905 uint8_t mac_addr[6]; 906 uint32_t mac_hi, mac_lo; 907 uint32_t ctrl_val; 908 int i; 909 u64 mac1, mac2; 910 u8 mac_addr1[6], mac_addr2[6]; 911 int num_macs; 912 913 /* try reading mac address from efuse */ 914 mac_lo = readl((*ctrl)->control_core_mac_id_0_lo); 915 mac_hi = readl((*ctrl)->control_core_mac_id_0_hi); 916 mac_addr[0] = (mac_hi & 0xFF0000) >> 16; 917 mac_addr[1] = (mac_hi & 0xFF00) >> 8; 918 mac_addr[2] = mac_hi & 0xFF; 919 mac_addr[3] = (mac_lo & 0xFF0000) >> 16; 920 mac_addr[4] = (mac_lo & 0xFF00) >> 8; 921 mac_addr[5] = mac_lo & 0xFF; 922 923 if (!getenv("ethaddr")) { 924 printf("<ethaddr> not set. Validating first E-fuse MAC\n"); 925 926 if (is_valid_ethaddr(mac_addr)) 927 eth_setenv_enetaddr("ethaddr", mac_addr); 928 } 929 930 mac_lo = readl((*ctrl)->control_core_mac_id_1_lo); 931 mac_hi = readl((*ctrl)->control_core_mac_id_1_hi); 932 mac_addr[0] = (mac_hi & 0xFF0000) >> 16; 933 mac_addr[1] = (mac_hi & 0xFF00) >> 8; 934 mac_addr[2] = mac_hi & 0xFF; 935 mac_addr[3] = (mac_lo & 0xFF0000) >> 16; 936 mac_addr[4] = (mac_lo & 0xFF00) >> 8; 937 mac_addr[5] = mac_lo & 0xFF; 938 939 if (!getenv("eth1addr")) { 940 if (is_valid_ethaddr(mac_addr)) 941 eth_setenv_enetaddr("eth1addr", mac_addr); 942 } 943 944 ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33); 945 ctrl_val |= 0x22; 946 writel(ctrl_val, (*ctrl)->control_core_control_io1); 947 948 /* The phy address for the AM57xx IDK are different than x15 */ 949 if (board_is_am572x_idk() || board_is_am571x_idk()) { 950 cpsw_data.slave_data[0].phy_addr = 0; 951 cpsw_data.slave_data[1].phy_addr = 1; 952 } 953 954 ret = cpsw_register(&cpsw_data); 955 if (ret < 0) 956 printf("Error %d registering CPSW switch\n", ret); 957 958 /* 959 * Export any Ethernet MAC addresses from EEPROM. 960 * On AM57xx the 2 MAC addresses define the address range 961 */ 962 board_ti_get_eth_mac_addr(0, mac_addr1); 963 board_ti_get_eth_mac_addr(1, mac_addr2); 964 965 if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) { 966 mac1 = mac_to_u64(mac_addr1); 967 mac2 = mac_to_u64(mac_addr2); 968 969 /* must contain an address range */ 970 num_macs = mac2 - mac1 + 1; 971 /* <= 50 to protect against user programming error */ 972 if (num_macs > 0 && num_macs <= 50) { 973 for (i = 0; i < num_macs; i++) { 974 u64_to_mac(mac1 + i, mac_addr); 975 if (is_valid_ethaddr(mac_addr)) { 976 eth_setenv_enetaddr_by_index("eth", 977 i + 2, 978 mac_addr); 979 } 980 } 981 } 982 } 983 984 return ret; 985 } 986 #endif 987 988 #ifdef CONFIG_BOARD_EARLY_INIT_F 989 /* VTT regulator enable */ 990 static inline void vtt_regulator_enable(void) 991 { 992 if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL) 993 return; 994 995 gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en"); 996 gpio_direction_output(GPIO_DDR_VTT_EN, 1); 997 } 998 999 int board_early_init_f(void) 1000 { 1001 vtt_regulator_enable(); 1002 return 0; 1003 } 1004 #endif 1005 1006 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) 1007 int ft_board_setup(void *blob, bd_t *bd) 1008 { 1009 ft_cpu_setup(blob, bd); 1010 1011 return 0; 1012 } 1013 #endif 1014 1015 #ifdef CONFIG_SPL_LOAD_FIT 1016 int board_fit_config_name_match(const char *name) 1017 { 1018 if (board_is_x15()) { 1019 if (board_is_x15_revb1()) { 1020 if (!strcmp(name, "am57xx-beagle-x15-revb1")) 1021 return 0; 1022 } else if (!strcmp(name, "am57xx-beagle-x15")) { 1023 return 0; 1024 } 1025 } else if (board_is_am572x_evm() && 1026 !strcmp(name, "am57xx-beagle-x15")) { 1027 return 0; 1028 } else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk")) { 1029 return 0; 1030 } else if (board_is_am571x_idk() && !strcmp(name, "am571x-idk")) { 1031 return 0; 1032 } 1033 1034 return -1; 1035 } 1036 #endif 1037 1038 #ifdef CONFIG_TI_SECURE_DEVICE 1039 void board_fit_image_post_process(void **p_image, size_t *p_size) 1040 { 1041 secure_boot_verify_image(p_image, p_size); 1042 } 1043 1044 void board_tee_image_process(ulong tee_image, size_t tee_size) 1045 { 1046 secure_tee_install((u32)tee_image); 1047 } 1048 1049 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process); 1050 #endif 1051