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> 36c0682587SSriramakrishnan #include <asm/arch/gpio.h> 370a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <i2c.h> 380a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 390a0e4badSJean-Christophe PLAGNIOL-VILLARD #include "evm.h" 400a0e4badSJean-Christophe PLAGNIOL-VILLARD 41c0682587SSriramakrishnan #define OMAP3EVM_GPIO_ETH_RST_GEN1 64 42c0682587SSriramakrishnan #define OMAP3EVM_GPIO_ETH_RST_GEN2 7 43c0682587SSriramakrishnan 4429565326SJohn Rigby DECLARE_GLOBAL_DATA_PTR; 4529565326SJohn Rigby 46b606ef41SDirk Behme static u32 omap3_evm_version; 47b5abf644SAjay Kumar Gupta 48b606ef41SDirk Behme u32 get_omap3_evm_rev(void) 49b5abf644SAjay Kumar Gupta { 50b5abf644SAjay Kumar Gupta return omap3_evm_version; 51b5abf644SAjay Kumar Gupta } 52b5abf644SAjay Kumar Gupta 53b5abf644SAjay Kumar Gupta static void omap3_evm_get_revision(void) 54b5abf644SAjay Kumar Gupta { 5576ee9a2cSSanjeev Premi #if defined(CONFIG_CMD_NET) 5676ee9a2cSSanjeev Premi /* 5776ee9a2cSSanjeev Premi * Board revision can be ascertained only by identifying 5876ee9a2cSSanjeev Premi * the Ethernet chipset. 5976ee9a2cSSanjeev Premi */ 60b5abf644SAjay Kumar Gupta unsigned int smsc_id; 61b5abf644SAjay Kumar Gupta 62b5abf644SAjay Kumar Gupta /* Ethernet PHY ID is stored at ID_REV register */ 63b5abf644SAjay Kumar Gupta smsc_id = readl(CONFIG_SMC911X_BASE + 0x50) & 0xFFFF0000; 64b5abf644SAjay Kumar Gupta printf("Read back SMSC id 0x%x\n", smsc_id); 65b5abf644SAjay Kumar Gupta 66b5abf644SAjay Kumar Gupta switch (smsc_id) { 67b5abf644SAjay Kumar Gupta /* SMSC9115 chipset */ 68b5abf644SAjay Kumar Gupta case 0x01150000: 69b5abf644SAjay Kumar Gupta omap3_evm_version = OMAP3EVM_BOARD_GEN_1; 70b5abf644SAjay Kumar Gupta break; 71b5abf644SAjay Kumar Gupta /* SMSC 9220 chipset */ 72b5abf644SAjay Kumar Gupta case 0x92200000: 73b5abf644SAjay Kumar Gupta default: 74b5abf644SAjay Kumar Gupta omap3_evm_version = OMAP3EVM_BOARD_GEN_2; 75b5abf644SAjay Kumar Gupta } 7676ee9a2cSSanjeev Premi #else 7776ee9a2cSSanjeev Premi #if defined(CONFIG_STATIC_BOARD_REV) 7876ee9a2cSSanjeev Premi /* 7976ee9a2cSSanjeev Premi * Look for static defintion of the board revision 8076ee9a2cSSanjeev Premi */ 8176ee9a2cSSanjeev Premi omap3_evm_version = CONFIG_STATIC_BOARD_REV; 8276ee9a2cSSanjeev Premi #else 8376ee9a2cSSanjeev Premi /* 8476ee9a2cSSanjeev Premi * Fallback to the default above. 8576ee9a2cSSanjeev Premi */ 8676ee9a2cSSanjeev Premi omap3_evm_version = OMAP3EVM_BOARD_GEN_2; 8776ee9a2cSSanjeev Premi #endif 8876ee9a2cSSanjeev Premi #endif /* CONFIG_CMD_NET */ 89b5abf644SAjay Kumar Gupta } 90b5abf644SAjay Kumar Gupta 9163f42400SSanjeev Premi #ifdef CONFIG_USB_OMAP3 920a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 93944a4894SAjay Kumar Gupta * MUSB port on OMAP3EVM Rev >= E requires extvbus programming. 94944a4894SAjay Kumar Gupta */ 95944a4894SAjay Kumar Gupta u8 omap3_evm_need_extvbus(void) 96944a4894SAjay Kumar Gupta { 97944a4894SAjay Kumar Gupta u8 retval = 0; 98944a4894SAjay Kumar Gupta 99944a4894SAjay Kumar Gupta if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) 100944a4894SAjay Kumar Gupta retval = 1; 101944a4894SAjay Kumar Gupta 102944a4894SAjay Kumar Gupta return retval; 103944a4894SAjay Kumar Gupta } 10463f42400SSanjeev Premi #endif 105944a4894SAjay Kumar Gupta 106944a4894SAjay Kumar Gupta /* 1070a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 1080a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 1090a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1100a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_init(void) 1110a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1120a0e4badSJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 1130a0e4badSJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 1140a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OMAP3EVM; 1150a0e4badSJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 1160a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 1170a0e4badSJean-Christophe PLAGNIOL-VILLARD 1180a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1190a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1200a0e4badSJean-Christophe PLAGNIOL-VILLARD 1210a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1220a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 1230a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Init ethernet (done here so udelay works) 1240a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1250a0e4badSJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 1260a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1270a0e4badSJean-Christophe PLAGNIOL-VILLARD 1280a0e4badSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_DRIVER_OMAP34XX_I2C 1290a0e4badSJean-Christophe PLAGNIOL-VILLARD i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); 1300a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 1310a0e4badSJean-Christophe PLAGNIOL-VILLARD 1320a0e4badSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_NET) 1330a0e4badSJean-Christophe PLAGNIOL-VILLARD setup_net_chip(); 1340a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 13576ee9a2cSSanjeev Premi omap3_evm_get_revision(); 1360a0e4badSJean-Christophe PLAGNIOL-VILLARD 1376921b314SSanjeev Premi #if defined(CONFIG_CMD_NET) 1386921b314SSanjeev Premi reset_net_chip(); 1396921b314SSanjeev Premi #endif 1400a0e4badSJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 1410a0e4badSJean-Christophe PLAGNIOL-VILLARD 1420a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1430a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1440a0e4badSJean-Christophe PLAGNIOL-VILLARD 1450a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1460a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 1470a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 1480a0e4badSJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 1490a0e4badSJean-Christophe PLAGNIOL-VILLARD * mode. 1500a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1510a0e4badSJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 1520a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1530a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_EVM(); 1540a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1550a0e4badSJean-Christophe PLAGNIOL-VILLARD 156*5626f336SSanjeev Premi #ifdef CONFIG_CMD_NET 1570a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1580a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: setup_net_chip 1590a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration GPMC registers specific to the 1600a0e4badSJean-Christophe PLAGNIOL-VILLARD * Ethernet hardware. 1610a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1620a0e4badSJean-Christophe PLAGNIOL-VILLARD static void setup_net_chip(void) 1630a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1640a0e4badSJean-Christophe PLAGNIOL-VILLARD struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 1650a0e4badSJean-Christophe PLAGNIOL-VILLARD 1660a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Configure GPMC registers */ 1670a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG1, &gpmc_cfg->cs[5].config1); 1680a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG2, &gpmc_cfg->cs[5].config2); 1690a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG3, &gpmc_cfg->cs[5].config3); 1700a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG4, &gpmc_cfg->cs[5].config4); 1710a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG5, &gpmc_cfg->cs[5].config5); 1720a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG6, &gpmc_cfg->cs[5].config6); 1730a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG7, &gpmc_cfg->cs[5].config7); 1740a0e4badSJean-Christophe PLAGNIOL-VILLARD 1750a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 1760a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 1770a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 1780a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 1790a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 1800a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 1810a0e4badSJean-Christophe PLAGNIOL-VILLARD &ctrl_base->gpmc_nadv_ale); 1826921b314SSanjeev Premi } 1836921b314SSanjeev Premi 1846921b314SSanjeev Premi /** 1856921b314SSanjeev Premi * Reset the ethernet chip. 1866921b314SSanjeev Premi */ 1876921b314SSanjeev Premi static void reset_net_chip(void) 1886921b314SSanjeev Premi { 189c0682587SSriramakrishnan int ret; 190c0682587SSriramakrishnan int rst_gpio; 1910a0e4badSJean-Christophe PLAGNIOL-VILLARD 192c0682587SSriramakrishnan if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) { 193c0682587SSriramakrishnan rst_gpio = OMAP3EVM_GPIO_ETH_RST_GEN1; 194c0682587SSriramakrishnan } else { 195c0682587SSriramakrishnan rst_gpio = OMAP3EVM_GPIO_ETH_RST_GEN2; 196c0682587SSriramakrishnan } 1970a0e4badSJean-Christophe PLAGNIOL-VILLARD 198c0682587SSriramakrishnan ret = omap_request_gpio(rst_gpio); 199c0682587SSriramakrishnan if (ret < 0) { 200c0682587SSriramakrishnan printf("Unable to get GPIO %d\n", rst_gpio); 201c0682587SSriramakrishnan return ; 202c0682587SSriramakrishnan } 203c0682587SSriramakrishnan 204c0682587SSriramakrishnan /* Configure as output */ 205c0682587SSriramakrishnan omap_set_gpio_direction(rst_gpio, 0); 206c0682587SSriramakrishnan 207c0682587SSriramakrishnan /* Send a pulse on the GPIO pin */ 208c0682587SSriramakrishnan omap_set_gpio_dataout(rst_gpio, 1); 2090a0e4badSJean-Christophe PLAGNIOL-VILLARD udelay(1); 210c0682587SSriramakrishnan omap_set_gpio_dataout(rst_gpio, 0); 2110a0e4badSJean-Christophe PLAGNIOL-VILLARD udelay(1); 212c0682587SSriramakrishnan omap_set_gpio_dataout(rst_gpio, 1); 2130a0e4badSJean-Christophe PLAGNIOL-VILLARD } 2140a0e4badSJean-Christophe PLAGNIOL-VILLARD 2150a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_eth_init(bd_t *bis) 2160a0e4badSJean-Christophe PLAGNIOL-VILLARD { 2170a0e4badSJean-Christophe PLAGNIOL-VILLARD int rc = 0; 2180a0e4badSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SMC911X 2190a0e4badSJean-Christophe PLAGNIOL-VILLARD rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 2200a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 2210a0e4badSJean-Christophe PLAGNIOL-VILLARD return rc; 2220a0e4badSJean-Christophe PLAGNIOL-VILLARD } 223*5626f336SSanjeev Premi #endif /* CONFIG_CMD_NET */ 224