1127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 2127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Maintainer : Steve Sakoman <steve@sakoman.com> 3127f9ae5SJean-Christophe PLAGNIOL-VILLARD * 4127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Derived from Beagle Board, 3430 SDP, and OMAP3EVM code by 5127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Richard Woodruff <r-woodruff2@ti.com> 6127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Syed Mohammed Khasim <khasim@ti.com> 7127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Sunil Kumar <sunilsaini05@gmail.com> 8127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Shashi Ranjan <shashiranjanmca05@gmail.com> 9127f9ae5SJean-Christophe PLAGNIOL-VILLARD * 10127f9ae5SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2004-2008 11127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Texas Instruments, <www.ti.com> 12127f9ae5SJean-Christophe PLAGNIOL-VILLARD * 131a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 14127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 15127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 16b3f4ca11SSimon Glass #include <dm.h> 17b3f4ca11SSimon Glass #include <ns16550.h> 18df382626SOlof Johansson #include <netdev.h> 19127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h> 20137703b8SAndreas Müller #include <linux/mtd/nand.h> 21127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 22cd7c5726SSteve Sakoman #include <asm/arch/mmc_host_def.h> 23127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h> 24df382626SOlof Johansson #include <asm/arch/mem.h> 25127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h> 2684c3b631SSanjeev Premi #include <asm/gpio.h> 27127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 28127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include "overo.h" 29127f9ae5SJean-Christophe PLAGNIOL-VILLARD 30f5c30c1bSStefan Herbrechtsmeier #ifdef CONFIG_USB_EHCI 31f5c30c1bSStefan Herbrechtsmeier #include <usb.h> 32f5c30c1bSStefan Herbrechtsmeier #include <asm/ehci-omap.h> 33f5c30c1bSStefan Herbrechtsmeier #endif 34f5c30c1bSStefan Herbrechtsmeier 3529565326SJohn Rigby DECLARE_GLOBAL_DATA_PTR; 3629565326SJohn Rigby 37d64b5b89SSteve Sakoman #define TWL4030_I2C_BUS 0 38d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_BUS 2 39d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_ADDRESS 0x51 40d64b5b89SSteve Sakoman 414ed914a2SStefan Herbrechtsmeier #define GUMSTIX_EMPTY_EEPROM 0x0 424ed914a2SStefan Herbrechtsmeier 43d64b5b89SSteve Sakoman #define GUMSTIX_SUMMIT 0x01000200 44d64b5b89SSteve Sakoman #define GUMSTIX_TOBI 0x02000200 45d64b5b89SSteve Sakoman #define GUMSTIX_TOBI_DUO 0x03000200 46d64b5b89SSteve Sakoman #define GUMSTIX_PALO35 0x04000200 47d64b5b89SSteve Sakoman #define GUMSTIX_PALO43 0x05000200 48d64b5b89SSteve Sakoman #define GUMSTIX_CHESTNUT43 0x06000200 49d64b5b89SSteve Sakoman #define GUMSTIX_PINTO 0x07000200 50d64b5b89SSteve Sakoman #define GUMSTIX_GALLOP43 0x08000200 51ea5940e9SAsh Charles #define GUMSTIX_ALTO35 0x09000200 52ea5940e9SAsh Charles #define GUMSTIX_STAGECOACH 0x0A000200 53ea5940e9SAsh Charles #define GUMSTIX_THUMBO 0x0B000200 54ea5940e9SAsh Charles #define GUMSTIX_TURTLECORE 0x0C000200 55ea5940e9SAsh Charles #define GUMSTIX_ARBOR43C 0x0D000200 56d64b5b89SSteve Sakoman 57d64b5b89SSteve Sakoman #define ETTUS_USRP_E 0x01000300 58d64b5b89SSteve Sakoman 59d64b5b89SSteve Sakoman #define GUMSTIX_NO_EEPROM 0xffffffff 60d64b5b89SSteve Sakoman 61d64b5b89SSteve Sakoman static struct { 62d64b5b89SSteve Sakoman unsigned int device_vendor; 63d64b5b89SSteve Sakoman unsigned char revision; 64d64b5b89SSteve Sakoman unsigned char content; 65d64b5b89SSteve Sakoman char fab_revision[8]; 66d64b5b89SSteve Sakoman char env_var[16]; 67d64b5b89SSteve Sakoman char env_setting[64]; 684ed914a2SStefan Herbrechtsmeier } expansion_config = {0x0}; 69ba9a11e4SSteve Sakoman 70b3f4ca11SSimon Glass static const struct ns16550_platdata overo_serial = { 71b3f4ca11SSimon Glass OMAP34XX_UART3, 72b3f4ca11SSimon Glass 2, 73b3f4ca11SSimon Glass V_NS16550_CLK 74b3f4ca11SSimon Glass }; 75b3f4ca11SSimon Glass 76b3f4ca11SSimon Glass U_BOOT_DEVICE(overo_uart) = { 77b3f4ca11SSimon Glass "serial_omap", 78b3f4ca11SSimon Glass &overo_serial 79b3f4ca11SSimon Glass }; 80b3f4ca11SSimon Glass 81127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 82127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 83127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 84127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 85127f9ae5SJean-Christophe PLAGNIOL-VILLARD int board_init(void) 86127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 87127f9ae5SJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 88127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 89127f9ae5SJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OVERO; 90127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 91127f9ae5SJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 92127f9ae5SJean-Christophe PLAGNIOL-VILLARD 93127f9ae5SJean-Christophe PLAGNIOL-VILLARD return 0; 94127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 95127f9ae5SJean-Christophe PLAGNIOL-VILLARD 96127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 97c2d5b341SSteve Sakoman * Routine: get_board_revision 98c2d5b341SSteve Sakoman * Description: Returns the board revision 99c2d5b341SSteve Sakoman */ 100c2d5b341SSteve Sakoman int get_board_revision(void) 101c2d5b341SSteve Sakoman { 102c2d5b341SSteve Sakoman int revision; 103c2d5b341SSteve Sakoman 1046789e84eSHeiko Schocher #ifdef CONFIG_SYS_I2C_OMAP34XX 105137703b8SAndreas Müller unsigned char data; 106137703b8SAndreas Müller 107137703b8SAndreas Müller /* board revisions <= R2410 connect 4030 irq_1 to gpio112 */ 108137703b8SAndreas Müller /* these boards should return a revision number of 0 */ 109137703b8SAndreas Müller /* the code below forces a 4030 RTC irq to ensure that gpio112 is low */ 110137703b8SAndreas Müller i2c_set_bus_num(TWL4030_I2C_BUS); 111137703b8SAndreas Müller data = 0x01; 112137703b8SAndreas Müller i2c_write(0x4B, 0x29, 1, &data, 1); 113137703b8SAndreas Müller data = 0x0c; 114137703b8SAndreas Müller i2c_write(0x4B, 0x2b, 1, &data, 1); 115137703b8SAndreas Müller i2c_read(0x4B, 0x2a, 1, &data, 1); 116137703b8SAndreas Müller #endif 117137703b8SAndreas Müller 11884c3b631SSanjeev Premi if (!gpio_request(112, "") && 11984c3b631SSanjeev Premi !gpio_request(113, "") && 12084c3b631SSanjeev Premi !gpio_request(115, "")) { 121c2d5b341SSteve Sakoman 12284c3b631SSanjeev Premi gpio_direction_input(112); 12384c3b631SSanjeev Premi gpio_direction_input(113); 12484c3b631SSanjeev Premi gpio_direction_input(115); 125c2d5b341SSteve Sakoman 12684c3b631SSanjeev Premi revision = gpio_get_value(115) << 2 | 12784c3b631SSanjeev Premi gpio_get_value(113) << 1 | 12884c3b631SSanjeev Premi gpio_get_value(112); 129c2d5b341SSteve Sakoman } else { 130bae485dbSAndreas Müller puts("Error: unable to acquire board revision GPIOs\n"); 131c2d5b341SSteve Sakoman revision = -1; 132c2d5b341SSteve Sakoman } 133c2d5b341SSteve Sakoman 134c2d5b341SSteve Sakoman return revision; 135c2d5b341SSteve Sakoman } 136c2d5b341SSteve Sakoman 137137703b8SAndreas Müller #ifdef CONFIG_SPL_BUILD 138137703b8SAndreas Müller /* 139137703b8SAndreas Müller * Routine: get_board_mem_timings 140137703b8SAndreas Müller * Description: If we use SPL then there is no x-loader nor config header 141137703b8SAndreas Müller * so we have to setup the DDR timings ourself on both banks. 142137703b8SAndreas Müller */ 1438c4445d2SPeter Barada void get_board_mem_timings(struct board_sdrc_timings *timings) 144137703b8SAndreas Müller { 1458c4445d2SPeter Barada timings->mr = MICRON_V_MR_165; 146137703b8SAndreas Müller switch (get_board_revision()) { 147137703b8SAndreas Müller case REVISION_0: /* Micron 1286MB/256MB, 1/2 banks of 128MB */ 1488c4445d2SPeter Barada timings->mcfg = MICRON_V_MCFG_165(128 << 20); 1498c4445d2SPeter Barada timings->ctrla = MICRON_V_ACTIMA_165; 1508c4445d2SPeter Barada timings->ctrlb = MICRON_V_ACTIMB_165; 1518c4445d2SPeter Barada timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 152137703b8SAndreas Müller break; 153137703b8SAndreas Müller case REVISION_1: /* Micron 256MB/512MB, 1/2 banks of 256MB */ 154be4cc457SAsh Charles case REVISION_4: 155802b3c7cSAsh Charles timings->mcfg = MICRON_V_MCFG_200(256 << 20); 156802b3c7cSAsh Charles timings->ctrla = MICRON_V_ACTIMA_200; 157802b3c7cSAsh Charles timings->ctrlb = MICRON_V_ACTIMB_200; 158802b3c7cSAsh Charles timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 159137703b8SAndreas Müller break; 160137703b8SAndreas Müller case REVISION_2: /* Hynix 256MB/512MB, 1/2 banks of 256MB */ 161802b3c7cSAsh Charles timings->mcfg = HYNIX_V_MCFG_200(256 << 20); 162802b3c7cSAsh Charles timings->ctrla = HYNIX_V_ACTIMA_200; 163802b3c7cSAsh Charles timings->ctrlb = HYNIX_V_ACTIMB_200; 164802b3c7cSAsh Charles timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 165137703b8SAndreas Müller break; 16649720a4bSSteve Sakoman case REVISION_3: /* Micron 512MB/1024MB, 1/2 banks of 512MB */ 16749720a4bSSteve Sakoman timings->mcfg = MCFG(512 << 20, 15); 16849720a4bSSteve Sakoman timings->ctrla = MICRON_V_ACTIMA_200; 16949720a4bSSteve Sakoman timings->ctrlb = MICRON_V_ACTIMB_200; 17049720a4bSSteve Sakoman timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 17149720a4bSSteve Sakoman break; 172137703b8SAndreas Müller default: 1738c4445d2SPeter Barada timings->mcfg = MICRON_V_MCFG_165(128 << 20); 1748c4445d2SPeter Barada timings->ctrla = MICRON_V_ACTIMA_165; 1758c4445d2SPeter Barada timings->ctrlb = MICRON_V_ACTIMB_165; 1768c4445d2SPeter Barada timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 177137703b8SAndreas Müller } 178137703b8SAndreas Müller } 179137703b8SAndreas Müller #endif 180137703b8SAndreas Müller 181c2d5b341SSteve Sakoman /* 182a06e1629SSteve Sakoman * Routine: get_sdio2_config 183a06e1629SSteve Sakoman * Description: Return information about the wifi module connection 184a06e1629SSteve Sakoman * Returns 0 if the module connects though a level translator 185a06e1629SSteve Sakoman * Returns 1 if the module connects directly 186a06e1629SSteve Sakoman */ 187a06e1629SSteve Sakoman int get_sdio2_config(void) 188a06e1629SSteve Sakoman { 189a06e1629SSteve Sakoman int sdio_direct; 190a06e1629SSteve Sakoman 19184c3b631SSanjeev Premi if (!gpio_request(130, "") && !gpio_request(139, "")) { 192a06e1629SSteve Sakoman 19384c3b631SSanjeev Premi gpio_direction_output(130, 0); 19484c3b631SSanjeev Premi gpio_direction_input(139); 195a06e1629SSteve Sakoman 196a06e1629SSteve Sakoman sdio_direct = 1; 19784c3b631SSanjeev Premi gpio_set_value(130, 0); 19884c3b631SSanjeev Premi if (gpio_get_value(139) == 0) { 19984c3b631SSanjeev Premi gpio_set_value(130, 1); 20084c3b631SSanjeev Premi if (gpio_get_value(139) == 1) 201a06e1629SSteve Sakoman sdio_direct = 0; 202a06e1629SSteve Sakoman } 203a06e1629SSteve Sakoman 204b5db0a06SJoe Hershberger gpio_direction_input(130); 205a06e1629SSteve Sakoman } else { 206bae485dbSAndreas Müller puts("Error: unable to acquire sdio2 clk GPIOs\n"); 207a06e1629SSteve Sakoman sdio_direct = -1; 208a06e1629SSteve Sakoman } 209a06e1629SSteve Sakoman 210a06e1629SSteve Sakoman return sdio_direct; 211a06e1629SSteve Sakoman } 212a06e1629SSteve Sakoman 213a06e1629SSteve Sakoman /* 214d64b5b89SSteve Sakoman * Routine: get_expansion_id 215d64b5b89SSteve Sakoman * Description: This function checks for expansion board by checking I2C 216d64b5b89SSteve Sakoman * bus 2 for the availability of an AT24C01B serial EEPROM. 217d64b5b89SSteve Sakoman * returns the device_vendor field from the EEPROM 218d64b5b89SSteve Sakoman */ 219d64b5b89SSteve Sakoman unsigned int get_expansion_id(void) 220d64b5b89SSteve Sakoman { 2214ed914a2SStefan Herbrechtsmeier if (expansion_config.device_vendor != 0x0) 2224ed914a2SStefan Herbrechtsmeier return expansion_config.device_vendor; 2234ed914a2SStefan Herbrechtsmeier 224d64b5b89SSteve Sakoman i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS); 225d64b5b89SSteve Sakoman 226d64b5b89SSteve Sakoman /* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */ 227d64b5b89SSteve Sakoman if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) { 228d64b5b89SSteve Sakoman i2c_set_bus_num(TWL4030_I2C_BUS); 229d64b5b89SSteve Sakoman return GUMSTIX_NO_EEPROM; 230d64b5b89SSteve Sakoman } 231d64b5b89SSteve Sakoman 232d64b5b89SSteve Sakoman /* read configuration data */ 233d64b5b89SSteve Sakoman i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config, 234d64b5b89SSteve Sakoman sizeof(expansion_config)); 235d64b5b89SSteve Sakoman 236d64b5b89SSteve Sakoman i2c_set_bus_num(TWL4030_I2C_BUS); 237d64b5b89SSteve Sakoman 238d64b5b89SSteve Sakoman return expansion_config.device_vendor; 239d64b5b89SSteve Sakoman } 240d64b5b89SSteve Sakoman 241d64b5b89SSteve Sakoman /* 242127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 243127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Configure board specific parts 244127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 245127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 246127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 247ea5940e9SAsh Charles unsigned int expansion_id; 248ea5940e9SAsh Charles 249127f9ae5SJean-Christophe PLAGNIOL-VILLARD twl4030_power_init(); 250ead39d7aSGrazvydas Ignotas twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 251127f9ae5SJean-Christophe PLAGNIOL-VILLARD 252c2d5b341SSteve Sakoman printf("Board revision: %d\n", get_board_revision()); 253a06e1629SSteve Sakoman 254a06e1629SSteve Sakoman switch (get_sdio2_config()) { 255a06e1629SSteve Sakoman case 0: 256bae485dbSAndreas Müller puts("Tranceiver detected on mmc2\n"); 257a06e1629SSteve Sakoman MUX_OVERO_SDIO2_TRANSCEIVER(); 258a06e1629SSteve Sakoman break; 259a06e1629SSteve Sakoman case 1: 260bae485dbSAndreas Müller puts("Direct connection on mmc2\n"); 261a06e1629SSteve Sakoman MUX_OVERO_SDIO2_DIRECT(); 262a06e1629SSteve Sakoman break; 263a06e1629SSteve Sakoman default: 264bae485dbSAndreas Müller puts("Unable to detect mmc2 connection type\n"); 265a06e1629SSteve Sakoman } 266a06e1629SSteve Sakoman 267ea5940e9SAsh Charles expansion_id = get_expansion_id(); 268ea5940e9SAsh Charles switch (expansion_id) { 269d64b5b89SSteve Sakoman case GUMSTIX_SUMMIT: 270d64b5b89SSteve Sakoman printf("Recognized Summit expansion board (rev %d %s)\n", 271d64b5b89SSteve Sakoman expansion_config.revision, 272d64b5b89SSteve Sakoman expansion_config.fab_revision); 2734ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 274d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 27512cc5437SAsh Charles setenv("expansionname", "summit"); 276d64b5b89SSteve Sakoman break; 277d64b5b89SSteve Sakoman case GUMSTIX_TOBI: 278d64b5b89SSteve Sakoman printf("Recognized Tobi expansion board (rev %d %s)\n", 279d64b5b89SSteve Sakoman expansion_config.revision, 280d64b5b89SSteve Sakoman expansion_config.fab_revision); 2814ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 282d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 28312cc5437SAsh Charles setenv("expansionname", "tobi"); 284d64b5b89SSteve Sakoman break; 285d64b5b89SSteve Sakoman case GUMSTIX_TOBI_DUO: 286d64b5b89SSteve Sakoman printf("Recognized Tobi Duo expansion board (rev %d %s)\n", 287d64b5b89SSteve Sakoman expansion_config.revision, 288d64b5b89SSteve Sakoman expansion_config.fab_revision); 2894ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 29072c7be95SArun Bharadwaj setenv("expansionname", "tobiduo"); 291d64b5b89SSteve Sakoman break; 292d64b5b89SSteve Sakoman case GUMSTIX_PALO35: 293d64b5b89SSteve Sakoman printf("Recognized Palo35 expansion board (rev %d %s)\n", 294d64b5b89SSteve Sakoman expansion_config.revision, 295d64b5b89SSteve Sakoman expansion_config.fab_revision); 2964ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 297d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd35"); 298*2ed43b54SAsh Charles setenv("expansionname", "palo35"); 299d64b5b89SSteve Sakoman break; 300d64b5b89SSteve Sakoman case GUMSTIX_PALO43: 301d64b5b89SSteve Sakoman printf("Recognized Palo43 expansion board (rev %d %s)\n", 302d64b5b89SSteve Sakoman expansion_config.revision, 303d64b5b89SSteve Sakoman expansion_config.fab_revision); 3044ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 305d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 30612cc5437SAsh Charles setenv("expansionname", "palo43"); 307d64b5b89SSteve Sakoman break; 308d64b5b89SSteve Sakoman case GUMSTIX_CHESTNUT43: 309d64b5b89SSteve Sakoman printf("Recognized Chestnut43 expansion board (rev %d %s)\n", 310d64b5b89SSteve Sakoman expansion_config.revision, 311d64b5b89SSteve Sakoman expansion_config.fab_revision); 3124ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 313d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 31412cc5437SAsh Charles setenv("expansionname", "chestnut43"); 315d64b5b89SSteve Sakoman break; 316d64b5b89SSteve Sakoman case GUMSTIX_PINTO: 317d64b5b89SSteve Sakoman printf("Recognized Pinto expansion board (rev %d %s)\n", 318d64b5b89SSteve Sakoman expansion_config.revision, 319d64b5b89SSteve Sakoman expansion_config.fab_revision); 3204ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 321d64b5b89SSteve Sakoman break; 322d64b5b89SSteve Sakoman case GUMSTIX_GALLOP43: 323d64b5b89SSteve Sakoman printf("Recognized Gallop43 expansion board (rev %d %s)\n", 324d64b5b89SSteve Sakoman expansion_config.revision, 325d64b5b89SSteve Sakoman expansion_config.fab_revision); 3264ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 327d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 32812cc5437SAsh Charles setenv("expansionname", "gallop43"); 329d64b5b89SSteve Sakoman break; 330ea5940e9SAsh Charles case GUMSTIX_ALTO35: 331ea5940e9SAsh Charles printf("Recognized Alto35 expansion board (rev %d %s)\n", 332ea5940e9SAsh Charles expansion_config.revision, 333ea5940e9SAsh Charles expansion_config.fab_revision); 3344ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 335ea5940e9SAsh Charles MUX_ALTO35(); 336ea5940e9SAsh Charles setenv("defaultdisplay", "lcd35"); 33712cc5437SAsh Charles setenv("expansionname", "alto35"); 338ea5940e9SAsh Charles break; 339ea5940e9SAsh Charles case GUMSTIX_STAGECOACH: 340ea5940e9SAsh Charles printf("Recognized Stagecoach expansion board (rev %d %s)\n", 341ea5940e9SAsh Charles expansion_config.revision, 342ea5940e9SAsh Charles expansion_config.fab_revision); 3434ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 344ea5940e9SAsh Charles break; 345ea5940e9SAsh Charles case GUMSTIX_THUMBO: 346ea5940e9SAsh Charles printf("Recognized Thumbo expansion board (rev %d %s)\n", 347ea5940e9SAsh Charles expansion_config.revision, 348ea5940e9SAsh Charles expansion_config.fab_revision); 3494ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 350ea5940e9SAsh Charles break; 351ea5940e9SAsh Charles case GUMSTIX_TURTLECORE: 352ea5940e9SAsh Charles printf("Recognized Turtlecore expansion board (rev %d %s)\n", 353ea5940e9SAsh Charles expansion_config.revision, 354ea5940e9SAsh Charles expansion_config.fab_revision); 3554ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 356ea5940e9SAsh Charles break; 357ea5940e9SAsh Charles case GUMSTIX_ARBOR43C: 358ea5940e9SAsh Charles printf("Recognized Arbor43C expansion board (rev %d %s)\n", 359ea5940e9SAsh Charles expansion_config.revision, 360ea5940e9SAsh Charles expansion_config.fab_revision); 3614ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 362ea5940e9SAsh Charles MUX_ARBOR43C(); 363ea5940e9SAsh Charles setenv("defaultdisplay", "lcd43"); 364da9ed5abSAsh Charles setenv("expansionname", "arbor43c"); 365ea5940e9SAsh Charles break; 366d64b5b89SSteve Sakoman case ETTUS_USRP_E: 367d64b5b89SSteve Sakoman printf("Recognized Ettus Research USRP-E (rev %d %s)\n", 368d64b5b89SSteve Sakoman expansion_config.revision, 369d64b5b89SSteve Sakoman expansion_config.fab_revision); 3704ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 371d64b5b89SSteve Sakoman MUX_USRP_E(); 372d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 373d64b5b89SSteve Sakoman break; 374d64b5b89SSteve Sakoman case GUMSTIX_NO_EEPROM: 3754ed914a2SStefan Herbrechtsmeier case GUMSTIX_EMPTY_EEPROM: 3764ed914a2SStefan Herbrechtsmeier puts("No or empty EEPROM on expansion board\n"); 3774ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 37812cc5437SAsh Charles setenv("expansionname", "tobi"); 379d64b5b89SSteve Sakoman break; 380d64b5b89SSteve Sakoman default: 381ea5940e9SAsh Charles printf("Unrecognized expansion board 0x%08x\n", expansion_id); 382ea5940e9SAsh Charles break; 383d64b5b89SSteve Sakoman } 384d64b5b89SSteve Sakoman 385d64b5b89SSteve Sakoman if (expansion_config.content == 1) 386d64b5b89SSteve Sakoman setenv(expansion_config.env_var, expansion_config.env_setting); 387d64b5b89SSteve Sakoman 388127f9ae5SJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 389127f9ae5SJean-Christophe PLAGNIOL-VILLARD 39012cc5437SAsh Charles if (get_cpu_family() == CPU_OMAP34XX) 39112cc5437SAsh Charles setenv("boardname", "overo"); 39212cc5437SAsh Charles else 39312cc5437SAsh Charles setenv("boardname", "overo-storm"); 39412cc5437SAsh Charles 395127f9ae5SJean-Christophe PLAGNIOL-VILLARD return 0; 396127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 397127f9ae5SJean-Christophe PLAGNIOL-VILLARD 398127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 399127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 400127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 401127f9ae5SJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 402127f9ae5SJean-Christophe PLAGNIOL-VILLARD * mode. 403127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 404127f9ae5SJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 405127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 406127f9ae5SJean-Christophe PLAGNIOL-VILLARD MUX_OVERO(); 407127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 408df382626SOlof Johansson 409113429a2SStefan Herbrechtsmeier #if defined(CONFIG_CMD_NET) && !defined(CONFIG_SPL_BUILD) 410113429a2SStefan Herbrechtsmeier /* GPMC definitions for LAN9221 chips on Tobi expansion boards */ 411113429a2SStefan Herbrechtsmeier static const u32 gpmc_lan_config[] = { 412113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG1, 413113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG2, 414113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG3, 415113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG4, 416113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG5, 417113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG6, 418113429a2SStefan Herbrechtsmeier /*CONFIG7- computed as params */ 419113429a2SStefan Herbrechtsmeier }; 420113429a2SStefan Herbrechtsmeier 421df382626SOlof Johansson /* 422df382626SOlof Johansson * Routine: setup_net_chip 423df382626SOlof Johansson * Description: Setting up the configuration GPMC registers specific to the 424df382626SOlof Johansson * Ethernet hardware. 425df382626SOlof Johansson */ 426df382626SOlof Johansson static void setup_net_chip(void) 427df382626SOlof Johansson { 428df382626SOlof Johansson struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 429df382626SOlof Johansson 430df382626SOlof Johansson /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 431df382626SOlof Johansson writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 432df382626SOlof Johansson /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 433df382626SOlof Johansson writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 434df382626SOlof Johansson /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 435df382626SOlof Johansson writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 436df382626SOlof Johansson &ctrl_base->gpmc_nadv_ale); 437113429a2SStefan Herbrechtsmeier } 438df382626SOlof Johansson 439113429a2SStefan Herbrechtsmeier /* 440113429a2SStefan Herbrechtsmeier * Routine: reset_net_chip 441113429a2SStefan Herbrechtsmeier * Description: Reset the Ethernet hardware. 442113429a2SStefan Herbrechtsmeier */ 443113429a2SStefan Herbrechtsmeier static void reset_net_chip(void) 444113429a2SStefan Herbrechtsmeier { 445df382626SOlof Johansson /* Make GPIO 64 as output pin and send a magic pulse through it */ 44684c3b631SSanjeev Premi if (!gpio_request(64, "")) { 44784c3b631SSanjeev Premi gpio_direction_output(64, 0); 44884c3b631SSanjeev Premi gpio_set_value(64, 1); 449df382626SOlof Johansson udelay(1); 45084c3b631SSanjeev Premi gpio_set_value(64, 0); 451df382626SOlof Johansson udelay(1); 45284c3b631SSanjeev Premi gpio_set_value(64, 1); 453df382626SOlof Johansson } 454df382626SOlof Johansson } 455df382626SOlof Johansson 456df382626SOlof Johansson int board_eth_init(bd_t *bis) 457df382626SOlof Johansson { 458113429a2SStefan Herbrechtsmeier unsigned int expansion_id; 459df382626SOlof Johansson int rc = 0; 460113429a2SStefan Herbrechtsmeier 461df382626SOlof Johansson #ifdef CONFIG_SMC911X 462113429a2SStefan Herbrechtsmeier expansion_id = get_expansion_id(); 463113429a2SStefan Herbrechtsmeier switch (expansion_id) { 464113429a2SStefan Herbrechtsmeier case GUMSTIX_TOBI_DUO: 465113429a2SStefan Herbrechtsmeier /* second lan chip */ 466113429a2SStefan Herbrechtsmeier enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4], 467113429a2SStefan Herbrechtsmeier 0x2B000000, GPMC_SIZE_16M); 468113429a2SStefan Herbrechtsmeier /* no break */ 469113429a2SStefan Herbrechtsmeier case GUMSTIX_TOBI: 470113429a2SStefan Herbrechtsmeier case GUMSTIX_CHESTNUT43: 471113429a2SStefan Herbrechtsmeier case GUMSTIX_STAGECOACH: 472113429a2SStefan Herbrechtsmeier case GUMSTIX_NO_EEPROM: 473113429a2SStefan Herbrechtsmeier case GUMSTIX_EMPTY_EEPROM: 474113429a2SStefan Herbrechtsmeier /* first lan chip */ 475113429a2SStefan Herbrechtsmeier enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5], 476113429a2SStefan Herbrechtsmeier 0x2C000000, GPMC_SIZE_16M); 477113429a2SStefan Herbrechtsmeier 478113429a2SStefan Herbrechtsmeier setup_net_chip(); 479113429a2SStefan Herbrechtsmeier reset_net_chip(); 480113429a2SStefan Herbrechtsmeier 481df382626SOlof Johansson rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 482113429a2SStefan Herbrechtsmeier break; 483113429a2SStefan Herbrechtsmeier default: 484113429a2SStefan Herbrechtsmeier break; 485113429a2SStefan Herbrechtsmeier } 486df382626SOlof Johansson #endif 487113429a2SStefan Herbrechtsmeier 488df382626SOlof Johansson return rc; 489df382626SOlof Johansson } 490113429a2SStefan Herbrechtsmeier #endif 491cd7c5726SSteve Sakoman 492137703b8SAndreas Müller #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD) 493cd7c5726SSteve Sakoman int board_mmc_init(bd_t *bis) 494cd7c5726SSteve Sakoman { 495e3913f56SNikita Kiryanov return omap_mmc_init(0, 0, 0, -1, -1); 496cd7c5726SSteve Sakoman } 497cd7c5726SSteve Sakoman #endif 498f5c30c1bSStefan Herbrechtsmeier 499aac5450eSPaul Kocialkowski #if defined(CONFIG_GENERIC_MMC) 500aac5450eSPaul Kocialkowski void board_mmc_power_init(void) 501aac5450eSPaul Kocialkowski { 502aac5450eSPaul Kocialkowski twl4030_power_mmc_init(0); 503aac5450eSPaul Kocialkowski } 504aac5450eSPaul Kocialkowski #endif 505aac5450eSPaul Kocialkowski 506f5c30c1bSStefan Herbrechtsmeier #if defined(CONFIG_USB_EHCI) && !defined(CONFIG_SPL_BUILD) 507f5c30c1bSStefan Herbrechtsmeier static struct omap_usbhs_board_data usbhs_bdata = { 508f5c30c1bSStefan Herbrechtsmeier .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, 509f5c30c1bSStefan Herbrechtsmeier .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, 510f5c30c1bSStefan Herbrechtsmeier .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED 511f5c30c1bSStefan Herbrechtsmeier }; 512f5c30c1bSStefan Herbrechtsmeier 513f5c30c1bSStefan Herbrechtsmeier #define GUMSTIX_GPIO_USBH_CPEN 168 514f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_init(int index, enum usb_init_type init, 515f5c30c1bSStefan Herbrechtsmeier struct ehci_hccr **hccr, struct ehci_hcor **hcor) 516f5c30c1bSStefan Herbrechtsmeier { 517f5c30c1bSStefan Herbrechtsmeier /* Enable USB power */ 518f5c30c1bSStefan Herbrechtsmeier if (!gpio_request(GUMSTIX_GPIO_USBH_CPEN, "usbh_cpen")) 519f5c30c1bSStefan Herbrechtsmeier gpio_direction_output(GUMSTIX_GPIO_USBH_CPEN, 1); 520f5c30c1bSStefan Herbrechtsmeier 521f5c30c1bSStefan Herbrechtsmeier return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor); 522f5c30c1bSStefan Herbrechtsmeier } 523f5c30c1bSStefan Herbrechtsmeier 524f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_stop(void) 525f5c30c1bSStefan Herbrechtsmeier { 526f5c30c1bSStefan Herbrechtsmeier /* Disable USB power */ 527f5c30c1bSStefan Herbrechtsmeier gpio_set_value(GUMSTIX_GPIO_USBH_CPEN, 0); 528f5c30c1bSStefan Herbrechtsmeier gpio_free(GUMSTIX_GPIO_USBH_CPEN); 529f5c30c1bSStefan Herbrechtsmeier 530f5c30c1bSStefan Herbrechtsmeier return omap_ehci_hcd_stop(); 531f5c30c1bSStefan Herbrechtsmeier } 532f5c30c1bSStefan Herbrechtsmeier 533f5c30c1bSStefan Herbrechtsmeier #endif /* CONFIG_USB_EHCI */ 534