xref: /rk3399_rockchip-uboot/board/overo/overo.c (revision 2ed43b549b8c40ab372b2be2d6f14be6bf89cb43)
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>
16b3f4ca11SSimon Glass #include <dm.h>
17b3f4ca11SSimon Glass #include <ns16550.h>
18df382626SOlof Johansson #include <netdev.h>
19127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h>
20137703b8SAndreas Müller #include <linux/mtd/nand.h>
21127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h>
22cd7c5726SSteve Sakoman #include <asm/arch/mmc_host_def.h>
23127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h>
24df382626SOlof Johansson #include <asm/arch/mem.h>
25127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h>
2684c3b631SSanjeev Premi #include <asm/gpio.h>
27127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h>
28127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include "overo.h"
29127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
30f5c30c1bSStefan Herbrechtsmeier #ifdef CONFIG_USB_EHCI
31f5c30c1bSStefan Herbrechtsmeier #include <usb.h>
32f5c30c1bSStefan Herbrechtsmeier #include <asm/ehci-omap.h>
33f5c30c1bSStefan Herbrechtsmeier #endif
34f5c30c1bSStefan Herbrechtsmeier 
3529565326SJohn Rigby DECLARE_GLOBAL_DATA_PTR;
3629565326SJohn Rigby 
37d64b5b89SSteve Sakoman #define TWL4030_I2C_BUS			0
38d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_BUS	2
39d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_ADDRESS	0x51
40d64b5b89SSteve Sakoman 
414ed914a2SStefan Herbrechtsmeier #define GUMSTIX_EMPTY_EEPROM		0x0
424ed914a2SStefan Herbrechtsmeier 
43d64b5b89SSteve Sakoman #define GUMSTIX_SUMMIT			0x01000200
44d64b5b89SSteve Sakoman #define GUMSTIX_TOBI			0x02000200
45d64b5b89SSteve Sakoman #define GUMSTIX_TOBI_DUO		0x03000200
46d64b5b89SSteve Sakoman #define GUMSTIX_PALO35			0x04000200
47d64b5b89SSteve Sakoman #define GUMSTIX_PALO43			0x05000200
48d64b5b89SSteve Sakoman #define GUMSTIX_CHESTNUT43		0x06000200
49d64b5b89SSteve Sakoman #define GUMSTIX_PINTO			0x07000200
50d64b5b89SSteve Sakoman #define GUMSTIX_GALLOP43		0x08000200
51ea5940e9SAsh Charles #define GUMSTIX_ALTO35			0x09000200
52ea5940e9SAsh Charles #define GUMSTIX_STAGECOACH		0x0A000200
53ea5940e9SAsh Charles #define GUMSTIX_THUMBO			0x0B000200
54ea5940e9SAsh Charles #define GUMSTIX_TURTLECORE		0x0C000200
55ea5940e9SAsh Charles #define GUMSTIX_ARBOR43C		0x0D000200
56d64b5b89SSteve Sakoman 
57d64b5b89SSteve Sakoman #define ETTUS_USRP_E			0x01000300
58d64b5b89SSteve Sakoman 
59d64b5b89SSteve Sakoman #define GUMSTIX_NO_EEPROM		0xffffffff
60d64b5b89SSteve Sakoman 
61d64b5b89SSteve Sakoman static struct {
62d64b5b89SSteve Sakoman 	unsigned int device_vendor;
63d64b5b89SSteve Sakoman 	unsigned char revision;
64d64b5b89SSteve Sakoman 	unsigned char content;
65d64b5b89SSteve Sakoman 	char fab_revision[8];
66d64b5b89SSteve Sakoman 	char env_var[16];
67d64b5b89SSteve Sakoman 	char env_setting[64];
684ed914a2SStefan Herbrechtsmeier } expansion_config = {0x0};
69ba9a11e4SSteve Sakoman 
70b3f4ca11SSimon Glass static const struct ns16550_platdata overo_serial = {
71b3f4ca11SSimon Glass 	OMAP34XX_UART3,
72b3f4ca11SSimon Glass 	2,
73b3f4ca11SSimon Glass 	V_NS16550_CLK
74b3f4ca11SSimon Glass };
75b3f4ca11SSimon Glass 
76b3f4ca11SSimon Glass U_BOOT_DEVICE(overo_uart) = {
77b3f4ca11SSimon Glass 	"serial_omap",
78b3f4ca11SSimon Glass 	&overo_serial
79b3f4ca11SSimon Glass };
80b3f4ca11SSimon Glass 
81127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
82127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: board_init
83127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Early hardware init.
84127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
85127f9ae5SJean-Christophe PLAGNIOL-VILLARD int board_init(void)
86127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
87127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
88127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	/* board id for Linux */
89127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_arch_number = MACH_TYPE_OVERO;
90127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	/* boot param addr */
91127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
92127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
93127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	return 0;
94127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
95127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
96127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
97c2d5b341SSteve Sakoman  * Routine: get_board_revision
98c2d5b341SSteve Sakoman  * Description: Returns the board revision
99c2d5b341SSteve Sakoman  */
100c2d5b341SSteve Sakoman int get_board_revision(void)
101c2d5b341SSteve Sakoman {
102c2d5b341SSteve Sakoman 	int revision;
103c2d5b341SSteve Sakoman 
1046789e84eSHeiko Schocher #ifdef CONFIG_SYS_I2C_OMAP34XX
105137703b8SAndreas Müller 	unsigned char data;
106137703b8SAndreas Müller 
107137703b8SAndreas Müller 	/* board revisions <= R2410 connect 4030 irq_1 to gpio112             */
108137703b8SAndreas Müller 	/* these boards should return a revision number of 0                  */
109137703b8SAndreas Müller 	/* the code below forces a 4030 RTC irq to ensure that gpio112 is low */
110137703b8SAndreas Müller 	i2c_set_bus_num(TWL4030_I2C_BUS);
111137703b8SAndreas Müller 	data = 0x01;
112137703b8SAndreas Müller 	i2c_write(0x4B, 0x29, 1, &data, 1);
113137703b8SAndreas Müller 	data = 0x0c;
114137703b8SAndreas Müller 	i2c_write(0x4B, 0x2b, 1, &data, 1);
115137703b8SAndreas Müller 	i2c_read(0x4B, 0x2a, 1, &data, 1);
116137703b8SAndreas Müller #endif
117137703b8SAndreas Müller 
11884c3b631SSanjeev Premi 	if (!gpio_request(112, "") &&
11984c3b631SSanjeev Premi 	    !gpio_request(113, "") &&
12084c3b631SSanjeev Premi 	    !gpio_request(115, "")) {
121c2d5b341SSteve Sakoman 
12284c3b631SSanjeev Premi 		gpio_direction_input(112);
12384c3b631SSanjeev Premi 		gpio_direction_input(113);
12484c3b631SSanjeev Premi 		gpio_direction_input(115);
125c2d5b341SSteve Sakoman 
12684c3b631SSanjeev Premi 		revision = gpio_get_value(115) << 2 |
12784c3b631SSanjeev Premi 			   gpio_get_value(113) << 1 |
12884c3b631SSanjeev Premi 			   gpio_get_value(112);
129c2d5b341SSteve Sakoman 	} else {
130bae485dbSAndreas Müller 		puts("Error: unable to acquire board revision GPIOs\n");
131c2d5b341SSteve Sakoman 		revision = -1;
132c2d5b341SSteve Sakoman 	}
133c2d5b341SSteve Sakoman 
134c2d5b341SSteve Sakoman 	return revision;
135c2d5b341SSteve Sakoman }
136c2d5b341SSteve Sakoman 
137137703b8SAndreas Müller #ifdef CONFIG_SPL_BUILD
138137703b8SAndreas Müller /*
139137703b8SAndreas Müller  * Routine: get_board_mem_timings
140137703b8SAndreas Müller  * Description: If we use SPL then there is no x-loader nor config header
141137703b8SAndreas Müller  * so we have to setup the DDR timings ourself on both banks.
142137703b8SAndreas Müller  */
1438c4445d2SPeter Barada void get_board_mem_timings(struct board_sdrc_timings *timings)
144137703b8SAndreas Müller {
1458c4445d2SPeter Barada 	timings->mr = MICRON_V_MR_165;
146137703b8SAndreas Müller 	switch (get_board_revision()) {
147137703b8SAndreas Müller 	case REVISION_0: /* Micron 1286MB/256MB, 1/2 banks of 128MB */
1488c4445d2SPeter Barada 		timings->mcfg = MICRON_V_MCFG_165(128 << 20);
1498c4445d2SPeter Barada 		timings->ctrla = MICRON_V_ACTIMA_165;
1508c4445d2SPeter Barada 		timings->ctrlb = MICRON_V_ACTIMB_165;
1518c4445d2SPeter Barada 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz;
152137703b8SAndreas Müller 		break;
153137703b8SAndreas Müller 	case REVISION_1: /* Micron 256MB/512MB, 1/2 banks of 256MB */
154be4cc457SAsh Charles 	case REVISION_4:
155802b3c7cSAsh Charles 		timings->mcfg = MICRON_V_MCFG_200(256 << 20);
156802b3c7cSAsh Charles 		timings->ctrla = MICRON_V_ACTIMA_200;
157802b3c7cSAsh Charles 		timings->ctrlb = MICRON_V_ACTIMB_200;
158802b3c7cSAsh Charles 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
159137703b8SAndreas Müller 		break;
160137703b8SAndreas Müller 	case REVISION_2: /* Hynix 256MB/512MB, 1/2 banks of 256MB */
161802b3c7cSAsh Charles 		timings->mcfg = HYNIX_V_MCFG_200(256 << 20);
162802b3c7cSAsh Charles 		timings->ctrla = HYNIX_V_ACTIMA_200;
163802b3c7cSAsh Charles 		timings->ctrlb = HYNIX_V_ACTIMB_200;
164802b3c7cSAsh Charles 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
165137703b8SAndreas Müller 		break;
16649720a4bSSteve Sakoman 	case REVISION_3: /* Micron 512MB/1024MB, 1/2 banks of 512MB */
16749720a4bSSteve Sakoman 		timings->mcfg = MCFG(512 << 20, 15);
16849720a4bSSteve Sakoman 		timings->ctrla = MICRON_V_ACTIMA_200;
16949720a4bSSteve Sakoman 		timings->ctrlb = MICRON_V_ACTIMB_200;
17049720a4bSSteve Sakoman 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
17149720a4bSSteve Sakoman 		break;
172137703b8SAndreas Müller 	default:
1738c4445d2SPeter Barada 		timings->mcfg = MICRON_V_MCFG_165(128 << 20);
1748c4445d2SPeter Barada 		timings->ctrla = MICRON_V_ACTIMA_165;
1758c4445d2SPeter Barada 		timings->ctrlb = MICRON_V_ACTIMB_165;
1768c4445d2SPeter Barada 		timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz;
177137703b8SAndreas Müller 	}
178137703b8SAndreas Müller }
179137703b8SAndreas Müller #endif
180137703b8SAndreas Müller 
181c2d5b341SSteve Sakoman /*
182a06e1629SSteve Sakoman  * Routine: get_sdio2_config
183a06e1629SSteve Sakoman  * Description: Return information about the wifi module connection
184a06e1629SSteve Sakoman  *              Returns 0 if the module connects though a level translator
185a06e1629SSteve Sakoman  *              Returns 1 if the module connects directly
186a06e1629SSteve Sakoman  */
187a06e1629SSteve Sakoman int get_sdio2_config(void)
188a06e1629SSteve Sakoman {
189a06e1629SSteve Sakoman 	int sdio_direct;
190a06e1629SSteve Sakoman 
19184c3b631SSanjeev Premi 	if (!gpio_request(130, "") && !gpio_request(139, "")) {
192a06e1629SSteve Sakoman 
19384c3b631SSanjeev Premi 		gpio_direction_output(130, 0);
19484c3b631SSanjeev Premi 		gpio_direction_input(139);
195a06e1629SSteve Sakoman 
196a06e1629SSteve Sakoman 		sdio_direct = 1;
19784c3b631SSanjeev Premi 		gpio_set_value(130, 0);
19884c3b631SSanjeev Premi 		if (gpio_get_value(139) == 0) {
19984c3b631SSanjeev Premi 			gpio_set_value(130, 1);
20084c3b631SSanjeev Premi 			if (gpio_get_value(139) == 1)
201a06e1629SSteve Sakoman 				sdio_direct = 0;
202a06e1629SSteve Sakoman 		}
203a06e1629SSteve Sakoman 
204b5db0a06SJoe Hershberger 		gpio_direction_input(130);
205a06e1629SSteve Sakoman 	} else {
206bae485dbSAndreas Müller 		puts("Error: unable to acquire sdio2 clk GPIOs\n");
207a06e1629SSteve Sakoman 		sdio_direct = -1;
208a06e1629SSteve Sakoman 	}
209a06e1629SSteve Sakoman 
210a06e1629SSteve Sakoman 	return sdio_direct;
211a06e1629SSteve Sakoman }
212a06e1629SSteve Sakoman 
213a06e1629SSteve Sakoman /*
214d64b5b89SSteve Sakoman  * Routine: get_expansion_id
215d64b5b89SSteve Sakoman  * Description: This function checks for expansion board by checking I2C
216d64b5b89SSteve Sakoman  *		bus 2 for the availability of an AT24C01B serial EEPROM.
217d64b5b89SSteve Sakoman  *		returns the device_vendor field from the EEPROM
218d64b5b89SSteve Sakoman  */
219d64b5b89SSteve Sakoman unsigned int get_expansion_id(void)
220d64b5b89SSteve Sakoman {
2214ed914a2SStefan Herbrechtsmeier 	if (expansion_config.device_vendor != 0x0)
2224ed914a2SStefan Herbrechtsmeier 		return expansion_config.device_vendor;
2234ed914a2SStefan Herbrechtsmeier 
224d64b5b89SSteve Sakoman 	i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS);
225d64b5b89SSteve Sakoman 
226d64b5b89SSteve Sakoman 	/* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */
227d64b5b89SSteve Sakoman 	if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) {
228d64b5b89SSteve Sakoman 		i2c_set_bus_num(TWL4030_I2C_BUS);
229d64b5b89SSteve Sakoman 		return GUMSTIX_NO_EEPROM;
230d64b5b89SSteve Sakoman 	}
231d64b5b89SSteve Sakoman 
232d64b5b89SSteve Sakoman 	/* read configuration data */
233d64b5b89SSteve Sakoman 	i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config,
234d64b5b89SSteve Sakoman 		 sizeof(expansion_config));
235d64b5b89SSteve Sakoman 
236d64b5b89SSteve Sakoman 	i2c_set_bus_num(TWL4030_I2C_BUS);
237d64b5b89SSteve Sakoman 
238d64b5b89SSteve Sakoman 	return expansion_config.device_vendor;
239d64b5b89SSteve Sakoman }
240d64b5b89SSteve Sakoman 
241d64b5b89SSteve Sakoman /*
242127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: misc_init_r
243127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Configure board specific parts
244127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
245127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void)
246127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
247ea5940e9SAsh Charles 	unsigned int expansion_id;
248ea5940e9SAsh Charles 
249127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	twl4030_power_init();
250ead39d7aSGrazvydas Ignotas 	twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON);
251127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
252c2d5b341SSteve Sakoman 	printf("Board revision: %d\n", get_board_revision());
253a06e1629SSteve Sakoman 
254a06e1629SSteve Sakoman 	switch (get_sdio2_config()) {
255a06e1629SSteve Sakoman 	case 0:
256bae485dbSAndreas Müller 		puts("Tranceiver detected on mmc2\n");
257a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_TRANSCEIVER();
258a06e1629SSteve Sakoman 		break;
259a06e1629SSteve Sakoman 	case 1:
260bae485dbSAndreas Müller 		puts("Direct connection on mmc2\n");
261a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_DIRECT();
262a06e1629SSteve Sakoman 		break;
263a06e1629SSteve Sakoman 	default:
264bae485dbSAndreas Müller 		puts("Unable to detect mmc2 connection type\n");
265a06e1629SSteve Sakoman 	}
266a06e1629SSteve Sakoman 
267ea5940e9SAsh Charles 	expansion_id = get_expansion_id();
268ea5940e9SAsh Charles 	switch (expansion_id) {
269d64b5b89SSteve Sakoman 	case GUMSTIX_SUMMIT:
270d64b5b89SSteve Sakoman 		printf("Recognized Summit expansion board (rev %d %s)\n",
271d64b5b89SSteve Sakoman 			expansion_config.revision,
272d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2734ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
274d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
27512cc5437SAsh Charles 		setenv("expansionname", "summit");
276d64b5b89SSteve Sakoman 		break;
277d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI:
278d64b5b89SSteve Sakoman 		printf("Recognized Tobi expansion board (rev %d %s)\n",
279d64b5b89SSteve Sakoman 			expansion_config.revision,
280d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2814ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
282d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
28312cc5437SAsh Charles 		setenv("expansionname", "tobi");
284d64b5b89SSteve Sakoman 		break;
285d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI_DUO:
286d64b5b89SSteve Sakoman 		printf("Recognized Tobi Duo expansion board (rev %d %s)\n",
287d64b5b89SSteve Sakoman 			expansion_config.revision,
288d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2894ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
29072c7be95SArun Bharadwaj 		setenv("expansionname", "tobiduo");
291d64b5b89SSteve Sakoman 		break;
292d64b5b89SSteve Sakoman 	case GUMSTIX_PALO35:
293d64b5b89SSteve Sakoman 		printf("Recognized Palo35 expansion board (rev %d %s)\n",
294d64b5b89SSteve Sakoman 			expansion_config.revision,
295d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2964ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
297d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd35");
298*2ed43b54SAsh Charles 		setenv("expansionname", "palo35");
299d64b5b89SSteve Sakoman 		break;
300d64b5b89SSteve Sakoman 	case GUMSTIX_PALO43:
301d64b5b89SSteve Sakoman 		printf("Recognized Palo43 expansion board (rev %d %s)\n",
302d64b5b89SSteve Sakoman 			expansion_config.revision,
303d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
3044ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
305d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
30612cc5437SAsh Charles 		setenv("expansionname", "palo43");
307d64b5b89SSteve Sakoman 		break;
308d64b5b89SSteve Sakoman 	case GUMSTIX_CHESTNUT43:
309d64b5b89SSteve Sakoman 		printf("Recognized Chestnut43 expansion board (rev %d %s)\n",
310d64b5b89SSteve Sakoman 			expansion_config.revision,
311d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
3124ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
313d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
31412cc5437SAsh Charles 		setenv("expansionname", "chestnut43");
315d64b5b89SSteve Sakoman 		break;
316d64b5b89SSteve Sakoman 	case GUMSTIX_PINTO:
317d64b5b89SSteve Sakoman 		printf("Recognized Pinto expansion board (rev %d %s)\n",
318d64b5b89SSteve Sakoman 			expansion_config.revision,
319d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
3204ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
321d64b5b89SSteve Sakoman 		break;
322d64b5b89SSteve Sakoman 	case GUMSTIX_GALLOP43:
323d64b5b89SSteve Sakoman 		printf("Recognized Gallop43 expansion board (rev %d %s)\n",
324d64b5b89SSteve Sakoman 			expansion_config.revision,
325d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
3264ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
327d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
32812cc5437SAsh Charles 		setenv("expansionname", "gallop43");
329d64b5b89SSteve Sakoman 		break;
330ea5940e9SAsh Charles 	case GUMSTIX_ALTO35:
331ea5940e9SAsh Charles 		printf("Recognized Alto35 expansion board (rev %d %s)\n",
332ea5940e9SAsh Charles 			expansion_config.revision,
333ea5940e9SAsh Charles 			expansion_config.fab_revision);
3344ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
335ea5940e9SAsh Charles 		MUX_ALTO35();
336ea5940e9SAsh Charles 		setenv("defaultdisplay", "lcd35");
33712cc5437SAsh Charles 		setenv("expansionname", "alto35");
338ea5940e9SAsh Charles 		break;
339ea5940e9SAsh Charles 	case GUMSTIX_STAGECOACH:
340ea5940e9SAsh Charles 		printf("Recognized Stagecoach expansion board (rev %d %s)\n",
341ea5940e9SAsh Charles 			expansion_config.revision,
342ea5940e9SAsh Charles 			expansion_config.fab_revision);
3434ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
344ea5940e9SAsh Charles 		break;
345ea5940e9SAsh Charles 	case GUMSTIX_THUMBO:
346ea5940e9SAsh Charles 		printf("Recognized Thumbo expansion board (rev %d %s)\n",
347ea5940e9SAsh Charles 			expansion_config.revision,
348ea5940e9SAsh Charles 			expansion_config.fab_revision);
3494ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
350ea5940e9SAsh Charles 		break;
351ea5940e9SAsh Charles 	case GUMSTIX_TURTLECORE:
352ea5940e9SAsh Charles 		printf("Recognized Turtlecore expansion board (rev %d %s)\n",
353ea5940e9SAsh Charles 			expansion_config.revision,
354ea5940e9SAsh Charles 			expansion_config.fab_revision);
3554ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
356ea5940e9SAsh Charles 		break;
357ea5940e9SAsh Charles 	case GUMSTIX_ARBOR43C:
358ea5940e9SAsh Charles 		printf("Recognized Arbor43C expansion board (rev %d %s)\n",
359ea5940e9SAsh Charles 			expansion_config.revision,
360ea5940e9SAsh Charles 			expansion_config.fab_revision);
3614ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
362ea5940e9SAsh Charles 		MUX_ARBOR43C();
363ea5940e9SAsh Charles 		setenv("defaultdisplay", "lcd43");
364da9ed5abSAsh Charles 		setenv("expansionname", "arbor43c");
365ea5940e9SAsh Charles 		break;
366d64b5b89SSteve Sakoman 	case ETTUS_USRP_E:
367d64b5b89SSteve Sakoman 		printf("Recognized Ettus Research USRP-E (rev %d %s)\n",
368d64b5b89SSteve Sakoman 			expansion_config.revision,
369d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
3704ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
371d64b5b89SSteve Sakoman 		MUX_USRP_E();
372d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
373d64b5b89SSteve Sakoman 		break;
374d64b5b89SSteve Sakoman 	case GUMSTIX_NO_EEPROM:
3754ed914a2SStefan Herbrechtsmeier 	case GUMSTIX_EMPTY_EEPROM:
3764ed914a2SStefan Herbrechtsmeier 		puts("No or empty EEPROM on expansion board\n");
3774ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
37812cc5437SAsh Charles 		setenv("expansionname", "tobi");
379d64b5b89SSteve Sakoman 		break;
380d64b5b89SSteve Sakoman 	default:
381ea5940e9SAsh Charles 		printf("Unrecognized expansion board 0x%08x\n", expansion_id);
382ea5940e9SAsh Charles 		break;
383d64b5b89SSteve Sakoman 	}
384d64b5b89SSteve Sakoman 
385d64b5b89SSteve Sakoman 	if (expansion_config.content == 1)
386d64b5b89SSteve Sakoman 		setenv(expansion_config.env_var, expansion_config.env_setting);
387d64b5b89SSteve Sakoman 
388127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	dieid_num_r();
389127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
39012cc5437SAsh Charles 	if (get_cpu_family() == CPU_OMAP34XX)
39112cc5437SAsh Charles 		setenv("boardname", "overo");
39212cc5437SAsh Charles 	else
39312cc5437SAsh Charles 		setenv("boardname", "overo-storm");
39412cc5437SAsh Charles 
395127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	return 0;
396127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
397127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
398127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
399127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: set_muxconf_regs
400127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Setting up the configuration Mux registers specific to the
401127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *		hardware. Many pins need to be moved from protect to primary
402127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *		mode.
403127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
404127f9ae5SJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void)
405127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
406127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	MUX_OVERO();
407127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
408df382626SOlof Johansson 
409113429a2SStefan Herbrechtsmeier #if defined(CONFIG_CMD_NET) && !defined(CONFIG_SPL_BUILD)
410113429a2SStefan Herbrechtsmeier /* GPMC definitions for LAN9221 chips on Tobi expansion boards */
411113429a2SStefan Herbrechtsmeier static const u32 gpmc_lan_config[] = {
412113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG1,
413113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG2,
414113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG3,
415113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG4,
416113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG5,
417113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG6,
418113429a2SStefan Herbrechtsmeier 	/*CONFIG7- computed as params */
419113429a2SStefan Herbrechtsmeier };
420113429a2SStefan Herbrechtsmeier 
421df382626SOlof Johansson /*
422df382626SOlof Johansson  * Routine: setup_net_chip
423df382626SOlof Johansson  * Description: Setting up the configuration GPMC registers specific to the
424df382626SOlof Johansson  *	      Ethernet hardware.
425df382626SOlof Johansson  */
426df382626SOlof Johansson static void setup_net_chip(void)
427df382626SOlof Johansson {
428df382626SOlof Johansson 	struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
429df382626SOlof Johansson 
430df382626SOlof Johansson 	/* Enable off mode for NWE in PADCONF_GPMC_NWE register */
431df382626SOlof Johansson 	writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe);
432df382626SOlof Johansson 	/* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */
433df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe);
434df382626SOlof Johansson 	/* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */
435df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00,
436df382626SOlof Johansson 		&ctrl_base->gpmc_nadv_ale);
437113429a2SStefan Herbrechtsmeier }
438df382626SOlof Johansson 
439113429a2SStefan Herbrechtsmeier /*
440113429a2SStefan Herbrechtsmeier  * Routine: reset_net_chip
441113429a2SStefan Herbrechtsmeier  * Description: Reset the Ethernet hardware.
442113429a2SStefan Herbrechtsmeier  */
443113429a2SStefan Herbrechtsmeier static void reset_net_chip(void)
444113429a2SStefan Herbrechtsmeier {
445df382626SOlof Johansson 	/* Make GPIO 64 as output pin and send a magic pulse through it */
44684c3b631SSanjeev Premi 	if (!gpio_request(64, "")) {
44784c3b631SSanjeev Premi 		gpio_direction_output(64, 0);
44884c3b631SSanjeev Premi 		gpio_set_value(64, 1);
449df382626SOlof Johansson 		udelay(1);
45084c3b631SSanjeev Premi 		gpio_set_value(64, 0);
451df382626SOlof Johansson 		udelay(1);
45284c3b631SSanjeev Premi 		gpio_set_value(64, 1);
453df382626SOlof Johansson 	}
454df382626SOlof Johansson }
455df382626SOlof Johansson 
456df382626SOlof Johansson int board_eth_init(bd_t *bis)
457df382626SOlof Johansson {
458113429a2SStefan Herbrechtsmeier 	unsigned int expansion_id;
459df382626SOlof Johansson 	int rc = 0;
460113429a2SStefan Herbrechtsmeier 
461df382626SOlof Johansson #ifdef CONFIG_SMC911X
462113429a2SStefan Herbrechtsmeier 	expansion_id = get_expansion_id();
463113429a2SStefan Herbrechtsmeier 	switch (expansion_id) {
464113429a2SStefan Herbrechtsmeier 	case GUMSTIX_TOBI_DUO:
465113429a2SStefan Herbrechtsmeier 		/* second lan chip */
466113429a2SStefan Herbrechtsmeier 		enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4],
467113429a2SStefan Herbrechtsmeier 				      0x2B000000, GPMC_SIZE_16M);
468113429a2SStefan Herbrechtsmeier 		/* no break */
469113429a2SStefan Herbrechtsmeier 	case GUMSTIX_TOBI:
470113429a2SStefan Herbrechtsmeier 	case GUMSTIX_CHESTNUT43:
471113429a2SStefan Herbrechtsmeier 	case GUMSTIX_STAGECOACH:
472113429a2SStefan Herbrechtsmeier 	case GUMSTIX_NO_EEPROM:
473113429a2SStefan Herbrechtsmeier 	case GUMSTIX_EMPTY_EEPROM:
474113429a2SStefan Herbrechtsmeier 		/* first lan chip */
475113429a2SStefan Herbrechtsmeier 		enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5],
476113429a2SStefan Herbrechtsmeier 				      0x2C000000, GPMC_SIZE_16M);
477113429a2SStefan Herbrechtsmeier 
478113429a2SStefan Herbrechtsmeier 		setup_net_chip();
479113429a2SStefan Herbrechtsmeier 		reset_net_chip();
480113429a2SStefan Herbrechtsmeier 
481df382626SOlof Johansson 		rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
482113429a2SStefan Herbrechtsmeier 		break;
483113429a2SStefan Herbrechtsmeier 	default:
484113429a2SStefan Herbrechtsmeier 		break;
485113429a2SStefan Herbrechtsmeier 	}
486df382626SOlof Johansson #endif
487113429a2SStefan Herbrechtsmeier 
488df382626SOlof Johansson 	return rc;
489df382626SOlof Johansson }
490113429a2SStefan Herbrechtsmeier #endif
491cd7c5726SSteve Sakoman 
492137703b8SAndreas Müller #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
493cd7c5726SSteve Sakoman int board_mmc_init(bd_t *bis)
494cd7c5726SSteve Sakoman {
495e3913f56SNikita Kiryanov 	return omap_mmc_init(0, 0, 0, -1, -1);
496cd7c5726SSteve Sakoman }
497cd7c5726SSteve Sakoman #endif
498f5c30c1bSStefan Herbrechtsmeier 
499aac5450eSPaul Kocialkowski #if defined(CONFIG_GENERIC_MMC)
500aac5450eSPaul Kocialkowski void board_mmc_power_init(void)
501aac5450eSPaul Kocialkowski {
502aac5450eSPaul Kocialkowski 	twl4030_power_mmc_init(0);
503aac5450eSPaul Kocialkowski }
504aac5450eSPaul Kocialkowski #endif
505aac5450eSPaul Kocialkowski 
506f5c30c1bSStefan Herbrechtsmeier #if defined(CONFIG_USB_EHCI) &&  !defined(CONFIG_SPL_BUILD)
507f5c30c1bSStefan Herbrechtsmeier static struct omap_usbhs_board_data usbhs_bdata = {
508f5c30c1bSStefan Herbrechtsmeier 	.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
509f5c30c1bSStefan Herbrechtsmeier 	.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
510f5c30c1bSStefan Herbrechtsmeier 	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED
511f5c30c1bSStefan Herbrechtsmeier };
512f5c30c1bSStefan Herbrechtsmeier 
513f5c30c1bSStefan Herbrechtsmeier #define GUMSTIX_GPIO_USBH_CPEN		168
514f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_init(int index, enum usb_init_type init,
515f5c30c1bSStefan Herbrechtsmeier 		  struct ehci_hccr **hccr, struct ehci_hcor **hcor)
516f5c30c1bSStefan Herbrechtsmeier {
517f5c30c1bSStefan Herbrechtsmeier 	/* Enable USB power */
518f5c30c1bSStefan Herbrechtsmeier 	if (!gpio_request(GUMSTIX_GPIO_USBH_CPEN, "usbh_cpen"))
519f5c30c1bSStefan Herbrechtsmeier 		gpio_direction_output(GUMSTIX_GPIO_USBH_CPEN, 1);
520f5c30c1bSStefan Herbrechtsmeier 
521f5c30c1bSStefan Herbrechtsmeier 	return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
522f5c30c1bSStefan Herbrechtsmeier }
523f5c30c1bSStefan Herbrechtsmeier 
524f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_stop(void)
525f5c30c1bSStefan Herbrechtsmeier {
526f5c30c1bSStefan Herbrechtsmeier 	/* Disable USB power */
527f5c30c1bSStefan Herbrechtsmeier 	gpio_set_value(GUMSTIX_GPIO_USBH_CPEN, 0);
528f5c30c1bSStefan Herbrechtsmeier 	gpio_free(GUMSTIX_GPIO_USBH_CPEN);
529f5c30c1bSStefan Herbrechtsmeier 
530f5c30c1bSStefan Herbrechtsmeier 	return omap_ehci_hcd_stop();
531f5c30c1bSStefan Herbrechtsmeier }
532f5c30c1bSStefan Herbrechtsmeier 
533f5c30c1bSStefan Herbrechtsmeier #endif /* CONFIG_USB_EHCI */
534