xref: /rk3399_rockchip-uboot/board/overo/overo.c (revision c7b9686d5d482c8e952598841ea467e6ec0ec0de)
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) = {
77*c7b9686dSThomas Chou 	"ns16550_serial",
78b3f4ca11SSimon Glass 	&overo_serial
79b3f4ca11SSimon Glass };
80b3f4ca11SSimon Glass 
81127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
82a06e1629SSteve Sakoman  * Routine: get_sdio2_config
83a06e1629SSteve Sakoman  * Description: Return information about the wifi module connection
84a06e1629SSteve Sakoman  *              Returns 0 if the module connects though a level translator
85a06e1629SSteve Sakoman  *              Returns 1 if the module connects directly
86a06e1629SSteve Sakoman  */
87a06e1629SSteve Sakoman int get_sdio2_config(void)
88a06e1629SSteve Sakoman {
89a06e1629SSteve Sakoman 	int sdio_direct;
90a06e1629SSteve Sakoman 
9184c3b631SSanjeev Premi 	if (!gpio_request(130, "") && !gpio_request(139, "")) {
92a06e1629SSteve Sakoman 
9384c3b631SSanjeev Premi 		gpio_direction_output(130, 0);
9484c3b631SSanjeev Premi 		gpio_direction_input(139);
95a06e1629SSteve Sakoman 
96a06e1629SSteve Sakoman 		sdio_direct = 1;
9784c3b631SSanjeev Premi 		gpio_set_value(130, 0);
9884c3b631SSanjeev Premi 		if (gpio_get_value(139) == 0) {
9984c3b631SSanjeev Premi 			gpio_set_value(130, 1);
10084c3b631SSanjeev Premi 			if (gpio_get_value(139) == 1)
101a06e1629SSteve Sakoman 				sdio_direct = 0;
102a06e1629SSteve Sakoman 		}
103a06e1629SSteve Sakoman 
104b5db0a06SJoe Hershberger 		gpio_direction_input(130);
105a06e1629SSteve Sakoman 	} else {
106bae485dbSAndreas Müller 		puts("Error: unable to acquire sdio2 clk GPIOs\n");
107a06e1629SSteve Sakoman 		sdio_direct = -1;
108a06e1629SSteve Sakoman 	}
109a06e1629SSteve Sakoman 
110a06e1629SSteve Sakoman 	return sdio_direct;
111a06e1629SSteve Sakoman }
112a06e1629SSteve Sakoman 
113a06e1629SSteve Sakoman /*
114d64b5b89SSteve Sakoman  * Routine: get_expansion_id
115d64b5b89SSteve Sakoman  * Description: This function checks for expansion board by checking I2C
116d64b5b89SSteve Sakoman  *		bus 2 for the availability of an AT24C01B serial EEPROM.
117d64b5b89SSteve Sakoman  *		returns the device_vendor field from the EEPROM
118d64b5b89SSteve Sakoman  */
119d64b5b89SSteve Sakoman unsigned int get_expansion_id(void)
120d64b5b89SSteve Sakoman {
1214ed914a2SStefan Herbrechtsmeier 	if (expansion_config.device_vendor != 0x0)
1224ed914a2SStefan Herbrechtsmeier 		return expansion_config.device_vendor;
1234ed914a2SStefan Herbrechtsmeier 
124d64b5b89SSteve Sakoman 	i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS);
125d64b5b89SSteve Sakoman 
126d64b5b89SSteve Sakoman 	/* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */
127d64b5b89SSteve Sakoman 	if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) {
128d64b5b89SSteve Sakoman 		i2c_set_bus_num(TWL4030_I2C_BUS);
129d64b5b89SSteve Sakoman 		return GUMSTIX_NO_EEPROM;
130d64b5b89SSteve Sakoman 	}
131d64b5b89SSteve Sakoman 
132d64b5b89SSteve Sakoman 	/* read configuration data */
133d64b5b89SSteve Sakoman 	i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config,
134d64b5b89SSteve Sakoman 		 sizeof(expansion_config));
135d64b5b89SSteve Sakoman 
136d64b5b89SSteve Sakoman 	i2c_set_bus_num(TWL4030_I2C_BUS);
137d64b5b89SSteve Sakoman 
138d64b5b89SSteve Sakoman 	return expansion_config.device_vendor;
139d64b5b89SSteve Sakoman }
140d64b5b89SSteve Sakoman 
141d64b5b89SSteve Sakoman /*
142127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: misc_init_r
143127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Configure board specific parts
144127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
145127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void)
146127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
147ea5940e9SAsh Charles 	unsigned int expansion_id;
148ea5940e9SAsh Charles 
149127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	twl4030_power_init();
150ead39d7aSGrazvydas Ignotas 	twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON);
151127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
152c2d5b341SSteve Sakoman 	printf("Board revision: %d\n", get_board_revision());
153a06e1629SSteve Sakoman 
154a06e1629SSteve Sakoman 	switch (get_sdio2_config()) {
155a06e1629SSteve Sakoman 	case 0:
156bae485dbSAndreas Müller 		puts("Tranceiver detected on mmc2\n");
157a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_TRANSCEIVER();
158a06e1629SSteve Sakoman 		break;
159a06e1629SSteve Sakoman 	case 1:
160bae485dbSAndreas Müller 		puts("Direct connection on mmc2\n");
161a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_DIRECT();
162a06e1629SSteve Sakoman 		break;
163a06e1629SSteve Sakoman 	default:
164bae485dbSAndreas Müller 		puts("Unable to detect mmc2 connection type\n");
165a06e1629SSteve Sakoman 	}
166a06e1629SSteve Sakoman 
167ea5940e9SAsh Charles 	expansion_id = get_expansion_id();
168ea5940e9SAsh Charles 	switch (expansion_id) {
169d64b5b89SSteve Sakoman 	case GUMSTIX_SUMMIT:
170d64b5b89SSteve Sakoman 		printf("Recognized Summit expansion board (rev %d %s)\n",
171d64b5b89SSteve Sakoman 			expansion_config.revision,
172d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
1734ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
174d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
17512cc5437SAsh Charles 		setenv("expansionname", "summit");
176d64b5b89SSteve Sakoman 		break;
177d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI:
178d64b5b89SSteve Sakoman 		printf("Recognized Tobi expansion board (rev %d %s)\n",
179d64b5b89SSteve Sakoman 			expansion_config.revision,
180d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
1814ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
182d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
18312cc5437SAsh Charles 		setenv("expansionname", "tobi");
184d64b5b89SSteve Sakoman 		break;
185d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI_DUO:
186d64b5b89SSteve Sakoman 		printf("Recognized Tobi Duo expansion board (rev %d %s)\n",
187d64b5b89SSteve Sakoman 			expansion_config.revision,
188d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
1894ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
19072c7be95SArun Bharadwaj 		setenv("expansionname", "tobiduo");
191d64b5b89SSteve Sakoman 		break;
192d64b5b89SSteve Sakoman 	case GUMSTIX_PALO35:
193d64b5b89SSteve Sakoman 		printf("Recognized Palo35 expansion board (rev %d %s)\n",
194d64b5b89SSteve Sakoman 			expansion_config.revision,
195d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
1964ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
197d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd35");
1982ed43b54SAsh Charles 		setenv("expansionname", "palo35");
199d64b5b89SSteve Sakoman 		break;
200d64b5b89SSteve Sakoman 	case GUMSTIX_PALO43:
201d64b5b89SSteve Sakoman 		printf("Recognized Palo43 expansion board (rev %d %s)\n",
202d64b5b89SSteve Sakoman 			expansion_config.revision,
203d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2044ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
205d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
20612cc5437SAsh Charles 		setenv("expansionname", "palo43");
207d64b5b89SSteve Sakoman 		break;
208d64b5b89SSteve Sakoman 	case GUMSTIX_CHESTNUT43:
209d64b5b89SSteve Sakoman 		printf("Recognized Chestnut43 expansion board (rev %d %s)\n",
210d64b5b89SSteve Sakoman 			expansion_config.revision,
211d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2124ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
213d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
21412cc5437SAsh Charles 		setenv("expansionname", "chestnut43");
215d64b5b89SSteve Sakoman 		break;
216d64b5b89SSteve Sakoman 	case GUMSTIX_PINTO:
217d64b5b89SSteve Sakoman 		printf("Recognized Pinto expansion board (rev %d %s)\n",
218d64b5b89SSteve Sakoman 			expansion_config.revision,
219d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2204ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
221d64b5b89SSteve Sakoman 		break;
222d64b5b89SSteve Sakoman 	case GUMSTIX_GALLOP43:
223d64b5b89SSteve Sakoman 		printf("Recognized Gallop43 expansion board (rev %d %s)\n",
224d64b5b89SSteve Sakoman 			expansion_config.revision,
225d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2264ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
227d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
22812cc5437SAsh Charles 		setenv("expansionname", "gallop43");
229d64b5b89SSteve Sakoman 		break;
230ea5940e9SAsh Charles 	case GUMSTIX_ALTO35:
231ea5940e9SAsh Charles 		printf("Recognized Alto35 expansion board (rev %d %s)\n",
232ea5940e9SAsh Charles 			expansion_config.revision,
233ea5940e9SAsh Charles 			expansion_config.fab_revision);
2344ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
235ea5940e9SAsh Charles 		MUX_ALTO35();
236ea5940e9SAsh Charles 		setenv("defaultdisplay", "lcd35");
23712cc5437SAsh Charles 		setenv("expansionname", "alto35");
238ea5940e9SAsh Charles 		break;
239ea5940e9SAsh Charles 	case GUMSTIX_STAGECOACH:
240ea5940e9SAsh Charles 		printf("Recognized Stagecoach expansion board (rev %d %s)\n",
241ea5940e9SAsh Charles 			expansion_config.revision,
242ea5940e9SAsh Charles 			expansion_config.fab_revision);
2434ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
244ea5940e9SAsh Charles 		break;
245ea5940e9SAsh Charles 	case GUMSTIX_THUMBO:
246ea5940e9SAsh Charles 		printf("Recognized Thumbo expansion board (rev %d %s)\n",
247ea5940e9SAsh Charles 			expansion_config.revision,
248ea5940e9SAsh Charles 			expansion_config.fab_revision);
2494ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
250ea5940e9SAsh Charles 		break;
251ea5940e9SAsh Charles 	case GUMSTIX_TURTLECORE:
252ea5940e9SAsh Charles 		printf("Recognized Turtlecore expansion board (rev %d %s)\n",
253ea5940e9SAsh Charles 			expansion_config.revision,
254ea5940e9SAsh Charles 			expansion_config.fab_revision);
2554ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
256ea5940e9SAsh Charles 		break;
257ea5940e9SAsh Charles 	case GUMSTIX_ARBOR43C:
258ea5940e9SAsh Charles 		printf("Recognized Arbor43C expansion board (rev %d %s)\n",
259ea5940e9SAsh Charles 			expansion_config.revision,
260ea5940e9SAsh Charles 			expansion_config.fab_revision);
2614ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
262ea5940e9SAsh Charles 		MUX_ARBOR43C();
263ea5940e9SAsh Charles 		setenv("defaultdisplay", "lcd43");
264da9ed5abSAsh Charles 		setenv("expansionname", "arbor43c");
265ea5940e9SAsh Charles 		break;
266d64b5b89SSteve Sakoman 	case ETTUS_USRP_E:
267d64b5b89SSteve Sakoman 		printf("Recognized Ettus Research USRP-E (rev %d %s)\n",
268d64b5b89SSteve Sakoman 			expansion_config.revision,
269d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2704ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
271d64b5b89SSteve Sakoman 		MUX_USRP_E();
272d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
273d64b5b89SSteve Sakoman 		break;
274d64b5b89SSteve Sakoman 	case GUMSTIX_NO_EEPROM:
2754ed914a2SStefan Herbrechtsmeier 	case GUMSTIX_EMPTY_EEPROM:
2764ed914a2SStefan Herbrechtsmeier 		puts("No or empty EEPROM on expansion board\n");
2774ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
27812cc5437SAsh Charles 		setenv("expansionname", "tobi");
279d64b5b89SSteve Sakoman 		break;
280d64b5b89SSteve Sakoman 	default:
281ea5940e9SAsh Charles 		printf("Unrecognized expansion board 0x%08x\n", expansion_id);
282ea5940e9SAsh Charles 		break;
283d64b5b89SSteve Sakoman 	}
284d64b5b89SSteve Sakoman 
285d64b5b89SSteve Sakoman 	if (expansion_config.content == 1)
286d64b5b89SSteve Sakoman 		setenv(expansion_config.env_var, expansion_config.env_setting);
287d64b5b89SSteve Sakoman 
288679f82c3SPaul Kocialkowski 	omap_die_id_display();
289127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
29012cc5437SAsh Charles 	if (get_cpu_family() == CPU_OMAP34XX)
29112cc5437SAsh Charles 		setenv("boardname", "overo");
29212cc5437SAsh Charles 	else
29312cc5437SAsh Charles 		setenv("boardname", "overo-storm");
29412cc5437SAsh Charles 
295127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	return 0;
296127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
297127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
298fe5d488fSArun Bharadwaj #if defined(CONFIG_CMD_NET)
299113429a2SStefan Herbrechtsmeier /* GPMC definitions for LAN9221 chips on Tobi expansion boards */
300113429a2SStefan Herbrechtsmeier static const u32 gpmc_lan_config[] = {
301113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG1,
302113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG2,
303113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG3,
304113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG4,
305113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG5,
306113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG6,
307113429a2SStefan Herbrechtsmeier 	/*CONFIG7- computed as params */
308113429a2SStefan Herbrechtsmeier };
309113429a2SStefan Herbrechtsmeier 
310df382626SOlof Johansson /*
311df382626SOlof Johansson  * Routine: setup_net_chip
312df382626SOlof Johansson  * Description: Setting up the configuration GPMC registers specific to the
313df382626SOlof Johansson  *	      Ethernet hardware.
314df382626SOlof Johansson  */
315df382626SOlof Johansson static void setup_net_chip(void)
316df382626SOlof Johansson {
317df382626SOlof Johansson 	struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
318df382626SOlof Johansson 
319df382626SOlof Johansson 	/* Enable off mode for NWE in PADCONF_GPMC_NWE register */
320df382626SOlof Johansson 	writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe);
321df382626SOlof Johansson 	/* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */
322df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe);
323df382626SOlof Johansson 	/* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */
324df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00,
325df382626SOlof Johansson 		&ctrl_base->gpmc_nadv_ale);
326113429a2SStefan Herbrechtsmeier }
327df382626SOlof Johansson 
328113429a2SStefan Herbrechtsmeier /*
329113429a2SStefan Herbrechtsmeier  * Routine: reset_net_chip
330113429a2SStefan Herbrechtsmeier  * Description: Reset the Ethernet hardware.
331113429a2SStefan Herbrechtsmeier  */
332113429a2SStefan Herbrechtsmeier static void reset_net_chip(void)
333113429a2SStefan Herbrechtsmeier {
334df382626SOlof Johansson 	/* Make GPIO 64 as output pin and send a magic pulse through it */
33584c3b631SSanjeev Premi 	if (!gpio_request(64, "")) {
33684c3b631SSanjeev Premi 		gpio_direction_output(64, 0);
33784c3b631SSanjeev Premi 		gpio_set_value(64, 1);
338df382626SOlof Johansson 		udelay(1);
33984c3b631SSanjeev Premi 		gpio_set_value(64, 0);
340df382626SOlof Johansson 		udelay(1);
34184c3b631SSanjeev Premi 		gpio_set_value(64, 1);
342df382626SOlof Johansson 	}
343df382626SOlof Johansson }
344df382626SOlof Johansson 
345df382626SOlof Johansson int board_eth_init(bd_t *bis)
346df382626SOlof Johansson {
347113429a2SStefan Herbrechtsmeier 	unsigned int expansion_id;
348df382626SOlof Johansson 	int rc = 0;
349113429a2SStefan Herbrechtsmeier 
350df382626SOlof Johansson #ifdef CONFIG_SMC911X
351113429a2SStefan Herbrechtsmeier 	expansion_id = get_expansion_id();
352113429a2SStefan Herbrechtsmeier 	switch (expansion_id) {
353113429a2SStefan Herbrechtsmeier 	case GUMSTIX_TOBI_DUO:
354113429a2SStefan Herbrechtsmeier 		/* second lan chip */
355113429a2SStefan Herbrechtsmeier 		enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4],
356113429a2SStefan Herbrechtsmeier 				      0x2B000000, GPMC_SIZE_16M);
357113429a2SStefan Herbrechtsmeier 		/* no break */
358113429a2SStefan Herbrechtsmeier 	case GUMSTIX_TOBI:
359113429a2SStefan Herbrechtsmeier 	case GUMSTIX_CHESTNUT43:
360113429a2SStefan Herbrechtsmeier 	case GUMSTIX_STAGECOACH:
361113429a2SStefan Herbrechtsmeier 	case GUMSTIX_NO_EEPROM:
362113429a2SStefan Herbrechtsmeier 	case GUMSTIX_EMPTY_EEPROM:
363113429a2SStefan Herbrechtsmeier 		/* first lan chip */
364113429a2SStefan Herbrechtsmeier 		enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5],
365113429a2SStefan Herbrechtsmeier 				      0x2C000000, GPMC_SIZE_16M);
366113429a2SStefan Herbrechtsmeier 
367113429a2SStefan Herbrechtsmeier 		setup_net_chip();
368113429a2SStefan Herbrechtsmeier 		reset_net_chip();
369113429a2SStefan Herbrechtsmeier 
370df382626SOlof Johansson 		rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
371113429a2SStefan Herbrechtsmeier 		break;
372113429a2SStefan Herbrechtsmeier 	default:
373113429a2SStefan Herbrechtsmeier 		break;
374113429a2SStefan Herbrechtsmeier 	}
375df382626SOlof Johansson #endif
376113429a2SStefan Herbrechtsmeier 
377df382626SOlof Johansson 	return rc;
378df382626SOlof Johansson }
379113429a2SStefan Herbrechtsmeier #endif
380cd7c5726SSteve Sakoman 
381fe5d488fSArun Bharadwaj #if defined(CONFIG_GENERIC_MMC)
382cd7c5726SSteve Sakoman int board_mmc_init(bd_t *bis)
383cd7c5726SSteve Sakoman {
384e3913f56SNikita Kiryanov 	return omap_mmc_init(0, 0, 0, -1, -1);
385cd7c5726SSteve Sakoman }
386cd7c5726SSteve Sakoman #endif
387f5c30c1bSStefan Herbrechtsmeier 
388aac5450eSPaul Kocialkowski #if defined(CONFIG_GENERIC_MMC)
389aac5450eSPaul Kocialkowski void board_mmc_power_init(void)
390aac5450eSPaul Kocialkowski {
391aac5450eSPaul Kocialkowski 	twl4030_power_mmc_init(0);
392aac5450eSPaul Kocialkowski }
393aac5450eSPaul Kocialkowski #endif
394aac5450eSPaul Kocialkowski 
395fe5d488fSArun Bharadwaj #if defined(CONFIG_USB_EHCI)
396f5c30c1bSStefan Herbrechtsmeier static struct omap_usbhs_board_data usbhs_bdata = {
397f5c30c1bSStefan Herbrechtsmeier 	.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
398f5c30c1bSStefan Herbrechtsmeier 	.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
399f5c30c1bSStefan Herbrechtsmeier 	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED
400f5c30c1bSStefan Herbrechtsmeier };
401f5c30c1bSStefan Herbrechtsmeier 
402f5c30c1bSStefan Herbrechtsmeier #define GUMSTIX_GPIO_USBH_CPEN		168
403f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_init(int index, enum usb_init_type init,
404f5c30c1bSStefan Herbrechtsmeier 		  struct ehci_hccr **hccr, struct ehci_hcor **hcor)
405f5c30c1bSStefan Herbrechtsmeier {
406f5c30c1bSStefan Herbrechtsmeier 	/* Enable USB power */
407f5c30c1bSStefan Herbrechtsmeier 	if (!gpio_request(GUMSTIX_GPIO_USBH_CPEN, "usbh_cpen"))
408f5c30c1bSStefan Herbrechtsmeier 		gpio_direction_output(GUMSTIX_GPIO_USBH_CPEN, 1);
409f5c30c1bSStefan Herbrechtsmeier 
410f5c30c1bSStefan Herbrechtsmeier 	return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
411f5c30c1bSStefan Herbrechtsmeier }
412f5c30c1bSStefan Herbrechtsmeier 
413f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_stop(void)
414f5c30c1bSStefan Herbrechtsmeier {
415f5c30c1bSStefan Herbrechtsmeier 	/* Disable USB power */
416f5c30c1bSStefan Herbrechtsmeier 	gpio_set_value(GUMSTIX_GPIO_USBH_CPEN, 0);
417f5c30c1bSStefan Herbrechtsmeier 	gpio_free(GUMSTIX_GPIO_USBH_CPEN);
418f5c30c1bSStefan Herbrechtsmeier 
419f5c30c1bSStefan Herbrechtsmeier 	return omap_ehci_hcd_stop();
420f5c30c1bSStefan Herbrechtsmeier }
421f5c30c1bSStefan Herbrechtsmeier 
422f5c30c1bSStefan Herbrechtsmeier #endif /* CONFIG_USB_EHCI */
423