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) = { 77*c7b9686dSThomas Chou "ns16550_serial", 78b3f4ca11SSimon Glass &overo_serial 79b3f4ca11SSimon Glass }; 80b3f4ca11SSimon Glass 81127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 82a06e1629SSteve Sakoman * Routine: get_sdio2_config 83a06e1629SSteve Sakoman * Description: Return information about the wifi module connection 84a06e1629SSteve Sakoman * Returns 0 if the module connects though a level translator 85a06e1629SSteve Sakoman * Returns 1 if the module connects directly 86a06e1629SSteve Sakoman */ 87a06e1629SSteve Sakoman int get_sdio2_config(void) 88a06e1629SSteve Sakoman { 89a06e1629SSteve Sakoman int sdio_direct; 90a06e1629SSteve Sakoman 9184c3b631SSanjeev Premi if (!gpio_request(130, "") && !gpio_request(139, "")) { 92a06e1629SSteve Sakoman 9384c3b631SSanjeev Premi gpio_direction_output(130, 0); 9484c3b631SSanjeev Premi gpio_direction_input(139); 95a06e1629SSteve Sakoman 96a06e1629SSteve Sakoman sdio_direct = 1; 9784c3b631SSanjeev Premi gpio_set_value(130, 0); 9884c3b631SSanjeev Premi if (gpio_get_value(139) == 0) { 9984c3b631SSanjeev Premi gpio_set_value(130, 1); 10084c3b631SSanjeev Premi if (gpio_get_value(139) == 1) 101a06e1629SSteve Sakoman sdio_direct = 0; 102a06e1629SSteve Sakoman } 103a06e1629SSteve Sakoman 104b5db0a06SJoe Hershberger gpio_direction_input(130); 105a06e1629SSteve Sakoman } else { 106bae485dbSAndreas Müller puts("Error: unable to acquire sdio2 clk GPIOs\n"); 107a06e1629SSteve Sakoman sdio_direct = -1; 108a06e1629SSteve Sakoman } 109a06e1629SSteve Sakoman 110a06e1629SSteve Sakoman return sdio_direct; 111a06e1629SSteve Sakoman } 112a06e1629SSteve Sakoman 113a06e1629SSteve Sakoman /* 114d64b5b89SSteve Sakoman * Routine: get_expansion_id 115d64b5b89SSteve Sakoman * Description: This function checks for expansion board by checking I2C 116d64b5b89SSteve Sakoman * bus 2 for the availability of an AT24C01B serial EEPROM. 117d64b5b89SSteve Sakoman * returns the device_vendor field from the EEPROM 118d64b5b89SSteve Sakoman */ 119d64b5b89SSteve Sakoman unsigned int get_expansion_id(void) 120d64b5b89SSteve Sakoman { 1214ed914a2SStefan Herbrechtsmeier if (expansion_config.device_vendor != 0x0) 1224ed914a2SStefan Herbrechtsmeier return expansion_config.device_vendor; 1234ed914a2SStefan Herbrechtsmeier 124d64b5b89SSteve Sakoman i2c_set_bus_num(EXPANSION_EEPROM_I2C_BUS); 125d64b5b89SSteve Sakoman 126d64b5b89SSteve Sakoman /* return GUMSTIX_NO_EEPROM if eeprom doesn't respond */ 127d64b5b89SSteve Sakoman if (i2c_probe(EXPANSION_EEPROM_I2C_ADDRESS) == 1) { 128d64b5b89SSteve Sakoman i2c_set_bus_num(TWL4030_I2C_BUS); 129d64b5b89SSteve Sakoman return GUMSTIX_NO_EEPROM; 130d64b5b89SSteve Sakoman } 131d64b5b89SSteve Sakoman 132d64b5b89SSteve Sakoman /* read configuration data */ 133d64b5b89SSteve Sakoman i2c_read(EXPANSION_EEPROM_I2C_ADDRESS, 0, 1, (u8 *)&expansion_config, 134d64b5b89SSteve Sakoman sizeof(expansion_config)); 135d64b5b89SSteve Sakoman 136d64b5b89SSteve Sakoman i2c_set_bus_num(TWL4030_I2C_BUS); 137d64b5b89SSteve Sakoman 138d64b5b89SSteve Sakoman return expansion_config.device_vendor; 139d64b5b89SSteve Sakoman } 140d64b5b89SSteve Sakoman 141d64b5b89SSteve Sakoman /* 142127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 143127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Configure board specific parts 144127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 145127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 146127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 147ea5940e9SAsh Charles unsigned int expansion_id; 148ea5940e9SAsh Charles 149127f9ae5SJean-Christophe PLAGNIOL-VILLARD twl4030_power_init(); 150ead39d7aSGrazvydas Ignotas twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 151127f9ae5SJean-Christophe PLAGNIOL-VILLARD 152c2d5b341SSteve Sakoman printf("Board revision: %d\n", get_board_revision()); 153a06e1629SSteve Sakoman 154a06e1629SSteve Sakoman switch (get_sdio2_config()) { 155a06e1629SSteve Sakoman case 0: 156bae485dbSAndreas Müller puts("Tranceiver detected on mmc2\n"); 157a06e1629SSteve Sakoman MUX_OVERO_SDIO2_TRANSCEIVER(); 158a06e1629SSteve Sakoman break; 159a06e1629SSteve Sakoman case 1: 160bae485dbSAndreas Müller puts("Direct connection on mmc2\n"); 161a06e1629SSteve Sakoman MUX_OVERO_SDIO2_DIRECT(); 162a06e1629SSteve Sakoman break; 163a06e1629SSteve Sakoman default: 164bae485dbSAndreas Müller puts("Unable to detect mmc2 connection type\n"); 165a06e1629SSteve Sakoman } 166a06e1629SSteve Sakoman 167ea5940e9SAsh Charles expansion_id = get_expansion_id(); 168ea5940e9SAsh Charles switch (expansion_id) { 169d64b5b89SSteve Sakoman case GUMSTIX_SUMMIT: 170d64b5b89SSteve Sakoman printf("Recognized Summit expansion board (rev %d %s)\n", 171d64b5b89SSteve Sakoman expansion_config.revision, 172d64b5b89SSteve Sakoman expansion_config.fab_revision); 1734ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 174d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 17512cc5437SAsh Charles setenv("expansionname", "summit"); 176d64b5b89SSteve Sakoman break; 177d64b5b89SSteve Sakoman case GUMSTIX_TOBI: 178d64b5b89SSteve Sakoman printf("Recognized Tobi expansion board (rev %d %s)\n", 179d64b5b89SSteve Sakoman expansion_config.revision, 180d64b5b89SSteve Sakoman expansion_config.fab_revision); 1814ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 182d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 18312cc5437SAsh Charles setenv("expansionname", "tobi"); 184d64b5b89SSteve Sakoman break; 185d64b5b89SSteve Sakoman case GUMSTIX_TOBI_DUO: 186d64b5b89SSteve Sakoman printf("Recognized Tobi Duo expansion board (rev %d %s)\n", 187d64b5b89SSteve Sakoman expansion_config.revision, 188d64b5b89SSteve Sakoman expansion_config.fab_revision); 1894ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 19072c7be95SArun Bharadwaj setenv("expansionname", "tobiduo"); 191d64b5b89SSteve Sakoman break; 192d64b5b89SSteve Sakoman case GUMSTIX_PALO35: 193d64b5b89SSteve Sakoman printf("Recognized Palo35 expansion board (rev %d %s)\n", 194d64b5b89SSteve Sakoman expansion_config.revision, 195d64b5b89SSteve Sakoman expansion_config.fab_revision); 1964ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 197d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd35"); 1982ed43b54SAsh Charles setenv("expansionname", "palo35"); 199d64b5b89SSteve Sakoman break; 200d64b5b89SSteve Sakoman case GUMSTIX_PALO43: 201d64b5b89SSteve Sakoman printf("Recognized Palo43 expansion board (rev %d %s)\n", 202d64b5b89SSteve Sakoman expansion_config.revision, 203d64b5b89SSteve Sakoman expansion_config.fab_revision); 2044ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 205d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 20612cc5437SAsh Charles setenv("expansionname", "palo43"); 207d64b5b89SSteve Sakoman break; 208d64b5b89SSteve Sakoman case GUMSTIX_CHESTNUT43: 209d64b5b89SSteve Sakoman printf("Recognized Chestnut43 expansion board (rev %d %s)\n", 210d64b5b89SSteve Sakoman expansion_config.revision, 211d64b5b89SSteve Sakoman expansion_config.fab_revision); 2124ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 213d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 21412cc5437SAsh Charles setenv("expansionname", "chestnut43"); 215d64b5b89SSteve Sakoman break; 216d64b5b89SSteve Sakoman case GUMSTIX_PINTO: 217d64b5b89SSteve Sakoman printf("Recognized Pinto expansion board (rev %d %s)\n", 218d64b5b89SSteve Sakoman expansion_config.revision, 219d64b5b89SSteve Sakoman expansion_config.fab_revision); 2204ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 221d64b5b89SSteve Sakoman break; 222d64b5b89SSteve Sakoman case GUMSTIX_GALLOP43: 223d64b5b89SSteve Sakoman printf("Recognized Gallop43 expansion board (rev %d %s)\n", 224d64b5b89SSteve Sakoman expansion_config.revision, 225d64b5b89SSteve Sakoman expansion_config.fab_revision); 2264ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 227d64b5b89SSteve Sakoman setenv("defaultdisplay", "lcd43"); 22812cc5437SAsh Charles setenv("expansionname", "gallop43"); 229d64b5b89SSteve Sakoman break; 230ea5940e9SAsh Charles case GUMSTIX_ALTO35: 231ea5940e9SAsh Charles printf("Recognized Alto35 expansion board (rev %d %s)\n", 232ea5940e9SAsh Charles expansion_config.revision, 233ea5940e9SAsh Charles expansion_config.fab_revision); 2344ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 235ea5940e9SAsh Charles MUX_ALTO35(); 236ea5940e9SAsh Charles setenv("defaultdisplay", "lcd35"); 23712cc5437SAsh Charles setenv("expansionname", "alto35"); 238ea5940e9SAsh Charles break; 239ea5940e9SAsh Charles case GUMSTIX_STAGECOACH: 240ea5940e9SAsh Charles printf("Recognized Stagecoach expansion board (rev %d %s)\n", 241ea5940e9SAsh Charles expansion_config.revision, 242ea5940e9SAsh Charles expansion_config.fab_revision); 2434ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 244ea5940e9SAsh Charles break; 245ea5940e9SAsh Charles case GUMSTIX_THUMBO: 246ea5940e9SAsh Charles printf("Recognized Thumbo expansion board (rev %d %s)\n", 247ea5940e9SAsh Charles expansion_config.revision, 248ea5940e9SAsh Charles expansion_config.fab_revision); 2494ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 250ea5940e9SAsh Charles break; 251ea5940e9SAsh Charles case GUMSTIX_TURTLECORE: 252ea5940e9SAsh Charles printf("Recognized Turtlecore expansion board (rev %d %s)\n", 253ea5940e9SAsh Charles expansion_config.revision, 254ea5940e9SAsh Charles expansion_config.fab_revision); 2554ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 256ea5940e9SAsh Charles break; 257ea5940e9SAsh Charles case GUMSTIX_ARBOR43C: 258ea5940e9SAsh Charles printf("Recognized Arbor43C expansion board (rev %d %s)\n", 259ea5940e9SAsh Charles expansion_config.revision, 260ea5940e9SAsh Charles expansion_config.fab_revision); 2614ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 262ea5940e9SAsh Charles MUX_ARBOR43C(); 263ea5940e9SAsh Charles setenv("defaultdisplay", "lcd43"); 264da9ed5abSAsh Charles setenv("expansionname", "arbor43c"); 265ea5940e9SAsh Charles break; 266d64b5b89SSteve Sakoman case ETTUS_USRP_E: 267d64b5b89SSteve Sakoman printf("Recognized Ettus Research USRP-E (rev %d %s)\n", 268d64b5b89SSteve Sakoman expansion_config.revision, 269d64b5b89SSteve Sakoman expansion_config.fab_revision); 2704ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 271d64b5b89SSteve Sakoman MUX_USRP_E(); 272d64b5b89SSteve Sakoman setenv("defaultdisplay", "dvi"); 273d64b5b89SSteve Sakoman break; 274d64b5b89SSteve Sakoman case GUMSTIX_NO_EEPROM: 2754ed914a2SStefan Herbrechtsmeier case GUMSTIX_EMPTY_EEPROM: 2764ed914a2SStefan Herbrechtsmeier puts("No or empty EEPROM on expansion board\n"); 2774ed914a2SStefan Herbrechtsmeier MUX_GUMSTIX(); 27812cc5437SAsh Charles setenv("expansionname", "tobi"); 279d64b5b89SSteve Sakoman break; 280d64b5b89SSteve Sakoman default: 281ea5940e9SAsh Charles printf("Unrecognized expansion board 0x%08x\n", expansion_id); 282ea5940e9SAsh Charles break; 283d64b5b89SSteve Sakoman } 284d64b5b89SSteve Sakoman 285d64b5b89SSteve Sakoman if (expansion_config.content == 1) 286d64b5b89SSteve Sakoman setenv(expansion_config.env_var, expansion_config.env_setting); 287d64b5b89SSteve Sakoman 288679f82c3SPaul Kocialkowski omap_die_id_display(); 289127f9ae5SJean-Christophe PLAGNIOL-VILLARD 29012cc5437SAsh Charles if (get_cpu_family() == CPU_OMAP34XX) 29112cc5437SAsh Charles setenv("boardname", "overo"); 29212cc5437SAsh Charles else 29312cc5437SAsh Charles setenv("boardname", "overo-storm"); 29412cc5437SAsh Charles 295127f9ae5SJean-Christophe PLAGNIOL-VILLARD return 0; 296127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 297127f9ae5SJean-Christophe PLAGNIOL-VILLARD 298fe5d488fSArun Bharadwaj #if defined(CONFIG_CMD_NET) 299113429a2SStefan Herbrechtsmeier /* GPMC definitions for LAN9221 chips on Tobi expansion boards */ 300113429a2SStefan Herbrechtsmeier static const u32 gpmc_lan_config[] = { 301113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG1, 302113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG2, 303113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG3, 304113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG4, 305113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG5, 306113429a2SStefan Herbrechtsmeier NET_LAN9221_GPMC_CONFIG6, 307113429a2SStefan Herbrechtsmeier /*CONFIG7- computed as params */ 308113429a2SStefan Herbrechtsmeier }; 309113429a2SStefan Herbrechtsmeier 310df382626SOlof Johansson /* 311df382626SOlof Johansson * Routine: setup_net_chip 312df382626SOlof Johansson * Description: Setting up the configuration GPMC registers specific to the 313df382626SOlof Johansson * Ethernet hardware. 314df382626SOlof Johansson */ 315df382626SOlof Johansson static void setup_net_chip(void) 316df382626SOlof Johansson { 317df382626SOlof Johansson struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 318df382626SOlof Johansson 319df382626SOlof Johansson /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 320df382626SOlof Johansson writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 321df382626SOlof Johansson /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 322df382626SOlof Johansson writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 323df382626SOlof Johansson /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 324df382626SOlof Johansson writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 325df382626SOlof Johansson &ctrl_base->gpmc_nadv_ale); 326113429a2SStefan Herbrechtsmeier } 327df382626SOlof Johansson 328113429a2SStefan Herbrechtsmeier /* 329113429a2SStefan Herbrechtsmeier * Routine: reset_net_chip 330113429a2SStefan Herbrechtsmeier * Description: Reset the Ethernet hardware. 331113429a2SStefan Herbrechtsmeier */ 332113429a2SStefan Herbrechtsmeier static void reset_net_chip(void) 333113429a2SStefan Herbrechtsmeier { 334df382626SOlof Johansson /* Make GPIO 64 as output pin and send a magic pulse through it */ 33584c3b631SSanjeev Premi if (!gpio_request(64, "")) { 33684c3b631SSanjeev Premi gpio_direction_output(64, 0); 33784c3b631SSanjeev Premi gpio_set_value(64, 1); 338df382626SOlof Johansson udelay(1); 33984c3b631SSanjeev Premi gpio_set_value(64, 0); 340df382626SOlof Johansson udelay(1); 34184c3b631SSanjeev Premi gpio_set_value(64, 1); 342df382626SOlof Johansson } 343df382626SOlof Johansson } 344df382626SOlof Johansson 345df382626SOlof Johansson int board_eth_init(bd_t *bis) 346df382626SOlof Johansson { 347113429a2SStefan Herbrechtsmeier unsigned int expansion_id; 348df382626SOlof Johansson int rc = 0; 349113429a2SStefan Herbrechtsmeier 350df382626SOlof Johansson #ifdef CONFIG_SMC911X 351113429a2SStefan Herbrechtsmeier expansion_id = get_expansion_id(); 352113429a2SStefan Herbrechtsmeier switch (expansion_id) { 353113429a2SStefan Herbrechtsmeier case GUMSTIX_TOBI_DUO: 354113429a2SStefan Herbrechtsmeier /* second lan chip */ 355113429a2SStefan Herbrechtsmeier enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4], 356113429a2SStefan Herbrechtsmeier 0x2B000000, GPMC_SIZE_16M); 357113429a2SStefan Herbrechtsmeier /* no break */ 358113429a2SStefan Herbrechtsmeier case GUMSTIX_TOBI: 359113429a2SStefan Herbrechtsmeier case GUMSTIX_CHESTNUT43: 360113429a2SStefan Herbrechtsmeier case GUMSTIX_STAGECOACH: 361113429a2SStefan Herbrechtsmeier case GUMSTIX_NO_EEPROM: 362113429a2SStefan Herbrechtsmeier case GUMSTIX_EMPTY_EEPROM: 363113429a2SStefan Herbrechtsmeier /* first lan chip */ 364113429a2SStefan Herbrechtsmeier enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5], 365113429a2SStefan Herbrechtsmeier 0x2C000000, GPMC_SIZE_16M); 366113429a2SStefan Herbrechtsmeier 367113429a2SStefan Herbrechtsmeier setup_net_chip(); 368113429a2SStefan Herbrechtsmeier reset_net_chip(); 369113429a2SStefan Herbrechtsmeier 370df382626SOlof Johansson rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 371113429a2SStefan Herbrechtsmeier break; 372113429a2SStefan Herbrechtsmeier default: 373113429a2SStefan Herbrechtsmeier break; 374113429a2SStefan Herbrechtsmeier } 375df382626SOlof Johansson #endif 376113429a2SStefan Herbrechtsmeier 377df382626SOlof Johansson return rc; 378df382626SOlof Johansson } 379113429a2SStefan Herbrechtsmeier #endif 380cd7c5726SSteve Sakoman 381fe5d488fSArun Bharadwaj #if defined(CONFIG_GENERIC_MMC) 382cd7c5726SSteve Sakoman int board_mmc_init(bd_t *bis) 383cd7c5726SSteve Sakoman { 384e3913f56SNikita Kiryanov return omap_mmc_init(0, 0, 0, -1, -1); 385cd7c5726SSteve Sakoman } 386cd7c5726SSteve Sakoman #endif 387f5c30c1bSStefan Herbrechtsmeier 388aac5450eSPaul Kocialkowski #if defined(CONFIG_GENERIC_MMC) 389aac5450eSPaul Kocialkowski void board_mmc_power_init(void) 390aac5450eSPaul Kocialkowski { 391aac5450eSPaul Kocialkowski twl4030_power_mmc_init(0); 392aac5450eSPaul Kocialkowski } 393aac5450eSPaul Kocialkowski #endif 394aac5450eSPaul Kocialkowski 395fe5d488fSArun Bharadwaj #if defined(CONFIG_USB_EHCI) 396f5c30c1bSStefan Herbrechtsmeier static struct omap_usbhs_board_data usbhs_bdata = { 397f5c30c1bSStefan Herbrechtsmeier .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, 398f5c30c1bSStefan Herbrechtsmeier .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, 399f5c30c1bSStefan Herbrechtsmeier .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED 400f5c30c1bSStefan Herbrechtsmeier }; 401f5c30c1bSStefan Herbrechtsmeier 402f5c30c1bSStefan Herbrechtsmeier #define GUMSTIX_GPIO_USBH_CPEN 168 403f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_init(int index, enum usb_init_type init, 404f5c30c1bSStefan Herbrechtsmeier struct ehci_hccr **hccr, struct ehci_hcor **hcor) 405f5c30c1bSStefan Herbrechtsmeier { 406f5c30c1bSStefan Herbrechtsmeier /* Enable USB power */ 407f5c30c1bSStefan Herbrechtsmeier if (!gpio_request(GUMSTIX_GPIO_USBH_CPEN, "usbh_cpen")) 408f5c30c1bSStefan Herbrechtsmeier gpio_direction_output(GUMSTIX_GPIO_USBH_CPEN, 1); 409f5c30c1bSStefan Herbrechtsmeier 410f5c30c1bSStefan Herbrechtsmeier return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor); 411f5c30c1bSStefan Herbrechtsmeier } 412f5c30c1bSStefan Herbrechtsmeier 413f5c30c1bSStefan Herbrechtsmeier int ehci_hcd_stop(void) 414f5c30c1bSStefan Herbrechtsmeier { 415f5c30c1bSStefan Herbrechtsmeier /* Disable USB power */ 416f5c30c1bSStefan Herbrechtsmeier gpio_set_value(GUMSTIX_GPIO_USBH_CPEN, 0); 417f5c30c1bSStefan Herbrechtsmeier gpio_free(GUMSTIX_GPIO_USBH_CPEN); 418f5c30c1bSStefan Herbrechtsmeier 419f5c30c1bSStefan Herbrechtsmeier return omap_ehci_hcd_stop(); 420f5c30c1bSStefan Herbrechtsmeier } 421f5c30c1bSStefan Herbrechtsmeier 422f5c30c1bSStefan Herbrechtsmeier #endif /* CONFIG_USB_EHCI */ 423