19d1b2987SEnric Balletbò i Serra /*
29d1b2987SEnric Balletbò i Serra * board.c
39d1b2987SEnric Balletbò i Serra *
49d1b2987SEnric Balletbò i Serra * Board functions for TCL SL50 board
59d1b2987SEnric Balletbò i Serra *
69d1b2987SEnric Balletbò i Serra * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
79d1b2987SEnric Balletbò i Serra *
89d1b2987SEnric Balletbò i Serra * SPDX-License-Identifier: GPL-2.0+
99d1b2987SEnric Balletbò i Serra */
109d1b2987SEnric Balletbò i Serra
119d1b2987SEnric Balletbò i Serra #include <common.h>
129d1b2987SEnric Balletbò i Serra #include <errno.h>
139d1b2987SEnric Balletbò i Serra #include <spl.h>
149d1b2987SEnric Balletbò i Serra #include <asm/arch/cpu.h>
159d1b2987SEnric Balletbò i Serra #include <asm/arch/hardware.h>
169d1b2987SEnric Balletbò i Serra #include <asm/arch/omap.h>
179d1b2987SEnric Balletbò i Serra #include <asm/arch/ddr_defs.h>
189d1b2987SEnric Balletbò i Serra #include <asm/arch/clock.h>
199d1b2987SEnric Balletbò i Serra #include <asm/arch/gpio.h>
209d1b2987SEnric Balletbò i Serra #include <asm/arch/mmc_host_def.h>
219d1b2987SEnric Balletbò i Serra #include <asm/arch/sys_proto.h>
229d1b2987SEnric Balletbò i Serra #include <asm/arch/mem.h>
239d1b2987SEnric Balletbò i Serra #include <asm/io.h>
249d1b2987SEnric Balletbò i Serra #include <asm/emif.h>
259d1b2987SEnric Balletbò i Serra #include <asm/gpio.h>
269d1b2987SEnric Balletbò i Serra #include <i2c.h>
279d1b2987SEnric Balletbò i Serra #include <miiphy.h>
289d1b2987SEnric Balletbò i Serra #include <cpsw.h>
299d1b2987SEnric Balletbò i Serra #include <power/tps65217.h>
309d1b2987SEnric Balletbò i Serra #include <power/tps65910.h>
319d1b2987SEnric Balletbò i Serra #include <environment.h>
329d1b2987SEnric Balletbò i Serra #include <watchdog.h>
339d1b2987SEnric Balletbò i Serra #include <environment.h>
349d1b2987SEnric Balletbò i Serra #include "board.h"
359d1b2987SEnric Balletbò i Serra
369d1b2987SEnric Balletbò i Serra DECLARE_GLOBAL_DATA_PTR;
379d1b2987SEnric Balletbò i Serra
389d1b2987SEnric Balletbò i Serra static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
399d1b2987SEnric Balletbò i Serra
409d1b2987SEnric Balletbò i Serra #ifndef CONFIG_SKIP_LOWLEVEL_INIT
419d1b2987SEnric Balletbò i Serra
429d1b2987SEnric Balletbò i Serra static const struct ddr_data ddr3_sl50_data = {
439d1b2987SEnric Balletbò i Serra .datardsratio0 = MT41K256M16HA125E_RD_DQS,
449d1b2987SEnric Balletbò i Serra .datawdsratio0 = MT41K256M16HA125E_WR_DQS,
459d1b2987SEnric Balletbò i Serra .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
469d1b2987SEnric Balletbò i Serra .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
479d1b2987SEnric Balletbò i Serra };
489d1b2987SEnric Balletbò i Serra
499d1b2987SEnric Balletbò i Serra static const struct cmd_control ddr3_sl50_cmd_ctrl_data = {
509d1b2987SEnric Balletbò i Serra .cmd0csratio = MT41K256M16HA125E_RATIO,
519d1b2987SEnric Balletbò i Serra .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
529d1b2987SEnric Balletbò i Serra
539d1b2987SEnric Balletbò i Serra .cmd1csratio = MT41K256M16HA125E_RATIO,
549d1b2987SEnric Balletbò i Serra .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
559d1b2987SEnric Balletbò i Serra
569d1b2987SEnric Balletbò i Serra .cmd2csratio = MT41K256M16HA125E_RATIO,
579d1b2987SEnric Balletbò i Serra .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
589d1b2987SEnric Balletbò i Serra };
599d1b2987SEnric Balletbò i Serra
609d1b2987SEnric Balletbò i Serra static struct emif_regs ddr3_sl50_emif_reg_data = {
619d1b2987SEnric Balletbò i Serra .sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
629d1b2987SEnric Balletbò i Serra .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
639d1b2987SEnric Balletbò i Serra .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
649d1b2987SEnric Balletbò i Serra .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
659d1b2987SEnric Balletbò i Serra .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
669d1b2987SEnric Balletbò i Serra .zq_config = MT41K256M16HA125E_ZQ_CFG,
679d1b2987SEnric Balletbò i Serra .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
689d1b2987SEnric Balletbò i Serra };
699d1b2987SEnric Balletbò i Serra
709d1b2987SEnric Balletbò i Serra #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)719d1b2987SEnric Balletbò i Serra int spl_start_uboot(void)
729d1b2987SEnric Balletbò i Serra {
739d1b2987SEnric Balletbò i Serra /* break into full u-boot on 'c' */
749d1b2987SEnric Balletbò i Serra if (serial_tstc() && serial_getc() == 'c')
759d1b2987SEnric Balletbò i Serra return 1;
769d1b2987SEnric Balletbò i Serra
779d1b2987SEnric Balletbò i Serra #ifdef CONFIG_SPL_ENV_SUPPORT
789d1b2987SEnric Balletbò i Serra env_init();
79310fb14bSSimon Glass env_load();
80*bfebc8c9SSimon Glass if (env_get_yesno("boot_os") != 1)
819d1b2987SEnric Balletbò i Serra return 1;
829d1b2987SEnric Balletbò i Serra #endif
839d1b2987SEnric Balletbò i Serra
849d1b2987SEnric Balletbò i Serra return 0;
859d1b2987SEnric Balletbò i Serra }
869d1b2987SEnric Balletbò i Serra #endif
879d1b2987SEnric Balletbò i Serra
889d1b2987SEnric Balletbò i Serra #define OSC (V_OSCK/1000000)
899d1b2987SEnric Balletbò i Serra const struct dpll_params dpll_ddr_sl50 = {
909d1b2987SEnric Balletbò i Serra 400, OSC-1, 1, -1, -1, -1, -1};
919d1b2987SEnric Balletbò i Serra
am33xx_spl_board_init(void)929d1b2987SEnric Balletbò i Serra void am33xx_spl_board_init(void)
939d1b2987SEnric Balletbò i Serra {
949d1b2987SEnric Balletbò i Serra int mpu_vdd;
959d1b2987SEnric Balletbò i Serra
969d1b2987SEnric Balletbò i Serra /* Get the frequency */
979d1b2987SEnric Balletbò i Serra dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
989d1b2987SEnric Balletbò i Serra
999d1b2987SEnric Balletbò i Serra /* BeagleBone PMIC Code */
1009d1b2987SEnric Balletbò i Serra int usb_cur_lim;
1019d1b2987SEnric Balletbò i Serra
1029d1b2987SEnric Balletbò i Serra if (i2c_probe(TPS65217_CHIP_PM))
1039d1b2987SEnric Balletbò i Serra return;
1049d1b2987SEnric Balletbò i Serra
1059d1b2987SEnric Balletbò i Serra /*
1069d1b2987SEnric Balletbò i Serra * Increase USB current limit to 1300mA or 1800mA and set
1079d1b2987SEnric Balletbò i Serra * the MPU voltage controller as needed.
1089d1b2987SEnric Balletbò i Serra */
1099d1b2987SEnric Balletbò i Serra if (dpll_mpu_opp100.m == MPUPLL_M_1000) {
1109d1b2987SEnric Balletbò i Serra usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
1119d1b2987SEnric Balletbò i Serra mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
1129d1b2987SEnric Balletbò i Serra } else {
1139d1b2987SEnric Balletbò i Serra usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
1149d1b2987SEnric Balletbò i Serra mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
1159d1b2987SEnric Balletbò i Serra }
1169d1b2987SEnric Balletbò i Serra
1179d1b2987SEnric Balletbò i Serra if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE,
1189d1b2987SEnric Balletbò i Serra TPS65217_POWER_PATH,
1199d1b2987SEnric Balletbò i Serra usb_cur_lim,
1209d1b2987SEnric Balletbò i Serra TPS65217_USB_INPUT_CUR_LIMIT_MASK))
1219d1b2987SEnric Balletbò i Serra puts("tps65217_reg_write failure\n");
1229d1b2987SEnric Balletbò i Serra
1239d1b2987SEnric Balletbò i Serra /* Set DCDC3 (CORE) voltage to 1.125V */
1249d1b2987SEnric Balletbò i Serra if (tps65217_voltage_update(TPS65217_DEFDCDC3,
1259d1b2987SEnric Balletbò i Serra TPS65217_DCDC_VOLT_SEL_1125MV)) {
1269d1b2987SEnric Balletbò i Serra puts("tps65217_voltage_update failure\n");
1279d1b2987SEnric Balletbò i Serra return;
1289d1b2987SEnric Balletbò i Serra }
1299d1b2987SEnric Balletbò i Serra
1309d1b2987SEnric Balletbò i Serra /* Set CORE Frequencies to OPP100 */
1319d1b2987SEnric Balletbò i Serra do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
1329d1b2987SEnric Balletbò i Serra
1339d1b2987SEnric Balletbò i Serra /* Set DCDC2 (MPU) voltage */
1349d1b2987SEnric Balletbò i Serra if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
1359d1b2987SEnric Balletbò i Serra puts("tps65217_voltage_update failure\n");
1369d1b2987SEnric Balletbò i Serra return;
1379d1b2987SEnric Balletbò i Serra }
1389d1b2987SEnric Balletbò i Serra
1399d1b2987SEnric Balletbò i Serra /*
1409d1b2987SEnric Balletbò i Serra * Set LDO3 to 1.8V and LDO4 to 3.3V
1419d1b2987SEnric Balletbò i Serra */
1429d1b2987SEnric Balletbò i Serra if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
1439d1b2987SEnric Balletbò i Serra TPS65217_DEFLS1,
1449d1b2987SEnric Balletbò i Serra TPS65217_LDO_VOLTAGE_OUT_1_8,
1459d1b2987SEnric Balletbò i Serra TPS65217_LDO_MASK))
1469d1b2987SEnric Balletbò i Serra puts("tps65217_reg_write failure\n");
1479d1b2987SEnric Balletbò i Serra
1489d1b2987SEnric Balletbò i Serra if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
1499d1b2987SEnric Balletbò i Serra TPS65217_DEFLS2,
1509d1b2987SEnric Balletbò i Serra TPS65217_LDO_VOLTAGE_OUT_3_3,
1519d1b2987SEnric Balletbò i Serra TPS65217_LDO_MASK))
1529d1b2987SEnric Balletbò i Serra puts("tps65217_reg_write failure\n");
1539d1b2987SEnric Balletbò i Serra
1549d1b2987SEnric Balletbò i Serra /* Set MPU Frequency to what we detected now that voltages are set */
1559d1b2987SEnric Balletbò i Serra do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
1569d1b2987SEnric Balletbò i Serra }
1579d1b2987SEnric Balletbò i Serra
get_dpll_ddr_params(void)1589d1b2987SEnric Balletbò i Serra const struct dpll_params *get_dpll_ddr_params(void)
1599d1b2987SEnric Balletbò i Serra {
1609d1b2987SEnric Balletbò i Serra enable_i2c0_pin_mux();
1619d1b2987SEnric Balletbò i Serra i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
1629d1b2987SEnric Balletbò i Serra
1639d1b2987SEnric Balletbò i Serra return &dpll_ddr_sl50;
1649d1b2987SEnric Balletbò i Serra }
1659d1b2987SEnric Balletbò i Serra
set_uart_mux_conf(void)1669d1b2987SEnric Balletbò i Serra void set_uart_mux_conf(void)
1679d1b2987SEnric Balletbò i Serra {
1689d1b2987SEnric Balletbò i Serra #if CONFIG_CONS_INDEX == 1
1699d1b2987SEnric Balletbò i Serra enable_uart0_pin_mux();
1709d1b2987SEnric Balletbò i Serra #elif CONFIG_CONS_INDEX == 2
1719d1b2987SEnric Balletbò i Serra enable_uart1_pin_mux();
1729d1b2987SEnric Balletbò i Serra #elif CONFIG_CONS_INDEX == 3
1739d1b2987SEnric Balletbò i Serra enable_uart2_pin_mux();
1749d1b2987SEnric Balletbò i Serra #elif CONFIG_CONS_INDEX == 4
1759d1b2987SEnric Balletbò i Serra enable_uart3_pin_mux();
1769d1b2987SEnric Balletbò i Serra #elif CONFIG_CONS_INDEX == 5
1779d1b2987SEnric Balletbò i Serra enable_uart4_pin_mux();
1789d1b2987SEnric Balletbò i Serra #elif CONFIG_CONS_INDEX == 6
1799d1b2987SEnric Balletbò i Serra enable_uart5_pin_mux();
1809d1b2987SEnric Balletbò i Serra #endif
1819d1b2987SEnric Balletbò i Serra }
1829d1b2987SEnric Balletbò i Serra
set_mux_conf_regs(void)1839d1b2987SEnric Balletbò i Serra void set_mux_conf_regs(void)
1849d1b2987SEnric Balletbò i Serra {
1859d1b2987SEnric Balletbò i Serra enable_board_pin_mux();
1869d1b2987SEnric Balletbò i Serra }
1879d1b2987SEnric Balletbò i Serra
1889d1b2987SEnric Balletbò i Serra const struct ctrl_ioregs ioregs_evmsk = {
1899d1b2987SEnric Balletbò i Serra .cm0ioctl = MT41J128MJT125_IOCTRL_VALUE,
1909d1b2987SEnric Balletbò i Serra .cm1ioctl = MT41J128MJT125_IOCTRL_VALUE,
1919d1b2987SEnric Balletbò i Serra .cm2ioctl = MT41J128MJT125_IOCTRL_VALUE,
1929d1b2987SEnric Balletbò i Serra .dt0ioctl = MT41J128MJT125_IOCTRL_VALUE,
1939d1b2987SEnric Balletbò i Serra .dt1ioctl = MT41J128MJT125_IOCTRL_VALUE,
1949d1b2987SEnric Balletbò i Serra };
1959d1b2987SEnric Balletbò i Serra
1969d1b2987SEnric Balletbò i Serra const struct ctrl_ioregs ioregs_bonelt = {
1979d1b2987SEnric Balletbò i Serra .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
1989d1b2987SEnric Balletbò i Serra .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
1999d1b2987SEnric Balletbò i Serra .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
2009d1b2987SEnric Balletbò i Serra .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
2019d1b2987SEnric Balletbò i Serra .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
2029d1b2987SEnric Balletbò i Serra };
2039d1b2987SEnric Balletbò i Serra
2049d1b2987SEnric Balletbò i Serra const struct ctrl_ioregs ioregs_evm15 = {
2059d1b2987SEnric Balletbò i Serra .cm0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
2069d1b2987SEnric Balletbò i Serra .cm1ioctl = MT41J512M8RH125_IOCTRL_VALUE,
2079d1b2987SEnric Balletbò i Serra .cm2ioctl = MT41J512M8RH125_IOCTRL_VALUE,
2089d1b2987SEnric Balletbò i Serra .dt0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
2099d1b2987SEnric Balletbò i Serra .dt1ioctl = MT41J512M8RH125_IOCTRL_VALUE,
2109d1b2987SEnric Balletbò i Serra };
2119d1b2987SEnric Balletbò i Serra
2129d1b2987SEnric Balletbò i Serra const struct ctrl_ioregs ioregs = {
2139d1b2987SEnric Balletbò i Serra .cm0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
2149d1b2987SEnric Balletbò i Serra .cm1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
2159d1b2987SEnric Balletbò i Serra .cm2ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
2169d1b2987SEnric Balletbò i Serra .dt0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
2179d1b2987SEnric Balletbò i Serra .dt1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
2189d1b2987SEnric Balletbò i Serra };
2199d1b2987SEnric Balletbò i Serra
sdram_init(void)2209d1b2987SEnric Balletbò i Serra void sdram_init(void)
2219d1b2987SEnric Balletbò i Serra {
2229d1b2987SEnric Balletbò i Serra config_ddr(400, &ioregs_bonelt,
2239d1b2987SEnric Balletbò i Serra &ddr3_sl50_data,
2249d1b2987SEnric Balletbò i Serra &ddr3_sl50_cmd_ctrl_data,
2259d1b2987SEnric Balletbò i Serra &ddr3_sl50_emif_reg_data, 0);
2269d1b2987SEnric Balletbò i Serra }
2279d1b2987SEnric Balletbò i Serra #endif
2289d1b2987SEnric Balletbò i Serra
2299d1b2987SEnric Balletbò i Serra /*
2309d1b2987SEnric Balletbò i Serra * Basic board specific setup. Pinmux has been handled already.
2319d1b2987SEnric Balletbò i Serra */
board_init(void)2329d1b2987SEnric Balletbò i Serra int board_init(void)
2339d1b2987SEnric Balletbò i Serra {
2349d1b2987SEnric Balletbò i Serra #if defined(CONFIG_HW_WATCHDOG)
2359d1b2987SEnric Balletbò i Serra hw_watchdog_init();
2369d1b2987SEnric Balletbò i Serra #endif
2379d1b2987SEnric Balletbò i Serra
2389d1b2987SEnric Balletbò i Serra gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
2399d1b2987SEnric Balletbò i Serra return 0;
2409d1b2987SEnric Balletbò i Serra }
2419d1b2987SEnric Balletbò i Serra
2429d1b2987SEnric Balletbò i Serra #ifdef CONFIG_BOARD_LATE_INIT
board_late_init(void)2439d1b2987SEnric Balletbò i Serra int board_late_init(void)
2449d1b2987SEnric Balletbò i Serra {
2459d1b2987SEnric Balletbò i Serra return 0;
2469d1b2987SEnric Balletbò i Serra }
2479d1b2987SEnric Balletbò i Serra #endif
2489d1b2987SEnric Balletbò i Serra
2499d1b2987SEnric Balletbò i Serra #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
2509d1b2987SEnric Balletbò i Serra (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
cpsw_control(int enabled)2519d1b2987SEnric Balletbò i Serra static void cpsw_control(int enabled)
2529d1b2987SEnric Balletbò i Serra {
2539d1b2987SEnric Balletbò i Serra /* VTP can be added here */
2549d1b2987SEnric Balletbò i Serra
2559d1b2987SEnric Balletbò i Serra return;
2569d1b2987SEnric Balletbò i Serra }
2579d1b2987SEnric Balletbò i Serra
2589d1b2987SEnric Balletbò i Serra static struct cpsw_slave_data cpsw_slaves[] = {
2599d1b2987SEnric Balletbò i Serra {
2609d1b2987SEnric Balletbò i Serra .slave_reg_ofs = 0x208,
2619d1b2987SEnric Balletbò i Serra .sliver_reg_ofs = 0xd80,
2629d1b2987SEnric Balletbò i Serra .phy_addr = 0,
2639d1b2987SEnric Balletbò i Serra },
2649d1b2987SEnric Balletbò i Serra {
2659d1b2987SEnric Balletbò i Serra .slave_reg_ofs = 0x308,
2669d1b2987SEnric Balletbò i Serra .sliver_reg_ofs = 0xdc0,
2679d1b2987SEnric Balletbò i Serra .phy_addr = 1,
2689d1b2987SEnric Balletbò i Serra },
2699d1b2987SEnric Balletbò i Serra };
2709d1b2987SEnric Balletbò i Serra
2719d1b2987SEnric Balletbò i Serra static struct cpsw_platform_data cpsw_data = {
2729d1b2987SEnric Balletbò i Serra .mdio_base = CPSW_MDIO_BASE,
2739d1b2987SEnric Balletbò i Serra .cpsw_base = CPSW_BASE,
2749d1b2987SEnric Balletbò i Serra .mdio_div = 0xff,
2759d1b2987SEnric Balletbò i Serra .channels = 8,
2769d1b2987SEnric Balletbò i Serra .cpdma_reg_ofs = 0x800,
2779d1b2987SEnric Balletbò i Serra .slaves = 1,
2789d1b2987SEnric Balletbò i Serra .slave_data = cpsw_slaves,
2799d1b2987SEnric Balletbò i Serra .ale_reg_ofs = 0xd00,
2809d1b2987SEnric Balletbò i Serra .ale_entries = 1024,
2819d1b2987SEnric Balletbò i Serra .host_port_reg_ofs = 0x108,
2829d1b2987SEnric Balletbò i Serra .hw_stats_reg_ofs = 0x900,
2839d1b2987SEnric Balletbò i Serra .bd_ram_ofs = 0x2000,
2849d1b2987SEnric Balletbò i Serra .mac_control = (1 << 5),
2859d1b2987SEnric Balletbò i Serra .control = cpsw_control,
2869d1b2987SEnric Balletbò i Serra .host_port_num = 0,
2879d1b2987SEnric Balletbò i Serra .version = CPSW_CTRL_VERSION_2,
2889d1b2987SEnric Balletbò i Serra };
2899d1b2987SEnric Balletbò i Serra #endif
2909d1b2987SEnric Balletbò i Serra
2919d1b2987SEnric Balletbò i Serra /*
2929d1b2987SEnric Balletbò i Serra * This function will:
2939d1b2987SEnric Balletbò i Serra * Read the eFuse for MAC addresses, and set ethaddr/eth1addr/usbnet_devaddr
2949d1b2987SEnric Balletbò i Serra * in the environment
2959d1b2987SEnric Balletbò i Serra * Perform fixups to the PHY present on certain boards. We only need this
2969d1b2987SEnric Balletbò i Serra * function in:
2979d1b2987SEnric Balletbò i Serra * - SPL with either CPSW or USB ethernet support
2989d1b2987SEnric Balletbò i Serra * - Full U-Boot, with either CPSW or USB ethernet
2999d1b2987SEnric Balletbò i Serra * Build in only these cases to avoid warnings about unused variables
3009d1b2987SEnric Balletbò i Serra * when we build an SPL that has neither option but full U-Boot will.
3019d1b2987SEnric Balletbò i Serra */
3029d1b2987SEnric Balletbò i Serra #if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) \
3039d1b2987SEnric Balletbò i Serra && defined(CONFIG_SPL_BUILD)) || \
3049d1b2987SEnric Balletbò i Serra ((defined(CONFIG_DRIVER_TI_CPSW) || \
3059d1b2987SEnric Balletbò i Serra defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \
3069d1b2987SEnric Balletbò i Serra !defined(CONFIG_SPL_BUILD))
board_eth_init(bd_t * bis)3079d1b2987SEnric Balletbò i Serra int board_eth_init(bd_t *bis)
3089d1b2987SEnric Balletbò i Serra {
3099d1b2987SEnric Balletbò i Serra int rv, n = 0;
3109d1b2987SEnric Balletbò i Serra uint8_t mac_addr[6];
3119d1b2987SEnric Balletbò i Serra uint32_t mac_hi, mac_lo;
3129d1b2987SEnric Balletbò i Serra
3139d1b2987SEnric Balletbò i Serra /* try reading mac address from efuse */
3149d1b2987SEnric Balletbò i Serra mac_lo = readl(&cdev->macid0l);
3159d1b2987SEnric Balletbò i Serra mac_hi = readl(&cdev->macid0h);
3169d1b2987SEnric Balletbò i Serra mac_addr[0] = mac_hi & 0xFF;
3179d1b2987SEnric Balletbò i Serra mac_addr[1] = (mac_hi & 0xFF00) >> 8;
3189d1b2987SEnric Balletbò i Serra mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
3199d1b2987SEnric Balletbò i Serra mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
3209d1b2987SEnric Balletbò i Serra mac_addr[4] = mac_lo & 0xFF;
3219d1b2987SEnric Balletbò i Serra mac_addr[5] = (mac_lo & 0xFF00) >> 8;
3229d1b2987SEnric Balletbò i Serra
3239d1b2987SEnric Balletbò i Serra #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
3249d1b2987SEnric Balletbò i Serra (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
32500caae6dSSimon Glass if (!env_get("ethaddr")) {
3269d1b2987SEnric Balletbò i Serra printf("<ethaddr> not set. Validating first E-fuse MAC\n");
3279d1b2987SEnric Balletbò i Serra
3289d1b2987SEnric Balletbò i Serra if (is_valid_ethaddr(mac_addr))
329fd1e959eSSimon Glass eth_env_set_enetaddr("ethaddr", mac_addr);
3309d1b2987SEnric Balletbò i Serra }
3319d1b2987SEnric Balletbò i Serra
3329d1b2987SEnric Balletbò i Serra #ifdef CONFIG_DRIVER_TI_CPSW
3339d1b2987SEnric Balletbò i Serra
3349d1b2987SEnric Balletbò i Serra mac_lo = readl(&cdev->macid1l);
3359d1b2987SEnric Balletbò i Serra mac_hi = readl(&cdev->macid1h);
3369d1b2987SEnric Balletbò i Serra mac_addr[0] = mac_hi & 0xFF;
3379d1b2987SEnric Balletbò i Serra mac_addr[1] = (mac_hi & 0xFF00) >> 8;
3389d1b2987SEnric Balletbò i Serra mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
3399d1b2987SEnric Balletbò i Serra mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
3409d1b2987SEnric Balletbò i Serra mac_addr[4] = mac_lo & 0xFF;
3419d1b2987SEnric Balletbò i Serra mac_addr[5] = (mac_lo & 0xFF00) >> 8;
3429d1b2987SEnric Balletbò i Serra
34300caae6dSSimon Glass if (!env_get("eth1addr")) {
3449d1b2987SEnric Balletbò i Serra if (is_valid_ethaddr(mac_addr))
345fd1e959eSSimon Glass eth_env_set_enetaddr("eth1addr", mac_addr);
3469d1b2987SEnric Balletbò i Serra }
3479d1b2987SEnric Balletbò i Serra
3489d1b2987SEnric Balletbò i Serra
3499d1b2987SEnric Balletbò i Serra writel(MII_MODE_ENABLE, &cdev->miisel);
3509d1b2987SEnric Balletbò i Serra cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
3519d1b2987SEnric Balletbò i Serra PHY_INTERFACE_MODE_MII;
3529d1b2987SEnric Balletbò i Serra
3539d1b2987SEnric Balletbò i Serra rv = cpsw_register(&cpsw_data);
3549d1b2987SEnric Balletbò i Serra if (rv < 0)
3559d1b2987SEnric Balletbò i Serra printf("Error %d registering CPSW switch\n", rv);
3569d1b2987SEnric Balletbò i Serra else
3579d1b2987SEnric Balletbò i Serra n += rv;
3589d1b2987SEnric Balletbò i Serra #endif
3599d1b2987SEnric Balletbò i Serra
3609d1b2987SEnric Balletbò i Serra /*
3619d1b2987SEnric Balletbò i Serra *
3629d1b2987SEnric Balletbò i Serra * CPSW RGMII Internal Delay Mode is not supported in all PVT
3639d1b2987SEnric Balletbò i Serra * operating points. So we must set the TX clock delay feature
3649d1b2987SEnric Balletbò i Serra * in the AR8051 PHY. Since we only support a single ethernet
3659d1b2987SEnric Balletbò i Serra * device in U-Boot, we only do this for the first instance.
3669d1b2987SEnric Balletbò i Serra */
3679d1b2987SEnric Balletbò i Serra #define AR8051_PHY_DEBUG_ADDR_REG 0x1d
3689d1b2987SEnric Balletbò i Serra #define AR8051_PHY_DEBUG_DATA_REG 0x1e
3699d1b2987SEnric Balletbò i Serra #define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
3709d1b2987SEnric Balletbò i Serra #define AR8051_RGMII_TX_CLK_DLY 0x100
3719d1b2987SEnric Balletbò i Serra
3729d1b2987SEnric Balletbò i Serra #endif
3739d1b2987SEnric Balletbò i Serra #if defined(CONFIG_USB_ETHER) && \
3749d1b2987SEnric Balletbò i Serra (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT))
3759d1b2987SEnric Balletbò i Serra if (is_valid_ether_addr(mac_addr))
376fd1e959eSSimon Glass eth_env_set_enetaddr("usbnet_devaddr", mac_addr);
3779d1b2987SEnric Balletbò i Serra
3789d1b2987SEnric Balletbò i Serra rv = usb_eth_initialize(bis);
3799d1b2987SEnric Balletbò i Serra if (rv < 0)
3809d1b2987SEnric Balletbò i Serra printf("Error %d registering USB_ETHER\n", rv);
3819d1b2987SEnric Balletbò i Serra else
3829d1b2987SEnric Balletbò i Serra n += rv;
3839d1b2987SEnric Balletbò i Serra #endif
3849d1b2987SEnric Balletbò i Serra return n;
3859d1b2987SEnric Balletbò i Serra }
3869d1b2987SEnric Balletbò i Serra #endif
387