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 * 13127f9ae5SJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this 14127f9ae5SJean-Christophe PLAGNIOL-VILLARD * project. 15127f9ae5SJean-Christophe PLAGNIOL-VILLARD * 16127f9ae5SJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 17127f9ae5SJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 18127f9ae5SJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 19127f9ae5SJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 20127f9ae5SJean-Christophe PLAGNIOL-VILLARD * 21127f9ae5SJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 22127f9ae5SJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 23127f9ae5SJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24127f9ae5SJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 25127f9ae5SJean-Christophe PLAGNIOL-VILLARD * 26127f9ae5SJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 27127f9ae5SJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 28127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 29127f9ae5SJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 30127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 31127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 32df382626SOlof Johansson #include <netdev.h> 33127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <twl4030.h> 34127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 35127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h> 36df382626SOlof Johansson #include <asm/arch/mem.h> 37127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h> 38df382626SOlof Johansson #include <asm/arch/gpio.h> 39127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 40127f9ae5SJean-Christophe PLAGNIOL-VILLARD #include "overo.h" 41127f9ae5SJean-Christophe PLAGNIOL-VILLARD 42df382626SOlof Johansson #if defined(CONFIG_CMD_NET) 43df382626SOlof Johansson static void setup_net_chip(void); 44df382626SOlof Johansson #endif 45df382626SOlof Johansson 46ba9a11e4SSteve Sakoman /* GPMC definitions for LAN9221 chips on Tobi expansion boards */ 47ba9a11e4SSteve Sakoman static const u32 gpmc_lan_config[] = { 48ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG1, 49ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG2, 50ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG3, 51ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG4, 52ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG5, 53ba9a11e4SSteve Sakoman NET_LAN9221_GPMC_CONFIG6, 54ba9a11e4SSteve Sakoman /*CONFIG7- computed as params */ 55ba9a11e4SSteve Sakoman }; 56ba9a11e4SSteve Sakoman 57127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 58127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 59127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 60127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 61127f9ae5SJean-Christophe PLAGNIOL-VILLARD int board_init(void) 62127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 63127f9ae5SJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR; 64127f9ae5SJean-Christophe PLAGNIOL-VILLARD 65127f9ae5SJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 66127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 67127f9ae5SJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OVERO; 68127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 69127f9ae5SJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 70127f9ae5SJean-Christophe PLAGNIOL-VILLARD 71127f9ae5SJean-Christophe PLAGNIOL-VILLARD return 0; 72127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 73127f9ae5SJean-Christophe PLAGNIOL-VILLARD 74127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 75c2d5b341SSteve Sakoman * Routine: get_board_revision 76c2d5b341SSteve Sakoman * Description: Returns the board revision 77c2d5b341SSteve Sakoman */ 78c2d5b341SSteve Sakoman int get_board_revision(void) 79c2d5b341SSteve Sakoman { 80c2d5b341SSteve Sakoman int revision; 81c2d5b341SSteve Sakoman 82c2d5b341SSteve Sakoman if (!omap_request_gpio(112) && 83c2d5b341SSteve Sakoman !omap_request_gpio(113) && 84c2d5b341SSteve Sakoman !omap_request_gpio(115)) { 85c2d5b341SSteve Sakoman 86c2d5b341SSteve Sakoman omap_set_gpio_direction(112, 1); 87c2d5b341SSteve Sakoman omap_set_gpio_direction(113, 1); 88c2d5b341SSteve Sakoman omap_set_gpio_direction(115, 1); 89c2d5b341SSteve Sakoman 90c2d5b341SSteve Sakoman revision = omap_get_gpio_datain(115) << 2 | 91c2d5b341SSteve Sakoman omap_get_gpio_datain(113) << 1 | 92c2d5b341SSteve Sakoman omap_get_gpio_datain(112); 93c2d5b341SSteve Sakoman 94c2d5b341SSteve Sakoman omap_free_gpio(112); 95c2d5b341SSteve Sakoman omap_free_gpio(113); 96c2d5b341SSteve Sakoman omap_free_gpio(115); 97c2d5b341SSteve Sakoman } else { 98c2d5b341SSteve Sakoman printf("Error: unable to acquire board revision GPIOs\n"); 99c2d5b341SSteve Sakoman revision = -1; 100c2d5b341SSteve Sakoman } 101c2d5b341SSteve Sakoman 102c2d5b341SSteve Sakoman return revision; 103c2d5b341SSteve Sakoman } 104c2d5b341SSteve Sakoman 105c2d5b341SSteve Sakoman /* 106*a06e1629SSteve Sakoman * Routine: get_sdio2_config 107*a06e1629SSteve Sakoman * Description: Return information about the wifi module connection 108*a06e1629SSteve Sakoman * Returns 0 if the module connects though a level translator 109*a06e1629SSteve Sakoman * Returns 1 if the module connects directly 110*a06e1629SSteve Sakoman */ 111*a06e1629SSteve Sakoman int get_sdio2_config(void) 112*a06e1629SSteve Sakoman { 113*a06e1629SSteve Sakoman int sdio_direct; 114*a06e1629SSteve Sakoman 115*a06e1629SSteve Sakoman if (!omap_request_gpio(130) && !omap_request_gpio(139)) { 116*a06e1629SSteve Sakoman 117*a06e1629SSteve Sakoman omap_set_gpio_direction(130, 0); 118*a06e1629SSteve Sakoman omap_set_gpio_direction(139, 1); 119*a06e1629SSteve Sakoman 120*a06e1629SSteve Sakoman sdio_direct = 1; 121*a06e1629SSteve Sakoman omap_set_gpio_dataout(130, 0); 122*a06e1629SSteve Sakoman if (omap_get_gpio_datain(139) == 0) { 123*a06e1629SSteve Sakoman omap_set_gpio_dataout(130, 1); 124*a06e1629SSteve Sakoman if (omap_get_gpio_datain(139) == 1) 125*a06e1629SSteve Sakoman sdio_direct = 0; 126*a06e1629SSteve Sakoman } 127*a06e1629SSteve Sakoman 128*a06e1629SSteve Sakoman omap_free_gpio(130); 129*a06e1629SSteve Sakoman omap_free_gpio(139); 130*a06e1629SSteve Sakoman } else { 131*a06e1629SSteve Sakoman printf("Error: unable to acquire sdio2 clk GPIOs\n"); 132*a06e1629SSteve Sakoman sdio_direct = -1; 133*a06e1629SSteve Sakoman } 134*a06e1629SSteve Sakoman 135*a06e1629SSteve Sakoman return sdio_direct; 136*a06e1629SSteve Sakoman } 137*a06e1629SSteve Sakoman 138*a06e1629SSteve Sakoman /* 139127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 140127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Configure board specific parts 141127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 142127f9ae5SJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 143127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 144127f9ae5SJean-Christophe PLAGNIOL-VILLARD twl4030_power_init(); 145ead39d7aSGrazvydas Ignotas twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 146127f9ae5SJean-Christophe PLAGNIOL-VILLARD 147df382626SOlof Johansson #if defined(CONFIG_CMD_NET) 148df382626SOlof Johansson setup_net_chip(); 149df382626SOlof Johansson #endif 150df382626SOlof Johansson 151c2d5b341SSteve Sakoman printf("Board revision: %d\n", get_board_revision()); 152*a06e1629SSteve Sakoman 153*a06e1629SSteve Sakoman switch (get_sdio2_config()) { 154*a06e1629SSteve Sakoman case 0: 155*a06e1629SSteve Sakoman printf("Tranceiver detected on mmc2\n"); 156*a06e1629SSteve Sakoman MUX_OVERO_SDIO2_TRANSCEIVER(); 157*a06e1629SSteve Sakoman break; 158*a06e1629SSteve Sakoman case 1: 159*a06e1629SSteve Sakoman printf("Direct connection on mmc2\n"); 160*a06e1629SSteve Sakoman MUX_OVERO_SDIO2_DIRECT(); 161*a06e1629SSteve Sakoman break; 162*a06e1629SSteve Sakoman default: 163*a06e1629SSteve Sakoman printf("Unable to detect mmc2 connection type\n"); 164*a06e1629SSteve Sakoman } 165*a06e1629SSteve Sakoman 166127f9ae5SJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 167127f9ae5SJean-Christophe PLAGNIOL-VILLARD 168127f9ae5SJean-Christophe PLAGNIOL-VILLARD return 0; 169127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 170127f9ae5SJean-Christophe PLAGNIOL-VILLARD 171127f9ae5SJean-Christophe PLAGNIOL-VILLARD /* 172127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 173127f9ae5SJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 174127f9ae5SJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 175127f9ae5SJean-Christophe PLAGNIOL-VILLARD * mode. 176127f9ae5SJean-Christophe PLAGNIOL-VILLARD */ 177127f9ae5SJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 178127f9ae5SJean-Christophe PLAGNIOL-VILLARD { 179127f9ae5SJean-Christophe PLAGNIOL-VILLARD MUX_OVERO(); 180127f9ae5SJean-Christophe PLAGNIOL-VILLARD } 181df382626SOlof Johansson 182df382626SOlof Johansson #if defined(CONFIG_CMD_NET) 183df382626SOlof Johansson /* 184df382626SOlof Johansson * Routine: setup_net_chip 185df382626SOlof Johansson * Description: Setting up the configuration GPMC registers specific to the 186df382626SOlof Johansson * Ethernet hardware. 187df382626SOlof Johansson */ 188df382626SOlof Johansson static void setup_net_chip(void) 189df382626SOlof Johansson { 190df382626SOlof Johansson struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 191df382626SOlof Johansson 192ba9a11e4SSteve Sakoman /* first lan chip */ 193ba9a11e4SSteve Sakoman enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[5], 0x2C000000, 194ba9a11e4SSteve Sakoman GPMC_SIZE_16M); 195ba9a11e4SSteve Sakoman 196ba9a11e4SSteve Sakoman /* second lan chip */ 197ba9a11e4SSteve Sakoman enable_gpmc_cs_config(gpmc_lan_config, &gpmc_cfg->cs[4], 0x2B000000, 198ba9a11e4SSteve Sakoman GPMC_SIZE_16M); 199df382626SOlof Johansson 200df382626SOlof Johansson /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 201df382626SOlof Johansson writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 202df382626SOlof Johansson /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 203df382626SOlof Johansson writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 204df382626SOlof Johansson /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 205df382626SOlof Johansson writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 206df382626SOlof Johansson &ctrl_base->gpmc_nadv_ale); 207df382626SOlof Johansson 208df382626SOlof Johansson /* Make GPIO 64 as output pin and send a magic pulse through it */ 209df382626SOlof Johansson if (!omap_request_gpio(64)) { 210df382626SOlof Johansson omap_set_gpio_direction(64, 0); 211df382626SOlof Johansson omap_set_gpio_dataout(64, 1); 212df382626SOlof Johansson udelay(1); 213df382626SOlof Johansson omap_set_gpio_dataout(64, 0); 214df382626SOlof Johansson udelay(1); 215df382626SOlof Johansson omap_set_gpio_dataout(64, 1); 216df382626SOlof Johansson } 217df382626SOlof Johansson } 218df382626SOlof Johansson #endif 219df382626SOlof Johansson 220df382626SOlof Johansson int board_eth_init(bd_t *bis) 221df382626SOlof Johansson { 222df382626SOlof Johansson int rc = 0; 223df382626SOlof Johansson #ifdef CONFIG_SMC911X 224df382626SOlof Johansson rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 225df382626SOlof Johansson #endif 226df382626SOlof Johansson return rc; 227df382626SOlof Johansson } 228