xref: /rk3399_rockchip-uboot/board/ti/beagle/beagle.c (revision 513e6fd3eb98b74a71e2d83149f98c4e6fc3ce64)
10a0e4badSJean-Christophe PLAGNIOL-VILLARD /*
20a0e4badSJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2004-2008
30a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Texas Instruments, <www.ti.com>
40a0e4badSJean-Christophe PLAGNIOL-VILLARD  *
50a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Author :
60a0e4badSJean-Christophe PLAGNIOL-VILLARD  *	Sunil Kumar <sunilsaini05@gmail.com>
70a0e4badSJean-Christophe PLAGNIOL-VILLARD  *	Shashi Ranjan <shashiranjanmca05@gmail.com>
80a0e4badSJean-Christophe PLAGNIOL-VILLARD  *
90a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Derived from Beagle Board and 3430 SDP code by
100a0e4badSJean-Christophe PLAGNIOL-VILLARD  *	Richard Woodruff <r-woodruff2@ti.com>
110a0e4badSJean-Christophe PLAGNIOL-VILLARD  *	Syed Mohammed Khasim <khasim@ti.com>
120a0e4badSJean-Christophe PLAGNIOL-VILLARD  *
130a0e4badSJean-Christophe PLAGNIOL-VILLARD  *
140a0e4badSJean-Christophe PLAGNIOL-VILLARD  * See file CREDITS for list of people who contributed to this
150a0e4badSJean-Christophe PLAGNIOL-VILLARD  * project.
160a0e4badSJean-Christophe PLAGNIOL-VILLARD  *
170a0e4badSJean-Christophe PLAGNIOL-VILLARD  * This program is free software; you can redistribute it and/or
180a0e4badSJean-Christophe PLAGNIOL-VILLARD  * modify it under the terms of the GNU General Public License as
190a0e4badSJean-Christophe PLAGNIOL-VILLARD  * published by the Free Software Foundation; either version 2 of
200a0e4badSJean-Christophe PLAGNIOL-VILLARD  * the License, or (at your option) any later version.
210a0e4badSJean-Christophe PLAGNIOL-VILLARD  *
220a0e4badSJean-Christophe PLAGNIOL-VILLARD  * This program is distributed in the hope that it will be useful,
230a0e4badSJean-Christophe PLAGNIOL-VILLARD  * but WITHOUT ANY WARRANTY; without even the implied warranty of
240a0e4badSJean-Christophe PLAGNIOL-VILLARD  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
250a0e4badSJean-Christophe PLAGNIOL-VILLARD  * GNU General Public License for more details.
260a0e4badSJean-Christophe PLAGNIOL-VILLARD  *
270a0e4badSJean-Christophe PLAGNIOL-VILLARD  * You should have received a copy of the GNU General Public License
280a0e4badSJean-Christophe PLAGNIOL-VILLARD  * along with this program; if not, write to the Free Software
290a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
300a0e4badSJean-Christophe PLAGNIOL-VILLARD  * MA 02111-1307 USA
310a0e4badSJean-Christophe PLAGNIOL-VILLARD  */
320a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <common.h>
3370d8c944SJason Kridner #ifdef CONFIG_STATUS_LED
3470d8c944SJason Kridner #include <status_led.h>
3570d8c944SJason Kridner #endif
360a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h>
370a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h>
380cd31144SSteve Sakoman #include <asm/arch/mmc_host_def.h>
390a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h>
400a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h>
4184c3b631SSanjeev Premi #include <asm/gpio.h>
420a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h>
43d90859a6SAlexander Holler #ifdef CONFIG_USB_EHCI
44d90859a6SAlexander Holler #include <usb.h>
45d90859a6SAlexander Holler #include <asm/arch/clocks.h>
46d90859a6SAlexander Holler #include <asm/arch/clocks_omap3.h>
47d90859a6SAlexander Holler #include <asm/arch/ehci_omap3.h>
48d90859a6SAlexander Holler /* from drivers/usb/host/ehci-core.h */
49d90859a6SAlexander Holler extern struct ehci_hccr *hccr;
50d90859a6SAlexander Holler extern volatile struct ehci_hcor *hcor;
51d90859a6SAlexander Holler #endif
520a0e4badSJean-Christophe PLAGNIOL-VILLARD #include "beagle.h"
53f835ea71SJason Kridner #include <command.h>
540a0e4badSJean-Christophe PLAGNIOL-VILLARD 
55d90859a6SAlexander Holler #define pr_debug(fmt, args...) debug(fmt, ##args)
56d90859a6SAlexander Holler 
57ca5f80aeSKoen Kooi #define TWL4030_I2C_BUS			0
58ca5f80aeSKoen Kooi #define EXPANSION_EEPROM_I2C_BUS	1
59ca5f80aeSKoen Kooi #define EXPANSION_EEPROM_I2C_ADDRESS	0x50
60ca5f80aeSKoen Kooi 
61ca5f80aeSKoen Kooi #define TINCANTOOLS_ZIPPY		0x01000100
62ca5f80aeSKoen Kooi #define TINCANTOOLS_ZIPPY2		0x02000100
63ca5f80aeSKoen Kooi #define TINCANTOOLS_TRAINER		0x04000100
64ca5f80aeSKoen Kooi #define TINCANTOOLS_SHOWDOG		0x03000100
65ca5f80aeSKoen Kooi #define KBADC_BEAGLEFPGA		0x01000600
66ee8485fdSKoen Kooi #define LW_BEAGLETOUCH			0x01000700
67ee8485fdSKoen Kooi #define BRAINMUX_LCDOG			0x01000800
68ee8485fdSKoen Kooi #define BRAINMUX_LCDOGTOUCH		0x02000800
69ee8485fdSKoen Kooi #define BBTOYS_WIFI			0x01000B00
70ee8485fdSKoen Kooi #define BBTOYS_VGA			0x02000B00
71ee8485fdSKoen Kooi #define BBTOYS_LCD			0x03000B00
72ca5f80aeSKoen Kooi #define BEAGLE_NO_EEPROM		0xffffffff
73ca5f80aeSKoen Kooi 
7429565326SJohn Rigby DECLARE_GLOBAL_DATA_PTR;
7529565326SJohn Rigby 
76ca5f80aeSKoen Kooi static struct {
77ca5f80aeSKoen Kooi 	unsigned int device_vendor;
78ca5f80aeSKoen Kooi 	unsigned char revision;
79ca5f80aeSKoen Kooi 	unsigned char content;
80ca5f80aeSKoen Kooi 	char fab_revision[8];
81ca5f80aeSKoen Kooi 	char env_var[16];
82ca5f80aeSKoen Kooi 	char env_setting[64];
83ca5f80aeSKoen Kooi } expansion_config;
84ca5f80aeSKoen Kooi 
850a0e4badSJean-Christophe PLAGNIOL-VILLARD /*
860a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Routine: board_init
870a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Description: Early hardware init.
880a0e4badSJean-Christophe PLAGNIOL-VILLARD  */
890a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_init(void)
900a0e4badSJean-Christophe PLAGNIOL-VILLARD {
910a0e4badSJean-Christophe PLAGNIOL-VILLARD 	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
920a0e4badSJean-Christophe PLAGNIOL-VILLARD 	/* board id for Linux */
930a0e4badSJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_arch_number = MACH_TYPE_OMAP3_BEAGLE;
940a0e4badSJean-Christophe PLAGNIOL-VILLARD 	/* boot param addr */
950a0e4badSJean-Christophe PLAGNIOL-VILLARD 	gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
960a0e4badSJean-Christophe PLAGNIOL-VILLARD 
9770d8c944SJason Kridner #if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
9870d8c944SJason Kridner 	status_led_set (STATUS_LED_BOOT, STATUS_LED_ON);
9970d8c944SJason Kridner #endif
10070d8c944SJason Kridner 
1010a0e4badSJean-Christophe PLAGNIOL-VILLARD 	return 0;
1020a0e4badSJean-Christophe PLAGNIOL-VILLARD }
1030a0e4badSJean-Christophe PLAGNIOL-VILLARD 
1040a0e4badSJean-Christophe PLAGNIOL-VILLARD /*
10506b95bd5SSteve Sakoman  * Routine: get_board_revision
10606b95bd5SSteve Sakoman  * Description: Detect if we are running on a Beagle revision Ax/Bx,
10708cbba2aSSteve Sakoman  *		C1/2/3, C4 or xM. This can be done by reading
10806b95bd5SSteve Sakoman  *		the level of GPIO173, GPIO172 and GPIO171. This should
10906b95bd5SSteve Sakoman  *		result in
11006b95bd5SSteve Sakoman  *		GPIO173, GPIO172, GPIO171: 1 1 1 => Ax/Bx
11106b95bd5SSteve Sakoman  *		GPIO173, GPIO172, GPIO171: 1 1 0 => C1/2/3
11206b95bd5SSteve Sakoman  *		GPIO173, GPIO172, GPIO171: 1 0 1 => C4
11308cbba2aSSteve Sakoman  *		GPIO173, GPIO172, GPIO171: 0 0 0 => xM
1140a0e4badSJean-Christophe PLAGNIOL-VILLARD  */
11506b95bd5SSteve Sakoman int get_board_revision(void)
1160a0e4badSJean-Christophe PLAGNIOL-VILLARD {
11706b95bd5SSteve Sakoman 	int revision;
1180a0e4badSJean-Christophe PLAGNIOL-VILLARD 
11984c3b631SSanjeev Premi 	if (!gpio_request(171, "") &&
12084c3b631SSanjeev Premi 	    !gpio_request(172, "") &&
12184c3b631SSanjeev Premi 	    !gpio_request(173, "")) {
1220a0e4badSJean-Christophe PLAGNIOL-VILLARD 
12384c3b631SSanjeev Premi 		gpio_direction_input(171);
12484c3b631SSanjeev Premi 		gpio_direction_input(172);
12584c3b631SSanjeev Premi 		gpio_direction_input(173);
1260a0e4badSJean-Christophe PLAGNIOL-VILLARD 
12784c3b631SSanjeev Premi 		revision = gpio_get_value(173) << 2 |
12884c3b631SSanjeev Premi 			   gpio_get_value(172) << 1 |
12984c3b631SSanjeev Premi 			   gpio_get_value(171);
13006b95bd5SSteve Sakoman 
13184c3b631SSanjeev Premi 		gpio_free(171);
13284c3b631SSanjeev Premi 		gpio_free(172);
13384c3b631SSanjeev Premi 		gpio_free(173);
13406b95bd5SSteve Sakoman 	} else {
13506b95bd5SSteve Sakoman 		printf("Error: unable to acquire board revision GPIOs\n");
13606b95bd5SSteve Sakoman 		revision = -1;
1370a0e4badSJean-Christophe PLAGNIOL-VILLARD 	}
1380a0e4badSJean-Christophe PLAGNIOL-VILLARD 
13906b95bd5SSteve Sakoman 	return revision;
1400a0e4badSJean-Christophe PLAGNIOL-VILLARD }
1410a0e4badSJean-Christophe PLAGNIOL-VILLARD 
1420a0e4badSJean-Christophe PLAGNIOL-VILLARD /*
143ca5f80aeSKoen Kooi  * Routine: get_expansion_id
144ca5f80aeSKoen Kooi  * Description: This function checks for expansion board by checking I2C
145ca5f80aeSKoen Kooi  *		bus 1 for the availability of an AT24C01B serial EEPROM.
146ca5f80aeSKoen Kooi  *		returns the device_vendor field from the EEPROM
147ca5f80aeSKoen Kooi  */
148ca5f80aeSKoen Kooi unsigned int get_expansion_id(void)
149ca5f80aeSKoen Kooi {
150ca5f80aeSKoen Kooi 	i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS);
151ca5f80aeSKoen Kooi 
152ca5f80aeSKoen Kooi 	/* return BEAGLE_NO_EEPROM if eeprom doesn't respond */
153ca5f80aeSKoen Kooi 	if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) {
154ca5f80aeSKoen Kooi 		i2c_set_bus_num(TWL4030_I2C_BUS);
155ca5f80aeSKoen Kooi 		return BEAGLE_NO_EEPROM;
156ca5f80aeSKoen Kooi 	}
157ca5f80aeSKoen Kooi 
158ca5f80aeSKoen Kooi 	/* read configuration data */
159ca5f80aeSKoen Kooi 	i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config,
160ca5f80aeSKoen Kooi 		 sizeof(expansion_config));
161ca5f80aeSKoen Kooi 
162ca5f80aeSKoen Kooi 	i2c_set_bus_num(TWL4030_I2C_BUS);
163ca5f80aeSKoen Kooi 
164ca5f80aeSKoen Kooi 	return expansion_config.device_vendor;
165ca5f80aeSKoen Kooi }
166ca5f80aeSKoen Kooi 
167ca5f80aeSKoen Kooi /*
1683f16ab91SJason Kridner  * Configure DSS to display background color on DVID
1693f16ab91SJason Kridner  * Configure VENC to display color bar on S-Video
1703f16ab91SJason Kridner  */
1713f16ab91SJason Kridner void beagle_display_init(void)
1723f16ab91SJason Kridner {
1733f16ab91SJason Kridner 	omap3_dss_venc_config(&venc_config_std_tv, VENC_HEIGHT, VENC_WIDTH);
1743f16ab91SJason Kridner 	switch (get_board_revision()) {
1753f16ab91SJason Kridner 	case REVISION_AXBX:
1763f16ab91SJason Kridner 	case REVISION_CX:
1773f16ab91SJason Kridner 	case REVISION_C4:
1783f16ab91SJason Kridner 		omap3_dss_panel_config(&dvid_cfg);
1793f16ab91SJason Kridner 		break;
1803f16ab91SJason Kridner 	case REVISION_XM_A:
1813f16ab91SJason Kridner 	case REVISION_XM_B:
1823f16ab91SJason Kridner 	case REVISION_XM_C:
1833f16ab91SJason Kridner 	default:
1843f16ab91SJason Kridner 		omap3_dss_panel_config(&dvid_cfg_xm);
1853f16ab91SJason Kridner 		break;
1863f16ab91SJason Kridner 	}
1873f16ab91SJason Kridner }
1883f16ab91SJason Kridner 
1893f16ab91SJason Kridner /*
1900a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Routine: misc_init_r
1910a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Description: Configure board specific parts
1920a0e4badSJean-Christophe PLAGNIOL-VILLARD  */
1930a0e4badSJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void)
1940a0e4badSJean-Christophe PLAGNIOL-VILLARD {
1950a0e4badSJean-Christophe PLAGNIOL-VILLARD 	struct gpio *gpio5_base = (struct gpio *)OMAP34XX_GPIO5_BASE;
1960a0e4badSJean-Christophe PLAGNIOL-VILLARD 	struct gpio *gpio6_base = (struct gpio *)OMAP34XX_GPIO6_BASE;
197f14a522aSJason Kridner 	struct control_prog_io *prog_io_base = (struct control_prog_io *)OMAP34XX_CTRL_BASE;
198d4e53f06SSteve Kipisz 
199d4e53f06SSteve Kipisz 	/* Enable i2c2 pullup resisters */
200d4e53f06SSteve Kipisz 	writel(~(PRG_I2C2_PULLUPRESX), &prog_io_base->io1);
2010a0e4badSJean-Christophe PLAGNIOL-VILLARD 
20206b95bd5SSteve Sakoman 	switch (get_board_revision()) {
20306b95bd5SSteve Sakoman 	case REVISION_AXBX:
20406b95bd5SSteve Sakoman 		printf("Beagle Rev Ax/Bx\n");
20506b95bd5SSteve Sakoman 		setenv("beaglerev", "AxBx");
20606b95bd5SSteve Sakoman 		break;
20706b95bd5SSteve Sakoman 	case REVISION_CX:
20806b95bd5SSteve Sakoman 		printf("Beagle Rev C1/C2/C3\n");
20906b95bd5SSteve Sakoman 		setenv("beaglerev", "Cx");
21006b95bd5SSteve Sakoman 		MUX_BEAGLE_C();
21106b95bd5SSteve Sakoman 		break;
21206b95bd5SSteve Sakoman 	case REVISION_C4:
21306b95bd5SSteve Sakoman 		printf("Beagle Rev C4\n");
21408cbba2aSSteve Sakoman 		setenv("beaglerev", "C4");
21506b95bd5SSteve Sakoman 		MUX_BEAGLE_C();
21606b95bd5SSteve Sakoman 		/* Set VAUX2 to 1.8V for EHCI PHY */
21706b95bd5SSteve Sakoman 		twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
21806b95bd5SSteve Sakoman 					TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
21906b95bd5SSteve Sakoman 					TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
22006b95bd5SSteve Sakoman 					TWL4030_PM_RECEIVER_DEV_GRP_P1);
22106b95bd5SSteve Sakoman 		break;
222f6e593bbSKoen Kooi 	case REVISION_XM_A:
22308cbba2aSSteve Sakoman 		printf("Beagle xM Rev A\n");
22408cbba2aSSteve Sakoman 		setenv("beaglerev", "xMA");
225f6e593bbSKoen Kooi 		MUX_BEAGLE_XM();
226f6e593bbSKoen Kooi 		/* Set VAUX2 to 1.8V for EHCI PHY */
227f6e593bbSKoen Kooi 		twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
228f6e593bbSKoen Kooi 					TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
229f6e593bbSKoen Kooi 					TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
230f6e593bbSKoen Kooi 					TWL4030_PM_RECEIVER_DEV_GRP_P1);
231f6e593bbSKoen Kooi 		break;
232f6e593bbSKoen Kooi 	case REVISION_XM_B:
233f6e593bbSKoen Kooi 		printf("Beagle xM Rev B\n");
234f6e593bbSKoen Kooi 		setenv("beaglerev", "xMB");
23508cbba2aSSteve Sakoman 		MUX_BEAGLE_XM();
23608cbba2aSSteve Sakoman 		/* Set VAUX2 to 1.8V for EHCI PHY */
23708cbba2aSSteve Sakoman 		twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
23808cbba2aSSteve Sakoman 					TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
23908cbba2aSSteve Sakoman 					TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
24008cbba2aSSteve Sakoman 					TWL4030_PM_RECEIVER_DEV_GRP_P1);
24108cbba2aSSteve Sakoman 		break;
2421ffcb346SKoen Kooi 	case REVISION_XM_C:
2431ffcb346SKoen Kooi 		printf("Beagle xM Rev C\n");
2441ffcb346SKoen Kooi 		setenv("beaglerev", "xMC");
2451ffcb346SKoen Kooi 		MUX_BEAGLE_XM();
2461ffcb346SKoen Kooi 		/* Set VAUX2 to 1.8V for EHCI PHY */
2471ffcb346SKoen Kooi 		twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
2481ffcb346SKoen Kooi 					TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
2491ffcb346SKoen Kooi 					TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
2501ffcb346SKoen Kooi 					TWL4030_PM_RECEIVER_DEV_GRP_P1);
2511ffcb346SKoen Kooi 		break;
25206b95bd5SSteve Sakoman 	default:
25306b95bd5SSteve Sakoman 		printf("Beagle unknown 0x%02x\n", get_board_revision());
254f6e593bbSKoen Kooi 		MUX_BEAGLE_XM();
255f6e593bbSKoen Kooi 		/* Set VAUX2 to 1.8V for EHCI PHY */
256f6e593bbSKoen Kooi 		twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX2_DEDICATED,
257f6e593bbSKoen Kooi 					TWL4030_PM_RECEIVER_VAUX2_VSEL_18,
258f6e593bbSKoen Kooi 					TWL4030_PM_RECEIVER_VAUX2_DEV_GRP,
259f6e593bbSKoen Kooi 					TWL4030_PM_RECEIVER_DEV_GRP_P1);
26006b95bd5SSteve Sakoman 	}
26106b95bd5SSteve Sakoman 
262ca5f80aeSKoen Kooi 	switch (get_expansion_id()) {
263ca5f80aeSKoen Kooi 	case TINCANTOOLS_ZIPPY:
264ca5f80aeSKoen Kooi 		printf("Recognized Tincantools Zippy board (rev %d %s)\n",
265ca5f80aeSKoen Kooi 			expansion_config.revision,
266ca5f80aeSKoen Kooi 			expansion_config.fab_revision);
267ca5f80aeSKoen Kooi 		MUX_TINCANTOOLS_ZIPPY();
268ca5f80aeSKoen Kooi 		setenv("buddy", "zippy");
269ca5f80aeSKoen Kooi 		break;
270ca5f80aeSKoen Kooi 	case TINCANTOOLS_ZIPPY2:
271ca5f80aeSKoen Kooi 		printf("Recognized Tincantools Zippy2 board (rev %d %s)\n",
272ca5f80aeSKoen Kooi 			expansion_config.revision,
273ca5f80aeSKoen Kooi 			expansion_config.fab_revision);
274ca5f80aeSKoen Kooi 		MUX_TINCANTOOLS_ZIPPY();
275ca5f80aeSKoen Kooi 		setenv("buddy", "zippy2");
276ca5f80aeSKoen Kooi 		break;
277ca5f80aeSKoen Kooi 	case TINCANTOOLS_TRAINER:
278ca5f80aeSKoen Kooi 		printf("Recognized Tincantools Trainer board (rev %d %s)\n",
279ca5f80aeSKoen Kooi 			expansion_config.revision,
280ca5f80aeSKoen Kooi 			expansion_config.fab_revision);
281ca5f80aeSKoen Kooi 		MUX_TINCANTOOLS_ZIPPY();
282ca5f80aeSKoen Kooi 		MUX_TINCANTOOLS_TRAINER();
283ca5f80aeSKoen Kooi 		setenv("buddy", "trainer");
284ca5f80aeSKoen Kooi 		break;
285ca5f80aeSKoen Kooi 	case TINCANTOOLS_SHOWDOG:
286ca5f80aeSKoen Kooi 		printf("Recognized Tincantools Showdow board (rev %d %s)\n",
287ca5f80aeSKoen Kooi 			expansion_config.revision,
288ca5f80aeSKoen Kooi 			expansion_config.fab_revision);
289ca5f80aeSKoen Kooi 		/* Place holder for DSS2 definition for showdog lcd */
290ca5f80aeSKoen Kooi 		setenv("defaultdisplay", "showdoglcd");
291ca5f80aeSKoen Kooi 		setenv("buddy", "showdog");
292ca5f80aeSKoen Kooi 		break;
293ca5f80aeSKoen Kooi 	case KBADC_BEAGLEFPGA:
294ca5f80aeSKoen Kooi 		printf("Recognized KBADC Beagle FPGA board\n");
295ca5f80aeSKoen Kooi 		MUX_KBADC_BEAGLEFPGA();
296ca5f80aeSKoen Kooi 		setenv("buddy", "beaglefpga");
297ca5f80aeSKoen Kooi 		break;
298ee8485fdSKoen Kooi 	case LW_BEAGLETOUCH:
299ee8485fdSKoen Kooi 		printf("Recognized Liquidware BeagleTouch board\n");
300ee8485fdSKoen Kooi 		setenv("buddy", "beagletouch");
301ee8485fdSKoen Kooi 		break;
302ee8485fdSKoen Kooi 	case BRAINMUX_LCDOG:
303ee8485fdSKoen Kooi 		printf("Recognized Brainmux LCDog board\n");
304ee8485fdSKoen Kooi 		setenv("buddy", "lcdog");
305ee8485fdSKoen Kooi 		break;
306ee8485fdSKoen Kooi 	case BRAINMUX_LCDOGTOUCH:
307ee8485fdSKoen Kooi 		printf("Recognized Brainmux LCDog Touch board\n");
308ee8485fdSKoen Kooi 		setenv("buddy", "lcdogtouch");
309ee8485fdSKoen Kooi 		break;
310ee8485fdSKoen Kooi 	case BBTOYS_WIFI:
311ee8485fdSKoen Kooi 		printf("Recognized BeagleBoardToys WiFi board\n");
312ee8485fdSKoen Kooi 		MUX_BBTOYS_WIFI()
313ee8485fdSKoen Kooi 		setenv("buddy", "bbtoys-wifi");
314ee8485fdSKoen Kooi 		break;;
315ee8485fdSKoen Kooi 	case BBTOYS_VGA:
316ee8485fdSKoen Kooi 		printf("Recognized BeagleBoardToys VGA board\n");
317ee8485fdSKoen Kooi 		break;;
318ee8485fdSKoen Kooi 	case BBTOYS_LCD:
319ee8485fdSKoen Kooi 		printf("Recognized BeagleBoardToys LCD board\n");
320ee8485fdSKoen Kooi 		break;;
321ca5f80aeSKoen Kooi 	case BEAGLE_NO_EEPROM:
322ca5f80aeSKoen Kooi 		printf("No EEPROM on expansion board\n");
323ca5f80aeSKoen Kooi 		setenv("buddy", "none");
324ca5f80aeSKoen Kooi 		break;
325ca5f80aeSKoen Kooi 	default:
326ca5f80aeSKoen Kooi 		printf("Unrecognized expansion board: %x\n",
327ca5f80aeSKoen Kooi 			expansion_config.device_vendor);
328ca5f80aeSKoen Kooi 		setenv("buddy", "unknown");
329ca5f80aeSKoen Kooi 	}
330ca5f80aeSKoen Kooi 
331ca5f80aeSKoen Kooi 	if (expansion_config.content == 1)
332ca5f80aeSKoen Kooi 		setenv(expansion_config.env_var, expansion_config.env_setting);
333ca5f80aeSKoen Kooi 
3340a0e4badSJean-Christophe PLAGNIOL-VILLARD 	twl4030_power_init();
33538a77c3aSChristian Spielberger 	switch (get_board_revision()) {
33638a77c3aSChristian Spielberger 	case REVISION_XM_A:
33738a77c3aSChristian Spielberger 	case REVISION_XM_B:
33838a77c3aSChristian Spielberger 		twl4030_led_init(TWL4030_LED_LEDEN_LEDBON);
33938a77c3aSChristian Spielberger 		break;
34038a77c3aSChristian Spielberger 	default:
341ead39d7aSGrazvydas Ignotas 		twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON);
34238a77c3aSChristian Spielberger 		break;
34338a77c3aSChristian Spielberger 	}
3440a0e4badSJean-Christophe PLAGNIOL-VILLARD 
34552d82e40SBob Feretich 	/* Set GPIO states before they are made outputs */
3460a0e4badSJean-Christophe PLAGNIOL-VILLARD 	writel(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1,
3470a0e4badSJean-Christophe PLAGNIOL-VILLARD 		&gpio6_base->setdataout);
3480a0e4badSJean-Christophe PLAGNIOL-VILLARD 	writel(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 |
3490a0e4badSJean-Christophe PLAGNIOL-VILLARD 		GPIO15 | GPIO14 | GPIO13 | GPIO12, &gpio5_base->setdataout);
3500a0e4badSJean-Christophe PLAGNIOL-VILLARD 
35152d82e40SBob Feretich 	/* Configure GPIOs to output */
35252d82e40SBob Feretich 	writel(~(GPIO23 | GPIO10 | GPIO8 | GPIO2 | GPIO1), &gpio6_base->oe);
35352d82e40SBob Feretich 	writel(~(GPIO31 | GPIO30 | GPIO29 | GPIO28 | GPIO22 | GPIO21 |
35452d82e40SBob Feretich 		GPIO15 | GPIO14 | GPIO13 | GPIO12), &gpio5_base->oe);
35552d82e40SBob Feretich 
3560a0e4badSJean-Christophe PLAGNIOL-VILLARD 	dieid_num_r();
3573f16ab91SJason Kridner 	beagle_display_init();
3583f16ab91SJason Kridner 	omap3_dss_enable();
3590a0e4badSJean-Christophe PLAGNIOL-VILLARD 
3600a0e4badSJean-Christophe PLAGNIOL-VILLARD 	return 0;
3610a0e4badSJean-Christophe PLAGNIOL-VILLARD }
3620a0e4badSJean-Christophe PLAGNIOL-VILLARD 
3630a0e4badSJean-Christophe PLAGNIOL-VILLARD /*
3640a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Routine: set_muxconf_regs
3650a0e4badSJean-Christophe PLAGNIOL-VILLARD  * Description: Setting up the configuration Mux registers specific to the
3660a0e4badSJean-Christophe PLAGNIOL-VILLARD  *		hardware. Many pins need to be moved from protect to primary
3670a0e4badSJean-Christophe PLAGNIOL-VILLARD  *		mode.
3680a0e4badSJean-Christophe PLAGNIOL-VILLARD  */
3690a0e4badSJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void)
3700a0e4badSJean-Christophe PLAGNIOL-VILLARD {
3710a0e4badSJean-Christophe PLAGNIOL-VILLARD 	MUX_BEAGLE();
3720a0e4badSJean-Christophe PLAGNIOL-VILLARD }
3730cd31144SSteve Sakoman 
3740cd31144SSteve Sakoman #ifdef CONFIG_GENERIC_MMC
3750cd31144SSteve Sakoman int board_mmc_init(bd_t *bis)
3760cd31144SSteve Sakoman {
3770cd31144SSteve Sakoman 	omap_mmc_init(0);
3780cd31144SSteve Sakoman 	return 0;
3790cd31144SSteve Sakoman }
3800cd31144SSteve Sakoman #endif
381d90859a6SAlexander Holler 
382d90859a6SAlexander Holler #ifdef CONFIG_USB_EHCI
383d90859a6SAlexander Holler 
384d90859a6SAlexander Holler #define GPIO_PHY_RESET 147
385d90859a6SAlexander Holler 
386d90859a6SAlexander Holler /* Reset is needed otherwise the kernel-driver will throw an error. */
387d90859a6SAlexander Holler int ehci_hcd_stop(void)
388d90859a6SAlexander Holler {
389d90859a6SAlexander Holler 	pr_debug("Resetting OMAP3 EHCI\n");
39084c3b631SSanjeev Premi 	gpio_set_value(GPIO_PHY_RESET, 0);
391d90859a6SAlexander Holler 	writel(OMAP_UHH_SYSCONFIG_SOFTRESET, OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
392f44047dfSKoen Kooi 	/* disable USB clocks */
393f44047dfSKoen Kooi 	struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
394f44047dfSKoen Kooi 	sr32(&prcm_base->iclken_usbhost, 0, 1, 0);
395f44047dfSKoen Kooi 	sr32(&prcm_base->fclken_usbhost, 0, 2, 0);
396f44047dfSKoen Kooi 	sr32(&prcm_base->iclken3_core, 2, 1, 0);
397f44047dfSKoen Kooi 	sr32(&prcm_base->fclken3_core, 2, 1, 0);
398d90859a6SAlexander Holler 	return 0;
399d90859a6SAlexander Holler }
400d90859a6SAlexander Holler 
401d90859a6SAlexander Holler /* Call usb_stop() before starting the kernel */
402d90859a6SAlexander Holler void show_boot_progress(int val)
403d90859a6SAlexander Holler {
404d90859a6SAlexander Holler 	if(val == 15)
405d90859a6SAlexander Holler 		usb_stop();
406d90859a6SAlexander Holler }
407d90859a6SAlexander Holler 
408d90859a6SAlexander Holler /*
409d90859a6SAlexander Holler  * Initialize the OMAP3 EHCI controller and PHY on the BeagleBoard.
410d90859a6SAlexander Holler  * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37.
411d90859a6SAlexander Holler  * See there for additional Copyrights.
412d90859a6SAlexander Holler  */
413d90859a6SAlexander Holler int ehci_hcd_init(void)
414d90859a6SAlexander Holler {
415d90859a6SAlexander Holler 	pr_debug("Initializing OMAP3 ECHI\n");
416d90859a6SAlexander Holler 
417d90859a6SAlexander Holler 	/* Put the PHY in RESET */
41884c3b631SSanjeev Premi 	gpio_request(GPIO_PHY_RESET, "");
41984c3b631SSanjeev Premi 	gpio_direction_output(GPIO_PHY_RESET, 0);
42084c3b631SSanjeev Premi 	gpio_set_value(GPIO_PHY_RESET, 0);
421d90859a6SAlexander Holler 
422d90859a6SAlexander Holler 	/* Hold the PHY in RESET for enough time till DIR is high */
423d90859a6SAlexander Holler 	/* Refer: ISSUE1 */
424d90859a6SAlexander Holler 	udelay(10);
425d90859a6SAlexander Holler 
426d90859a6SAlexander Holler 	struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
427d90859a6SAlexander Holler 	/* Enable USBHOST_L3_ICLK (USBHOST_MICLK) */
428d90859a6SAlexander Holler 	sr32(&prcm_base->iclken_usbhost, 0, 1, 1);
429d90859a6SAlexander Holler 	/*
430d90859a6SAlexander Holler 	 * Enable USBHOST_48M_FCLK (USBHOST_FCLK1)
431d90859a6SAlexander Holler 	 * and USBHOST_120M_FCLK (USBHOST_FCLK2)
432d90859a6SAlexander Holler 	 */
433d90859a6SAlexander Holler 	sr32(&prcm_base->fclken_usbhost, 0, 2, 3);
434d90859a6SAlexander Holler 	/* Enable USBTTL_ICLK */
435d90859a6SAlexander Holler 	sr32(&prcm_base->iclken3_core, 2, 1, 1);
436d90859a6SAlexander Holler 	/* Enable USBTTL_FCLK */
437d90859a6SAlexander Holler 	sr32(&prcm_base->fclken3_core, 2, 1, 1);
438d90859a6SAlexander Holler 	pr_debug("USB clocks enabled\n");
439d90859a6SAlexander Holler 
440d90859a6SAlexander Holler 	/* perform TLL soft reset, and wait until reset is complete */
441d90859a6SAlexander Holler 	writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET,
442d90859a6SAlexander Holler 		OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
443d90859a6SAlexander Holler 	/* Wait for TLL reset to complete */
444d90859a6SAlexander Holler 	while (!(readl(OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSSTATUS)
445d90859a6SAlexander Holler 			& OMAP_USBTLL_SYSSTATUS_RESETDONE));
446d90859a6SAlexander Holler 	pr_debug("TLL reset done\n");
447d90859a6SAlexander Holler 
448d90859a6SAlexander Holler 	writel(OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
449d90859a6SAlexander Holler 		OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
450d90859a6SAlexander Holler 		OMAP_USBTLL_SYSCONFIG_CACTIVITY,
451d90859a6SAlexander Holler 		OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
452d90859a6SAlexander Holler 
453d90859a6SAlexander Holler 	/* Put UHH in NoIdle/NoStandby mode */
454d90859a6SAlexander Holler 	writel(OMAP_UHH_SYSCONFIG_ENAWAKEUP
455d90859a6SAlexander Holler 		| OMAP_UHH_SYSCONFIG_SIDLEMODE
456d90859a6SAlexander Holler 		| OMAP_UHH_SYSCONFIG_CACTIVITY
457d90859a6SAlexander Holler 		| OMAP_UHH_SYSCONFIG_MIDLEMODE,
458d90859a6SAlexander Holler 		OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
459d90859a6SAlexander Holler 
460d90859a6SAlexander Holler 	/* setup burst configurations */
461d90859a6SAlexander Holler 	writel(OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
462d90859a6SAlexander Holler 		| OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN
463d90859a6SAlexander Holler 		| OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN,
464d90859a6SAlexander Holler 		OMAP3_UHH_BASE + OMAP_UHH_HOSTCONFIG);
465d90859a6SAlexander Holler 
466d90859a6SAlexander Holler 	/*
467d90859a6SAlexander Holler 	 * Refer ISSUE1:
468d90859a6SAlexander Holler 	 * Hold the PHY in RESET for enough time till
469d90859a6SAlexander Holler 	 * PHY is settled and ready
470d90859a6SAlexander Holler 	 */
471d90859a6SAlexander Holler 	udelay(10);
47284c3b631SSanjeev Premi 	gpio_set_value(GPIO_PHY_RESET, 1);
473d90859a6SAlexander Holler 
474d90859a6SAlexander Holler 	hccr = (struct ehci_hccr *)(OMAP3_EHCI_BASE);
475d90859a6SAlexander Holler 	hcor = (struct ehci_hcor *)(OMAP3_EHCI_BASE + 0x10);
476d90859a6SAlexander Holler 
477d90859a6SAlexander Holler 	pr_debug("OMAP3 EHCI init done\n");
478d90859a6SAlexander Holler 	return 0;
479d90859a6SAlexander Holler }
480d90859a6SAlexander Holler 
481d90859a6SAlexander Holler #endif /* CONFIG_USB_EHCI */
482f835ea71SJason Kridner 
483f835ea71SJason Kridner /*
484f835ea71SJason Kridner  * This command returns the status of the user button on beagle xM
485f835ea71SJason Kridner  * Input - none
486f835ea71SJason Kridner  * Returns - 	1 if button is held down
487f835ea71SJason Kridner  *		0 if button is not held down
488f835ea71SJason Kridner  */
489*513e6fd3SDirk Behme int do_userbutton(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
490f835ea71SJason Kridner {
491f835ea71SJason Kridner 	int     button = 0;
492f835ea71SJason Kridner 	int	gpio;
493f835ea71SJason Kridner 
494f835ea71SJason Kridner 	/*
495f835ea71SJason Kridner 	 * pass address parameter as argv[0] (aka command name),
496f835ea71SJason Kridner 	 * and all remaining args
497f835ea71SJason Kridner 	 */
498f835ea71SJason Kridner 	switch (get_board_revision()) {
499f835ea71SJason Kridner 	case REVISION_AXBX:
500f835ea71SJason Kridner 	case REVISION_CX:
501f835ea71SJason Kridner 	case REVISION_C4:
502f835ea71SJason Kridner 		gpio = 7;
503f835ea71SJason Kridner 		break;
504f835ea71SJason Kridner 	case REVISION_XM_A:
505f835ea71SJason Kridner 	case REVISION_XM_B:
506f835ea71SJason Kridner 	case REVISION_XM_C:
507f835ea71SJason Kridner 	default:
508f835ea71SJason Kridner 		gpio = 4;
509f835ea71SJason Kridner 		break;
510f835ea71SJason Kridner 	}
51184c3b631SSanjeev Premi 	gpio_request(gpio, "");
51284c3b631SSanjeev Premi 	gpio_direction_input(gpio);
513f835ea71SJason Kridner 	printf("The user button is currently ");
51484c3b631SSanjeev Premi 	if (gpio_get_value(gpio))
515f835ea71SJason Kridner 	{
516f835ea71SJason Kridner 		button = 1;
517f835ea71SJason Kridner 		printf("PRESSED.\n");
518f835ea71SJason Kridner 	}
519f835ea71SJason Kridner 	else
520f835ea71SJason Kridner 	{
521f835ea71SJason Kridner 		button = 0;
522f835ea71SJason Kridner 		printf("NOT pressed.\n");
523f835ea71SJason Kridner 	}
524f835ea71SJason Kridner 
52584c3b631SSanjeev Premi 	gpio_free(gpio);
526f835ea71SJason Kridner 
527f835ea71SJason Kridner 	return !button;
528f835ea71SJason Kridner }
529f835ea71SJason Kridner 
530f835ea71SJason Kridner /* -------------------------------------------------------------------- */
531f835ea71SJason Kridner 
532f835ea71SJason Kridner U_BOOT_CMD(
533f835ea71SJason Kridner 	userbutton, CONFIG_SYS_MAXARGS, 1,	do_userbutton,
534f835ea71SJason Kridner 	"Return the status of the BeagleBoard USER button",
535f835ea71SJason Kridner 	""
536f835ea71SJason Kridner );
537