xref: /rk3399_rockchip-uboot/board/overo/overo.c (revision 331c2375688d79920fb06b8f0c4c52a7df56fb29)
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>
20*331c2375SMasahiro Yamada #include <linux/mtd/rawnand.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 
308850c5d5STom Rini #ifdef CONFIG_USB_EHCI_HCD
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 = {
712f6ed3b8SAdam Ford 	.base = OMAP34XX_UART3,
722f6ed3b8SAdam Ford 	.reg_shift = 2,
7317fa0326SHeiko Schocher 	.clock = V_NS16550_CLK,
7417fa0326SHeiko Schocher 	.fcr = UART_FCR_DEFVAL,
75b3f4ca11SSimon Glass };
76b3f4ca11SSimon Glass 
77b3f4ca11SSimon Glass U_BOOT_DEVICE(overo_uart) = {
78c7b9686dSThomas Chou 	"ns16550_serial",
79b3f4ca11SSimon Glass 	&overo_serial
80b3f4ca11SSimon Glass };
81b3f4ca11SSimon Glass 
82127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
83a06e1629SSteve Sakoman  * Routine: get_sdio2_config
84a06e1629SSteve Sakoman  * Description: Return information about the wifi module connection
85a06e1629SSteve Sakoman  *              Returns 0 if the module connects though a level translator
86a06e1629SSteve Sakoman  *              Returns 1 if the module connects directly
87a06e1629SSteve Sakoman  */
get_sdio2_config(void)88a06e1629SSteve Sakoman int get_sdio2_config(void)
89a06e1629SSteve Sakoman {
90a06e1629SSteve Sakoman 	int sdio_direct;
91a06e1629SSteve Sakoman 
9284c3b631SSanjeev Premi 	if (!gpio_request(130, "") && !gpio_request(139, "")) {
93a06e1629SSteve Sakoman 
9484c3b631SSanjeev Premi 		gpio_direction_output(130, 0);
9584c3b631SSanjeev Premi 		gpio_direction_input(139);
96a06e1629SSteve Sakoman 
97a06e1629SSteve Sakoman 		sdio_direct = 1;
9884c3b631SSanjeev Premi 		gpio_set_value(130, 0);
9984c3b631SSanjeev Premi 		if (gpio_get_value(139) == 0) {
10084c3b631SSanjeev Premi 			gpio_set_value(130, 1);
10184c3b631SSanjeev Premi 			if (gpio_get_value(139) == 1)
102a06e1629SSteve Sakoman 				sdio_direct = 0;
103a06e1629SSteve Sakoman 		}
104a06e1629SSteve Sakoman 
105b5db0a06SJoe Hershberger 		gpio_direction_input(130);
106a06e1629SSteve Sakoman 	} else {
107bae485dbSAndreas Müller 		puts("Error: unable to acquire sdio2 clk GPIOs\n");
108a06e1629SSteve Sakoman 		sdio_direct = -1;
109a06e1629SSteve Sakoman 	}
110a06e1629SSteve Sakoman 
111a06e1629SSteve Sakoman 	return sdio_direct;
112a06e1629SSteve Sakoman }
113a06e1629SSteve Sakoman 
114a06e1629SSteve Sakoman /*
115d64b5b89SSteve Sakoman  * Routine: get_expansion_id
116d64b5b89SSteve Sakoman  * Description: This function checks for expansion board by checking I2C
117d64b5b89SSteve Sakoman  *		bus 2 for the availability of an AT24C01B serial EEPROM.
118d64b5b89SSteve Sakoman  *		returns the device_vendor field from the EEPROM
119d64b5b89SSteve Sakoman  */
get_expansion_id(void)120d64b5b89SSteve Sakoman unsigned int get_expansion_id(void)
121d64b5b89SSteve Sakoman {
1224ed914a2SStefan Herbrechtsmeier 	if (expansion_config.device_vendor != 0x0)
1234ed914a2SStefan Herbrechtsmeier 		return expansion_config.device_vendor;
1244ed914a2SStefan Herbrechtsmeier 
125d64b5b89SSteve Sakoman 	i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS);
126d64b5b89SSteve Sakoman 
127d64b5b89SSteve Sakoman 	/* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */
128d64b5b89SSteve Sakoman 	if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) {
129d64b5b89SSteve Sakoman 		i2c_set_bus_num(TWL4030_I2C_BUS);
130d64b5b89SSteve Sakoman 		return GUMSTIX_NO_EEPROM;
131d64b5b89SSteve Sakoman 	}
132d64b5b89SSteve Sakoman 
133d64b5b89SSteve Sakoman 	/* read configuration data */
134d64b5b89SSteve Sakoman 	i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config,
135d64b5b89SSteve Sakoman 		 sizeof(expansion_config));
136d64b5b89SSteve Sakoman 
137d64b5b89SSteve Sakoman 	i2c_set_bus_num(TWL4030_I2C_BUS);
138d64b5b89SSteve Sakoman 
139d64b5b89SSteve Sakoman 	return expansion_config.device_vendor;
140d64b5b89SSteve Sakoman }
141d64b5b89SSteve Sakoman 
142d64b5b89SSteve Sakoman /*
143127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: misc_init_r
144127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Configure board specific parts
145127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
misc_init_r(void)146127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void)
147127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
148ea5940e9SAsh Charles 	unsigned int expansion_id;
149ea5940e9SAsh Charles 
150127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	twl4030_power_init();
151ead39d7aSGrazvydas Ignotas 	twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON);
152127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
153c2d5b341SSteve Sakoman 	printf("Board revision: %d\n", get_board_revision());
154a06e1629SSteve Sakoman 
155a06e1629SSteve Sakoman 	switch (get_sdio2_config()) {
156a06e1629SSteve Sakoman 	case 0:
157bae485dbSAndreas Müller 		puts("Tranceiver detected on mmc2\n");
158a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_TRANSCEIVER();
159a06e1629SSteve Sakoman 		break;
160a06e1629SSteve Sakoman 	case 1:
161bae485dbSAndreas Müller 		puts("Direct connection on mmc2\n");
162a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_DIRECT();
163a06e1629SSteve Sakoman 		break;
164a06e1629SSteve Sakoman 	default:
165bae485dbSAndreas Müller 		puts("Unable to detect mmc2 connection type\n");
166a06e1629SSteve Sakoman 	}
167a06e1629SSteve Sakoman 
168ea5940e9SAsh Charles 	expansion_id = get_expansion_id();
169ea5940e9SAsh Charles 	switch (expansion_id) {
170d64b5b89SSteve Sakoman 	case GUMSTIX_SUMMIT:
171d64b5b89SSteve Sakoman 		printf("Recognized Summit expansion board (rev %d %s)\n",
172d64b5b89SSteve Sakoman 			expansion_config.revision,
173d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
1744ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
175382bee57SSimon Glass 		env_set("defaultdisplay", "dvi");
176382bee57SSimon Glass 		env_set("expansionname", "summit");
177d64b5b89SSteve Sakoman 		break;
178d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI:
179d64b5b89SSteve Sakoman 		printf("Recognized Tobi expansion board (rev %d %s)\n",
180d64b5b89SSteve Sakoman 			expansion_config.revision,
181d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
1824ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
183382bee57SSimon Glass 		env_set("defaultdisplay", "dvi");
184382bee57SSimon Glass 		env_set("expansionname", "tobi");
185d64b5b89SSteve Sakoman 		break;
186d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI_DUO:
187d64b5b89SSteve Sakoman 		printf("Recognized Tobi Duo expansion board (rev %d %s)\n",
188d64b5b89SSteve Sakoman 			expansion_config.revision,
189d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
1904ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
191382bee57SSimon Glass 		env_set("expansionname", "tobiduo");
192d64b5b89SSteve Sakoman 		break;
193d64b5b89SSteve Sakoman 	case GUMSTIX_PALO35:
194d64b5b89SSteve Sakoman 		printf("Recognized Palo35 expansion board (rev %d %s)\n",
195d64b5b89SSteve Sakoman 			expansion_config.revision,
196d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
1974ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
198382bee57SSimon Glass 		env_set("defaultdisplay", "lcd35");
199382bee57SSimon Glass 		env_set("expansionname", "palo35");
200d64b5b89SSteve Sakoman 		break;
201d64b5b89SSteve Sakoman 	case GUMSTIX_PALO43:
202d64b5b89SSteve Sakoman 		printf("Recognized Palo43 expansion board (rev %d %s)\n",
203d64b5b89SSteve Sakoman 			expansion_config.revision,
204d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2054ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
206382bee57SSimon Glass 		env_set("defaultdisplay", "lcd43");
207382bee57SSimon Glass 		env_set("expansionname", "palo43");
208d64b5b89SSteve Sakoman 		break;
209d64b5b89SSteve Sakoman 	case GUMSTIX_CHESTNUT43:
210d64b5b89SSteve Sakoman 		printf("Recognized Chestnut43 expansion board (rev %d %s)\n",
211d64b5b89SSteve Sakoman 			expansion_config.revision,
212d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2134ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
214382bee57SSimon Glass 		env_set("defaultdisplay", "lcd43");
215382bee57SSimon Glass 		env_set("expansionname", "chestnut43");
216d64b5b89SSteve Sakoman 		break;
217d64b5b89SSteve Sakoman 	case GUMSTIX_PINTO:
218d64b5b89SSteve Sakoman 		printf("Recognized Pinto expansion board (rev %d %s)\n",
219d64b5b89SSteve Sakoman 			expansion_config.revision,
220d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2214ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
222d64b5b89SSteve Sakoman 		break;
223d64b5b89SSteve Sakoman 	case GUMSTIX_GALLOP43:
224d64b5b89SSteve Sakoman 		printf("Recognized Gallop43 expansion board (rev %d %s)\n",
225d64b5b89SSteve Sakoman 			expansion_config.revision,
226d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2274ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
228382bee57SSimon Glass 		env_set("defaultdisplay", "lcd43");
229382bee57SSimon Glass 		env_set("expansionname", "gallop43");
230d64b5b89SSteve Sakoman 		break;
231ea5940e9SAsh Charles 	case GUMSTIX_ALTO35:
232ea5940e9SAsh Charles 		printf("Recognized Alto35 expansion board (rev %d %s)\n",
233ea5940e9SAsh Charles 			expansion_config.revision,
234ea5940e9SAsh Charles 			expansion_config.fab_revision);
2354ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
236ea5940e9SAsh Charles 		MUX_ALTO35();
237382bee57SSimon Glass 		env_set("defaultdisplay", "lcd35");
238382bee57SSimon Glass 		env_set("expansionname", "alto35");
239ea5940e9SAsh Charles 		break;
240ea5940e9SAsh Charles 	case GUMSTIX_STAGECOACH:
241ea5940e9SAsh Charles 		printf("Recognized Stagecoach expansion board (rev %d %s)\n",
242ea5940e9SAsh Charles 			expansion_config.revision,
243ea5940e9SAsh Charles 			expansion_config.fab_revision);
2444ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
245ea5940e9SAsh Charles 		break;
246ea5940e9SAsh Charles 	case GUMSTIX_THUMBO:
247ea5940e9SAsh Charles 		printf("Recognized Thumbo expansion board (rev %d %s)\n",
248ea5940e9SAsh Charles 			expansion_config.revision,
249ea5940e9SAsh Charles 			expansion_config.fab_revision);
2504ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
251ea5940e9SAsh Charles 		break;
252ea5940e9SAsh Charles 	case GUMSTIX_TURTLECORE:
253ea5940e9SAsh Charles 		printf("Recognized Turtlecore expansion board (rev %d %s)\n",
254ea5940e9SAsh Charles 			expansion_config.revision,
255ea5940e9SAsh Charles 			expansion_config.fab_revision);
2564ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
257ea5940e9SAsh Charles 		break;
258ea5940e9SAsh Charles 	case GUMSTIX_ARBOR43C:
259ea5940e9SAsh Charles 		printf("Recognized Arbor43C expansion board (rev %d %s)\n",
260ea5940e9SAsh Charles 			expansion_config.revision,
261ea5940e9SAsh Charles 			expansion_config.fab_revision);
2624ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
263ea5940e9SAsh Charles 		MUX_ARBOR43C();
264382bee57SSimon Glass 		env_set("defaultdisplay", "lcd43");
265382bee57SSimon Glass 		env_set("expansionname", "arbor43c");
266ea5940e9SAsh Charles 		break;
267d64b5b89SSteve Sakoman 	case ETTUS_USRP_E:
268d64b5b89SSteve Sakoman 		printf("Recognized Ettus Research USRP-E (rev %d %s)\n",
269d64b5b89SSteve Sakoman 			expansion_config.revision,
270d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
2714ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
272d64b5b89SSteve Sakoman 		MUX_USRP_E();
273382bee57SSimon Glass 		env_set("defaultdisplay", "dvi");
274d64b5b89SSteve Sakoman 		break;
275d64b5b89SSteve Sakoman 	case GUMSTIX_NO_EEPROM:
2764ed914a2SStefan Herbrechtsmeier 	case GUMSTIX_EMPTY_EEPROM:
2774ed914a2SStefan Herbrechtsmeier 		puts("No or empty EEPROM on expansion board\n");
2784ed914a2SStefan Herbrechtsmeier 		MUX_GUMSTIX();
279382bee57SSimon Glass 		env_set("expansionname", "tobi");
280d64b5b89SSteve Sakoman 		break;
281d64b5b89SSteve Sakoman 	default:
282ea5940e9SAsh Charles 		printf("Unrecognized expansion board 0x%08x\n", expansion_id);
283ea5940e9SAsh Charles 		break;
284d64b5b89SSteve Sakoman 	}
285d64b5b89SSteve Sakoman 
286d64b5b89SSteve Sakoman 	if (expansion_config.content == 1)
287382bee57SSimon Glass 		env_set(expansion_config.env_var, expansion_config.env_setting);
288d64b5b89SSteve Sakoman 
289679f82c3SPaul Kocialkowski 	omap_die_id_display();
290127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
29112cc5437SAsh Charles 	if (get_cpu_family() == CPU_OMAP34XX)
292382bee57SSimon Glass 		env_set("boardname", "overo");
29312cc5437SAsh Charles 	else
294382bee57SSimon Glass 		env_set("boardname", "overo-storm");
29512cc5437SAsh Charles 
296127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	return 0;
297127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
298127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
299fe5d488fSArun Bharadwaj #if defined(CONFIG_CMD_NET)
300113429a2SStefan Herbrechtsmeier /* GPMC definitions for LAN9221 chips on Tobi expansion boards */
301113429a2SStefan Herbrechtsmeier static const u32 gpmc_lan_config[] = {
302113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG1,
303113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG2,
304113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG3,
305113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG4,
306113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG5,
307113429a2SStefan Herbrechtsmeier 	NET_LAN9221_GPMC_CONFIG6,
308113429a2SStefan Herbrechtsmeier 	/*CONFIG7- computed as params */
309113429a2SStefan Herbrechtsmeier };
310113429a2SStefan Herbrechtsmeier 
311df382626SOlof Johansson /*
312df382626SOlof Johansson  * Routine: setup_net_chip
313df382626SOlof Johansson  * Description: Setting up the configuration GPMC registers specific to the
314df382626SOlof Johansson  *	      Ethernet hardware.
315df382626SOlof Johansson  */
setup_net_chip(void)316df382626SOlof Johansson static void setup_net_chip(void)
317df382626SOlof Johansson {
318df382626SOlof Johansson 	struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
319df382626SOlof Johansson 
320df382626SOlof Johansson 	/* Enable off mode for NWE in PADCONF_GPMC_NWE register */
321df382626SOlof Johansson 	writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe);
322df382626SOlof Johansson 	/* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */
323df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe);
324df382626SOlof Johansson 	/* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */
325df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00,
326df382626SOlof Johansson 		&ctrl_base->gpmc_nadv_ale);
327113429a2SStefan Herbrechtsmeier }
328df382626SOlof Johansson 
329113429a2SStefan Herbrechtsmeier /*
330113429a2SStefan Herbrechtsmeier  * Routine: reset_net_chip
331113429a2SStefan Herbrechtsmeier  * Description: Reset the Ethernet hardware.
332113429a2SStefan Herbrechtsmeier  */
reset_net_chip(void)333113429a2SStefan Herbrechtsmeier static void reset_net_chip(void)
334113429a2SStefan Herbrechtsmeier {
335df382626SOlof Johansson 	/* Make GPIO 64 as output pin and send a magic pulse through it */
33684c3b631SSanjeev Premi 	if (!gpio_request(64, "")) {
33784c3b631SSanjeev Premi 		gpio_direction_output(64, 0);
33884c3b631SSanjeev Premi 		gpio_set_value(64, 1);
339df382626SOlof Johansson 		udelay(1);
34084c3b631SSanjeev Premi 		gpio_set_value(64, 0);
341df382626SOlof Johansson 		udelay(1);
34284c3b631SSanjeev Premi 		gpio_set_value(64, 1);
343df382626SOlof Johansson 	}
344df382626SOlof Johansson }
345df382626SOlof Johansson 
board_eth_init(bd_t * bis)346df382626SOlof Johansson int board_eth_init(bd_t *bis)
347df382626SOlof Johansson {
348113429a2SStefan Herbrechtsmeier 	unsigned int expansion_id;
349df382626SOlof Johansson 	int rc = 0;
350113429a2SStefan Herbrechtsmeier 
351df382626SOlof Johansson #ifdef CONFIG_SMC911X
352113429a2SStefan Herbrechtsmeier 	expansion_id = get_expansion_id();
353113429a2SStefan Herbrechtsmeier 	switch (expansion_id) {
354113429a2SStefan Herbrechtsmeier 	case GUMSTIX_TOBI_DUO:
355113429a2SStefan Herbrechtsmeier 		/* second lan chip */
356113429a2SStefan Herbrechtsmeier 		enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4],
357113429a2SStefan Herbrechtsmeier 				      0x2B000000, GPMC_SIZE_16M);
358113429a2SStefan Herbrechtsmeier 		/* no break */
359113429a2SStefan Herbrechtsmeier 	case GUMSTIX_TOBI:
360113429a2SStefan Herbrechtsmeier 	case GUMSTIX_CHESTNUT43:
361113429a2SStefan Herbrechtsmeier 	case GUMSTIX_STAGECOACH:
362113429a2SStefan Herbrechtsmeier 	case GUMSTIX_NO_EEPROM:
363113429a2SStefan Herbrechtsmeier 	case GUMSTIX_EMPTY_EEPROM:
364113429a2SStefan Herbrechtsmeier 		/* first lan chip */
365113429a2SStefan Herbrechtsmeier 		enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5],
366113429a2SStefan Herbrechtsmeier 				      0x2C000000, GPMC_SIZE_16M);
367113429a2SStefan Herbrechtsmeier 
368113429a2SStefan Herbrechtsmeier 		setup_net_chip();
369113429a2SStefan Herbrechtsmeier 		reset_net_chip();
370113429a2SStefan Herbrechtsmeier 
371df382626SOlof Johansson 		rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
372113429a2SStefan Herbrechtsmeier 		break;
373113429a2SStefan Herbrechtsmeier 	default:
374113429a2SStefan Herbrechtsmeier 		break;
375113429a2SStefan Herbrechtsmeier 	}
376df382626SOlof Johansson #endif
377113429a2SStefan Herbrechtsmeier 
378df382626SOlof Johansson 	return rc;
379df382626SOlof Johansson }
380113429a2SStefan Herbrechtsmeier #endif
381cd7c5726SSteve Sakoman 
3824aa2ba3aSMasahiro Yamada #if defined(CONFIG_MMC)
board_mmc_init(bd_t * bis)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
388f5c30c1bSStefan Herbrechtsmeier 
3894aa2ba3aSMasahiro Yamada #if defined(CONFIG_MMC)
board_mmc_power_init(void)390aac5450eSPaul Kocialkowski void board_mmc_power_init(void)
391aac5450eSPaul Kocialkowski {
392aac5450eSPaul Kocialkowski 	twl4030_power_mmc_init(0);
393aac5450eSPaul Kocialkowski }
394aac5450eSPaul Kocialkowski #endif
395aac5450eSPaul Kocialkowski 
3968850c5d5STom Rini #if defined(CONFIG_USB_EHCI_HCD)
397f5c30c1bSStefan Herbrechtsmeier static struct omap_usbhs_board_data usbhs_bdata = {
398f5c30c1bSStefan Herbrechtsmeier 	.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
399f5c30c1bSStefan Herbrechtsmeier 	.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
400f5c30c1bSStefan Herbrechtsmeier 	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED
401f5c30c1bSStefan Herbrechtsmeier };
402f5c30c1bSStefan Herbrechtsmeier 
403f5c30c1bSStefan Herbrechtsmeier #define GUMSTIX_GPIO_USBH_CPEN		168
ehci_hcd_init(int index,enum usb_init_type init,struct ehci_hccr ** hccr,struct ehci_hcor ** hcor)404f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_init(int index, enum usb_init_type init,
405f5c30c1bSStefan Herbrechtsmeier 		  struct ehci_hccr **hccr, struct ehci_hcor **hcor)
406f5c30c1bSStefan Herbrechtsmeier {
407f5c30c1bSStefan Herbrechtsmeier 	/* Enable USB power */
408f5c30c1bSStefan Herbrechtsmeier 	if (!gpio_request(GUMSTIX_GPIO_USBH_CPEN, "usbh_cpen"))
409f5c30c1bSStefan Herbrechtsmeier 		gpio_direction_output(GUMSTIX_GPIO_USBH_CPEN, 1);
410f5c30c1bSStefan Herbrechtsmeier 
411f5c30c1bSStefan Herbrechtsmeier 	return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
412f5c30c1bSStefan Herbrechtsmeier }
413f5c30c1bSStefan Herbrechtsmeier 
ehci_hcd_stop(void)414f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_stop(void)
415f5c30c1bSStefan Herbrechtsmeier {
416f5c30c1bSStefan Herbrechtsmeier 	/* Disable USB power */
417f5c30c1bSStefan Herbrechtsmeier 	gpio_set_value(GUMSTIX_GPIO_USBH_CPEN, 0);
418f5c30c1bSStefan Herbrechtsmeier 	gpio_free(GUMSTIX_GPIO_USBH_CPEN);
419f5c30c1bSStefan Herbrechtsmeier 
420f5c30c1bSStefan Herbrechtsmeier 	return omap_ehci_hcd_stop();
421f5c30c1bSStefan Herbrechtsmeier }
422f5c30c1bSStefan Herbrechtsmeier 
4238850c5d5STom Rini #endif /* CONFIG_USB_EHCI_HCD */
424