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> 16df382626SOlof Johansson #include <netdev.h> 17127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h> 18137703b8SAndreas Müller #include <linux/mtd/nand.h> 19127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 20cd7c5726SSteve Sakoman #include <asm/arch/mmc_host_def.h> 21127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h> 22df382626SOlof Johansson #include <asm/arch/mem.h> 23127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h> 2484c3b631SSanjeev Premi #include <asm/gpio.h> 25127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 26127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include "overo.h" 27127f9ae5SJean-Christophe PLAGNIOL-VILLARD 2829565326SJohn Rigby DECLARE_GLOBAL_DATA_PTR; 2929565326SJohn Rigby 30d64b5b89SSteve Sakoman #define TWL4030_I2C_BUS 0 31d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_BUS 2 32d64b5b89SSteve Sakoman #define EXPANSION_EEPROM_I2C_ADDRESS 0x51 33d64b5b89SSteve Sakoman 34d64b5b89SSteve Sakoman #define GUMSTIX_SUMMIT 0x01000200 35d64b5b89SSteve Sakoman #define GUMSTIX_TOBI 0x02000200 36d64b5b89SSteve Sakoman #define GUMSTIX_TOBI_DUO 0x03000200 37d64b5b89SSteve Sakoman #define GUMSTIX_PALO35 0x04000200 38d64b5b89SSteve Sakoman #define GUMSTIX_PALO43 0x05000200 39d64b5b89SSteve Sakoman #define GUMSTIX_CHESTNUT43 0x06000200 40d64b5b89SSteve Sakoman #define GUMSTIX_PINTO 0x07000200 41d64b5b89SSteve Sakoman #define GUMSTIX_GALLOP43 0x08000200 42*ea5940e9SAsh Charles #define GUMSTIX_ALTO35 0x09000200 43*ea5940e9SAsh Charles #define GUMSTIX_STAGECOACH 0x0A000200 44*ea5940e9SAsh Charles #define GUMSTIX_THUMBO 0x0B000200 45*ea5940e9SAsh Charles #define GUMSTIX_TURTLECORE 0x0C000200 46*ea5940e9SAsh Charles #define GUMSTIX_ARBOR43C 0x0D000200 47d64b5b89SSteve Sakoman 48d64b5b89SSteve Sakoman #define ETTUS_USRP_E 0x01000300 49d64b5b89SSteve Sakoman 50d64b5b89SSteve Sakoman #define GUMSTIX_NO_EEPROM 0xffffffff 51d64b5b89SSteve Sakoman 52d64b5b89SSteve Sakoman static struct { 53d64b5b89SSteve Sakoman unsigned int device_vendor; 54d64b5b89SSteve Sakoman unsigned char revision; 55d64b5b89SSteve Sakoman unsigned char content; 56d64b5b89SSteve Sakoman char fab_revision[8]; 57d64b5b89SSteve Sakoman char env_var[16]; 58d64b5b89SSteve Sakoman char env_setting[64]; 59d64b5b89SSteve Sakoman } expansion_config; 60d64b5b89SSteve Sakoman 61df382626SOlof Johansson #if defined(CONFIG_CMD_NET) 62df382626SOlof Johansson static void setup_net_chip(void); 63df382626SOlof Johansson #endif 64df382626SOlof Johansson 65ba9a11e4SSteve Sakoman /* GPMC definitions for LAN9221 chips on Tobi expansion boards */ 66ba9a11e4SSteve Sakoman static const u32 gpmc_lan_config[] = { 67ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG1, 68ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG2, 69ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG3, 70ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG4, 71ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG5, 72ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG6, 73ba9a11e4SSteve Sakoman /*CONFIG7- computed as params */ 74ba9a11e4SSteve Sakoman }; 75ba9a11e4SSteve Sakoman 76127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 77127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 78127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 79127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 80127f9ae5SJean-Christophe PLAGNIOL-VILLARD int board_init(void) 81127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 82127f9ae5SJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 83127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 84127f9ae5SJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OVERO; 85127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 86127f9ae5SJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 87127f9ae5SJean-Christophe PLAGNIOL-VILLARD 88127f9ae5SJean-Christophe PLAGNIOL-VILLARD return 0; 89127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 90127f9ae5SJean-Christophe PLAGNIOL-VILLARD 91127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 92c2d5b341SSteve Sakoman * Routine: get_board_revision 93c2d5b341SSteve Sakoman * Description: Returns the board revision 94c2d5b341SSteve Sakoman */ 95c2d5b341SSteve Sakoman int get_board_revision(void) 96c2d5b341SSteve Sakoman { 97c2d5b341SSteve Sakoman int revision; 98c2d5b341SSteve Sakoman 996789e84eSHeiko Schocher #ifdef CONFIG_SYS_I2C_OMAP34XX 100137703b8SAndreas Müller unsigned char data; 101137703b8SAndreas Müller 102137703b8SAndreas Müller /* board revisions <= R2410 connect 4030 irq_1 to gpio112 */ 103137703b8SAndreas Müller /* these boards should return a revision number of 0 */ 104137703b8SAndreas Müller /* the code below forces a 4030 RTC irq to ensure that gpio112 is low */ 105137703b8SAndreas Müller i2c_set_bus_num(TWL4030_I2C_BUS); 106137703b8SAndreas Müller data = 0x01; 107137703b8SAndreas Müller i2c_write(0x4B, 0x29, 1, &data, 1); 108137703b8SAndreas Müller data = 0x0c; 109137703b8SAndreas Müller i2c_write(0x4B, 0x2b, 1, &data, 1); 110137703b8SAndreas Müller i2c_read(0x4B, 0x2a, 1, &data, 1); 111137703b8SAndreas Müller #endif 112137703b8SAndreas Müller 11384c3b631SSanjeev Premi if (!gpio_request(112, "") && 11484c3b631SSanjeev Premi !gpio_request(113, "") && 11584c3b631SSanjeev Premi !gpio_request(115, "")) { 116c2d5b341SSteve Sakoman 11784c3b631SSanjeev Premi gpio_direction_input(112); 11884c3b631SSanjeev Premi gpio_direction_input(113); 11984c3b631SSanjeev Premi gpio_direction_input(115); 120c2d5b341SSteve Sakoman 12184c3b631SSanjeev Premi revision = gpio_get_value(115) << 2 | 12284c3b631SSanjeev Premi gpio_get_value(113) << 1 | 12384c3b631SSanjeev Premi gpio_get_value(112); 124c2d5b341SSteve Sakoman } else { 125bae485dbSAndreas Müller puts("Error: unable to acquire board revision GPIOs\n"); 126c2d5b341SSteve Sakoman revision = -1; 127c2d5b341SSteve Sakoman } 128c2d5b341SSteve Sakoman 129c2d5b341SSteve Sakoman return revision; 130c2d5b341SSteve Sakoman } 131c2d5b341SSteve Sakoman 132137703b8SAndreas Müller #ifdef CONFIG_SPL_BUILD 133137703b8SAndreas Müller /* 134137703b8SAndreas Müller * Routine: get_board_mem_timings 135137703b8SAndreas Müller * Description: If we use SPL then there is no x-loader nor config header 136137703b8SAndreas Müller * so we have to setup the DDR timings ourself on both banks. 137137703b8SAndreas Müller */ 1388c4445d2SPeter Barada void get_board_mem_timings(struct board_sdrc_timings *timings) 139137703b8SAndreas Müller { 1408c4445d2SPeter Barada timings->mr = MICRON_V_MR_165; 141137703b8SAndreas Müller switch (get_board_revision()) { 142137703b8SAndreas Müller case REVISION_0: /* Micron 1286MB/256MB, 1/2 banks of 128MB */ 1438c4445d2SPeter Barada timings->mcfg = MICRON_V_MCFG_165(128 << 20); 1448c4445d2SPeter Barada timings->ctrla = MICRON_V_ACTIMA_165; 1458c4445d2SPeter Barada timings->ctrlb = MICRON_V_ACTIMB_165; 1468c4445d2SPeter Barada timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 147137703b8SAndreas Müller break; 148137703b8SAndreas Müller case REVISION_1: /* Micron 256MB/512MB, 1/2 banks of 256MB */ 149be4cc457SAsh Charles case REVISION_4: 150802b3c7cSAsh Charles timings->mcfg = MICRON_V_MCFG_200(256 << 20); 151802b3c7cSAsh Charles timings->ctrla = MICRON_V_ACTIMA_200; 152802b3c7cSAsh Charles timings->ctrlb = MICRON_V_ACTIMB_200; 153802b3c7cSAsh Charles timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 154137703b8SAndreas Müller break; 155137703b8SAndreas Müller case REVISION_2: /* Hynix 256MB/512MB, 1/2 banks of 256MB */ 156802b3c7cSAsh Charles timings->mcfg = HYNIX_V_MCFG_200(256 << 20); 157802b3c7cSAsh Charles timings->ctrla = HYNIX_V_ACTIMA_200; 158802b3c7cSAsh Charles timings->ctrlb = HYNIX_V_ACTIMB_200; 159802b3c7cSAsh Charles timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 160137703b8SAndreas Müller break; 16149720a4bSSteve Sakoman case REVISION_3: /* Micron 512MB/1024MB, 1/2 banks of 512MB */ 16249720a4bSSteve Sakoman timings->mcfg = MCFG(512 << 20, 15); 16349720a4bSSteve Sakoman timings->ctrla = MICRON_V_ACTIMA_200; 16449720a4bSSteve Sakoman timings->ctrlb = MICRON_V_ACTIMB_200; 16549720a4bSSteve Sakoman timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz; 16649720a4bSSteve Sakoman break; 167137703b8SAndreas Müller default: 1688c4445d2SPeter Barada timings->mcfg = MICRON_V_MCFG_165(128 << 20); 1698c4445d2SPeter Barada timings->ctrla = MICRON_V_ACTIMA_165; 1708c4445d2SPeter Barada timings->ctrlb = MICRON_V_ACTIMB_165; 1718c4445d2SPeter Barada timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 172137703b8SAndreas Müller } 173137703b8SAndreas Müller } 174137703b8SAndreas Müller #endif 175137703b8SAndreas Müller 176c2d5b341SSteve Sakoman /* 177a06e1629SSteve Sakoman * Routine: get_sdio2_config 178a06e1629SSteve Sakoman * Description: Return information about the wifi module connection 179a06e1629SSteve Sakoman * Returns 0 if the module connects though a level translator 180a06e1629SSteve Sakoman * Returns 1 if the module connects directly 181a06e1629SSteve Sakoman */ 182a06e1629SSteve Sakoman int get_sdio2_config(void) 183a06e1629SSteve Sakoman { 184a06e1629SSteve Sakoman int sdio_direct; 185a06e1629SSteve Sakoman 18684c3b631SSanjeev Premi if (!gpio_request(130, "") && !gpio_request(139, "")) { 187a06e1629SSteve Sakoman 18884c3b631SSanjeev Premi gpio_direction_output(130, 0); 18984c3b631SSanjeev Premi gpio_direction_input(139); 190a06e1629SSteve Sakoman 191a06e1629SSteve Sakoman sdio_direct = 1; 19284c3b631SSanjeev Premi gpio_set_value(130, 0); 19384c3b631SSanjeev Premi if (gpio_get_value(139) == 0) { 19484c3b631SSanjeev Premi gpio_set_value(130, 1); 19584c3b631SSanjeev Premi if (gpio_get_value(139) == 1) 196a06e1629SSteve Sakoman sdio_direct = 0; 197a06e1629SSteve Sakoman } 198a06e1629SSteve Sakoman 199b5db0a06SJoe Hershberger gpio_direction_input(130); 200a06e1629SSteve Sakoman } else { 201bae485dbSAndreas Müller puts("Error: unable to acquire sdio2 clk GPIOs\n"); 202a06e1629SSteve Sakoman sdio_direct = -1; 203a06e1629SSteve Sakoman } 204a06e1629SSteve Sakoman 205a06e1629SSteve Sakoman return sdio_direct; 206a06e1629SSteve Sakoman } 207a06e1629SSteve Sakoman 208a06e1629SSteve Sakoman /* 209d64b5b89SSteve Sakoman * Routine: get_expansion_id 210d64b5b89SSteve Sakoman * Description: This function checks for expansion board by checking I2C 211d64b5b89SSteve Sakoman * bus 2 for the availability of an AT24C01B serial EEPROM. 212d64b5b89SSteve Sakoman * returns the device_vendor field from the EEPROM 213d64b5b89SSteve Sakoman */ 214d64b5b89SSteve Sakoman unsigned int get_expansion_id(void) 215d64b5b89SSteve Sakoman { 216d64b5b89SSteve Sakoman i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS); 217d64b5b89SSteve Sakoman 218d64b5b89SSteve Sakoman /* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */ 219d64b5b89SSteve Sakoman if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) { 220d64b5b89SSteve Sakoman i2c_set_bus_num(TWL4030_I2C_BUS); 221d64b5b89SSteve Sakoman return GUMSTIX_NO_EEPROM; 222d64b5b89SSteve Sakoman } 223d64b5b89SSteve Sakoman 224d64b5b89SSteve Sakoman /* read configuration data */ 225d64b5b89SSteve Sakoman i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config, 226d64b5b89SSteve Sakoman sizeof(expansion_config)); 227d64b5b89SSteve Sakoman 228d64b5b89SSteve Sakoman i2c_set_bus_num(TWL4030_I2C_BUS); 229d64b5b89SSteve Sakoman 230d64b5b89SSteve Sakoman return expansion_config.device_vendor; 231d64b5b89SSteve Sakoman } 232d64b5b89SSteve Sakoman 233d64b5b89SSteve Sakoman /* 234127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 235127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Configure board specific parts 236127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 237127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 238127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 239*ea5940e9SAsh Charles unsigned int expansion_id; 240*ea5940e9SAsh Charles 241127f9ae5SJean-Christophe PLAGNIOL-VILLARD twl4030_power_init(); 242ead39d7aSGrazvydas Ignotas twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 243127f9ae5SJean-Christophe PLAGNIOL-VILLARD 244df382626SOlof Johansson #if defined(CONFIG_CMD_NET) 245df382626SOlof Johansson setup_net_chip(); 246df382626SOlof Johansson #endif 247df382626SOlof Johansson 248c2d5b341SSteve Sakoman printf("Board revision: %d\n", get_board_revision()); 249a06e1629SSteve Sakoman 250a06e1629SSteve Sakoman switch (get_sdio2_config()) { 251a06e1629SSteve Sakoman case 0: 252bae485dbSAndreas Müller puts("Tranceiver detected on mmc2\n"); 253a06e1629SSteve Sakoman MUX_OVERO_SDIO2_TRANSCEIVER(); 254a06e1629SSteve Sakoman break; 255a06e1629SSteve Sakoman case 1: 256bae485dbSAndreas Müller puts("Direct connection on mmc2\n"); 257a06e1629SSteve Sakoman MUX_OVERO_SDIO2_DIRECT(); 258a06e1629SSteve Sakoman break; 259a06e1629SSteve Sakoman default: 260bae485dbSAndreas Müller puts("Unable to detect mmc2 connection type\n"); 261a06e1629SSteve Sakoman } 262a06e1629SSteve Sakoman 263*ea5940e9SAsh Charles expansion_id = get_expansion_id(); 264*ea5940e9SAsh Charles switch (expansion_id) { 265d64b5b89SSteve Sakoman case GUMSTIX_SUMMIT: 266d64b5b89SSteve Sakoman printf("Recognized Summit expansion board (rev %d %s)\n", 267d64b5b89SSteve Sakoman expansion_config.revision, 268d64b5b89SSteve Sakoman expansion_config.fab_revision); 269d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 270d64b5b89SSteve Sakoman break; 271d64b5b89SSteve Sakoman case GUMSTIX_TOBI: 272d64b5b89SSteve Sakoman printf("Recognized Tobi expansion board (rev %d %s)\n", 273d64b5b89SSteve Sakoman expansion_config.revision, 274d64b5b89SSteve Sakoman expansion_config.fab_revision); 275d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 276d64b5b89SSteve Sakoman break; 277d64b5b89SSteve Sakoman case GUMSTIX_TOBI_DUO: 278d64b5b89SSteve Sakoman printf("Recognized Tobi Duo expansion board (rev %d %s)\n", 279d64b5b89SSteve Sakoman expansion_config.revision, 280d64b5b89SSteve Sakoman expansion_config.fab_revision); 2818f7109b3SPhilip Balister /* second lan chip */ 2828f7109b3SPhilip Balister enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4], 2838f7109b3SPhilip Balister 0x2B000000, GPMC_SIZE_16M); 284d64b5b89SSteve Sakoman break; 285d64b5b89SSteve Sakoman case GUMSTIX_PALO35: 286d64b5b89SSteve Sakoman printf("Recognized Palo35 expansion board (rev %d %s)\n", 287d64b5b89SSteve Sakoman expansion_config.revision, 288d64b5b89SSteve Sakoman expansion_config.fab_revision); 289d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd35"); 290d64b5b89SSteve Sakoman break; 291d64b5b89SSteve Sakoman case GUMSTIX_PALO43: 292d64b5b89SSteve Sakoman printf("Recognized Palo43 expansion board (rev %d %s)\n", 293d64b5b89SSteve Sakoman expansion_config.revision, 294d64b5b89SSteve Sakoman expansion_config.fab_revision); 295d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 296d64b5b89SSteve Sakoman break; 297d64b5b89SSteve Sakoman case GUMSTIX_CHESTNUT43: 298d64b5b89SSteve Sakoman printf("Recognized Chestnut43 expansion board (rev %d %s)\n", 299d64b5b89SSteve Sakoman expansion_config.revision, 300d64b5b89SSteve Sakoman expansion_config.fab_revision); 301d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 302d64b5b89SSteve Sakoman break; 303d64b5b89SSteve Sakoman case GUMSTIX_PINTO: 304d64b5b89SSteve Sakoman printf("Recognized Pinto expansion board (rev %d %s)\n", 305d64b5b89SSteve Sakoman expansion_config.revision, 306d64b5b89SSteve Sakoman expansion_config.fab_revision); 307d64b5b89SSteve Sakoman break; 308d64b5b89SSteve Sakoman case GUMSTIX_GALLOP43: 309d64b5b89SSteve Sakoman printf("Recognized Gallop43 expansion board (rev %d %s)\n", 310d64b5b89SSteve Sakoman expansion_config.revision, 311d64b5b89SSteve Sakoman expansion_config.fab_revision); 312d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 313d64b5b89SSteve Sakoman break; 314*ea5940e9SAsh Charles case GUMSTIX_ALTO35: 315*ea5940e9SAsh Charles printf("Recognized Alto35 expansion board (rev %d %s)\n", 316*ea5940e9SAsh Charles expansion_config.revision, 317*ea5940e9SAsh Charles expansion_config.fab_revision); 318*ea5940e9SAsh Charles MUX_ALTO35(); 319*ea5940e9SAsh Charles setenv("defaultdisplay", "lcd35"); 320*ea5940e9SAsh Charles break; 321*ea5940e9SAsh Charles case GUMSTIX_STAGECOACH: 322*ea5940e9SAsh Charles printf("Recognized Stagecoach expansion board (rev %d %s)\n", 323*ea5940e9SAsh Charles expansion_config.revision, 324*ea5940e9SAsh Charles expansion_config.fab_revision); 325*ea5940e9SAsh Charles break; 326*ea5940e9SAsh Charles case GUMSTIX_THUMBO: 327*ea5940e9SAsh Charles printf("Recognized Thumbo expansion board (rev %d %s)\n", 328*ea5940e9SAsh Charles expansion_config.revision, 329*ea5940e9SAsh Charles expansion_config.fab_revision); 330*ea5940e9SAsh Charles break; 331*ea5940e9SAsh Charles case GUMSTIX_TURTLECORE: 332*ea5940e9SAsh Charles printf("Recognized Turtlecore expansion board (rev %d %s)\n", 333*ea5940e9SAsh Charles expansion_config.revision, 334*ea5940e9SAsh Charles expansion_config.fab_revision); 335*ea5940e9SAsh Charles break; 336*ea5940e9SAsh Charles case GUMSTIX_ARBOR43C: 337*ea5940e9SAsh Charles printf("Recognized Arbor43C expansion board (rev %d %s)\n", 338*ea5940e9SAsh Charles expansion_config.revision, 339*ea5940e9SAsh Charles expansion_config.fab_revision); 340*ea5940e9SAsh Charles MUX_ARBOR43C(); 341*ea5940e9SAsh Charles setenv("defaultdisplay", "lcd43"); 342*ea5940e9SAsh Charles break; 343d64b5b89SSteve Sakoman case ETTUS_USRP_E: 344d64b5b89SSteve Sakoman printf("Recognized Ettus Research USRP-E (rev %d %s)\n", 345d64b5b89SSteve Sakoman expansion_config.revision, 346d64b5b89SSteve Sakoman expansion_config.fab_revision); 347d64b5b89SSteve Sakoman MUX_USRP_E(); 348d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 349d64b5b89SSteve Sakoman break; 350d64b5b89SSteve Sakoman case GUMSTIX_NO_EEPROM: 351bae485dbSAndreas Müller puts("No EEPROM on expansion board\n"); 352d64b5b89SSteve Sakoman break; 353d64b5b89SSteve Sakoman default: 354*ea5940e9SAsh Charles printf("Unrecognized expansion board 0x%08x\n", expansion_id); 355*ea5940e9SAsh Charles break; 356d64b5b89SSteve Sakoman } 357d64b5b89SSteve Sakoman 358d64b5b89SSteve Sakoman if (expansion_config.content == 1) 359d64b5b89SSteve Sakoman setenv(expansion_config.env_var, expansion_config.env_setting); 360d64b5b89SSteve Sakoman 361127f9ae5SJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 362127f9ae5SJean-Christophe PLAGNIOL-VILLARD 363127f9ae5SJean-Christophe PLAGNIOL-VILLARD return 0; 364127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 365127f9ae5SJean-Christophe PLAGNIOL-VILLARD 366127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 367127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 368127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 369127f9ae5SJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 370127f9ae5SJean-Christophe PLAGNIOL-VILLARD * mode. 371127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 372127f9ae5SJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 373127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 374127f9ae5SJean-Christophe PLAGNIOL-VILLARD MUX_OVERO(); 375127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 376df382626SOlof Johansson 377df382626SOlof Johansson #if defined(CONFIG_CMD_NET) 378df382626SOlof Johansson /* 379df382626SOlof Johansson * Routine: setup_net_chip 380df382626SOlof Johansson * Description: Setting up the configuration GPMC registers specific to the 381df382626SOlof Johansson * Ethernet hardware. 382df382626SOlof Johansson */ 383df382626SOlof Johansson static void setup_net_chip(void) 384df382626SOlof Johansson { 385df382626SOlof Johansson struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 386df382626SOlof Johansson 387ba9a11e4SSteve Sakoman /* first lan chip */ 388ba9a11e4SSteve Sakoman enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5], 0x2C000000, 389ba9a11e4SSteve Sakoman GPMC_SIZE_16M); 390ba9a11e4SSteve Sakoman 391df382626SOlof Johansson /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 392df382626SOlof Johansson writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 393df382626SOlof Johansson /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 394df382626SOlof Johansson writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 395df382626SOlof Johansson /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 396df382626SOlof Johansson writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 397df382626SOlof Johansson &ctrl_base->gpmc_nadv_ale); 398df382626SOlof Johansson 399df382626SOlof Johansson /* Make GPIO 64 as output pin and send a magic pulse through it */ 40084c3b631SSanjeev Premi if (!gpio_request(64, "")) { 40184c3b631SSanjeev Premi gpio_direction_output(64, 0); 40284c3b631SSanjeev Premi gpio_set_value(64, 1); 403df382626SOlof Johansson udelay(1); 40484c3b631SSanjeev Premi gpio_set_value(64, 0); 405df382626SOlof Johansson udelay(1); 40684c3b631SSanjeev Premi gpio_set_value(64, 1); 407df382626SOlof Johansson } 408df382626SOlof Johansson } 409df382626SOlof Johansson #endif 410df382626SOlof Johansson 411df382626SOlof Johansson int board_eth_init(bd_t *bis) 412df382626SOlof Johansson { 413df382626SOlof Johansson int rc = 0; 414df382626SOlof Johansson #ifdef CONFIG_SMC911X 415df382626SOlof Johansson rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 416df382626SOlof Johansson #endif 417df382626SOlof Johansson return rc; 418df382626SOlof Johansson } 419cd7c5726SSteve Sakoman 420137703b8SAndreas Müller #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD) 421cd7c5726SSteve Sakoman int board_mmc_init(bd_t *bis) 422cd7c5726SSteve Sakoman { 423e3913f56SNikita Kiryanov return omap_mmc_init(0, 0, 0, -1, -1); 424cd7c5726SSteve Sakoman } 425cd7c5726SSteve Sakoman #endif 426