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 * Manikandan Pillai <mani.pillai@ti.com> 70a0e4badSJean-Christophe PLAGNIOL-VILLARD * 80a0e4badSJean-Christophe PLAGNIOL-VILLARD * Derived from Beagle Board and 3430 SDP code by 90a0e4badSJean-Christophe PLAGNIOL-VILLARD * Richard Woodruff <r-woodruff2@ti.com> 100a0e4badSJean-Christophe PLAGNIOL-VILLARD * Syed Mohammed Khasim <khasim@ti.com> 110a0e4badSJean-Christophe PLAGNIOL-VILLARD * 120a0e4badSJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this 130a0e4badSJean-Christophe PLAGNIOL-VILLARD * project. 140a0e4badSJean-Christophe PLAGNIOL-VILLARD * 150a0e4badSJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 160a0e4badSJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 170a0e4badSJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 180a0e4badSJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 190a0e4badSJean-Christophe PLAGNIOL-VILLARD * 200a0e4badSJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 210a0e4badSJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 220a0e4badSJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 230a0e4badSJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 240a0e4badSJean-Christophe PLAGNIOL-VILLARD * 250a0e4badSJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 260a0e4badSJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 270a0e4badSJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 280a0e4badSJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 290a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 300a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <common.h> 310a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <netdev.h> 320a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 330a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mem.h> 340a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h> 350a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h> 36*dcc4f38bSVaibhav Hiremath #include <asm/arch/mmc_host_def.h> 37c0682587SSriramakrishnan #include <asm/arch/gpio.h> 380a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <i2c.h> 390a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 400a0e4badSJean-Christophe PLAGNIOL-VILLARD #include "evm.h" 410a0e4badSJean-Christophe PLAGNIOL-VILLARD 42c0682587SSriramakrishnan #define OMAP3EVM_GPIO_ETH_RST_GEN1 64 43c0682587SSriramakrishnan #define OMAP3EVM_GPIO_ETH_RST_GEN2 7 44c0682587SSriramakrishnan 4529565326SJohn Rigby DECLARE_GLOBAL_DATA_PTR; 4629565326SJohn Rigby 47b606ef41SDirk Behme static u32 omap3_evm_version; 48b5abf644SAjay Kumar Gupta 49b606ef41SDirk Behme u32 get_omap3_evm_rev(void) 50b5abf644SAjay Kumar Gupta { 51b5abf644SAjay Kumar Gupta return omap3_evm_version; 52b5abf644SAjay Kumar Gupta } 53b5abf644SAjay Kumar Gupta 54b5abf644SAjay Kumar Gupta static void omap3_evm_get_revision(void) 55b5abf644SAjay Kumar Gupta { 5676ee9a2cSSanjeev Premi #if defined(CONFIG_CMD_NET) 5776ee9a2cSSanjeev Premi /* 5876ee9a2cSSanjeev Premi * Board revision can be ascertained only by identifying 5976ee9a2cSSanjeev Premi * the Ethernet chipset. 6076ee9a2cSSanjeev Premi */ 61b5abf644SAjay Kumar Gupta unsigned int smsc_id; 62b5abf644SAjay Kumar Gupta 63b5abf644SAjay Kumar Gupta /* Ethernet PHY ID is stored at ID_REV register */ 64b5abf644SAjay Kumar Gupta smsc_id = readl(CONFIG_SMC911X_BASE + 0x50) & 0xFFFF0000; 65b5abf644SAjay Kumar Gupta printf("Read back SMSC id 0x%x\n", smsc_id); 66b5abf644SAjay Kumar Gupta 67b5abf644SAjay Kumar Gupta switch (smsc_id) { 68b5abf644SAjay Kumar Gupta /* SMSC9115 chipset */ 69b5abf644SAjay Kumar Gupta case 0x01150000: 70b5abf644SAjay Kumar Gupta omap3_evm_version = OMAP3EVM_BOARD_GEN_1; 71b5abf644SAjay Kumar Gupta break; 72b5abf644SAjay Kumar Gupta /* SMSC 9220 chipset */ 73b5abf644SAjay Kumar Gupta case 0x92200000: 74b5abf644SAjay Kumar Gupta default: 75b5abf644SAjay Kumar Gupta omap3_evm_version = OMAP3EVM_BOARD_GEN_2; 76b5abf644SAjay Kumar Gupta } 7776ee9a2cSSanjeev Premi #else 7876ee9a2cSSanjeev Premi #if defined(CONFIG_STATIC_BOARD_REV) 7976ee9a2cSSanjeev Premi /* 8076ee9a2cSSanjeev Premi * Look for static defintion of the board revision 8176ee9a2cSSanjeev Premi */ 8276ee9a2cSSanjeev Premi omap3_evm_version = CONFIG_STATIC_BOARD_REV; 8376ee9a2cSSanjeev Premi #else 8476ee9a2cSSanjeev Premi /* 8576ee9a2cSSanjeev Premi * Fallback to the default above. 8676ee9a2cSSanjeev Premi */ 8776ee9a2cSSanjeev Premi omap3_evm_version = OMAP3EVM_BOARD_GEN_2; 8876ee9a2cSSanjeev Premi #endif 8976ee9a2cSSanjeev Premi #endif /* CONFIG_CMD_NET */ 90b5abf644SAjay Kumar Gupta } 91b5abf644SAjay Kumar Gupta 9263f42400SSanjeev Premi #ifdef CONFIG_USB_OMAP3 930a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 94944a4894SAjay Kumar Gupta * MUSB port on OMAP3EVM Rev >= E requires extvbus programming. 95944a4894SAjay Kumar Gupta */ 96944a4894SAjay Kumar Gupta u8 omap3_evm_need_extvbus(void) 97944a4894SAjay Kumar Gupta { 98944a4894SAjay Kumar Gupta u8 retval = 0; 99944a4894SAjay Kumar Gupta 100944a4894SAjay Kumar Gupta if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) 101944a4894SAjay Kumar Gupta retval = 1; 102944a4894SAjay Kumar Gupta 103944a4894SAjay Kumar Gupta return retval; 104944a4894SAjay Kumar Gupta } 10563f42400SSanjeev Premi #endif 106944a4894SAjay Kumar Gupta 107944a4894SAjay Kumar Gupta /* 1080a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 1090a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 1100a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1110a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_init(void) 1120a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1130a0e4badSJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 1140a0e4badSJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 1150a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OMAP3EVM; 1160a0e4badSJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 1170a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 1180a0e4badSJean-Christophe PLAGNIOL-VILLARD 1190a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1200a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1210a0e4badSJean-Christophe PLAGNIOL-VILLARD 1220a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1230a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 1240a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Init ethernet (done here so udelay works) 1250a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1260a0e4badSJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 1270a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1280a0e4badSJean-Christophe PLAGNIOL-VILLARD 1290a0e4badSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_DRIVER_OMAP34XX_I2C 1300a0e4badSJean-Christophe PLAGNIOL-VILLARD i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); 1310a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 1320a0e4badSJean-Christophe PLAGNIOL-VILLARD 1330a0e4badSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_NET) 1340a0e4badSJean-Christophe PLAGNIOL-VILLARD setup_net_chip(); 1350a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 13676ee9a2cSSanjeev Premi omap3_evm_get_revision(); 1370a0e4badSJean-Christophe PLAGNIOL-VILLARD 1386921b314SSanjeev Premi #if defined(CONFIG_CMD_NET) 1396921b314SSanjeev Premi reset_net_chip(); 1406921b314SSanjeev Premi #endif 1410a0e4badSJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 1420a0e4badSJean-Christophe PLAGNIOL-VILLARD 1430a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1440a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1450a0e4badSJean-Christophe PLAGNIOL-VILLARD 1460a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1470a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 1480a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 1490a0e4badSJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 1500a0e4badSJean-Christophe PLAGNIOL-VILLARD * mode. 1510a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1520a0e4badSJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 1530a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1540a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_EVM(); 1550a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1560a0e4badSJean-Christophe PLAGNIOL-VILLARD 1575626f336SSanjeev Premi #ifdef CONFIG_CMD_NET 1580a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1590a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: setup_net_chip 1600a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration GPMC registers specific to the 1610a0e4badSJean-Christophe PLAGNIOL-VILLARD * Ethernet hardware. 1620a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1630a0e4badSJean-Christophe PLAGNIOL-VILLARD static void setup_net_chip(void) 1640a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1650a0e4badSJean-Christophe PLAGNIOL-VILLARD struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 1660a0e4badSJean-Christophe PLAGNIOL-VILLARD 1670a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Configure GPMC registers */ 1680a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG1, &gpmc_cfg->cs[5].config1); 1690a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG2, &gpmc_cfg->cs[5].config2); 1700a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG3, &gpmc_cfg->cs[5].config3); 1710a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG4, &gpmc_cfg->cs[5].config4); 1720a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG5, &gpmc_cfg->cs[5].config5); 1730a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG6, &gpmc_cfg->cs[5].config6); 1740a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG7, &gpmc_cfg->cs[5].config7); 1750a0e4badSJean-Christophe PLAGNIOL-VILLARD 1760a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 1770a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 1780a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 1790a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 1800a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 1810a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 1820a0e4badSJean-Christophe PLAGNIOL-VILLARD &ctrl_base->gpmc_nadv_ale); 1836921b314SSanjeev Premi } 1846921b314SSanjeev Premi 1856921b314SSanjeev Premi /** 1866921b314SSanjeev Premi * Reset the ethernet chip. 1876921b314SSanjeev Premi */ 1886921b314SSanjeev Premi static void reset_net_chip(void) 1896921b314SSanjeev Premi { 190c0682587SSriramakrishnan int ret; 191c0682587SSriramakrishnan int rst_gpio; 1920a0e4badSJean-Christophe PLAGNIOL-VILLARD 193c0682587SSriramakrishnan if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) { 194c0682587SSriramakrishnan rst_gpio = OMAP3EVM_GPIO_ETH_RST_GEN1; 195c0682587SSriramakrishnan } else { 196c0682587SSriramakrishnan rst_gpio = OMAP3EVM_GPIO_ETH_RST_GEN2; 197c0682587SSriramakrishnan } 1980a0e4badSJean-Christophe PLAGNIOL-VILLARD 199c0682587SSriramakrishnan ret = omap_request_gpio(rst_gpio); 200c0682587SSriramakrishnan if (ret < 0) { 201c0682587SSriramakrishnan printf("Unable to get GPIO %d\n", rst_gpio); 202c0682587SSriramakrishnan return ; 203c0682587SSriramakrishnan } 204c0682587SSriramakrishnan 205c0682587SSriramakrishnan /* Configure as output */ 206c0682587SSriramakrishnan omap_set_gpio_direction(rst_gpio, 0); 207c0682587SSriramakrishnan 208c0682587SSriramakrishnan /* Send a pulse on the GPIO pin */ 209c0682587SSriramakrishnan omap_set_gpio_dataout(rst_gpio, 1); 2100a0e4badSJean-Christophe PLAGNIOL-VILLARD udelay(1); 211c0682587SSriramakrishnan omap_set_gpio_dataout(rst_gpio, 0); 2120a0e4badSJean-Christophe PLAGNIOL-VILLARD udelay(1); 213c0682587SSriramakrishnan omap_set_gpio_dataout(rst_gpio, 1); 2140a0e4badSJean-Christophe PLAGNIOL-VILLARD } 2150a0e4badSJean-Christophe PLAGNIOL-VILLARD 2160a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_eth_init(bd_t *bis) 2170a0e4badSJean-Christophe PLAGNIOL-VILLARD { 2180a0e4badSJean-Christophe PLAGNIOL-VILLARD int rc = 0; 2190a0e4badSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SMC911X 2200a0e4badSJean-Christophe PLAGNIOL-VILLARD rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 2210a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 2220a0e4badSJean-Christophe PLAGNIOL-VILLARD return rc; 2230a0e4badSJean-Christophe PLAGNIOL-VILLARD } 2245626f336SSanjeev Premi #endif /* CONFIG_CMD_NET */ 225*dcc4f38bSVaibhav Hiremath 226*dcc4f38bSVaibhav Hiremath #ifdef CONFIG_GENERIC_MMC 227*dcc4f38bSVaibhav Hiremath int board_mmc_init(bd_t *bis) 228*dcc4f38bSVaibhav Hiremath { 229*dcc4f38bSVaibhav Hiremath omap_mmc_init(0); 230*dcc4f38bSVaibhav Hiremath return 0; 231*dcc4f38bSVaibhav Hiremath } 232*dcc4f38bSVaibhav Hiremath #endif 233