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