1*a2bc4321SGilles Gameiro /* 2*a2bc4321SGilles Gameiro * board.c 3*a2bc4321SGilles Gameiro * 4*a2bc4321SGilles Gameiro * Board functions for Birdland Audio BAV335x Network Processor 5*a2bc4321SGilles Gameiro * 6*a2bc4321SGilles Gameiro * Copyright (c) 2012-2014 Birdland Audio - http://birdland.com/oem 7*a2bc4321SGilles Gameiro * 8*a2bc4321SGilles Gameiro * SPDX-License-Identifier: GPL-2.0+ 9*a2bc4321SGilles Gameiro */ 10*a2bc4321SGilles Gameiro 11*a2bc4321SGilles Gameiro #include <common.h> 12*a2bc4321SGilles Gameiro #include <errno.h> 13*a2bc4321SGilles Gameiro #include <spl.h> 14*a2bc4321SGilles Gameiro #include <asm/arch/cpu.h> 15*a2bc4321SGilles Gameiro #include <asm/arch/hardware.h> 16*a2bc4321SGilles Gameiro #include <asm/arch/omap.h> 17*a2bc4321SGilles Gameiro #include <asm/arch/ddr_defs.h> 18*a2bc4321SGilles Gameiro #include <asm/arch/clock.h> 19*a2bc4321SGilles Gameiro #include <asm/arch/gpio.h> 20*a2bc4321SGilles Gameiro #include <asm/arch/mmc_host_def.h> 21*a2bc4321SGilles Gameiro #include <asm/arch/sys_proto.h> 22*a2bc4321SGilles Gameiro #include <asm/arch/mem.h> 23*a2bc4321SGilles Gameiro #include <asm/io.h> 24*a2bc4321SGilles Gameiro #include <asm/emif.h> 25*a2bc4321SGilles Gameiro #include <asm/gpio.h> 26*a2bc4321SGilles Gameiro #include <i2c.h> 27*a2bc4321SGilles Gameiro #include <miiphy.h> 28*a2bc4321SGilles Gameiro #include <cpsw.h> 29*a2bc4321SGilles Gameiro #include <power/tps65217.h> 30*a2bc4321SGilles Gameiro #include <power/tps65910.h> 31*a2bc4321SGilles Gameiro #include <environment.h> 32*a2bc4321SGilles Gameiro #include <watchdog.h> 33*a2bc4321SGilles Gameiro #include <environment.h> 34*a2bc4321SGilles Gameiro #include "board.h" 35*a2bc4321SGilles Gameiro 36*a2bc4321SGilles Gameiro DECLARE_GLOBAL_DATA_PTR; 37*a2bc4321SGilles Gameiro 38*a2bc4321SGilles Gameiro /* GPIO that controls power to DDR on EVM-SK */ 39*a2bc4321SGilles Gameiro #define GPIO_DDR_VTT_EN 7 40*a2bc4321SGilles Gameiro 41*a2bc4321SGilles Gameiro static __maybe_unused struct ctrl_dev *cdev = 42*a2bc4321SGilles Gameiro (struct ctrl_dev *)CTRL_DEVICE_BASE; 43*a2bc4321SGilles Gameiro 44*a2bc4321SGilles Gameiro 45*a2bc4321SGilles Gameiro 46*a2bc4321SGilles Gameiro /* 47*a2bc4321SGilles Gameiro * Read header information from EEPROM into global structure. 48*a2bc4321SGilles Gameiro */ 49*a2bc4321SGilles Gameiro static int read_eeprom(struct board_eeconfig *header) 50*a2bc4321SGilles Gameiro { 51*a2bc4321SGilles Gameiro /* Check if baseboard eeprom is available */ 52*a2bc4321SGilles Gameiro if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) 53*a2bc4321SGilles Gameiro return -ENODEV; 54*a2bc4321SGilles Gameiro 55*a2bc4321SGilles Gameiro /* read the eeprom using i2c */ 56*a2bc4321SGilles Gameiro if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header, 57*a2bc4321SGilles Gameiro sizeof(struct board_eeconfig))) 58*a2bc4321SGilles Gameiro return -EIO; 59*a2bc4321SGilles Gameiro 60*a2bc4321SGilles Gameiro if (header->magic != BOARD_MAGIC) { 61*a2bc4321SGilles Gameiro /* read the i2c eeprom again using only a 1 byte address */ 62*a2bc4321SGilles Gameiro if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header, 63*a2bc4321SGilles Gameiro sizeof(struct board_eeconfig))) 64*a2bc4321SGilles Gameiro return -EIO; 65*a2bc4321SGilles Gameiro 66*a2bc4321SGilles Gameiro if (header->magic != BOARD_MAGIC) 67*a2bc4321SGilles Gameiro return -EINVAL; 68*a2bc4321SGilles Gameiro } 69*a2bc4321SGilles Gameiro return 0; 70*a2bc4321SGilles Gameiro } 71*a2bc4321SGilles Gameiro 72*a2bc4321SGilles Gameiro 73*a2bc4321SGilles Gameiro 74*a2bc4321SGilles Gameiro 75*a2bc4321SGilles Gameiro enum board_type get_board_type(bool debug) 76*a2bc4321SGilles Gameiro { 77*a2bc4321SGilles Gameiro int ecode; 78*a2bc4321SGilles Gameiro struct board_eeconfig header; 79*a2bc4321SGilles Gameiro 80*a2bc4321SGilles Gameiro ecode = read_eeprom(&header); 81*a2bc4321SGilles Gameiro if (ecode == 0) { 82*a2bc4321SGilles Gameiro if (header.version[1] == 'A') { 83*a2bc4321SGilles Gameiro if (debug) 84*a2bc4321SGilles Gameiro puts("=== Detected Board model BAV335x Rev.A"); 85*a2bc4321SGilles Gameiro return BAV335A; 86*a2bc4321SGilles Gameiro } else if (header.version[1] == 'B') { 87*a2bc4321SGilles Gameiro if (debug) 88*a2bc4321SGilles Gameiro puts("=== Detected Board model BAV335x Rev.B"); 89*a2bc4321SGilles Gameiro return BAV335B; 90*a2bc4321SGilles Gameiro } else if (debug) { 91*a2bc4321SGilles Gameiro puts("### Un-known board model in serial-EE\n"); 92*a2bc4321SGilles Gameiro } 93*a2bc4321SGilles Gameiro } else if (debug) { 94*a2bc4321SGilles Gameiro switch (ecode) { 95*a2bc4321SGilles Gameiro case -ENODEV: 96*a2bc4321SGilles Gameiro puts("### Board doesn't have a serial-EE\n"); 97*a2bc4321SGilles Gameiro break; 98*a2bc4321SGilles Gameiro case -EINVAL: 99*a2bc4321SGilles Gameiro puts("### Board serial-EE signature is incorrect.\n"); 100*a2bc4321SGilles Gameiro break; 101*a2bc4321SGilles Gameiro default: 102*a2bc4321SGilles Gameiro puts("### IO Error reading serial-EE.\n"); 103*a2bc4321SGilles Gameiro break; 104*a2bc4321SGilles Gameiro } 105*a2bc4321SGilles Gameiro } 106*a2bc4321SGilles Gameiro 107*a2bc4321SGilles Gameiro #if (CONFIG_BAV_VERSION == 1) 108*a2bc4321SGilles Gameiro if (debug) 109*a2bc4321SGilles Gameiro puts("### Selecting BAV335A as per config\n"); 110*a2bc4321SGilles Gameiro return BAV335A; 111*a2bc4321SGilles Gameiro #elif (CONFIG_BAV_VERSION == 2) 112*a2bc4321SGilles Gameiro if (debug) 113*a2bc4321SGilles Gameiro puts("### Selecting BAV335B as per config\n"); 114*a2bc4321SGilles Gameiro return BAV335B; 115*a2bc4321SGilles Gameiro #endif 116*a2bc4321SGilles Gameiro #if (NOT_DEFINED == 2) 117*a2bc4321SGilles Gameiro #error "SHOULD NEVER DISPLAY THIS" 118*a2bc4321SGilles Gameiro #endif 119*a2bc4321SGilles Gameiro 120*a2bc4321SGilles Gameiro if (debug) 121*a2bc4321SGilles Gameiro puts("### Defaulting to model BAV335x Rev.B\n"); 122*a2bc4321SGilles Gameiro return BAV335B; 123*a2bc4321SGilles Gameiro } 124*a2bc4321SGilles Gameiro 125*a2bc4321SGilles Gameiro 126*a2bc4321SGilles Gameiro 127*a2bc4321SGilles Gameiro #ifndef CONFIG_SKIP_LOWLEVEL_INIT 128*a2bc4321SGilles Gameiro static const struct ddr_data ddr3_bav335x_data = { 129*a2bc4321SGilles Gameiro .datardsratio0 = MT41K256M16HA125E_RD_DQS, 130*a2bc4321SGilles Gameiro .datawdsratio0 = MT41K256M16HA125E_WR_DQS, 131*a2bc4321SGilles Gameiro .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE, 132*a2bc4321SGilles Gameiro .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA, 133*a2bc4321SGilles Gameiro }; 134*a2bc4321SGilles Gameiro 135*a2bc4321SGilles Gameiro static const struct cmd_control ddr3_bav335x_cmd_ctrl_data = { 136*a2bc4321SGilles Gameiro .cmd0csratio = MT41K256M16HA125E_RATIO, 137*a2bc4321SGilles Gameiro .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 138*a2bc4321SGilles Gameiro .cmd1csratio = MT41K256M16HA125E_RATIO, 139*a2bc4321SGilles Gameiro .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 140*a2bc4321SGilles Gameiro .cmd2csratio = MT41K256M16HA125E_RATIO, 141*a2bc4321SGilles Gameiro .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 142*a2bc4321SGilles Gameiro }; 143*a2bc4321SGilles Gameiro 144*a2bc4321SGilles Gameiro 145*a2bc4321SGilles Gameiro static struct emif_regs ddr3_bav335x_emif_reg_data = { 146*a2bc4321SGilles Gameiro .sdram_config = MT41K256M16HA125E_EMIF_SDCFG, 147*a2bc4321SGilles Gameiro .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF, 148*a2bc4321SGilles Gameiro .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1, 149*a2bc4321SGilles Gameiro .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2, 150*a2bc4321SGilles Gameiro .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3, 151*a2bc4321SGilles Gameiro .zq_config = MT41K256M16HA125E_ZQ_CFG, 152*a2bc4321SGilles Gameiro .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY, 153*a2bc4321SGilles Gameiro }; 154*a2bc4321SGilles Gameiro 155*a2bc4321SGilles Gameiro 156*a2bc4321SGilles Gameiro #ifdef CONFIG_SPL_OS_BOOT 157*a2bc4321SGilles Gameiro int spl_start_uboot(void) 158*a2bc4321SGilles Gameiro { 159*a2bc4321SGilles Gameiro /* break into full u-boot on 'c' */ 160*a2bc4321SGilles Gameiro if (serial_tstc() && serial_getc() == 'c') 161*a2bc4321SGilles Gameiro return 1; 162*a2bc4321SGilles Gameiro 163*a2bc4321SGilles Gameiro #ifdef CONFIG_SPL_ENV_SUPPORT 164*a2bc4321SGilles Gameiro env_init(); 165*a2bc4321SGilles Gameiro env_relocate_spec(); 166*a2bc4321SGilles Gameiro if (getenv_yesno("boot_os") != 1) 167*a2bc4321SGilles Gameiro return 1; 168*a2bc4321SGilles Gameiro #endif 169*a2bc4321SGilles Gameiro 170*a2bc4321SGilles Gameiro return 0; 171*a2bc4321SGilles Gameiro } 172*a2bc4321SGilles Gameiro #endif 173*a2bc4321SGilles Gameiro 174*a2bc4321SGilles Gameiro #define OSC (V_OSCK/1000000) 175*a2bc4321SGilles Gameiro const struct dpll_params dpll_ddr = { 176*a2bc4321SGilles Gameiro 266, OSC-1, 1, -1, -1, -1, -1}; 177*a2bc4321SGilles Gameiro const struct dpll_params dpll_ddr_evm_sk = { 178*a2bc4321SGilles Gameiro 303, OSC-1, 1, -1, -1, -1, -1}; 179*a2bc4321SGilles Gameiro const struct dpll_params dpll_ddr_bone_black = { 180*a2bc4321SGilles Gameiro 400, OSC-1, 1, -1, -1, -1, -1}; 181*a2bc4321SGilles Gameiro 182*a2bc4321SGilles Gameiro void am33xx_spl_board_init(void) 183*a2bc4321SGilles Gameiro { 184*a2bc4321SGilles Gameiro /* debug print detect status */ 185*a2bc4321SGilles Gameiro (void)get_board_type(true); 186*a2bc4321SGilles Gameiro 187*a2bc4321SGilles Gameiro /* Get the frequency */ 188*a2bc4321SGilles Gameiro /* dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev); */ 189*a2bc4321SGilles Gameiro dpll_mpu_opp100.m = MPUPLL_M_1000; 190*a2bc4321SGilles Gameiro 191*a2bc4321SGilles Gameiro if (i2c_probe(TPS65217_CHIP_PM)) 192*a2bc4321SGilles Gameiro return; 193*a2bc4321SGilles Gameiro 194*a2bc4321SGilles Gameiro /* Set the USB Current Limit */ 195*a2bc4321SGilles Gameiro if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, TPS65217_POWER_PATH, 196*a2bc4321SGilles Gameiro TPS65217_USB_INPUT_CUR_LIMIT_1800MA, 197*a2bc4321SGilles Gameiro TPS65217_USB_INPUT_CUR_LIMIT_MASK)) 198*a2bc4321SGilles Gameiro puts("! tps65217_reg_write: could not set USB limit\n"); 199*a2bc4321SGilles Gameiro 200*a2bc4321SGilles Gameiro /* Set the Core Voltage (DCDC3) to 1.125V */ 201*a2bc4321SGilles Gameiro if (tps65217_voltage_update(TPS65217_DEFDCDC3, 202*a2bc4321SGilles Gameiro TPS65217_DCDC_VOLT_SEL_1125MV)) { 203*a2bc4321SGilles Gameiro puts("! tps65217_reg_write: could not set Core Voltage\n"); 204*a2bc4321SGilles Gameiro return; 205*a2bc4321SGilles Gameiro } 206*a2bc4321SGilles Gameiro 207*a2bc4321SGilles Gameiro /* Set CORE Frequencies to OPP100 */ 208*a2bc4321SGilles Gameiro do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); 209*a2bc4321SGilles Gameiro 210*a2bc4321SGilles Gameiro /* Set the MPU Voltage (DCDC2) */ 211*a2bc4321SGilles Gameiro if (tps65217_voltage_update(TPS65217_DEFDCDC2, 212*a2bc4321SGilles Gameiro TPS65217_DCDC_VOLT_SEL_1325MV)) { 213*a2bc4321SGilles Gameiro puts("! tps65217_reg_write: could not set MPU Voltage\n"); 214*a2bc4321SGilles Gameiro return; 215*a2bc4321SGilles Gameiro } 216*a2bc4321SGilles Gameiro 217*a2bc4321SGilles Gameiro /* 218*a2bc4321SGilles Gameiro * Set LDO3, LDO4 output voltage to 3.3V for Beaglebone. 219*a2bc4321SGilles Gameiro * Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black. 220*a2bc4321SGilles Gameiro */ 221*a2bc4321SGilles Gameiro if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, TPS65217_DEFLS1, 222*a2bc4321SGilles Gameiro TPS65217_LDO_VOLTAGE_OUT_1_8, TPS65217_LDO_MASK)) 223*a2bc4321SGilles Gameiro puts("! tps65217_reg_write: could not set LDO3\n"); 224*a2bc4321SGilles Gameiro 225*a2bc4321SGilles Gameiro if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, TPS65217_DEFLS2, 226*a2bc4321SGilles Gameiro TPS65217_LDO_VOLTAGE_OUT_3_3, TPS65217_LDO_MASK)) 227*a2bc4321SGilles Gameiro puts("! tps65217_reg_write: could not set LDO4\n"); 228*a2bc4321SGilles Gameiro 229*a2bc4321SGilles Gameiro /* Set MPU Frequency to what we detected now that voltages are set */ 230*a2bc4321SGilles Gameiro do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100); 231*a2bc4321SGilles Gameiro } 232*a2bc4321SGilles Gameiro 233*a2bc4321SGilles Gameiro const struct dpll_params *get_dpll_ddr_params(void) 234*a2bc4321SGilles Gameiro { 235*a2bc4321SGilles Gameiro enable_i2c0_pin_mux(); 236*a2bc4321SGilles Gameiro i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE); 237*a2bc4321SGilles Gameiro 238*a2bc4321SGilles Gameiro return &dpll_ddr_bone_black; 239*a2bc4321SGilles Gameiro } 240*a2bc4321SGilles Gameiro 241*a2bc4321SGilles Gameiro void set_uart_mux_conf(void) 242*a2bc4321SGilles Gameiro { 243*a2bc4321SGilles Gameiro #if CONFIG_CONS_INDEX == 1 244*a2bc4321SGilles Gameiro enable_uart0_pin_mux(); 245*a2bc4321SGilles Gameiro #elif CONFIG_CONS_INDEX == 2 246*a2bc4321SGilles Gameiro enable_uart1_pin_mux(); 247*a2bc4321SGilles Gameiro #elif CONFIG_CONS_INDEX == 3 248*a2bc4321SGilles Gameiro enable_uart2_pin_mux(); 249*a2bc4321SGilles Gameiro #elif CONFIG_CONS_INDEX == 4 250*a2bc4321SGilles Gameiro enable_uart3_pin_mux(); 251*a2bc4321SGilles Gameiro #elif CONFIG_CONS_INDEX == 5 252*a2bc4321SGilles Gameiro enable_uart4_pin_mux(); 253*a2bc4321SGilles Gameiro #elif CONFIG_CONS_INDEX == 6 254*a2bc4321SGilles Gameiro enable_uart5_pin_mux(); 255*a2bc4321SGilles Gameiro #endif 256*a2bc4321SGilles Gameiro } 257*a2bc4321SGilles Gameiro 258*a2bc4321SGilles Gameiro void set_mux_conf_regs(void) 259*a2bc4321SGilles Gameiro { 260*a2bc4321SGilles Gameiro enum board_type board; 261*a2bc4321SGilles Gameiro 262*a2bc4321SGilles Gameiro board = get_board_type(false); 263*a2bc4321SGilles Gameiro enable_board_pin_mux(board); 264*a2bc4321SGilles Gameiro } 265*a2bc4321SGilles Gameiro 266*a2bc4321SGilles Gameiro const struct ctrl_ioregs ioregs_bonelt = { 267*a2bc4321SGilles Gameiro .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 268*a2bc4321SGilles Gameiro .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 269*a2bc4321SGilles Gameiro .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 270*a2bc4321SGilles Gameiro .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 271*a2bc4321SGilles Gameiro .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 272*a2bc4321SGilles Gameiro }; 273*a2bc4321SGilles Gameiro 274*a2bc4321SGilles Gameiro 275*a2bc4321SGilles Gameiro void sdram_init(void) 276*a2bc4321SGilles Gameiro { 277*a2bc4321SGilles Gameiro config_ddr(400, &ioregs_bonelt, 278*a2bc4321SGilles Gameiro &ddr3_bav335x_data, 279*a2bc4321SGilles Gameiro &ddr3_bav335x_cmd_ctrl_data, 280*a2bc4321SGilles Gameiro &ddr3_bav335x_emif_reg_data, 0); 281*a2bc4321SGilles Gameiro } 282*a2bc4321SGilles Gameiro #endif 283*a2bc4321SGilles Gameiro 284*a2bc4321SGilles Gameiro /* 285*a2bc4321SGilles Gameiro * Basic board specific setup. Pinmux has been handled already. 286*a2bc4321SGilles Gameiro */ 287*a2bc4321SGilles Gameiro int board_init(void) 288*a2bc4321SGilles Gameiro { 289*a2bc4321SGilles Gameiro #if defined(CONFIG_HW_WATCHDOG) 290*a2bc4321SGilles Gameiro hw_watchdog_init(); 291*a2bc4321SGilles Gameiro #endif 292*a2bc4321SGilles Gameiro 293*a2bc4321SGilles Gameiro gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 294*a2bc4321SGilles Gameiro #if defined(CONFIG_NOR) || defined(CONFIG_NAND) 295*a2bc4321SGilles Gameiro gpmc_init(); 296*a2bc4321SGilles Gameiro #endif 297*a2bc4321SGilles Gameiro return 0; 298*a2bc4321SGilles Gameiro } 299*a2bc4321SGilles Gameiro 300*a2bc4321SGilles Gameiro #ifdef CONFIG_BOARD_LATE_INIT 301*a2bc4321SGilles Gameiro int board_late_init(void) 302*a2bc4321SGilles Gameiro { 303*a2bc4321SGilles Gameiro #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 304*a2bc4321SGilles Gameiro setenv("board_name", "BAV335xB"); 305*a2bc4321SGilles Gameiro setenv("board_rev", "B"); /* Fix me, but why bother.. */ 306*a2bc4321SGilles Gameiro #endif 307*a2bc4321SGilles Gameiro return 0; 308*a2bc4321SGilles Gameiro } 309*a2bc4321SGilles Gameiro #endif 310*a2bc4321SGilles Gameiro 311*a2bc4321SGilles Gameiro 312*a2bc4321SGilles Gameiro #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ 313*a2bc4321SGilles Gameiro (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 314*a2bc4321SGilles Gameiro static void cpsw_control(int enabled) 315*a2bc4321SGilles Gameiro { 316*a2bc4321SGilles Gameiro /* VTP can be added here */ 317*a2bc4321SGilles Gameiro return; 318*a2bc4321SGilles Gameiro } 319*a2bc4321SGilles Gameiro 320*a2bc4321SGilles Gameiro static struct cpsw_slave_data cpsw_slaves[] = { 321*a2bc4321SGilles Gameiro { 322*a2bc4321SGilles Gameiro .slave_reg_ofs = 0x208, 323*a2bc4321SGilles Gameiro .sliver_reg_ofs = 0xd80, 324*a2bc4321SGilles Gameiro .phy_addr = 0, 325*a2bc4321SGilles Gameiro }, 326*a2bc4321SGilles Gameiro { 327*a2bc4321SGilles Gameiro .slave_reg_ofs = 0x308, 328*a2bc4321SGilles Gameiro .sliver_reg_ofs = 0xdc0, 329*a2bc4321SGilles Gameiro .phy_addr = 1, 330*a2bc4321SGilles Gameiro }, 331*a2bc4321SGilles Gameiro }; 332*a2bc4321SGilles Gameiro 333*a2bc4321SGilles Gameiro static struct cpsw_platform_data cpsw_data = { 334*a2bc4321SGilles Gameiro .mdio_base = CPSW_MDIO_BASE, 335*a2bc4321SGilles Gameiro .cpsw_base = CPSW_BASE, 336*a2bc4321SGilles Gameiro .mdio_div = 0xff, 337*a2bc4321SGilles Gameiro .channels = 8, 338*a2bc4321SGilles Gameiro .cpdma_reg_ofs = 0x800, 339*a2bc4321SGilles Gameiro .slaves = 1, 340*a2bc4321SGilles Gameiro .slave_data = cpsw_slaves, 341*a2bc4321SGilles Gameiro .ale_reg_ofs = 0xd00, 342*a2bc4321SGilles Gameiro .ale_entries = 1024, 343*a2bc4321SGilles Gameiro .host_port_reg_ofs = 0x108, 344*a2bc4321SGilles Gameiro .hw_stats_reg_ofs = 0x900, 345*a2bc4321SGilles Gameiro .bd_ram_ofs = 0x2000, 346*a2bc4321SGilles Gameiro .mac_control = (1 << 5), 347*a2bc4321SGilles Gameiro .control = cpsw_control, 348*a2bc4321SGilles Gameiro .host_port_num = 0, 349*a2bc4321SGilles Gameiro .version = CPSW_CTRL_VERSION_2, 350*a2bc4321SGilles Gameiro }; 351*a2bc4321SGilles Gameiro #endif 352*a2bc4321SGilles Gameiro 353*a2bc4321SGilles Gameiro 354*a2bc4321SGilles Gameiro /* 355*a2bc4321SGilles Gameiro * This function will: 356*a2bc4321SGilles Gameiro * Perform fixups to the PHY present on certain boards. We only need this 357*a2bc4321SGilles Gameiro * function in: 358*a2bc4321SGilles Gameiro * - SPL with either CPSW or USB ethernet support 359*a2bc4321SGilles Gameiro * - Full U-Boot, with either CPSW or USB ethernet 360*a2bc4321SGilles Gameiro * Build in only these cases to avoid warnings about unused variables 361*a2bc4321SGilles Gameiro * when we build an SPL that has neither option but full U-Boot will. 362*a2bc4321SGilles Gameiro */ 363*a2bc4321SGilles Gameiro #if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) &&\ 364*a2bc4321SGilles Gameiro defined(CONFIG_SPL_BUILD)) || \ 365*a2bc4321SGilles Gameiro ((defined(CONFIG_DRIVER_TI_CPSW) || \ 366*a2bc4321SGilles Gameiro defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \ 367*a2bc4321SGilles Gameiro !defined(CONFIG_SPL_BUILD)) 368*a2bc4321SGilles Gameiro int board_eth_init(bd_t *bis) 369*a2bc4321SGilles Gameiro { 370*a2bc4321SGilles Gameiro int ecode, rv, n; 371*a2bc4321SGilles Gameiro uint8_t mac_addr[6]; 372*a2bc4321SGilles Gameiro struct board_eeconfig header; 373*a2bc4321SGilles Gameiro __maybe_unused enum board_type board; 374*a2bc4321SGilles Gameiro 375*a2bc4321SGilles Gameiro /* Default manufacturing address; used when no EE or invalid */ 376*a2bc4321SGilles Gameiro n = 0; 377*a2bc4321SGilles Gameiro mac_addr[0] = 0; 378*a2bc4321SGilles Gameiro mac_addr[1] = 0x20; 379*a2bc4321SGilles Gameiro mac_addr[2] = 0x18; 380*a2bc4321SGilles Gameiro mac_addr[3] = 0x1C; 381*a2bc4321SGilles Gameiro mac_addr[4] = 0x00; 382*a2bc4321SGilles Gameiro mac_addr[5] = 0x01; 383*a2bc4321SGilles Gameiro 384*a2bc4321SGilles Gameiro ecode = read_eeprom(&header); 385*a2bc4321SGilles Gameiro /* if we have a valid EE, get mac address from there */ 386*a2bc4321SGilles Gameiro if ((ecode == 0) && 387*a2bc4321SGilles Gameiro is_valid_ether_addr((const u8 *)&header.mac_addr[0][0])) { 388*a2bc4321SGilles Gameiro memcpy(mac_addr, (const void *)&header.mac_addr[0][0], 6); 389*a2bc4321SGilles Gameiro } 390*a2bc4321SGilles Gameiro 391*a2bc4321SGilles Gameiro 392*a2bc4321SGilles Gameiro #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ 393*a2bc4321SGilles Gameiro (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 394*a2bc4321SGilles Gameiro 395*a2bc4321SGilles Gameiro if (!getenv("ethaddr")) { 396*a2bc4321SGilles Gameiro printf("<ethaddr> not set. Validating first E-fuse MAC\n"); 397*a2bc4321SGilles Gameiro 398*a2bc4321SGilles Gameiro if (is_valid_ether_addr(mac_addr)) 399*a2bc4321SGilles Gameiro eth_setenv_enetaddr("ethaddr", mac_addr); 400*a2bc4321SGilles Gameiro } 401*a2bc4321SGilles Gameiro 402*a2bc4321SGilles Gameiro #ifdef CONFIG_DRIVER_TI_CPSW 403*a2bc4321SGilles Gameiro 404*a2bc4321SGilles Gameiro board = get_board_type(false); 405*a2bc4321SGilles Gameiro 406*a2bc4321SGilles Gameiro /* Rev.A uses 10/100 PHY in mii mode */ 407*a2bc4321SGilles Gameiro if (board == BAV335A) { 408*a2bc4321SGilles Gameiro writel(MII_MODE_ENABLE, &cdev->miisel); 409*a2bc4321SGilles Gameiro cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_MII; 410*a2bc4321SGilles Gameiro cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_MII; 411*a2bc4321SGilles Gameiro } 412*a2bc4321SGilles Gameiro /* Rev.B (default) uses GB PHY in rmii mode */ 413*a2bc4321SGilles Gameiro else { 414*a2bc4321SGilles Gameiro writel((RGMII_MODE_ENABLE | RGMII_INT_DELAY), &cdev->miisel); 415*a2bc4321SGilles Gameiro cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if 416*a2bc4321SGilles Gameiro = PHY_INTERFACE_MODE_RGMII; 417*a2bc4321SGilles Gameiro } 418*a2bc4321SGilles Gameiro 419*a2bc4321SGilles Gameiro rv = cpsw_register(&cpsw_data); 420*a2bc4321SGilles Gameiro if (rv < 0) 421*a2bc4321SGilles Gameiro printf("Error %d registering CPSW switch\n", rv); 422*a2bc4321SGilles Gameiro else 423*a2bc4321SGilles Gameiro n += rv; 424*a2bc4321SGilles Gameiro #endif 425*a2bc4321SGilles Gameiro 426*a2bc4321SGilles Gameiro #endif 427*a2bc4321SGilles Gameiro 428*a2bc4321SGilles Gameiro return n; 429*a2bc4321SGilles Gameiro } 430*a2bc4321SGilles Gameiro #endif 431