xref: /rk3399_rockchip-uboot/board/tcl/sl50/board.c (revision bfebc8c965e41d62dc6355d09bdd63ca57011b99)
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