xref: /rk3399_rockchip-uboot/board/overo/overo.c (revision be4cc457b5fd8b14363a777c8d54fd78e649e127)
1127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
2127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Maintainer : Steve Sakoman <steve@sakoman.com>
3127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *
4127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Derived from Beagle Board, 3430 SDP, and OMAP3EVM code by
5127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *	Richard Woodruff <r-woodruff2@ti.com>
6127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *	Syed Mohammed Khasim <khasim@ti.com>
7127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *	Sunil Kumar <sunilsaini05@gmail.com>
8127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *	Shashi Ranjan <shashiranjanmca05@gmail.com>
9127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *
10127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2004-2008
11127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Texas Instruments, <www.ti.com>
12127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *
131a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
14127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
15127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <common.h>
16df382626SOlof Johansson #include <netdev.h>
17127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h>
18137703b8SAndreas Müller #include <linux/mtd/nand.h>
19127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h>
20cd7c5726SSteve Sakoman #include <asm/arch/mmc_host_def.h>
21127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h>
22df382626SOlof Johansson #include <asm/arch/mem.h>
23127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h>
2484c3b631SSanjeev Premi #include <asm/gpio.h>
25127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h>
26127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include "overo.h"
27127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
2829565326SJohn Rigby DECLARE_GLOBAL_DATA_PTR;
2929565326SJohn Rigby 
30d64b5b89SSteve Sakoman #define TWL4030_I2C_BUS			0
31d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_BUS	2
32d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_ADDRESS	0x51
33d64b5b89SSteve Sakoman 
34d64b5b89SSteve Sakoman #define GUMSTIX_SUMMIT			0x01000200
35d64b5b89SSteve Sakoman #define GUMSTIX_TOBI			0x02000200
36d64b5b89SSteve Sakoman #define GUMSTIX_TOBI_DUO		0x03000200
37d64b5b89SSteve Sakoman #define GUMSTIX_PALO35			0x04000200
38d64b5b89SSteve Sakoman #define GUMSTIX_PALO43			0x05000200
39d64b5b89SSteve Sakoman #define GUMSTIX_CHESTNUT43		0x06000200
40d64b5b89SSteve Sakoman #define GUMSTIX_PINTO			0x07000200
41d64b5b89SSteve Sakoman #define GUMSTIX_GALLOP43		0x08000200
42d64b5b89SSteve Sakoman 
43d64b5b89SSteve Sakoman #define ETTUS_USRP_E			0x01000300
44d64b5b89SSteve Sakoman 
45d64b5b89SSteve Sakoman #define GUMSTIX_NO_EEPROM		0xffffffff
46d64b5b89SSteve Sakoman 
47d64b5b89SSteve Sakoman static struct {
48d64b5b89SSteve Sakoman 	unsigned int device_vendor;
49d64b5b89SSteve Sakoman 	unsigned char revision;
50d64b5b89SSteve Sakoman 	unsigned char content;
51d64b5b89SSteve Sakoman 	char fab_revision[8];
52d64b5b89SSteve Sakoman 	char env_var[16];
53d64b5b89SSteve Sakoman 	char env_setting[64];
54d64b5b89SSteve Sakoman } expansion_config;
55d64b5b89SSteve Sakoman 
56df382626SOlof Johansson #if defined(CONFIG_CMD_NET)
57df382626SOlof Johansson static void setup_net_chip(void);
58df382626SOlof Johansson #endif
59df382626SOlof Johansson 
60ba9a11e4SSteve Sakoman /* GPMC definitions for LAN9221 chips on Tobi expansion boards */
61ba9a11e4SSteve Sakoman static const u32 gpmc_lan_config[] = {
62ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG1,
63ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG2,
64ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG3,
65ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG4,
66ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG5,
67ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG6,
68ba9a11e4SSteve Sakoman     /*CONFIG7- computed as params */
69ba9a11e4SSteve Sakoman };
70ba9a11e4SSteve Sakoman 
71127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
72127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: board_init
73127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Early hardware init.
74127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
75127f9ae5SJean-Christophe PLAGNIOL-VILLARD int board_init(void)
76127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
77127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
78127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	/* board id for Linux */
79127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_arch_number = MACH_TYPE_OVERO;
80127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	/* boot param addr */
81127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
82127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
83127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	return 0;
84127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
85127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
86127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
87c2d5b341SSteve Sakoman  * Routine: get_board_revision
88c2d5b341SSteve Sakoman  * Description: Returns the board revision
89c2d5b341SSteve Sakoman  */
90c2d5b341SSteve Sakoman int get_board_revision(void)
91c2d5b341SSteve Sakoman {
92c2d5b341SSteve Sakoman 	int revision;
93c2d5b341SSteve Sakoman 
946789e84eSHeiko Schocher #ifdef CONFIG_SYS_I2C_OMAP34XX
95137703b8SAndreas Müller 	unsigned char data;
96137703b8SAndreas Müller 
97137703b8SAndreas Müller 	/* board revisions <= R2410 connect 4030 irq_1 to gpio112             */
98137703b8SAndreas Müller 	/* these boards should return a revision number of 0                  */
99137703b8SAndreas Müller 	/* the code below forces a 4030 RTC irq to ensure that gpio112 is low */
100137703b8SAndreas Müller 	i2c_set_bus_num(TWL4030_I2C_BUS);
101137703b8SAndreas Müller 	data = 0x01;
102137703b8SAndreas Müller 	i2c_write(0x4B, 0x29, 1, &data, 1);
103137703b8SAndreas Müller 	data = 0x0c;
104137703b8SAndreas Müller 	i2c_write(0x4B, 0x2b, 1, &data, 1);
105137703b8SAndreas Müller 	i2c_read(0x4B, 0x2a, 1, &data, 1);
106137703b8SAndreas Müller #endif
107137703b8SAndreas Müller 
10884c3b631SSanjeev Premi 	if (!gpio_request(112, "") &&
10984c3b631SSanjeev Premi 	    !gpio_request(113, "") &&
11084c3b631SSanjeev Premi 	    !gpio_request(115, "")) {
111c2d5b341SSteve Sakoman 
11284c3b631SSanjeev Premi 		gpio_direction_input(112);
11384c3b631SSanjeev Premi 		gpio_direction_input(113);
11484c3b631SSanjeev Premi 		gpio_direction_input(115);
115c2d5b341SSteve Sakoman 
11684c3b631SSanjeev Premi 		revision = gpio_get_value(115) << 2 |
11784c3b631SSanjeev Premi 			   gpio_get_value(113) << 1 |
11884c3b631SSanjeev Premi 			   gpio_get_value(112);
119c2d5b341SSteve Sakoman 	} else {
120bae485dbSAndreas Müller 		puts("Error: unable to acquire board revision GPIOs\n");
121c2d5b341SSteve Sakoman 		revision = -1;
122c2d5b341SSteve Sakoman 	}
123c2d5b341SSteve Sakoman 
124c2d5b341SSteve Sakoman 	return revision;
125c2d5b341SSteve Sakoman }
126c2d5b341SSteve Sakoman 
127137703b8SAndreas Müller #ifdef CONFIG_SPL_BUILD
128137703b8SAndreas Müller /*
129137703b8SAndreas Müller  * Routine: get_board_mem_timings
130137703b8SAndreas Müller  * Description: If we use SPL then there is no x-loader nor config header
131137703b8SAndreas Müller  * so we have to setup the DDR timings ourself on both banks.
132137703b8SAndreas Müller  */
1338c4445d2SPeter Barada void get_board_mem_timings(struct board_sdrc_timings *timings)
134137703b8SAndreas Müller {
1358c4445d2SPeter Barada 	timings->mr = MICRON_V_MR_165;
136137703b8SAndreas Müller 	switch (get_board_revision()) {
137137703b8SAndreas Müller 	case REVISION_0: /* Micron 1286MB/256MB, 1/2 banks of 128MB */
1388c4445d2SPeter Barada 		timings->mcfg = MICRON_V_MCFG_165(128 << 20);
1398c4445d2SPeter Barada 		timings->ctrla = MICRON_V_ACTIMA_165;
1408c4445d2SPeter Barada 		timings->ctrlb = MICRON_V_ACTIMB_165;
1418c4445d2SPeter Barada 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz;
142137703b8SAndreas Müller 		break;
143137703b8SAndreas Müller 	case REVISION_1: /* Micron 256MB/512MB, 1/2 banks of 256MB */
144*be4cc457SAsh Charles 	case REVISION_4:
145802b3c7cSAsh Charles 		timings->mcfg = MICRON_V_MCFG_200(256 << 20);
146802b3c7cSAsh Charles 		timings->ctrla = MICRON_V_ACTIMA_200;
147802b3c7cSAsh Charles 		timings->ctrlb = MICRON_V_ACTIMB_200;
148802b3c7cSAsh Charles 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
149137703b8SAndreas Müller 		break;
150137703b8SAndreas Müller 	case REVISION_2: /* Hynix 256MB/512MB, 1/2 banks of 256MB */
151802b3c7cSAsh Charles 		timings->mcfg = HYNIX_V_MCFG_200(256 << 20);
152802b3c7cSAsh Charles 		timings->ctrla = HYNIX_V_ACTIMA_200;
153802b3c7cSAsh Charles 		timings->ctrlb = HYNIX_V_ACTIMB_200;
154802b3c7cSAsh Charles 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
155137703b8SAndreas Müller 		break;
15649720a4bSSteve Sakoman 	case REVISION_3: /* Micron 512MB/1024MB, 1/2 banks of 512MB */
15749720a4bSSteve Sakoman 		timings->mcfg = MCFG(512 << 20, 15);
15849720a4bSSteve Sakoman 		timings->ctrla = MICRON_V_ACTIMA_200;
15949720a4bSSteve Sakoman 		timings->ctrlb = MICRON_V_ACTIMB_200;
16049720a4bSSteve Sakoman 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
16149720a4bSSteve Sakoman 		break;
162137703b8SAndreas Müller 	default:
1638c4445d2SPeter Barada 		timings->mcfg = MICRON_V_MCFG_165(128 << 20);
1648c4445d2SPeter Barada 		timings->ctrla = MICRON_V_ACTIMA_165;
1658c4445d2SPeter Barada 		timings->ctrlb = MICRON_V_ACTIMB_165;
1668c4445d2SPeter Barada 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz;
167137703b8SAndreas Müller 	}
168137703b8SAndreas Müller }
169137703b8SAndreas Müller #endif
170137703b8SAndreas Müller 
171c2d5b341SSteve Sakoman /*
172a06e1629SSteve Sakoman  * Routine: get_sdio2_config
173a06e1629SSteve Sakoman  * Description: Return information about the wifi module connection
174a06e1629SSteve Sakoman  *              Returns 0 if the module connects though a level translator
175a06e1629SSteve Sakoman  *              Returns 1 if the module connects directly
176a06e1629SSteve Sakoman  */
177a06e1629SSteve Sakoman int get_sdio2_config(void)
178a06e1629SSteve Sakoman {
179a06e1629SSteve Sakoman 	int sdio_direct;
180a06e1629SSteve Sakoman 
18184c3b631SSanjeev Premi 	if (!gpio_request(130, "") && !gpio_request(139, "")) {
182a06e1629SSteve Sakoman 
18384c3b631SSanjeev Premi 		gpio_direction_output(130, 0);
18484c3b631SSanjeev Premi 		gpio_direction_input(139);
185a06e1629SSteve Sakoman 
186a06e1629SSteve Sakoman 		sdio_direct = 1;
18784c3b631SSanjeev Premi 		gpio_set_value(130, 0);
18884c3b631SSanjeev Premi 		if (gpio_get_value(139) == 0) {
18984c3b631SSanjeev Premi 			gpio_set_value(130, 1);
19084c3b631SSanjeev Premi 			if (gpio_get_value(139) == 1)
191a06e1629SSteve Sakoman 				sdio_direct = 0;
192a06e1629SSteve Sakoman 		}
193a06e1629SSteve Sakoman 
194b5db0a06SJoe Hershberger 		gpio_direction_input(130);
195a06e1629SSteve Sakoman 	} else {
196bae485dbSAndreas Müller 		puts("Error: unable to acquire sdio2 clk GPIOs\n");
197a06e1629SSteve Sakoman 		sdio_direct = -1;
198a06e1629SSteve Sakoman 	}
199a06e1629SSteve Sakoman 
200a06e1629SSteve Sakoman 	return sdio_direct;
201a06e1629SSteve Sakoman }
202a06e1629SSteve Sakoman 
203a06e1629SSteve Sakoman /*
204d64b5b89SSteve Sakoman  * Routine: get_expansion_id
205d64b5b89SSteve Sakoman  * Description: This function checks for expansion board by checking I2C
206d64b5b89SSteve Sakoman  *		bus 2 for the availability of an AT24C01B serial EEPROM.
207d64b5b89SSteve Sakoman  *		returns the device_vendor field from the EEPROM
208d64b5b89SSteve Sakoman  */
209d64b5b89SSteve Sakoman unsigned int get_expansion_id(void)
210d64b5b89SSteve Sakoman {
211d64b5b89SSteve Sakoman 	i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS);
212d64b5b89SSteve Sakoman 
213d64b5b89SSteve Sakoman 	/* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */
214d64b5b89SSteve Sakoman 	if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) {
215d64b5b89SSteve Sakoman 		i2c_set_bus_num(TWL4030_I2C_BUS);
216d64b5b89SSteve Sakoman 		return GUMSTIX_NO_EEPROM;
217d64b5b89SSteve Sakoman 	}
218d64b5b89SSteve Sakoman 
219d64b5b89SSteve Sakoman 	/* read configuration data */
220d64b5b89SSteve Sakoman 	i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config,
221d64b5b89SSteve Sakoman 		 sizeof(expansion_config));
222d64b5b89SSteve Sakoman 
223d64b5b89SSteve Sakoman 	i2c_set_bus_num(TWL4030_I2C_BUS);
224d64b5b89SSteve Sakoman 
225d64b5b89SSteve Sakoman 	return expansion_config.device_vendor;
226d64b5b89SSteve Sakoman }
227d64b5b89SSteve Sakoman 
228d64b5b89SSteve Sakoman /*
229127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: misc_init_r
230127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Configure board specific parts
231127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
232127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void)
233127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
234127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	twl4030_power_init();
235ead39d7aSGrazvydas Ignotas 	twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON);
236127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
237df382626SOlof Johansson #if defined(CONFIG_CMD_NET)
238df382626SOlof Johansson 	setup_net_chip();
239df382626SOlof Johansson #endif
240df382626SOlof Johansson 
241c2d5b341SSteve Sakoman 	printf("Board revision: %d\n", get_board_revision());
242a06e1629SSteve Sakoman 
243a06e1629SSteve Sakoman 	switch (get_sdio2_config()) {
244a06e1629SSteve Sakoman 	case 0:
245bae485dbSAndreas Müller 		puts("Tranceiver detected on mmc2\n");
246a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_TRANSCEIVER();
247a06e1629SSteve Sakoman 		break;
248a06e1629SSteve Sakoman 	case 1:
249bae485dbSAndreas Müller 		puts("Direct connection on mmc2\n");
250a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_DIRECT();
251a06e1629SSteve Sakoman 		break;
252a06e1629SSteve Sakoman 	default:
253bae485dbSAndreas Müller 		puts("Unable to detect mmc2 connection type\n");
254a06e1629SSteve Sakoman 	}
255a06e1629SSteve Sakoman 
256d64b5b89SSteve Sakoman 	switch (get_expansion_id()) {
257d64b5b89SSteve Sakoman 	case GUMSTIX_SUMMIT:
258d64b5b89SSteve Sakoman 		printf("Recognized Summit expansion board (rev %d %s)\n",
259d64b5b89SSteve Sakoman 			expansion_config.revision,
260d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
261d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
262d64b5b89SSteve Sakoman 		break;
263d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI:
264d64b5b89SSteve Sakoman 		printf("Recognized Tobi expansion board (rev %d %s)\n",
265d64b5b89SSteve Sakoman 			expansion_config.revision,
266d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
267d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
268d64b5b89SSteve Sakoman 		break;
269d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI_DUO:
270d64b5b89SSteve Sakoman 		printf("Recognized Tobi Duo expansion board (rev %d %s)\n",
271d64b5b89SSteve Sakoman 			expansion_config.revision,
272d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2738f7109b3SPhilip Balister 		/* second lan chip */
2748f7109b3SPhilip Balister 		enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4],
2758f7109b3SPhilip Balister 		    0x2B000000, GPMC_SIZE_16M);
276d64b5b89SSteve Sakoman 		break;
277d64b5b89SSteve Sakoman 	case GUMSTIX_PALO35:
278d64b5b89SSteve Sakoman 		printf("Recognized Palo35 expansion board (rev %d %s)\n",
279d64b5b89SSteve Sakoman 			expansion_config.revision,
280d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
281d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd35");
282d64b5b89SSteve Sakoman 		break;
283d64b5b89SSteve Sakoman 	case GUMSTIX_PALO43:
284d64b5b89SSteve Sakoman 		printf("Recognized Palo43 expansion board (rev %d %s)\n",
285d64b5b89SSteve Sakoman 			expansion_config.revision,
286d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
287d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
288d64b5b89SSteve Sakoman 		break;
289d64b5b89SSteve Sakoman 	case GUMSTIX_CHESTNUT43:
290d64b5b89SSteve Sakoman 		printf("Recognized Chestnut43 expansion board (rev %d %s)\n",
291d64b5b89SSteve Sakoman 			expansion_config.revision,
292d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
293d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
294d64b5b89SSteve Sakoman 		break;
295d64b5b89SSteve Sakoman 	case GUMSTIX_PINTO:
296d64b5b89SSteve Sakoman 		printf("Recognized Pinto expansion board (rev %d %s)\n",
297d64b5b89SSteve Sakoman 			expansion_config.revision,
298d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
299d64b5b89SSteve Sakoman 		break;
300d64b5b89SSteve Sakoman 	case GUMSTIX_GALLOP43:
301d64b5b89SSteve Sakoman 		printf("Recognized Gallop43 expansion board (rev %d %s)\n",
302d64b5b89SSteve Sakoman 			expansion_config.revision,
303d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
304d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
305d64b5b89SSteve Sakoman 		break;
306d64b5b89SSteve Sakoman 	case ETTUS_USRP_E:
307d64b5b89SSteve Sakoman 		printf("Recognized Ettus Research USRP-E (rev %d %s)\n",
308d64b5b89SSteve Sakoman 			expansion_config.revision,
309d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
310d64b5b89SSteve Sakoman 		MUX_USRP_E();
311d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
312d64b5b89SSteve Sakoman 		break;
313d64b5b89SSteve Sakoman 	case GUMSTIX_NO_EEPROM:
314bae485dbSAndreas Müller 		puts("No EEPROM on expansion board\n");
315d64b5b89SSteve Sakoman 		break;
316d64b5b89SSteve Sakoman 	default:
317bae485dbSAndreas Müller 		puts("Unrecognized expansion board\n");
318d64b5b89SSteve Sakoman 	}
319d64b5b89SSteve Sakoman 
320d64b5b89SSteve Sakoman 	if (expansion_config.content == 1)
321d64b5b89SSteve Sakoman 		setenv(expansion_config.env_var, expansion_config.env_setting);
322d64b5b89SSteve Sakoman 
323127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	dieid_num_r();
324127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
325127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	return 0;
326127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
327127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
328127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
329127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: set_muxconf_regs
330127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Setting up the configuration Mux registers specific to the
331127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *		hardware. Many pins need to be moved from protect to primary
332127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *		mode.
333127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
334127f9ae5SJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void)
335127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
336127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	MUX_OVERO();
337127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
338df382626SOlof Johansson 
339df382626SOlof Johansson #if defined(CONFIG_CMD_NET)
340df382626SOlof Johansson /*
341df382626SOlof Johansson  * Routine: setup_net_chip
342df382626SOlof Johansson  * Description: Setting up the configuration GPMC registers specific to the
343df382626SOlof Johansson  *	      Ethernet hardware.
344df382626SOlof Johansson  */
345df382626SOlof Johansson static void setup_net_chip(void)
346df382626SOlof Johansson {
347df382626SOlof Johansson 	struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
348df382626SOlof Johansson 
349ba9a11e4SSteve Sakoman 	/* first lan chip */
350ba9a11e4SSteve Sakoman 	enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5], 0x2C000000,
351ba9a11e4SSteve Sakoman 			GPMC_SIZE_16M);
352ba9a11e4SSteve Sakoman 
353df382626SOlof Johansson 	/* Enable off mode for NWE in PADCONF_GPMC_NWE register */
354df382626SOlof Johansson 	writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe);
355df382626SOlof Johansson 	/* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */
356df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe);
357df382626SOlof Johansson 	/* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */
358df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00,
359df382626SOlof Johansson 		&ctrl_base->gpmc_nadv_ale);
360df382626SOlof Johansson 
361df382626SOlof Johansson 	/* Make GPIO 64 as output pin and send a magic pulse through it */
36284c3b631SSanjeev Premi 	if (!gpio_request(64, "")) {
36384c3b631SSanjeev Premi 		gpio_direction_output(64, 0);
36484c3b631SSanjeev Premi 		gpio_set_value(64, 1);
365df382626SOlof Johansson 		udelay(1);
36684c3b631SSanjeev Premi 		gpio_set_value(64, 0);
367df382626SOlof Johansson 		udelay(1);
36884c3b631SSanjeev Premi 		gpio_set_value(64, 1);
369df382626SOlof Johansson 	}
370df382626SOlof Johansson }
371df382626SOlof Johansson #endif
372df382626SOlof Johansson 
373df382626SOlof Johansson int board_eth_init(bd_t *bis)
374df382626SOlof Johansson {
375df382626SOlof Johansson 	int rc = 0;
376df382626SOlof Johansson #ifdef CONFIG_SMC911X
377df382626SOlof Johansson 	rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
378df382626SOlof Johansson #endif
379df382626SOlof Johansson 	return rc;
380df382626SOlof Johansson }
381cd7c5726SSteve Sakoman 
382137703b8SAndreas Müller #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
383cd7c5726SSteve Sakoman int board_mmc_init(bd_t *bis)
384cd7c5726SSteve Sakoman {
385e3913f56SNikita Kiryanov 	return omap_mmc_init(0, 0, 0, -1, -1);
386cd7c5726SSteve Sakoman }
387cd7c5726SSteve Sakoman #endif
388