xref: /rk3399_rockchip-uboot/board/overo/overo.c (revision d64b5b89159dad129e4e07d4267c549b6d473386)
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  *
13127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * See file CREDITS for list of people who contributed to this
14127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * project.
15127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *
16127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * This program is free software; you can redistribute it and/or
17127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * modify it under the terms of the GNU General Public License as
18127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * published by the Free Software Foundation; either version 2 of
19127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * the License, or (at your option) any later version.
20127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *
21127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * This program is distributed in the hope that it will be useful,
22127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * GNU General Public License for more details.
25127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *
26127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * You should have received a copy of the GNU General Public License
27127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * along with this program; if not, write to the Free Software
28127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
29127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * MA 02111-1307 USA
30127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
31127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <common.h>
32df382626SOlof Johansson #include <netdev.h>
33127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h>
34127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h>
35cd7c5726SSteve Sakoman #include <asm/arch/mmc_host_def.h>
36127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h>
37df382626SOlof Johansson #include <asm/arch/mem.h>
38127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h>
39df382626SOlof Johansson #include <asm/arch/gpio.h>
40127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h>
41127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include "overo.h"
42127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
43*d64b5b89SSteve Sakoman #define TWL4030_I2C_BUS			0
44*d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_BUS	2
45*d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_ADDRESS	0x51
46*d64b5b89SSteve Sakoman 
47*d64b5b89SSteve Sakoman #define GUMSTIX_SUMMIT			0x01000200
48*d64b5b89SSteve Sakoman #define GUMSTIX_TOBI			0x02000200
49*d64b5b89SSteve Sakoman #define GUMSTIX_TOBI_DUO		0x03000200
50*d64b5b89SSteve Sakoman #define GUMSTIX_PALO35			0x04000200
51*d64b5b89SSteve Sakoman #define GUMSTIX_PALO43			0x05000200
52*d64b5b89SSteve Sakoman #define GUMSTIX_CHESTNUT43		0x06000200
53*d64b5b89SSteve Sakoman #define GUMSTIX_PINTO			0x07000200
54*d64b5b89SSteve Sakoman #define GUMSTIX_GALLOP43		0x08000200
55*d64b5b89SSteve Sakoman 
56*d64b5b89SSteve Sakoman #define ETTUS_USRP_E			0x01000300
57*d64b5b89SSteve Sakoman 
58*d64b5b89SSteve Sakoman #define GUMSTIX_NO_EEPROM		0xffffffff
59*d64b5b89SSteve Sakoman 
60*d64b5b89SSteve Sakoman static struct {
61*d64b5b89SSteve Sakoman 	unsigned int device_vendor;
62*d64b5b89SSteve Sakoman 	unsigned char revision;
63*d64b5b89SSteve Sakoman 	unsigned char content;
64*d64b5b89SSteve Sakoman 	char fab_revision[8];
65*d64b5b89SSteve Sakoman 	char env_var[16];
66*d64b5b89SSteve Sakoman 	char env_setting[64];
67*d64b5b89SSteve Sakoman } expansion_config;
68*d64b5b89SSteve Sakoman 
69df382626SOlof Johansson #if defined(CONFIG_CMD_NET)
70df382626SOlof Johansson static void setup_net_chip(void);
71df382626SOlof Johansson #endif
72df382626SOlof Johansson 
73ba9a11e4SSteve Sakoman /* GPMC definitions for LAN9221 chips on Tobi expansion boards */
74ba9a11e4SSteve Sakoman static const u32 gpmc_lan_config[] = {
75ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG1,
76ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG2,
77ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG3,
78ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG4,
79ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG5,
80ba9a11e4SSteve Sakoman     NET_LAN9221_GPMC_CONFIG6,
81ba9a11e4SSteve Sakoman     /*CONFIG7- computed as params */
82ba9a11e4SSteve Sakoman };
83ba9a11e4SSteve Sakoman 
84127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
85127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: board_init
86127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Early hardware init.
87127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
88127f9ae5SJean-Christophe PLAGNIOL-VILLARD int board_init(void)
89127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
90127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	DECLARE_GLOBAL_DATA_PTR;
91127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
92127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
93127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	/* board id for Linux */
94127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_arch_number = MACH_TYPE_OVERO;
95127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	/* boot param addr */
96127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
97127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
98127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	return 0;
99127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
100127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
101127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
102c2d5b341SSteve Sakoman  * Routine: get_board_revision
103c2d5b341SSteve Sakoman  * Description: Returns the board revision
104c2d5b341SSteve Sakoman  */
105c2d5b341SSteve Sakoman int get_board_revision(void)
106c2d5b341SSteve Sakoman {
107c2d5b341SSteve Sakoman 	int revision;
108c2d5b341SSteve Sakoman 
109c2d5b341SSteve Sakoman 	if (!omap_request_gpio(112) &&
110c2d5b341SSteve Sakoman 	    !omap_request_gpio(113) &&
111c2d5b341SSteve Sakoman 	    !omap_request_gpio(115)) {
112c2d5b341SSteve Sakoman 
113c2d5b341SSteve Sakoman 		omap_set_gpio_direction(112, 1);
114c2d5b341SSteve Sakoman 		omap_set_gpio_direction(113, 1);
115c2d5b341SSteve Sakoman 		omap_set_gpio_direction(115, 1);
116c2d5b341SSteve Sakoman 
117c2d5b341SSteve Sakoman 		revision = omap_get_gpio_datain(115) << 2 |
118c2d5b341SSteve Sakoman 			   omap_get_gpio_datain(113) << 1 |
119c2d5b341SSteve Sakoman 			   omap_get_gpio_datain(112);
120c2d5b341SSteve Sakoman 
121c2d5b341SSteve Sakoman 		omap_free_gpio(112);
122c2d5b341SSteve Sakoman 		omap_free_gpio(113);
123c2d5b341SSteve Sakoman 		omap_free_gpio(115);
124c2d5b341SSteve Sakoman 	} else {
125c2d5b341SSteve Sakoman 		printf("Error: unable to acquire board revision GPIOs\n");
126c2d5b341SSteve Sakoman 		revision = -1;
127c2d5b341SSteve Sakoman 	}
128c2d5b341SSteve Sakoman 
129c2d5b341SSteve Sakoman 	return revision;
130c2d5b341SSteve Sakoman }
131c2d5b341SSteve Sakoman 
132c2d5b341SSteve Sakoman /*
133a06e1629SSteve Sakoman  * Routine: get_sdio2_config
134a06e1629SSteve Sakoman  * Description: Return information about the wifi module connection
135a06e1629SSteve Sakoman  *              Returns 0 if the module connects though a level translator
136a06e1629SSteve Sakoman  *              Returns 1 if the module connects directly
137a06e1629SSteve Sakoman  */
138a06e1629SSteve Sakoman int get_sdio2_config(void)
139a06e1629SSteve Sakoman {
140a06e1629SSteve Sakoman 	int sdio_direct;
141a06e1629SSteve Sakoman 
142a06e1629SSteve Sakoman 	if (!omap_request_gpio(130) && !omap_request_gpio(139)) {
143a06e1629SSteve Sakoman 
144a06e1629SSteve Sakoman 		omap_set_gpio_direction(130, 0);
145a06e1629SSteve Sakoman 		omap_set_gpio_direction(139, 1);
146a06e1629SSteve Sakoman 
147a06e1629SSteve Sakoman 		sdio_direct = 1;
148a06e1629SSteve Sakoman 		omap_set_gpio_dataout(130, 0);
149a06e1629SSteve Sakoman 		if (omap_get_gpio_datain(139) == 0) {
150a06e1629SSteve Sakoman 			omap_set_gpio_dataout(130, 1);
151a06e1629SSteve Sakoman 			if (omap_get_gpio_datain(139) == 1)
152a06e1629SSteve Sakoman 				sdio_direct = 0;
153a06e1629SSteve Sakoman 		}
154a06e1629SSteve Sakoman 
155a06e1629SSteve Sakoman 		omap_free_gpio(130);
156a06e1629SSteve Sakoman 		omap_free_gpio(139);
157a06e1629SSteve Sakoman 	} else {
158a06e1629SSteve Sakoman 		printf("Error: unable to acquire sdio2 clk GPIOs\n");
159a06e1629SSteve Sakoman 		sdio_direct = -1;
160a06e1629SSteve Sakoman 	}
161a06e1629SSteve Sakoman 
162a06e1629SSteve Sakoman 	return sdio_direct;
163a06e1629SSteve Sakoman }
164a06e1629SSteve Sakoman 
165a06e1629SSteve Sakoman /*
166*d64b5b89SSteve Sakoman  * Routine: get_expansion_id
167*d64b5b89SSteve Sakoman  * Description: This function checks for expansion board by checking I2C
168*d64b5b89SSteve Sakoman  *		bus 2 for the availability of an AT24C01B serial EEPROM.
169*d64b5b89SSteve Sakoman  *		returns the device_vendor field from the EEPROM
170*d64b5b89SSteve Sakoman  */
171*d64b5b89SSteve Sakoman unsigned int get_expansion_id(void)
172*d64b5b89SSteve Sakoman {
173*d64b5b89SSteve Sakoman 	i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS);
174*d64b5b89SSteve Sakoman 
175*d64b5b89SSteve Sakoman 	/* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */
176*d64b5b89SSteve Sakoman 	if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) {
177*d64b5b89SSteve Sakoman 		i2c_set_bus_num(TWL4030_I2C_BUS);
178*d64b5b89SSteve Sakoman 		return GUMSTIX_NO_EEPROM;
179*d64b5b89SSteve Sakoman 	}
180*d64b5b89SSteve Sakoman 
181*d64b5b89SSteve Sakoman 	/* read configuration data */
182*d64b5b89SSteve Sakoman 	i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config,
183*d64b5b89SSteve Sakoman 		 sizeof(expansion_config));
184*d64b5b89SSteve Sakoman 
185*d64b5b89SSteve Sakoman 	i2c_set_bus_num(TWL4030_I2C_BUS);
186*d64b5b89SSteve Sakoman 
187*d64b5b89SSteve Sakoman 	return expansion_config.device_vendor;
188*d64b5b89SSteve Sakoman }
189*d64b5b89SSteve Sakoman 
190*d64b5b89SSteve Sakoman /*
191127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: misc_init_r
192127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Configure board specific parts
193127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
194127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void)
195127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
196127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	twl4030_power_init();
197ead39d7aSGrazvydas Ignotas 	twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON);
198127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
199df382626SOlof Johansson #if defined(CONFIG_CMD_NET)
200df382626SOlof Johansson 	setup_net_chip();
201df382626SOlof Johansson #endif
202df382626SOlof Johansson 
203c2d5b341SSteve Sakoman 	printf("Board revision: %d\n", get_board_revision());
204a06e1629SSteve Sakoman 
205a06e1629SSteve Sakoman 	switch (get_sdio2_config()) {
206a06e1629SSteve Sakoman 	case 0:
207a06e1629SSteve Sakoman 		printf("Tranceiver detected on mmc2\n");
208a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_TRANSCEIVER();
209a06e1629SSteve Sakoman 		break;
210a06e1629SSteve Sakoman 	case 1:
211a06e1629SSteve Sakoman 		printf("Direct connection on mmc2\n");
212a06e1629SSteve Sakoman 		MUX_OVERO_SDIO2_DIRECT();
213a06e1629SSteve Sakoman 		break;
214a06e1629SSteve Sakoman 	default:
215a06e1629SSteve Sakoman 		printf("Unable to detect mmc2 connection type\n");
216a06e1629SSteve Sakoman 	}
217a06e1629SSteve Sakoman 
218*d64b5b89SSteve Sakoman 	switch (get_expansion_id()) {
219*d64b5b89SSteve Sakoman 	case GUMSTIX_SUMMIT:
220*d64b5b89SSteve Sakoman 		printf("Recognized Summit expansion board (rev %d %s)\n",
221*d64b5b89SSteve Sakoman 			expansion_config.revision,
222*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
223*d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
224*d64b5b89SSteve Sakoman 		break;
225*d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI:
226*d64b5b89SSteve Sakoman 		printf("Recognized Tobi expansion board (rev %d %s)\n",
227*d64b5b89SSteve Sakoman 			expansion_config.revision,
228*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
229*d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
230*d64b5b89SSteve Sakoman 		break;
231*d64b5b89SSteve Sakoman 	case GUMSTIX_TOBI_DUO:
232*d64b5b89SSteve Sakoman 		printf("Recognized Tobi Duo expansion board (rev %d %s)\n",
233*d64b5b89SSteve Sakoman 			expansion_config.revision,
234*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
235*d64b5b89SSteve Sakoman 		break;
236*d64b5b89SSteve Sakoman 	case GUMSTIX_PALO35:
237*d64b5b89SSteve Sakoman 		printf("Recognized Palo35 expansion board (rev %d %s)\n",
238*d64b5b89SSteve Sakoman 			expansion_config.revision,
239*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
240*d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd35");
241*d64b5b89SSteve Sakoman 		break;
242*d64b5b89SSteve Sakoman 	case GUMSTIX_PALO43:
243*d64b5b89SSteve Sakoman 		printf("Recognized Palo43 expansion board (rev %d %s)\n",
244*d64b5b89SSteve Sakoman 			expansion_config.revision,
245*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
246*d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
247*d64b5b89SSteve Sakoman 		break;
248*d64b5b89SSteve Sakoman 	case GUMSTIX_CHESTNUT43:
249*d64b5b89SSteve Sakoman 		printf("Recognized Chestnut43 expansion board (rev %d %s)\n",
250*d64b5b89SSteve Sakoman 			expansion_config.revision,
251*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
252*d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
253*d64b5b89SSteve Sakoman 		break;
254*d64b5b89SSteve Sakoman 	case GUMSTIX_PINTO:
255*d64b5b89SSteve Sakoman 		printf("Recognized Pinto expansion board (rev %d %s)\n",
256*d64b5b89SSteve Sakoman 			expansion_config.revision,
257*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
258*d64b5b89SSteve Sakoman 		break;
259*d64b5b89SSteve Sakoman 	case GUMSTIX_GALLOP43:
260*d64b5b89SSteve Sakoman 		printf("Recognized Gallop43 expansion board (rev %d %s)\n",
261*d64b5b89SSteve Sakoman 			expansion_config.revision,
262*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
263*d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "lcd43");
264*d64b5b89SSteve Sakoman 		break;
265*d64b5b89SSteve Sakoman 	case ETTUS_USRP_E:
266*d64b5b89SSteve Sakoman 		printf("Recognized Ettus Research USRP-E (rev %d %s)\n",
267*d64b5b89SSteve Sakoman 			expansion_config.revision,
268*d64b5b89SSteve Sakoman 			expansion_config.fab_revision);
269*d64b5b89SSteve Sakoman 		MUX_USRP_E();
270*d64b5b89SSteve Sakoman 		setenv("defaultdisplay", "dvi");
271*d64b5b89SSteve Sakoman 		break;
272*d64b5b89SSteve Sakoman 	case GUMSTIX_NO_EEPROM:
273*d64b5b89SSteve Sakoman 		printf("No EEPROM on expansion board\n");
274*d64b5b89SSteve Sakoman 		break;
275*d64b5b89SSteve Sakoman 	default:
276*d64b5b89SSteve Sakoman 		printf("Unrecognized expansion board\n");
277*d64b5b89SSteve Sakoman 	}
278*d64b5b89SSteve Sakoman 
279*d64b5b89SSteve Sakoman 	if (expansion_config.content == 1)
280*d64b5b89SSteve Sakoman 		setenv(expansion_config.env_var, expansion_config.env_setting);
281*d64b5b89SSteve Sakoman 
282127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	dieid_num_r();
283127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
284127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	return 0;
285127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
286127f9ae5SJean-Christophe PLAGNIOL-VILLARD 
287127f9ae5SJean-Christophe PLAGNIOL-VILLARD /*
288127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Routine: set_muxconf_regs
289127f9ae5SJean-Christophe PLAGNIOL-VILLARD  * Description: Setting up the configuration Mux registers specific to the
290127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *		hardware. Many pins need to be moved from protect to primary
291127f9ae5SJean-Christophe PLAGNIOL-VILLARD  *		mode.
292127f9ae5SJean-Christophe PLAGNIOL-VILLARD  */
293127f9ae5SJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void)
294127f9ae5SJean-Christophe PLAGNIOL-VILLARD {
295127f9ae5SJean-Christophe PLAGNIOL-VILLARD 	MUX_OVERO();
296127f9ae5SJean-Christophe PLAGNIOL-VILLARD }
297df382626SOlof Johansson 
298df382626SOlof Johansson #if defined(CONFIG_CMD_NET)
299df382626SOlof Johansson /*
300df382626SOlof Johansson  * Routine: setup_net_chip
301df382626SOlof Johansson  * Description: Setting up the configuration GPMC registers specific to the
302df382626SOlof Johansson  *	      Ethernet hardware.
303df382626SOlof Johansson  */
304df382626SOlof Johansson static void setup_net_chip(void)
305df382626SOlof Johansson {
306df382626SOlof Johansson 	struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
307df382626SOlof Johansson 
308ba9a11e4SSteve Sakoman 	/* first lan chip */
309ba9a11e4SSteve Sakoman 	enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5], 0x2C000000,
310ba9a11e4SSteve Sakoman 			GPMC_SIZE_16M);
311ba9a11e4SSteve Sakoman 
312ba9a11e4SSteve Sakoman 	/* second lan chip */
313ba9a11e4SSteve Sakoman 	enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4], 0x2B000000,
314ba9a11e4SSteve Sakoman 			GPMC_SIZE_16M);
315df382626SOlof Johansson 
316df382626SOlof Johansson 	/* Enable off mode for NWE in PADCONF_GPMC_NWE register */
317df382626SOlof Johansson 	writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe);
318df382626SOlof Johansson 	/* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */
319df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe);
320df382626SOlof Johansson 	/* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */
321df382626SOlof Johansson 	writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00,
322df382626SOlof Johansson 		&ctrl_base->gpmc_nadv_ale);
323df382626SOlof Johansson 
324df382626SOlof Johansson 	/* Make GPIO 64 as output pin and send a magic pulse through it */
325df382626SOlof Johansson 	if (!omap_request_gpio(64)) {
326df382626SOlof Johansson 		omap_set_gpio_direction(64, 0);
327df382626SOlof Johansson 		omap_set_gpio_dataout(64, 1);
328df382626SOlof Johansson 		udelay(1);
329df382626SOlof Johansson 		omap_set_gpio_dataout(64, 0);
330df382626SOlof Johansson 		udelay(1);
331df382626SOlof Johansson 		omap_set_gpio_dataout(64, 1);
332df382626SOlof Johansson 	}
333df382626SOlof Johansson }
334df382626SOlof Johansson #endif
335df382626SOlof Johansson 
336df382626SOlof Johansson int board_eth_init(bd_t *bis)
337df382626SOlof Johansson {
338df382626SOlof Johansson 	int rc = 0;
339df382626SOlof Johansson #ifdef CONFIG_SMC911X
340df382626SOlof Johansson 	rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
341df382626SOlof Johansson #endif
342df382626SOlof Johansson 	return rc;
343df382626SOlof Johansson }
344cd7c5726SSteve Sakoman 
345cd7c5726SSteve Sakoman #ifdef CONFIG_GENERIC_MMC
346cd7c5726SSteve Sakoman int board_mmc_init(bd_t *bis)
347cd7c5726SSteve Sakoman {
348cd7c5726SSteve Sakoman 	omap_mmc_init(0);
349cd7c5726SSteve Sakoman 	return 0;
350cd7c5726SSteve Sakoman }
351cd7c5726SSteve Sakoman #endif
352