xref: /OK3568_Linux_fs/u-boot/board/siemens/draco/board.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Board functions for TI AM335X based draco board
3*4882a593Smuzhiyun  * (C) Copyright 2013 Siemens Schweiz AG
4*4882a593Smuzhiyun  * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Based on:
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Board functions for TI AM335X based boards
9*4882a593Smuzhiyun  * u-boot:/board/ti/am335x/board.c
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include <common.h>
17*4882a593Smuzhiyun #include <errno.h>
18*4882a593Smuzhiyun #include <spl.h>
19*4882a593Smuzhiyun #include <asm/arch/cpu.h>
20*4882a593Smuzhiyun #include <asm/arch/hardware.h>
21*4882a593Smuzhiyun #include <asm/arch/omap.h>
22*4882a593Smuzhiyun #include <asm/arch/ddr_defs.h>
23*4882a593Smuzhiyun #include <asm/arch/clock.h>
24*4882a593Smuzhiyun #include <asm/arch/gpio.h>
25*4882a593Smuzhiyun #include <asm/arch/mmc_host_def.h>
26*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
27*4882a593Smuzhiyun #include <asm/arch/mem.h>
28*4882a593Smuzhiyun #include <asm/io.h>
29*4882a593Smuzhiyun #include <asm/emif.h>
30*4882a593Smuzhiyun #include <asm/gpio.h>
31*4882a593Smuzhiyun #include <i2c.h>
32*4882a593Smuzhiyun #include <miiphy.h>
33*4882a593Smuzhiyun #include <cpsw.h>
34*4882a593Smuzhiyun #include <watchdog.h>
35*4882a593Smuzhiyun #include "board.h"
36*4882a593Smuzhiyun #include "../common/factoryset.h"
37*4882a593Smuzhiyun #include <nand.h>
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
42*4882a593Smuzhiyun static struct draco_baseboard_id __attribute__((section(".data"))) settings;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #if DDR_PLL_FREQ == 303
45*4882a593Smuzhiyun #if !defined(CONFIG_TARGET_ETAMIN)
46*4882a593Smuzhiyun /* Default@303MHz-i0 */
47*4882a593Smuzhiyun const struct ddr3_data ddr3_default = {
48*4882a593Smuzhiyun 	0x33524444, 0x56312e35, 0x0080, 0x0000, 0x003A, 0x003F, 0x009F,
49*4882a593Smuzhiyun 	0x0079, 0x0888A39B, 0x26517FDA, 0x501F84EF, 0x00100206, 0x61A44A32,
50*4882a593Smuzhiyun 	0x0000093B, 0x0000014A,
51*4882a593Smuzhiyun 	"default name @303MHz           \0",
52*4882a593Smuzhiyun 	"default marking                \0",
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun #else
55*4882a593Smuzhiyun /* etamin board */
56*4882a593Smuzhiyun const struct ddr3_data ddr3_default = {
57*4882a593Smuzhiyun 	0x33524444, 0x56312e36, 0x0080, 0x0000, 0x003A, 0x0010, 0x009F,
58*4882a593Smuzhiyun 	0x0050, 0x0888A39B, 0x266D7FDA, 0x501F86AF, 0x00100206, 0x61A44BB2,
59*4882a593Smuzhiyun 	0x0000093B, 0x0000018A,
60*4882a593Smuzhiyun 	"test-etamin                    \0",
61*4882a593Smuzhiyun 	"generic-8Gbit                  \0",
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun #endif
64*4882a593Smuzhiyun #elif DDR_PLL_FREQ == 400
65*4882a593Smuzhiyun /* Default@400MHz-i0 */
66*4882a593Smuzhiyun const struct ddr3_data ddr3_default = {
67*4882a593Smuzhiyun 	0x33524444, 0x56312e35, 0x0080, 0x0000, 0x0039, 0x0046, 0x00ab,
68*4882a593Smuzhiyun 	0x0080, 0x0AAAA4DB, 0x26307FDA, 0x501F821F, 0x00100207, 0x61A45232,
69*4882a593Smuzhiyun 	0x00000618, 0x0000014A,
70*4882a593Smuzhiyun 	"default name @400MHz           \0",
71*4882a593Smuzhiyun 	"default marking                \0",
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun #endif
74*4882a593Smuzhiyun 
set_default_ddr3_timings(void)75*4882a593Smuzhiyun static void set_default_ddr3_timings(void)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	printf("Set default DDR3 settings\n");
78*4882a593Smuzhiyun 	settings.ddr3 = ddr3_default;
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
print_ddr3_timings(void)81*4882a593Smuzhiyun static void print_ddr3_timings(void)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun 	printf("\nDDR3\n");
84*4882a593Smuzhiyun 	printf("clock:\t\t%d MHz\n", DDR_PLL_FREQ);
85*4882a593Smuzhiyun 	printf("device:\t\t%s\n", settings.ddr3.manu_name);
86*4882a593Smuzhiyun 	printf("marking:\t%s\n", settings.ddr3.manu_marking);
87*4882a593Smuzhiyun 	printf("%-20s, %-8s, %-8s, %-4s\n", "timing parameters", "eeprom",
88*4882a593Smuzhiyun 	       "default", "diff");
89*4882a593Smuzhiyun 	PRINTARGS(magic);
90*4882a593Smuzhiyun 	PRINTARGS(version);
91*4882a593Smuzhiyun 	PRINTARGS(ddr3_sratio);
92*4882a593Smuzhiyun 	PRINTARGS(iclkout);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	PRINTARGS(dt0rdsratio0);
95*4882a593Smuzhiyun 	PRINTARGS(dt0wdsratio0);
96*4882a593Smuzhiyun 	PRINTARGS(dt0fwsratio0);
97*4882a593Smuzhiyun 	PRINTARGS(dt0wrsratio0);
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	PRINTARGS(sdram_tim1);
100*4882a593Smuzhiyun 	PRINTARGS(sdram_tim2);
101*4882a593Smuzhiyun 	PRINTARGS(sdram_tim3);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	PRINTARGS(emif_ddr_phy_ctlr_1);
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	PRINTARGS(sdram_config);
106*4882a593Smuzhiyun 	PRINTARGS(ref_ctrl);
107*4882a593Smuzhiyun 	PRINTARGS(ioctr_val);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun 
print_chip_data(void)110*4882a593Smuzhiyun static void print_chip_data(void)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun 	struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
113*4882a593Smuzhiyun 	dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
114*4882a593Smuzhiyun 	printf("\nCPU BOARD\n");
115*4882a593Smuzhiyun 	printf("device: \t'%s'\n", settings.chip.sdevname);
116*4882a593Smuzhiyun 	printf("hw version: \t'%s'\n", settings.chip.shwver);
117*4882a593Smuzhiyun 	printf("max freq: \t%d MHz\n", dpll_mpu_opp100.m);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun #endif /* CONFIG_SPL_BUILD */
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #define AM335X_NAND_ECC_MASK 0x0f
122*4882a593Smuzhiyun #define AM335X_NAND_ECC_TYPE_16 0x02
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun static int ecc_type;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun struct am335x_nand_geometry {
127*4882a593Smuzhiyun 	u32 magic;
128*4882a593Smuzhiyun 	u8 nand_geo_addr;
129*4882a593Smuzhiyun 	u8 nand_geo_page;
130*4882a593Smuzhiyun 	u8 nand_bus;
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
draco_read_nand_geometry(void)133*4882a593Smuzhiyun static int draco_read_nand_geometry(void)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun 	struct am335x_nand_geometry geo;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	/* Read NAND geometry */
138*4882a593Smuzhiyun 	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0x80, 2,
139*4882a593Smuzhiyun 		     (uchar *)&geo, sizeof(struct am335x_nand_geometry))) {
140*4882a593Smuzhiyun 		printf("Could not read the NAND geomtery; something fundamentally wrong on the I2C bus.\n");
141*4882a593Smuzhiyun 		return -EIO;
142*4882a593Smuzhiyun 	}
143*4882a593Smuzhiyun 	if (geo.magic != 0xa657b310) {
144*4882a593Smuzhiyun 		printf("%s: bad magic: %x\n", __func__, geo.magic);
145*4882a593Smuzhiyun 		return -EFAULT;
146*4882a593Smuzhiyun 	}
147*4882a593Smuzhiyun 	if ((geo.nand_bus & AM335X_NAND_ECC_MASK) == AM335X_NAND_ECC_TYPE_16)
148*4882a593Smuzhiyun 		ecc_type = 16;
149*4882a593Smuzhiyun 	else
150*4882a593Smuzhiyun 		ecc_type = 8;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	return 0;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /*
156*4882a593Smuzhiyun  * Read header information from EEPROM into global structure.
157*4882a593Smuzhiyun  */
read_eeprom(void)158*4882a593Smuzhiyun static int read_eeprom(void)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun 	/* Check if baseboard eeprom is available */
161*4882a593Smuzhiyun 	if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
162*4882a593Smuzhiyun 		printf("Could not probe the EEPROM; something fundamentally wrong on the I2C bus.\n");
163*4882a593Smuzhiyun 		return 1;
164*4882a593Smuzhiyun 	}
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
167*4882a593Smuzhiyun 	/* Read Siemens eeprom data (DDR3) */
168*4882a593Smuzhiyun 	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, EEPROM_ADDR_DDR3, 2,
169*4882a593Smuzhiyun 		     (uchar *)&settings.ddr3, sizeof(struct ddr3_data))) {
170*4882a593Smuzhiyun 		printf("Could not read the EEPROM; something fundamentally wrong on the I2C bus.\nUse default DDR3 timings\n");
171*4882a593Smuzhiyun 		set_default_ddr3_timings();
172*4882a593Smuzhiyun 	}
173*4882a593Smuzhiyun 	/* Read Siemens eeprom data (CHIP) */
174*4882a593Smuzhiyun 	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, EEPROM_ADDR_CHIP, 2,
175*4882a593Smuzhiyun 		     (uchar *)&settings.chip, sizeof(settings.chip)))
176*4882a593Smuzhiyun 		printf("Could not read chip settings\n");
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	if (ddr3_default.magic == settings.ddr3.magic &&
179*4882a593Smuzhiyun 	    ddr3_default.version == settings.ddr3.version) {
180*4882a593Smuzhiyun 		printf("Using DDR3 settings from EEPROM\n");
181*4882a593Smuzhiyun 	} else {
182*4882a593Smuzhiyun 		if (ddr3_default.magic != settings.ddr3.magic)
183*4882a593Smuzhiyun 			printf("Warning: No valid DDR3 data in eeprom.\n");
184*4882a593Smuzhiyun 		if (ddr3_default.version != settings.ddr3.version)
185*4882a593Smuzhiyun 			printf("Warning: DDR3 data version does not match.\n");
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 		printf("Using default settings\n");
188*4882a593Smuzhiyun 		set_default_ddr3_timings();
189*4882a593Smuzhiyun 	}
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	if (MAGIC_CHIP == settings.chip.magic)
192*4882a593Smuzhiyun 		print_chip_data();
193*4882a593Smuzhiyun 	else
194*4882a593Smuzhiyun 		printf("Warning: No chip data in eeprom\n");
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	print_ddr3_timings();
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 	return draco_read_nand_geometry();
199*4882a593Smuzhiyun #endif
200*4882a593Smuzhiyun 	return 0;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #ifdef CONFIG_SPL_BUILD
board_init_ddr(void)204*4882a593Smuzhiyun static void board_init_ddr(void)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun struct emif_regs draco_ddr3_emif_reg_data = {
207*4882a593Smuzhiyun 	.zq_config = 0x50074BE4,
208*4882a593Smuzhiyun };
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun struct ddr_data draco_ddr3_data = {
211*4882a593Smuzhiyun };
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun struct cmd_control draco_ddr3_cmd_ctrl_data = {
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun struct ctrl_ioregs draco_ddr3_ioregs = {
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	/* pass values from eeprom */
220*4882a593Smuzhiyun 	draco_ddr3_emif_reg_data.sdram_tim1 = settings.ddr3.sdram_tim1;
221*4882a593Smuzhiyun 	draco_ddr3_emif_reg_data.sdram_tim2 = settings.ddr3.sdram_tim2;
222*4882a593Smuzhiyun 	draco_ddr3_emif_reg_data.sdram_tim3 = settings.ddr3.sdram_tim3;
223*4882a593Smuzhiyun 	draco_ddr3_emif_reg_data.emif_ddr_phy_ctlr_1 =
224*4882a593Smuzhiyun 		settings.ddr3.emif_ddr_phy_ctlr_1;
225*4882a593Smuzhiyun 	draco_ddr3_emif_reg_data.sdram_config = settings.ddr3.sdram_config;
226*4882a593Smuzhiyun 	draco_ddr3_emif_reg_data.sdram_config2 = 0x08000000;
227*4882a593Smuzhiyun 	draco_ddr3_emif_reg_data.ref_ctrl = settings.ddr3.ref_ctrl;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	draco_ddr3_data.datardsratio0 = settings.ddr3.dt0rdsratio0;
230*4882a593Smuzhiyun 	draco_ddr3_data.datawdsratio0 = settings.ddr3.dt0wdsratio0;
231*4882a593Smuzhiyun 	draco_ddr3_data.datafwsratio0 = settings.ddr3.dt0fwsratio0;
232*4882a593Smuzhiyun 	draco_ddr3_data.datawrsratio0 = settings.ddr3.dt0wrsratio0;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	draco_ddr3_cmd_ctrl_data.cmd0csratio = settings.ddr3.ddr3_sratio;
235*4882a593Smuzhiyun 	draco_ddr3_cmd_ctrl_data.cmd0iclkout = settings.ddr3.iclkout;
236*4882a593Smuzhiyun 	draco_ddr3_cmd_ctrl_data.cmd1csratio = settings.ddr3.ddr3_sratio;
237*4882a593Smuzhiyun 	draco_ddr3_cmd_ctrl_data.cmd1iclkout = settings.ddr3.iclkout;
238*4882a593Smuzhiyun 	draco_ddr3_cmd_ctrl_data.cmd2csratio = settings.ddr3.ddr3_sratio;
239*4882a593Smuzhiyun 	draco_ddr3_cmd_ctrl_data.cmd2iclkout = settings.ddr3.iclkout;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	draco_ddr3_ioregs.cm0ioctl = settings.ddr3.ioctr_val,
242*4882a593Smuzhiyun 	draco_ddr3_ioregs.cm1ioctl = settings.ddr3.ioctr_val,
243*4882a593Smuzhiyun 	draco_ddr3_ioregs.cm2ioctl = settings.ddr3.ioctr_val,
244*4882a593Smuzhiyun 	draco_ddr3_ioregs.dt0ioctl = settings.ddr3.ioctr_val,
245*4882a593Smuzhiyun 	draco_ddr3_ioregs.dt1ioctl = settings.ddr3.ioctr_val,
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	config_ddr(DDR_PLL_FREQ, &draco_ddr3_ioregs, &draco_ddr3_data,
248*4882a593Smuzhiyun 		   &draco_ddr3_cmd_ctrl_data, &draco_ddr3_emif_reg_data, 0);
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun 
spl_siemens_board_init(void)251*4882a593Smuzhiyun static void spl_siemens_board_init(void)
252*4882a593Smuzhiyun {
253*4882a593Smuzhiyun 	return;
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun #endif /* if def CONFIG_SPL_BUILD */
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun #ifdef CONFIG_BOARD_LATE_INIT
board_late_init(void)258*4882a593Smuzhiyun int board_late_init(void)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun 	int ret;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	ret = draco_read_nand_geometry();
263*4882a593Smuzhiyun 	if (ret != 0)
264*4882a593Smuzhiyun 		return ret;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	nand_curr_device = 0;
267*4882a593Smuzhiyun 	omap_nand_switch_ecc(1, ecc_type);
268*4882a593Smuzhiyun #ifdef CONFIG_TARGET_ETAMIN
269*4882a593Smuzhiyun 	nand_curr_device = 1;
270*4882a593Smuzhiyun 	omap_nand_switch_ecc(1, ecc_type);
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun #ifdef CONFIG_FACTORYSET
273*4882a593Smuzhiyun 	/* Set ASN in environment*/
274*4882a593Smuzhiyun 	if (factory_dat.asn[0] != 0) {
275*4882a593Smuzhiyun 		env_set("dtb_name", (char *)factory_dat.asn);
276*4882a593Smuzhiyun 	} else {
277*4882a593Smuzhiyun 		/* dtb suffix gets added in load script */
278*4882a593Smuzhiyun 		env_set("dtb_name", "am335x-draco");
279*4882a593Smuzhiyun 	}
280*4882a593Smuzhiyun #else
281*4882a593Smuzhiyun 	env_set("dtb_name", "am335x-draco");
282*4882a593Smuzhiyun #endif
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	return 0;
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun #endif
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
289*4882a593Smuzhiyun 	(defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
cpsw_control(int enabled)290*4882a593Smuzhiyun static void cpsw_control(int enabled)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun 	/* VTP can be added here */
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	return;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun static struct cpsw_slave_data cpsw_slaves[] = {
298*4882a593Smuzhiyun 	{
299*4882a593Smuzhiyun 		.slave_reg_ofs	= 0x208,
300*4882a593Smuzhiyun 		.sliver_reg_ofs	= 0xd80,
301*4882a593Smuzhiyun 		.phy_addr	= 0,
302*4882a593Smuzhiyun 		.phy_if		= PHY_INTERFACE_MODE_MII,
303*4882a593Smuzhiyun 	},
304*4882a593Smuzhiyun };
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun static struct cpsw_platform_data cpsw_data = {
307*4882a593Smuzhiyun 	.mdio_base		= CPSW_MDIO_BASE,
308*4882a593Smuzhiyun 	.cpsw_base		= CPSW_BASE,
309*4882a593Smuzhiyun 	.mdio_div		= 0xff,
310*4882a593Smuzhiyun 	.channels		= 4,
311*4882a593Smuzhiyun 	.cpdma_reg_ofs		= 0x800,
312*4882a593Smuzhiyun 	.slaves			= 1,
313*4882a593Smuzhiyun 	.slave_data		= cpsw_slaves,
314*4882a593Smuzhiyun 	.ale_reg_ofs		= 0xd00,
315*4882a593Smuzhiyun 	.ale_entries		= 1024,
316*4882a593Smuzhiyun 	.host_port_reg_ofs	= 0x108,
317*4882a593Smuzhiyun 	.hw_stats_reg_ofs	= 0x900,
318*4882a593Smuzhiyun 	.bd_ram_ofs		= 0x2000,
319*4882a593Smuzhiyun 	.mac_control		= (1 << 5),
320*4882a593Smuzhiyun 	.control		= cpsw_control,
321*4882a593Smuzhiyun 	.host_port_num		= 0,
322*4882a593Smuzhiyun 	.version		= CPSW_CTRL_VERSION_2,
323*4882a593Smuzhiyun };
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun #if defined(CONFIG_DRIVER_TI_CPSW) || \
326*4882a593Smuzhiyun 	(defined(CONFIG_USB_ETHER) && defined(CONFIG_USB_MUSB_GADGET))
board_eth_init(bd_t * bis)327*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun 	struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
330*4882a593Smuzhiyun 	int n = 0;
331*4882a593Smuzhiyun 	int rv;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	factoryset_env_set();
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	/* Set rgmii mode and enable rmii clock to be sourced from chip */
336*4882a593Smuzhiyun 	writel((RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE), &cdev->miisel);
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	rv = cpsw_register(&cpsw_data);
339*4882a593Smuzhiyun 	if (rv < 0)
340*4882a593Smuzhiyun 		printf("Error %d registering CPSW switch\n", rv);
341*4882a593Smuzhiyun 	else
342*4882a593Smuzhiyun 		n += rv;
343*4882a593Smuzhiyun 	return n;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun 
do_switch_reset(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])346*4882a593Smuzhiyun static int do_switch_reset(cmd_tbl_t *cmdtp, int flag, int argc,
347*4882a593Smuzhiyun 			  char *const argv[])
348*4882a593Smuzhiyun {
349*4882a593Smuzhiyun 	/* Reset SMSC LAN9303 switch for default configuration */
350*4882a593Smuzhiyun 	gpio_request(GPIO_LAN9303_NRST, "nRST");
351*4882a593Smuzhiyun 	gpio_direction_output(GPIO_LAN9303_NRST, 0);
352*4882a593Smuzhiyun 	/* assert active low reset for 200us */
353*4882a593Smuzhiyun 	udelay(200);
354*4882a593Smuzhiyun 	gpio_set_value(GPIO_LAN9303_NRST, 1);
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 	return 0;
357*4882a593Smuzhiyun };
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun U_BOOT_CMD(
360*4882a593Smuzhiyun 	switch_rst, CONFIG_SYS_MAXARGS, 1,	do_switch_reset,
361*4882a593Smuzhiyun 	"Reset LAN9303 switch via its reset pin",
362*4882a593Smuzhiyun 	""
363*4882a593Smuzhiyun );
364*4882a593Smuzhiyun #endif /* #if defined(CONFIG_DRIVER_TI_CPSW) */
365*4882a593Smuzhiyun #endif /* #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) */
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun #ifdef CONFIG_NAND_CS_INIT
368*4882a593Smuzhiyun /* GPMC definitions for second nand cs1 */
369*4882a593Smuzhiyun static const u32 gpmc_nand_config[] = {
370*4882a593Smuzhiyun 	ETAMIN_NAND_GPMC_CONFIG1,
371*4882a593Smuzhiyun 	ETAMIN_NAND_GPMC_CONFIG2,
372*4882a593Smuzhiyun 	ETAMIN_NAND_GPMC_CONFIG3,
373*4882a593Smuzhiyun 	ETAMIN_NAND_GPMC_CONFIG4,
374*4882a593Smuzhiyun 	ETAMIN_NAND_GPMC_CONFIG5,
375*4882a593Smuzhiyun 	ETAMIN_NAND_GPMC_CONFIG6,
376*4882a593Smuzhiyun 	/*CONFIG7- computed as params */
377*4882a593Smuzhiyun };
378*4882a593Smuzhiyun 
board_nand_cs_init(void)379*4882a593Smuzhiyun static void board_nand_cs_init(void)
380*4882a593Smuzhiyun {
381*4882a593Smuzhiyun 	enable_gpmc_cs_config(gpmc_nand_config, &gpmc_cfg->cs[1],
382*4882a593Smuzhiyun 			      0x18000000, GPMC_SIZE_16M);
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun #endif
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun #include "../common/board.c"
387