1*6ce89324SYegor Yefremov /* 2*6ce89324SYegor Yefremov * board.c 3*6ce89324SYegor Yefremov * 4*6ce89324SYegor Yefremov * Board functions for TI AM335X based boards 5*6ce89324SYegor Yefremov * 6*6ce89324SYegor Yefremov * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ 7*6ce89324SYegor Yefremov * 8*6ce89324SYegor Yefremov * SPDX-License-Identifier: GPL-2.0+ 9*6ce89324SYegor Yefremov */ 10*6ce89324SYegor Yefremov 11*6ce89324SYegor Yefremov #include <common.h> 12*6ce89324SYegor Yefremov #include <errno.h> 13*6ce89324SYegor Yefremov #include <spl.h> 14*6ce89324SYegor Yefremov #include <asm/arch/cpu.h> 15*6ce89324SYegor Yefremov #include <asm/arch/hardware.h> 16*6ce89324SYegor Yefremov #include <asm/arch/omap.h> 17*6ce89324SYegor Yefremov #include <asm/arch/ddr_defs.h> 18*6ce89324SYegor Yefremov #include <asm/arch/clock.h> 19*6ce89324SYegor Yefremov #include <asm/arch/gpio.h> 20*6ce89324SYegor Yefremov #include <asm/arch/mmc_host_def.h> 21*6ce89324SYegor Yefremov #include <asm/arch/sys_proto.h> 22*6ce89324SYegor Yefremov #include <asm/arch/mem.h> 23*6ce89324SYegor Yefremov #include <asm/arch/mux.h> 24*6ce89324SYegor Yefremov #include <asm/io.h> 25*6ce89324SYegor Yefremov #include <asm/emif.h> 26*6ce89324SYegor Yefremov #include <asm/gpio.h> 27*6ce89324SYegor Yefremov #include <i2c.h> 28*6ce89324SYegor Yefremov #include <miiphy.h> 29*6ce89324SYegor Yefremov #include <cpsw.h> 30*6ce89324SYegor Yefremov #include <power/tps65217.h> 31*6ce89324SYegor Yefremov #include <power/tps65910.h> 32*6ce89324SYegor Yefremov #include <environment.h> 33*6ce89324SYegor Yefremov #include <watchdog.h> 34*6ce89324SYegor Yefremov #include "board.h" 35*6ce89324SYegor Yefremov 36*6ce89324SYegor Yefremov DECLARE_GLOBAL_DATA_PTR; 37*6ce89324SYegor Yefremov 38*6ce89324SYegor Yefremov /* GPIO that controls power to DDR on EVM-SK */ 39*6ce89324SYegor Yefremov #define GPIO_DDR_VTT_EN 7 40*6ce89324SYegor Yefremov #define DIP_S1 44 41*6ce89324SYegor Yefremov 42*6ce89324SYegor Yefremov static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; 43*6ce89324SYegor Yefremov 44*6ce89324SYegor Yefremov static int baltos_set_console(void) 45*6ce89324SYegor Yefremov { 46*6ce89324SYegor Yefremov int val, i, dips = 0; 47*6ce89324SYegor Yefremov char buf[7]; 48*6ce89324SYegor Yefremov 49*6ce89324SYegor Yefremov for (i = 0; i < 4; i++) { 50*6ce89324SYegor Yefremov sprintf(buf, "dip_s%d", i + 1); 51*6ce89324SYegor Yefremov 52*6ce89324SYegor Yefremov if (gpio_request(DIP_S1 + i, buf)) { 53*6ce89324SYegor Yefremov printf("failed to export GPIO %d\n", DIP_S1 + i); 54*6ce89324SYegor Yefremov return 0; 55*6ce89324SYegor Yefremov } 56*6ce89324SYegor Yefremov 57*6ce89324SYegor Yefremov if (gpio_direction_input(DIP_S1 + i)) { 58*6ce89324SYegor Yefremov printf("failed to set GPIO %d direction\n", DIP_S1 + i); 59*6ce89324SYegor Yefremov return 0; 60*6ce89324SYegor Yefremov } 61*6ce89324SYegor Yefremov 62*6ce89324SYegor Yefremov val = gpio_get_value(DIP_S1 + i); 63*6ce89324SYegor Yefremov dips |= val << i; 64*6ce89324SYegor Yefremov } 65*6ce89324SYegor Yefremov 66*6ce89324SYegor Yefremov printf("DIPs: 0x%1x\n", (~dips) & 0xf); 67*6ce89324SYegor Yefremov 68*6ce89324SYegor Yefremov if ((dips & 0xf) == 0xe) 69*6ce89324SYegor Yefremov setenv("console", "ttyUSB0,115200n8"); 70*6ce89324SYegor Yefremov 71*6ce89324SYegor Yefremov return 0; 72*6ce89324SYegor Yefremov } 73*6ce89324SYegor Yefremov 74*6ce89324SYegor Yefremov static int read_eeprom(BSP_VS_HWPARAM *header) 75*6ce89324SYegor Yefremov { 76*6ce89324SYegor Yefremov i2c_set_bus_num(1); 77*6ce89324SYegor Yefremov 78*6ce89324SYegor Yefremov /* Check if baseboard eeprom is available */ 79*6ce89324SYegor Yefremov if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) { 80*6ce89324SYegor Yefremov puts("Could not probe the EEPROM; something fundamentally " 81*6ce89324SYegor Yefremov "wrong on the I2C bus.\n"); 82*6ce89324SYegor Yefremov return -ENODEV; 83*6ce89324SYegor Yefremov } 84*6ce89324SYegor Yefremov 85*6ce89324SYegor Yefremov /* read the eeprom using i2c */ 86*6ce89324SYegor Yefremov if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header, 87*6ce89324SYegor Yefremov sizeof(BSP_VS_HWPARAM))) { 88*6ce89324SYegor Yefremov puts("Could not read the EEPROM; something fundamentally" 89*6ce89324SYegor Yefremov " wrong on the I2C bus.\n"); 90*6ce89324SYegor Yefremov return -EIO; 91*6ce89324SYegor Yefremov } 92*6ce89324SYegor Yefremov 93*6ce89324SYegor Yefremov if (header->Magic != 0xDEADBEEF) { 94*6ce89324SYegor Yefremov 95*6ce89324SYegor Yefremov printf("Incorrect magic number (0x%x) in EEPROM\n", 96*6ce89324SYegor Yefremov header->Magic); 97*6ce89324SYegor Yefremov 98*6ce89324SYegor Yefremov /* fill default values */ 99*6ce89324SYegor Yefremov header->SystemId = 211; 100*6ce89324SYegor Yefremov header->MAC1[0] = 0x00; 101*6ce89324SYegor Yefremov header->MAC1[1] = 0x00; 102*6ce89324SYegor Yefremov header->MAC1[2] = 0x00; 103*6ce89324SYegor Yefremov header->MAC1[3] = 0x00; 104*6ce89324SYegor Yefremov header->MAC1[4] = 0x00; 105*6ce89324SYegor Yefremov header->MAC1[5] = 0x01; 106*6ce89324SYegor Yefremov 107*6ce89324SYegor Yefremov header->MAC2[0] = 0x00; 108*6ce89324SYegor Yefremov header->MAC2[1] = 0x00; 109*6ce89324SYegor Yefremov header->MAC2[2] = 0x00; 110*6ce89324SYegor Yefremov header->MAC2[3] = 0x00; 111*6ce89324SYegor Yefremov header->MAC2[4] = 0x00; 112*6ce89324SYegor Yefremov header->MAC2[5] = 0x02; 113*6ce89324SYegor Yefremov 114*6ce89324SYegor Yefremov header->MAC3[0] = 0x00; 115*6ce89324SYegor Yefremov header->MAC3[1] = 0x00; 116*6ce89324SYegor Yefremov header->MAC3[2] = 0x00; 117*6ce89324SYegor Yefremov header->MAC3[3] = 0x00; 118*6ce89324SYegor Yefremov header->MAC3[4] = 0x00; 119*6ce89324SYegor Yefremov header->MAC3[5] = 0x03; 120*6ce89324SYegor Yefremov } 121*6ce89324SYegor Yefremov 122*6ce89324SYegor Yefremov return 0; 123*6ce89324SYegor Yefremov } 124*6ce89324SYegor Yefremov 125*6ce89324SYegor Yefremov #if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT) 126*6ce89324SYegor Yefremov 127*6ce89324SYegor Yefremov static const struct ddr_data ddr3_baltos_data = { 128*6ce89324SYegor Yefremov .datardsratio0 = MT41K256M16HA125E_RD_DQS, 129*6ce89324SYegor Yefremov .datawdsratio0 = MT41K256M16HA125E_WR_DQS, 130*6ce89324SYegor Yefremov .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE, 131*6ce89324SYegor Yefremov .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA, 132*6ce89324SYegor Yefremov }; 133*6ce89324SYegor Yefremov 134*6ce89324SYegor Yefremov static const struct cmd_control ddr3_baltos_cmd_ctrl_data = { 135*6ce89324SYegor Yefremov .cmd0csratio = MT41K256M16HA125E_RATIO, 136*6ce89324SYegor Yefremov .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 137*6ce89324SYegor Yefremov 138*6ce89324SYegor Yefremov .cmd1csratio = MT41K256M16HA125E_RATIO, 139*6ce89324SYegor Yefremov .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 140*6ce89324SYegor Yefremov 141*6ce89324SYegor Yefremov .cmd2csratio = MT41K256M16HA125E_RATIO, 142*6ce89324SYegor Yefremov .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 143*6ce89324SYegor Yefremov }; 144*6ce89324SYegor Yefremov 145*6ce89324SYegor Yefremov static struct emif_regs ddr3_baltos_emif_reg_data = { 146*6ce89324SYegor Yefremov .sdram_config = MT41K256M16HA125E_EMIF_SDCFG, 147*6ce89324SYegor Yefremov .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF, 148*6ce89324SYegor Yefremov .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1, 149*6ce89324SYegor Yefremov .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2, 150*6ce89324SYegor Yefremov .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3, 151*6ce89324SYegor Yefremov .zq_config = MT41K256M16HA125E_ZQ_CFG, 152*6ce89324SYegor Yefremov .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY, 153*6ce89324SYegor Yefremov }; 154*6ce89324SYegor Yefremov 155*6ce89324SYegor Yefremov #ifdef CONFIG_SPL_OS_BOOT 156*6ce89324SYegor Yefremov int spl_start_uboot(void) 157*6ce89324SYegor Yefremov { 158*6ce89324SYegor Yefremov /* break into full u-boot on 'c' */ 159*6ce89324SYegor Yefremov return (serial_tstc() && serial_getc() == 'c'); 160*6ce89324SYegor Yefremov } 161*6ce89324SYegor Yefremov #endif 162*6ce89324SYegor Yefremov 163*6ce89324SYegor Yefremov #define OSC (V_OSCK/1000000) 164*6ce89324SYegor Yefremov const struct dpll_params dpll_ddr = { 165*6ce89324SYegor Yefremov 266, OSC-1, 1, -1, -1, -1, -1}; 166*6ce89324SYegor Yefremov const struct dpll_params dpll_ddr_evm_sk = { 167*6ce89324SYegor Yefremov 303, OSC-1, 1, -1, -1, -1, -1}; 168*6ce89324SYegor Yefremov const struct dpll_params dpll_ddr_baltos = { 169*6ce89324SYegor Yefremov 400, OSC-1, 1, -1, -1, -1, -1}; 170*6ce89324SYegor Yefremov 171*6ce89324SYegor Yefremov void am33xx_spl_board_init(void) 172*6ce89324SYegor Yefremov { 173*6ce89324SYegor Yefremov int mpu_vdd; 174*6ce89324SYegor Yefremov int sil_rev; 175*6ce89324SYegor Yefremov 176*6ce89324SYegor Yefremov /* Get the frequency */ 177*6ce89324SYegor Yefremov dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev); 178*6ce89324SYegor Yefremov 179*6ce89324SYegor Yefremov /* 180*6ce89324SYegor Yefremov * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all 181*6ce89324SYegor Yefremov * MPU frequencies we support we use a CORE voltage of 182*6ce89324SYegor Yefremov * 1.1375V. For MPU voltage we need to switch based on 183*6ce89324SYegor Yefremov * the frequency we are running at. 184*6ce89324SYegor Yefremov */ 185*6ce89324SYegor Yefremov i2c_set_bus_num(1); 186*6ce89324SYegor Yefremov 187*6ce89324SYegor Yefremov if (i2c_probe(TPS65910_CTRL_I2C_ADDR)) { 188*6ce89324SYegor Yefremov puts("i2c: cannot access TPS65910\n"); 189*6ce89324SYegor Yefremov return; 190*6ce89324SYegor Yefremov } 191*6ce89324SYegor Yefremov 192*6ce89324SYegor Yefremov /* 193*6ce89324SYegor Yefremov * Depending on MPU clock and PG we will need a different 194*6ce89324SYegor Yefremov * VDD to drive at that speed. 195*6ce89324SYegor Yefremov */ 196*6ce89324SYegor Yefremov sil_rev = readl(&cdev->deviceid) >> 28; 197*6ce89324SYegor Yefremov mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, 198*6ce89324SYegor Yefremov dpll_mpu_opp100.m); 199*6ce89324SYegor Yefremov 200*6ce89324SYegor Yefremov /* Tell the TPS65910 to use i2c */ 201*6ce89324SYegor Yefremov tps65910_set_i2c_control(); 202*6ce89324SYegor Yefremov 203*6ce89324SYegor Yefremov /* First update MPU voltage. */ 204*6ce89324SYegor Yefremov if (tps65910_voltage_update(MPU, mpu_vdd)) 205*6ce89324SYegor Yefremov return; 206*6ce89324SYegor Yefremov 207*6ce89324SYegor Yefremov /* Second, update the CORE voltage. */ 208*6ce89324SYegor Yefremov if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_3)) 209*6ce89324SYegor Yefremov return; 210*6ce89324SYegor Yefremov 211*6ce89324SYegor Yefremov /* Set CORE Frequencies to OPP100 */ 212*6ce89324SYegor Yefremov do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); 213*6ce89324SYegor Yefremov 214*6ce89324SYegor Yefremov /* Set MPU Frequency to what we detected now that voltages are set */ 215*6ce89324SYegor Yefremov do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100); 216*6ce89324SYegor Yefremov 217*6ce89324SYegor Yefremov writel(0x000010ff, PRM_DEVICE_INST + 4); 218*6ce89324SYegor Yefremov } 219*6ce89324SYegor Yefremov 220*6ce89324SYegor Yefremov const struct dpll_params *get_dpll_ddr_params(void) 221*6ce89324SYegor Yefremov { 222*6ce89324SYegor Yefremov enable_i2c1_pin_mux(); 223*6ce89324SYegor Yefremov i2c_set_bus_num(1); 224*6ce89324SYegor Yefremov 225*6ce89324SYegor Yefremov return &dpll_ddr_baltos; 226*6ce89324SYegor Yefremov } 227*6ce89324SYegor Yefremov 228*6ce89324SYegor Yefremov void set_uart_mux_conf(void) 229*6ce89324SYegor Yefremov { 230*6ce89324SYegor Yefremov enable_uart0_pin_mux(); 231*6ce89324SYegor Yefremov } 232*6ce89324SYegor Yefremov 233*6ce89324SYegor Yefremov void set_mux_conf_regs(void) 234*6ce89324SYegor Yefremov { 235*6ce89324SYegor Yefremov enable_board_pin_mux(); 236*6ce89324SYegor Yefremov } 237*6ce89324SYegor Yefremov 238*6ce89324SYegor Yefremov const struct ctrl_ioregs ioregs_baltos = { 239*6ce89324SYegor Yefremov .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 240*6ce89324SYegor Yefremov .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 241*6ce89324SYegor Yefremov .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 242*6ce89324SYegor Yefremov .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 243*6ce89324SYegor Yefremov .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 244*6ce89324SYegor Yefremov }; 245*6ce89324SYegor Yefremov 246*6ce89324SYegor Yefremov void sdram_init(void) 247*6ce89324SYegor Yefremov { 248*6ce89324SYegor Yefremov gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en"); 249*6ce89324SYegor Yefremov gpio_direction_output(GPIO_DDR_VTT_EN, 1); 250*6ce89324SYegor Yefremov 251*6ce89324SYegor Yefremov config_ddr(400, &ioregs_baltos, 252*6ce89324SYegor Yefremov &ddr3_baltos_data, 253*6ce89324SYegor Yefremov &ddr3_baltos_cmd_ctrl_data, 254*6ce89324SYegor Yefremov &ddr3_baltos_emif_reg_data, 0); 255*6ce89324SYegor Yefremov } 256*6ce89324SYegor Yefremov #endif 257*6ce89324SYegor Yefremov 258*6ce89324SYegor Yefremov /* 259*6ce89324SYegor Yefremov * Basic board specific setup. Pinmux has been handled already. 260*6ce89324SYegor Yefremov */ 261*6ce89324SYegor Yefremov int board_init(void) 262*6ce89324SYegor Yefremov { 263*6ce89324SYegor Yefremov #if defined(CONFIG_HW_WATCHDOG) 264*6ce89324SYegor Yefremov hw_watchdog_init(); 265*6ce89324SYegor Yefremov #endif 266*6ce89324SYegor Yefremov 267*6ce89324SYegor Yefremov gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 268*6ce89324SYegor Yefremov #if defined(CONFIG_NOR) || defined(CONFIG_NAND) 269*6ce89324SYegor Yefremov gpmc_init(); 270*6ce89324SYegor Yefremov #endif 271*6ce89324SYegor Yefremov return 0; 272*6ce89324SYegor Yefremov } 273*6ce89324SYegor Yefremov 274*6ce89324SYegor Yefremov int ft_board_setup(void *blob, bd_t *bd) 275*6ce89324SYegor Yefremov { 276*6ce89324SYegor Yefremov int node, ret; 277*6ce89324SYegor Yefremov unsigned char mac_addr[6]; 278*6ce89324SYegor Yefremov BSP_VS_HWPARAM header; 279*6ce89324SYegor Yefremov 280*6ce89324SYegor Yefremov /* get production data */ 281*6ce89324SYegor Yefremov if (read_eeprom(&header)) 282*6ce89324SYegor Yefremov return 0; 283*6ce89324SYegor Yefremov 284*6ce89324SYegor Yefremov /* setup MAC1 */ 285*6ce89324SYegor Yefremov mac_addr[0] = header.MAC1[0]; 286*6ce89324SYegor Yefremov mac_addr[1] = header.MAC1[1]; 287*6ce89324SYegor Yefremov mac_addr[2] = header.MAC1[2]; 288*6ce89324SYegor Yefremov mac_addr[3] = header.MAC1[3]; 289*6ce89324SYegor Yefremov mac_addr[4] = header.MAC1[4]; 290*6ce89324SYegor Yefremov mac_addr[5] = header.MAC1[5]; 291*6ce89324SYegor Yefremov 292*6ce89324SYegor Yefremov 293*6ce89324SYegor Yefremov node = fdt_path_offset(blob, "/ocp/ethernet/slave@4a100200"); 294*6ce89324SYegor Yefremov if (node < 0) { 295*6ce89324SYegor Yefremov printf("no /soc/fman/ethernet path offset\n"); 296*6ce89324SYegor Yefremov return -ENODEV; 297*6ce89324SYegor Yefremov } 298*6ce89324SYegor Yefremov 299*6ce89324SYegor Yefremov ret = fdt_setprop(blob, node, "mac-address", &mac_addr, 6); 300*6ce89324SYegor Yefremov if (ret) { 301*6ce89324SYegor Yefremov printf("error setting local-mac-address property\n"); 302*6ce89324SYegor Yefremov return -ENODEV; 303*6ce89324SYegor Yefremov } 304*6ce89324SYegor Yefremov 305*6ce89324SYegor Yefremov /* setup MAC2 */ 306*6ce89324SYegor Yefremov mac_addr[0] = header.MAC2[0]; 307*6ce89324SYegor Yefremov mac_addr[1] = header.MAC2[1]; 308*6ce89324SYegor Yefremov mac_addr[2] = header.MAC2[2]; 309*6ce89324SYegor Yefremov mac_addr[3] = header.MAC2[3]; 310*6ce89324SYegor Yefremov mac_addr[4] = header.MAC2[4]; 311*6ce89324SYegor Yefremov mac_addr[5] = header.MAC2[5]; 312*6ce89324SYegor Yefremov 313*6ce89324SYegor Yefremov node = fdt_path_offset(blob, "/ocp/ethernet/slave@4a100300"); 314*6ce89324SYegor Yefremov if (node < 0) { 315*6ce89324SYegor Yefremov printf("no /soc/fman/ethernet path offset\n"); 316*6ce89324SYegor Yefremov return -ENODEV; 317*6ce89324SYegor Yefremov } 318*6ce89324SYegor Yefremov 319*6ce89324SYegor Yefremov ret = fdt_setprop(blob, node, "mac-address", &mac_addr, 6); 320*6ce89324SYegor Yefremov if (ret) { 321*6ce89324SYegor Yefremov printf("error setting local-mac-address property\n"); 322*6ce89324SYegor Yefremov return -ENODEV; 323*6ce89324SYegor Yefremov } 324*6ce89324SYegor Yefremov 325*6ce89324SYegor Yefremov printf("\nFDT was successfully setup\n"); 326*6ce89324SYegor Yefremov 327*6ce89324SYegor Yefremov return 0; 328*6ce89324SYegor Yefremov } 329*6ce89324SYegor Yefremov 330*6ce89324SYegor Yefremov static struct module_pin_mux dip_pin_mux[] = { 331*6ce89324SYegor Yefremov {OFFSET(gpmc_ad12), (MODE(7) | RXACTIVE )}, /* GPIO1_12 */ 332*6ce89324SYegor Yefremov {OFFSET(gpmc_ad13), (MODE(7) | RXACTIVE )}, /* GPIO1_13 */ 333*6ce89324SYegor Yefremov {OFFSET(gpmc_ad14), (MODE(7) | RXACTIVE )}, /* GPIO1_14 */ 334*6ce89324SYegor Yefremov {OFFSET(gpmc_ad15), (MODE(7) | RXACTIVE )}, /* GPIO1_15 */ 335*6ce89324SYegor Yefremov {-1}, 336*6ce89324SYegor Yefremov }; 337*6ce89324SYegor Yefremov 338*6ce89324SYegor Yefremov #ifdef CONFIG_BOARD_LATE_INIT 339*6ce89324SYegor Yefremov int board_late_init(void) 340*6ce89324SYegor Yefremov { 341*6ce89324SYegor Yefremov #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 342*6ce89324SYegor Yefremov BSP_VS_HWPARAM header; 343*6ce89324SYegor Yefremov char model[4]; 344*6ce89324SYegor Yefremov 345*6ce89324SYegor Yefremov /* get production data */ 346*6ce89324SYegor Yefremov if (read_eeprom(&header)) { 347*6ce89324SYegor Yefremov sprintf(model, "211"); 348*6ce89324SYegor Yefremov } else { 349*6ce89324SYegor Yefremov sprintf(model, "%d", header.SystemId); 350*6ce89324SYegor Yefremov if (header.SystemId == 215) { 351*6ce89324SYegor Yefremov configure_module_pin_mux(dip_pin_mux); 352*6ce89324SYegor Yefremov baltos_set_console(); 353*6ce89324SYegor Yefremov } 354*6ce89324SYegor Yefremov } 355*6ce89324SYegor Yefremov setenv("board_name", model); 356*6ce89324SYegor Yefremov #endif 357*6ce89324SYegor Yefremov 358*6ce89324SYegor Yefremov return 0; 359*6ce89324SYegor Yefremov } 360*6ce89324SYegor Yefremov #endif 361*6ce89324SYegor Yefremov 362*6ce89324SYegor Yefremov #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ 363*6ce89324SYegor Yefremov (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 364*6ce89324SYegor Yefremov static void cpsw_control(int enabled) 365*6ce89324SYegor Yefremov { 366*6ce89324SYegor Yefremov /* VTP can be added here */ 367*6ce89324SYegor Yefremov 368*6ce89324SYegor Yefremov return; 369*6ce89324SYegor Yefremov } 370*6ce89324SYegor Yefremov 371*6ce89324SYegor Yefremov static struct cpsw_slave_data cpsw_slaves[] = { 372*6ce89324SYegor Yefremov { 373*6ce89324SYegor Yefremov .slave_reg_ofs = 0x208, 374*6ce89324SYegor Yefremov .sliver_reg_ofs = 0xd80, 375*6ce89324SYegor Yefremov .phy_addr = 0, 376*6ce89324SYegor Yefremov }, 377*6ce89324SYegor Yefremov { 378*6ce89324SYegor Yefremov .slave_reg_ofs = 0x308, 379*6ce89324SYegor Yefremov .sliver_reg_ofs = 0xdc0, 380*6ce89324SYegor Yefremov .phy_addr = 7, 381*6ce89324SYegor Yefremov }, 382*6ce89324SYegor Yefremov }; 383*6ce89324SYegor Yefremov 384*6ce89324SYegor Yefremov static struct cpsw_platform_data cpsw_data = { 385*6ce89324SYegor Yefremov .mdio_base = CPSW_MDIO_BASE, 386*6ce89324SYegor Yefremov .cpsw_base = CPSW_BASE, 387*6ce89324SYegor Yefremov .mdio_div = 0xff, 388*6ce89324SYegor Yefremov .channels = 8, 389*6ce89324SYegor Yefremov .cpdma_reg_ofs = 0x800, 390*6ce89324SYegor Yefremov .slaves = 2, 391*6ce89324SYegor Yefremov .slave_data = cpsw_slaves, 392*6ce89324SYegor Yefremov .active_slave = 1, 393*6ce89324SYegor Yefremov .ale_reg_ofs = 0xd00, 394*6ce89324SYegor Yefremov .ale_entries = 1024, 395*6ce89324SYegor Yefremov .host_port_reg_ofs = 0x108, 396*6ce89324SYegor Yefremov .hw_stats_reg_ofs = 0x900, 397*6ce89324SYegor Yefremov .bd_ram_ofs = 0x2000, 398*6ce89324SYegor Yefremov .mac_control = (1 << 5), 399*6ce89324SYegor Yefremov .control = cpsw_control, 400*6ce89324SYegor Yefremov .host_port_num = 0, 401*6ce89324SYegor Yefremov .version = CPSW_CTRL_VERSION_2, 402*6ce89324SYegor Yefremov }; 403*6ce89324SYegor Yefremov #endif 404*6ce89324SYegor Yefremov 405*6ce89324SYegor Yefremov #if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) \ 406*6ce89324SYegor Yefremov && defined(CONFIG_SPL_BUILD)) || \ 407*6ce89324SYegor Yefremov ((defined(CONFIG_DRIVER_TI_CPSW) || \ 408*6ce89324SYegor Yefremov defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \ 409*6ce89324SYegor Yefremov !defined(CONFIG_SPL_BUILD)) 410*6ce89324SYegor Yefremov int board_eth_init(bd_t *bis) 411*6ce89324SYegor Yefremov { 412*6ce89324SYegor Yefremov int rv, n = 0; 413*6ce89324SYegor Yefremov uint8_t mac_addr[6]; 414*6ce89324SYegor Yefremov uint32_t mac_hi, mac_lo; 415*6ce89324SYegor Yefremov __maybe_unused struct am335x_baseboard_id header; 416*6ce89324SYegor Yefremov 417*6ce89324SYegor Yefremov /* 418*6ce89324SYegor Yefremov * Note here that we're using CPSW1 since that has a 1Gbit PHY while 419*6ce89324SYegor Yefremov * CSPW0 has a 100Mbit PHY. 420*6ce89324SYegor Yefremov * 421*6ce89324SYegor Yefremov * On product, CPSW1 maps to port labeled WAN. 422*6ce89324SYegor Yefremov */ 423*6ce89324SYegor Yefremov 424*6ce89324SYegor Yefremov /* try reading mac address from efuse */ 425*6ce89324SYegor Yefremov mac_lo = readl(&cdev->macid1l); 426*6ce89324SYegor Yefremov mac_hi = readl(&cdev->macid1h); 427*6ce89324SYegor Yefremov mac_addr[0] = mac_hi & 0xFF; 428*6ce89324SYegor Yefremov mac_addr[1] = (mac_hi & 0xFF00) >> 8; 429*6ce89324SYegor Yefremov mac_addr[2] = (mac_hi & 0xFF0000) >> 16; 430*6ce89324SYegor Yefremov mac_addr[3] = (mac_hi & 0xFF000000) >> 24; 431*6ce89324SYegor Yefremov mac_addr[4] = mac_lo & 0xFF; 432*6ce89324SYegor Yefremov mac_addr[5] = (mac_lo & 0xFF00) >> 8; 433*6ce89324SYegor Yefremov 434*6ce89324SYegor Yefremov #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ 435*6ce89324SYegor Yefremov (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 436*6ce89324SYegor Yefremov if (!getenv("ethaddr")) { 437*6ce89324SYegor Yefremov printf("<ethaddr> not set. Validating first E-fuse MAC\n"); 438*6ce89324SYegor Yefremov 439*6ce89324SYegor Yefremov if (is_valid_ethaddr(mac_addr)) 440*6ce89324SYegor Yefremov eth_setenv_enetaddr("ethaddr", mac_addr); 441*6ce89324SYegor Yefremov } 442*6ce89324SYegor Yefremov 443*6ce89324SYegor Yefremov #ifdef CONFIG_DRIVER_TI_CPSW 444*6ce89324SYegor Yefremov writel((GMII1_SEL_RMII | GMII2_SEL_RGMII | RGMII2_IDMODE), &cdev->miisel); 445*6ce89324SYegor Yefremov cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_RGMII; 446*6ce89324SYegor Yefremov rv = cpsw_register(&cpsw_data); 447*6ce89324SYegor Yefremov if (rv < 0) 448*6ce89324SYegor Yefremov printf("Error %d registering CPSW switch\n", rv); 449*6ce89324SYegor Yefremov else 450*6ce89324SYegor Yefremov n += rv; 451*6ce89324SYegor Yefremov #endif 452*6ce89324SYegor Yefremov 453*6ce89324SYegor Yefremov /* 454*6ce89324SYegor Yefremov * 455*6ce89324SYegor Yefremov * CPSW RGMII Internal Delay Mode is not supported in all PVT 456*6ce89324SYegor Yefremov * operating points. So we must set the TX clock delay feature 457*6ce89324SYegor Yefremov * in the AR8051 PHY. Since we only support a single ethernet 458*6ce89324SYegor Yefremov * device in U-Boot, we only do this for the first instance. 459*6ce89324SYegor Yefremov */ 460*6ce89324SYegor Yefremov #define AR8051_PHY_DEBUG_ADDR_REG 0x1d 461*6ce89324SYegor Yefremov #define AR8051_PHY_DEBUG_DATA_REG 0x1e 462*6ce89324SYegor Yefremov #define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5 463*6ce89324SYegor Yefremov #define AR8051_RGMII_TX_CLK_DLY 0x100 464*6ce89324SYegor Yefremov const char *devname; 465*6ce89324SYegor Yefremov devname = miiphy_get_current_dev(); 466*6ce89324SYegor Yefremov 467*6ce89324SYegor Yefremov miiphy_write(devname, 0x7, AR8051_PHY_DEBUG_ADDR_REG, 468*6ce89324SYegor Yefremov AR8051_DEBUG_RGMII_CLK_DLY_REG); 469*6ce89324SYegor Yefremov miiphy_write(devname, 0x7, AR8051_PHY_DEBUG_DATA_REG, 470*6ce89324SYegor Yefremov AR8051_RGMII_TX_CLK_DLY); 471*6ce89324SYegor Yefremov #endif 472*6ce89324SYegor Yefremov return n; 473*6ce89324SYegor Yefremov } 474*6ce89324SYegor Yefremov #endif 475