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> 360a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <i2c.h> 370a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 380a0e4badSJean-Christophe PLAGNIOL-VILLARD #include "evm.h" 390a0e4badSJean-Christophe PLAGNIOL-VILLARD 40*b606ef41SDirk Behme static u32 omap3_evm_version; 41b5abf644SAjay Kumar Gupta 42*b606ef41SDirk Behme u32 get_omap3_evm_rev(void) 43b5abf644SAjay Kumar Gupta { 44b5abf644SAjay Kumar Gupta return omap3_evm_version; 45b5abf644SAjay Kumar Gupta } 46b5abf644SAjay Kumar Gupta 47b5abf644SAjay Kumar Gupta static void omap3_evm_get_revision(void) 48b5abf644SAjay Kumar Gupta { 4976ee9a2cSSanjeev Premi #if defined(CONFIG_CMD_NET) 5076ee9a2cSSanjeev Premi /* 5176ee9a2cSSanjeev Premi * Board revision can be ascertained only by identifying 5276ee9a2cSSanjeev Premi * the Ethernet chipset. 5376ee9a2cSSanjeev Premi */ 54b5abf644SAjay Kumar Gupta unsigned int smsc_id; 55b5abf644SAjay Kumar Gupta 56b5abf644SAjay Kumar Gupta /* Ethernet PHY ID is stored at ID_REV register */ 57b5abf644SAjay Kumar Gupta smsc_id = readl(CONFIG_SMC911X_BASE + 0x50) & 0xFFFF0000; 58b5abf644SAjay Kumar Gupta printf("Read back SMSC id 0x%x\n", smsc_id); 59b5abf644SAjay Kumar Gupta 60b5abf644SAjay Kumar Gupta switch (smsc_id) { 61b5abf644SAjay Kumar Gupta /* SMSC9115 chipset */ 62b5abf644SAjay Kumar Gupta case 0x01150000: 63b5abf644SAjay Kumar Gupta omap3_evm_version = OMAP3EVM_BOARD_GEN_1; 64b5abf644SAjay Kumar Gupta break; 65b5abf644SAjay Kumar Gupta /* SMSC 9220 chipset */ 66b5abf644SAjay Kumar Gupta case 0x92200000: 67b5abf644SAjay Kumar Gupta default: 68b5abf644SAjay Kumar Gupta omap3_evm_version = OMAP3EVM_BOARD_GEN_2; 69b5abf644SAjay Kumar Gupta } 7076ee9a2cSSanjeev Premi #else 7176ee9a2cSSanjeev Premi #if defined(CONFIG_STATIC_BOARD_REV) 7276ee9a2cSSanjeev Premi /* 7376ee9a2cSSanjeev Premi * Look for static defintion of the board revision 7476ee9a2cSSanjeev Premi */ 7576ee9a2cSSanjeev Premi omap3_evm_version = CONFIG_STATIC_BOARD_REV; 7676ee9a2cSSanjeev Premi #else 7776ee9a2cSSanjeev Premi /* 7876ee9a2cSSanjeev Premi * Fallback to the default above. 7976ee9a2cSSanjeev Premi */ 8076ee9a2cSSanjeev Premi omap3_evm_version = OMAP3EVM_BOARD_GEN_2; 8176ee9a2cSSanjeev Premi #endif 8276ee9a2cSSanjeev Premi #endif /* CONFIG_CMD_NET */ 83b5abf644SAjay Kumar Gupta } 84b5abf644SAjay Kumar Gupta 8563f42400SSanjeev Premi #ifdef CONFIG_USB_OMAP3 860a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 87944a4894SAjay Kumar Gupta * MUSB port on OMAP3EVM Rev >= E requires extvbus programming. 88944a4894SAjay Kumar Gupta */ 89944a4894SAjay Kumar Gupta u8 omap3_evm_need_extvbus(void) 90944a4894SAjay Kumar Gupta { 91944a4894SAjay Kumar Gupta u8 retval = 0; 92944a4894SAjay Kumar Gupta 93944a4894SAjay Kumar Gupta if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) 94944a4894SAjay Kumar Gupta retval = 1; 95944a4894SAjay Kumar Gupta 96944a4894SAjay Kumar Gupta return retval; 97944a4894SAjay Kumar Gupta } 9863f42400SSanjeev Premi #endif 99944a4894SAjay Kumar Gupta 100944a4894SAjay Kumar Gupta /* 1010a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 1020a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 1030a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1040a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_init(void) 1050a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1060a0e4badSJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR; 1070a0e4badSJean-Christophe PLAGNIOL-VILLARD 1080a0e4badSJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 1090a0e4badSJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 1100a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OMAP3EVM; 1110a0e4badSJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 1120a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 1130a0e4badSJean-Christophe PLAGNIOL-VILLARD 1140a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1150a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1160a0e4badSJean-Christophe PLAGNIOL-VILLARD 1170a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1180a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 1190a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Init ethernet (done here so udelay works) 1200a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1210a0e4badSJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 1220a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1230a0e4badSJean-Christophe PLAGNIOL-VILLARD 1240a0e4badSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_DRIVER_OMAP34XX_I2C 1250a0e4badSJean-Christophe PLAGNIOL-VILLARD i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); 1260a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 1270a0e4badSJean-Christophe PLAGNIOL-VILLARD 1280a0e4badSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_NET) 1290a0e4badSJean-Christophe PLAGNIOL-VILLARD setup_net_chip(); 1300a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 13176ee9a2cSSanjeev Premi omap3_evm_get_revision(); 1320a0e4badSJean-Christophe PLAGNIOL-VILLARD 1330a0e4badSJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 1340a0e4badSJean-Christophe PLAGNIOL-VILLARD 1350a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1360a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1370a0e4badSJean-Christophe PLAGNIOL-VILLARD 1380a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1390a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 1400a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 1410a0e4badSJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 1420a0e4badSJean-Christophe PLAGNIOL-VILLARD * mode. 1430a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1440a0e4badSJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 1450a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1460a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_EVM(); 1470a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1480a0e4badSJean-Christophe PLAGNIOL-VILLARD 1490a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1500a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: setup_net_chip 1510a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration GPMC registers specific to the 1520a0e4badSJean-Christophe PLAGNIOL-VILLARD * Ethernet hardware. 1530a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1540a0e4badSJean-Christophe PLAGNIOL-VILLARD static void setup_net_chip(void) 1550a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1560a0e4badSJean-Christophe PLAGNIOL-VILLARD struct gpio *gpio3_base = (struct gpio *)OMAP34XX_GPIO3_BASE; 1570a0e4badSJean-Christophe PLAGNIOL-VILLARD struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 1580a0e4badSJean-Christophe PLAGNIOL-VILLARD 1590a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Configure GPMC registers */ 1600a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG1, &gpmc_cfg->cs[5].config1); 1610a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG2, &gpmc_cfg->cs[5].config2); 1620a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG3, &gpmc_cfg->cs[5].config3); 1630a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG4, &gpmc_cfg->cs[5].config4); 1640a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG5, &gpmc_cfg->cs[5].config5); 1650a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG6, &gpmc_cfg->cs[5].config6); 1660a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG7, &gpmc_cfg->cs[5].config7); 1670a0e4badSJean-Christophe PLAGNIOL-VILLARD 1680a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 1690a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 1700a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 1710a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 1720a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 1730a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 1740a0e4badSJean-Christophe PLAGNIOL-VILLARD &ctrl_base->gpmc_nadv_ale); 1750a0e4badSJean-Christophe PLAGNIOL-VILLARD 1760a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Make GPIO 64 as output pin */ 1770a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(readl(&gpio3_base->oe) & ~(GPIO0), &gpio3_base->oe); 1780a0e4badSJean-Christophe PLAGNIOL-VILLARD 1790a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Now send a pulse on the GPIO pin */ 1800a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO0, &gpio3_base->setdataout); 1810a0e4badSJean-Christophe PLAGNIOL-VILLARD udelay(1); 1820a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO0, &gpio3_base->cleardataout); 1830a0e4badSJean-Christophe PLAGNIOL-VILLARD udelay(1); 1840a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(GPIO0, &gpio3_base->setdataout); 1850a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1860a0e4badSJean-Christophe PLAGNIOL-VILLARD 1870a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_eth_init(bd_t *bis) 1880a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1890a0e4badSJean-Christophe PLAGNIOL-VILLARD int rc = 0; 1900a0e4badSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SMC911X 1910a0e4badSJean-Christophe PLAGNIOL-VILLARD rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 1920a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 1930a0e4badSJean-Christophe PLAGNIOL-VILLARD return rc; 1940a0e4badSJean-Christophe PLAGNIOL-VILLARD } 195