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