10a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 2673283f3STom Rini * (C) Copyright 2004-2011 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 * 121a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 130a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 140a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <common.h> 150a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <netdev.h> 160a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 170a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mem.h> 180a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/mux.h> 190a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/sys_proto.h> 20dcc4f38bSVaibhav Hiremath #include <asm/arch/mmc_host_def.h> 2184c3b631SSanjeev Premi #include <asm/gpio.h> 220a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <i2c.h> 230a0e4badSJean-Christophe PLAGNIOL-VILLARD #include <asm/mach-types.h> 24673283f3STom Rini #include <linux/mtd/nand.h> 250a0e4badSJean-Christophe PLAGNIOL-VILLARD #include "evm.h" 260a0e4badSJean-Christophe PLAGNIOL-VILLARD 27c0682587SSriramakrishnan #define OMAP3EVM_GPIO_ETH_RST_GEN1 64 28c0682587SSriramakrishnan #define OMAP3EVM_GPIO_ETH_RST_GEN2 7 29c0682587SSriramakrishnan 3029565326SJohn Rigby DECLARE_GLOBAL_DATA_PTR; 3129565326SJohn Rigby 32b606ef41SDirk Behme static u32 omap3_evm_version; 33b5abf644SAjay Kumar Gupta 34b606ef41SDirk Behme u32 get_omap3_evm_rev(void) 35b5abf644SAjay Kumar Gupta { 36b5abf644SAjay Kumar Gupta return omap3_evm_version; 37b5abf644SAjay Kumar Gupta } 38b5abf644SAjay Kumar Gupta 39b5abf644SAjay Kumar Gupta static void omap3_evm_get_revision(void) 40b5abf644SAjay Kumar Gupta { 4176ee9a2cSSanjeev Premi #if defined(CONFIG_CMD_NET) 4276ee9a2cSSanjeev Premi /* 4376ee9a2cSSanjeev Premi * Board revision can be ascertained only by identifying 4476ee9a2cSSanjeev Premi * the Ethernet chipset. 4576ee9a2cSSanjeev Premi */ 46b5abf644SAjay Kumar Gupta unsigned int smsc_id; 47b5abf644SAjay Kumar Gupta 48b5abf644SAjay Kumar Gupta /* Ethernet PHY ID is stored at ID_REV register */ 49b5abf644SAjay Kumar Gupta smsc_id = readl(CONFIG_SMC911X_BASE + 0x50) & 0xFFFF0000; 50b5abf644SAjay Kumar Gupta printf("Read back SMSC id 0x%x\n", smsc_id); 51b5abf644SAjay Kumar Gupta 52b5abf644SAjay Kumar Gupta switch (smsc_id) { 53b5abf644SAjay Kumar Gupta /* SMSC9115 chipset */ 54b5abf644SAjay Kumar Gupta case 0x01150000: 55b5abf644SAjay Kumar Gupta omap3_evm_version = OMAP3EVM_BOARD_GEN_1; 56b5abf644SAjay Kumar Gupta break; 57b5abf644SAjay Kumar Gupta /* SMSC 9220 chipset */ 58b5abf644SAjay Kumar Gupta case 0x92200000: 59b5abf644SAjay Kumar Gupta default: 60b5abf644SAjay Kumar Gupta omap3_evm_version = OMAP3EVM_BOARD_GEN_2; 61b5abf644SAjay Kumar Gupta } 6276ee9a2cSSanjeev Premi #else 6376ee9a2cSSanjeev Premi #if defined(CONFIG_STATIC_BOARD_REV) 6476ee9a2cSSanjeev Premi /* 6576ee9a2cSSanjeev Premi * Look for static defintion of the board revision 6676ee9a2cSSanjeev Premi */ 6776ee9a2cSSanjeev Premi omap3_evm_version = CONFIG_STATIC_BOARD_REV; 6876ee9a2cSSanjeev Premi #else 6976ee9a2cSSanjeev Premi /* 7076ee9a2cSSanjeev Premi * Fallback to the default above. 7176ee9a2cSSanjeev Premi */ 7276ee9a2cSSanjeev Premi omap3_evm_version = OMAP3EVM_BOARD_GEN_2; 7376ee9a2cSSanjeev Premi #endif 7476ee9a2cSSanjeev Premi #endif /* CONFIG_CMD_NET */ 75b5abf644SAjay Kumar Gupta } 76b5abf644SAjay Kumar Gupta 7763f42400SSanjeev Premi #ifdef CONFIG_USB_OMAP3 780a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 79944a4894SAjay Kumar Gupta * MUSB port on OMAP3EVM Rev >= E requires extvbus programming. 80944a4894SAjay Kumar Gupta */ 81944a4894SAjay Kumar Gupta u8 omap3_evm_need_extvbus(void) 82944a4894SAjay Kumar Gupta { 83944a4894SAjay Kumar Gupta u8 retval = 0; 84944a4894SAjay Kumar Gupta 85944a4894SAjay Kumar Gupta if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) 86944a4894SAjay Kumar Gupta retval = 1; 87944a4894SAjay Kumar Gupta 88944a4894SAjay Kumar Gupta return retval; 89944a4894SAjay Kumar Gupta } 9063f42400SSanjeev Premi #endif 91944a4894SAjay Kumar Gupta 92944a4894SAjay Kumar Gupta /* 930a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: board_init 940a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Early hardware init. 950a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 960a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_init(void) 970a0e4badSJean-Christophe PLAGNIOL-VILLARD { 980a0e4badSJean-Christophe PLAGNIOL-VILLARD gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 990a0e4badSJean-Christophe PLAGNIOL-VILLARD /* board id for Linux */ 1000a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_OMAP3EVM; 1010a0e4badSJean-Christophe PLAGNIOL-VILLARD /* boot param addr */ 1020a0e4badSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 1030a0e4badSJean-Christophe PLAGNIOL-VILLARD 1040a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1050a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1060a0e4badSJean-Christophe PLAGNIOL-VILLARD 107673283f3STom Rini #ifdef CONFIG_SPL_BUILD 108673283f3STom Rini /* 109673283f3STom Rini * Routine: get_board_mem_timings 110673283f3STom Rini * Description: If we use SPL then there is no x-loader nor config header 111673283f3STom Rini * so we have to setup the DDR timings ourself on the first bank. This 112673283f3STom Rini * provides the timing values back to the function that configures 113673283f3STom Rini * the memory. 114673283f3STom Rini */ 1158c4445d2SPeter Barada void get_board_mem_timings(struct board_sdrc_timings *timings) 116673283f3STom Rini { 117673283f3STom Rini int pop_mfr, pop_id; 118673283f3STom Rini 119673283f3STom Rini /* 120673283f3STom Rini * We need to identify what PoP memory is on the board so that 121673283f3STom Rini * we know what timings to use. To map the ID values please see 122673283f3STom Rini * nand_ids.c 123673283f3STom Rini */ 124673283f3STom Rini identify_nand_chip(&pop_mfr, &pop_id); 125673283f3STom Rini 126673283f3STom Rini if (pop_mfr == NAND_MFR_HYNIX && pop_id == 0xbc) { 127673283f3STom Rini /* 256MB DDR */ 1288c4445d2SPeter Barada timings->mcfg = HYNIX_V_MCFG_200(256 << 20); 1298c4445d2SPeter Barada timings->ctrla = HYNIX_V_ACTIMA_200; 1308c4445d2SPeter Barada timings->ctrlb = HYNIX_V_ACTIMB_200; 131673283f3STom Rini } else { 132673283f3STom Rini /* 128MB DDR */ 1338c4445d2SPeter Barada timings->mcfg = MICRON_V_MCFG_165(128 << 20); 1348c4445d2SPeter Barada timings->ctrla = MICRON_V_ACTIMA_165; 1358c4445d2SPeter Barada timings->ctrlb = MICRON_V_ACTIMB_165; 136673283f3STom Rini } 1378c4445d2SPeter Barada timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 1388c4445d2SPeter Barada timings->mr = MICRON_V_MR_165; 139673283f3STom Rini } 140673283f3STom Rini #endif 141673283f3STom Rini 1420a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1430a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: misc_init_r 1440a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Init ethernet (done here so udelay works) 1450a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1460a0e4badSJean-Christophe PLAGNIOL-VILLARD int misc_init_r(void) 1470a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1480a0e4badSJean-Christophe PLAGNIOL-VILLARD 149*6789e84eSHeiko Schocher #ifdef CONFIG_SYS_I2C_OMAP34XX 150*6789e84eSHeiko Schocher i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE); 1510a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 1520a0e4badSJean-Christophe PLAGNIOL-VILLARD 1530a0e4badSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_NET) 1540a0e4badSJean-Christophe PLAGNIOL-VILLARD setup_net_chip(); 1550a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 15676ee9a2cSSanjeev Premi omap3_evm_get_revision(); 1570a0e4badSJean-Christophe PLAGNIOL-VILLARD 1586921b314SSanjeev Premi #if defined(CONFIG_CMD_NET) 1596921b314SSanjeev Premi reset_net_chip(); 1606921b314SSanjeev Premi #endif 1610a0e4badSJean-Christophe PLAGNIOL-VILLARD dieid_num_r(); 1620a0e4badSJean-Christophe PLAGNIOL-VILLARD 1630a0e4badSJean-Christophe PLAGNIOL-VILLARD return 0; 1640a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1650a0e4badSJean-Christophe PLAGNIOL-VILLARD 1660a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1670a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: set_muxconf_regs 1680a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration Mux registers specific to the 1690a0e4badSJean-Christophe PLAGNIOL-VILLARD * hardware. Many pins need to be moved from protect to primary 1700a0e4badSJean-Christophe PLAGNIOL-VILLARD * mode. 1710a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1720a0e4badSJean-Christophe PLAGNIOL-VILLARD void set_muxconf_regs(void) 1730a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1740a0e4badSJean-Christophe PLAGNIOL-VILLARD MUX_EVM(); 1750a0e4badSJean-Christophe PLAGNIOL-VILLARD } 1760a0e4badSJean-Christophe PLAGNIOL-VILLARD 1775626f336SSanjeev Premi #ifdef CONFIG_CMD_NET 1780a0e4badSJean-Christophe PLAGNIOL-VILLARD /* 1790a0e4badSJean-Christophe PLAGNIOL-VILLARD * Routine: setup_net_chip 1800a0e4badSJean-Christophe PLAGNIOL-VILLARD * Description: Setting up the configuration GPMC registers specific to the 1810a0e4badSJean-Christophe PLAGNIOL-VILLARD * Ethernet hardware. 1820a0e4badSJean-Christophe PLAGNIOL-VILLARD */ 1830a0e4badSJean-Christophe PLAGNIOL-VILLARD static void setup_net_chip(void) 1840a0e4badSJean-Christophe PLAGNIOL-VILLARD { 1850a0e4badSJean-Christophe PLAGNIOL-VILLARD struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE; 1860a0e4badSJean-Christophe PLAGNIOL-VILLARD 1870a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Configure GPMC registers */ 1880a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG1, &gpmc_cfg->cs[5].config1); 1890a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG2, &gpmc_cfg->cs[5].config2); 1900a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG3, &gpmc_cfg->cs[5].config3); 1910a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG4, &gpmc_cfg->cs[5].config4); 1920a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG5, &gpmc_cfg->cs[5].config5); 1930a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG6, &gpmc_cfg->cs[5].config6); 1940a0e4badSJean-Christophe PLAGNIOL-VILLARD writel(NET_GPMC_CONFIG7, &gpmc_cfg->cs[5].config7); 1950a0e4badSJean-Christophe PLAGNIOL-VILLARD 1960a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for NWE in PADCONF_GPMC_NWE register */ 1970a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe); 1980a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */ 1990a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe); 2000a0e4badSJean-Christophe PLAGNIOL-VILLARD /* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */ 2010a0e4badSJean-Christophe PLAGNIOL-VILLARD writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00, 2020a0e4badSJean-Christophe PLAGNIOL-VILLARD &ctrl_base->gpmc_nadv_ale); 2036921b314SSanjeev Premi } 2046921b314SSanjeev Premi 2056921b314SSanjeev Premi /** 2066921b314SSanjeev Premi * Reset the ethernet chip. 2076921b314SSanjeev Premi */ 2086921b314SSanjeev Premi static void reset_net_chip(void) 2096921b314SSanjeev Premi { 210c0682587SSriramakrishnan int ret; 211c0682587SSriramakrishnan int rst_gpio; 2120a0e4badSJean-Christophe PLAGNIOL-VILLARD 213c0682587SSriramakrishnan if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) { 214c0682587SSriramakrishnan rst_gpio = OMAP3EVM_GPIO_ETH_RST_GEN1; 215c0682587SSriramakrishnan } else { 216c0682587SSriramakrishnan rst_gpio = OMAP3EVM_GPIO_ETH_RST_GEN2; 217c0682587SSriramakrishnan } 2180a0e4badSJean-Christophe PLAGNIOL-VILLARD 21984c3b631SSanjeev Premi ret = gpio_request(rst_gpio, ""); 220c0682587SSriramakrishnan if (ret < 0) { 221c0682587SSriramakrishnan printf("Unable to get GPIO %d\n", rst_gpio); 222c0682587SSriramakrishnan return ; 223c0682587SSriramakrishnan } 224c0682587SSriramakrishnan 225c0682587SSriramakrishnan /* Configure as output */ 22684c3b631SSanjeev Premi gpio_direction_output(rst_gpio, 0); 227c0682587SSriramakrishnan 228c0682587SSriramakrishnan /* Send a pulse on the GPIO pin */ 22984c3b631SSanjeev Premi gpio_set_value(rst_gpio, 1); 2300a0e4badSJean-Christophe PLAGNIOL-VILLARD udelay(1); 23184c3b631SSanjeev Premi gpio_set_value(rst_gpio, 0); 2320a0e4badSJean-Christophe PLAGNIOL-VILLARD udelay(1); 23384c3b631SSanjeev Premi gpio_set_value(rst_gpio, 1); 2340a0e4badSJean-Christophe PLAGNIOL-VILLARD } 2350a0e4badSJean-Christophe PLAGNIOL-VILLARD 2360a0e4badSJean-Christophe PLAGNIOL-VILLARD int board_eth_init(bd_t *bis) 2370a0e4badSJean-Christophe PLAGNIOL-VILLARD { 2380a0e4badSJean-Christophe PLAGNIOL-VILLARD int rc = 0; 2390a0e4badSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SMC911X 2405e463a24SSanjeev Premi #define STR_ENV_ETHADDR "ethaddr" 2415e463a24SSanjeev Premi 2425e463a24SSanjeev Premi struct eth_device *dev; 2435e463a24SSanjeev Premi uchar eth_addr[6]; 2445e463a24SSanjeev Premi 2450a0e4badSJean-Christophe PLAGNIOL-VILLARD rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 2465e463a24SSanjeev Premi 2475e463a24SSanjeev Premi if (!eth_getenv_enetaddr(STR_ENV_ETHADDR, eth_addr)) { 2485e463a24SSanjeev Premi dev = eth_get_dev_by_index(0); 2495e463a24SSanjeev Premi if (dev) { 2505e463a24SSanjeev Premi eth_setenv_enetaddr(STR_ENV_ETHADDR, dev->enetaddr); 2515e463a24SSanjeev Premi } else { 2525e463a24SSanjeev Premi printf("omap3evm: Couldn't get eth device\n"); 2535e463a24SSanjeev Premi rc = -1; 2545e463a24SSanjeev Premi } 2555e463a24SSanjeev Premi } 2560a0e4badSJean-Christophe PLAGNIOL-VILLARD #endif 2570a0e4badSJean-Christophe PLAGNIOL-VILLARD return rc; 2580a0e4badSJean-Christophe PLAGNIOL-VILLARD } 2595626f336SSanjeev Premi #endif /* CONFIG_CMD_NET */ 260dcc4f38bSVaibhav Hiremath 261673283f3STom Rini #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD) 262dcc4f38bSVaibhav Hiremath int board_mmc_init(bd_t *bis) 263dcc4f38bSVaibhav Hiremath { 264e3913f56SNikita Kiryanov return omap_mmc_init(0, 0, 0, -1, -1); 265dcc4f38bSVaibhav Hiremath } 266dcc4f38bSVaibhav Hiremath #endif 267