1c35d7cf0SFrederik Kriewitz /* 2c35d7cf0SFrederik Kriewitz * (C) Copyright 2004-2008 3c35d7cf0SFrederik Kriewitz * Texas Instruments, <www.ti.com> 4c35d7cf0SFrederik Kriewitz * 5c35d7cf0SFrederik Kriewitz * Author : 6c35d7cf0SFrederik Kriewitz * Sunil Kumar <sunilsaini05@gmail.com> 7c35d7cf0SFrederik Kriewitz * Shashi Ranjan <shashiranjanmca05@gmail.com> 8c35d7cf0SFrederik Kriewitz * 9c35d7cf0SFrederik Kriewitz * (C) Copyright 2009 10c35d7cf0SFrederik Kriewitz * Frederik Kriewitz <frederik@kriewitz.eu> 11c35d7cf0SFrederik Kriewitz * 12c35d7cf0SFrederik Kriewitz * Derived from Beagle Board and 3430 SDP code by 13c35d7cf0SFrederik Kriewitz * Richard Woodruff <r-woodruff2@ti.com> 14c35d7cf0SFrederik Kriewitz * Syed Mohammed Khasim <khasim@ti.com> 15c35d7cf0SFrederik Kriewitz * 16c35d7cf0SFrederik Kriewitz * 171a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 18c35d7cf0SFrederik Kriewitz */ 19c35d7cf0SFrederik Kriewitz #include <common.h> 20a91ef4adSAnthoine Bourgeois #include <dm.h> 21a91ef4adSAnthoine Bourgeois #include <ns16550.h> 22c35d7cf0SFrederik Kriewitz #include <twl4030.h> 23c35d7cf0SFrederik Kriewitz #include <asm/io.h> 24f408501dSTom Rini #include <asm/arch/mmc_host_def.h> 25c35d7cf0SFrederik Kriewitz #include <asm/arch/mux.h> 26c35d7cf0SFrederik Kriewitz #include <asm/arch/sys_proto.h> 27c35d7cf0SFrederik Kriewitz #include <asm/arch/mem.h> 28c35d7cf0SFrederik Kriewitz #include <asm/mach-types.h> 29c35d7cf0SFrederik Kriewitz #include "devkit8000.h" 302d52a9a3SSimon Schwarz #include <asm/gpio.h> 31c35d7cf0SFrederik Kriewitz #ifdef CONFIG_DRIVER_DM9000 32c35d7cf0SFrederik Kriewitz #include <net.h> 33c35d7cf0SFrederik Kriewitz #include <netdev.h> 34c35d7cf0SFrederik Kriewitz #endif 35c35d7cf0SFrederik Kriewitz 36c35d7cf0SFrederik Kriewitz DECLARE_GLOBAL_DATA_PTR; 37c35d7cf0SFrederik Kriewitz 3813b178edSThomas Weber static u32 gpmc_net_config[GPMC_MAX_REG] = { 3913b178edSThomas Weber NET_GPMC_CONFIG1, 4013b178edSThomas Weber NET_GPMC_CONFIG2, 4113b178edSThomas Weber NET_GPMC_CONFIG3, 4213b178edSThomas Weber NET_GPMC_CONFIG4, 4313b178edSThomas Weber NET_GPMC_CONFIG5, 4413b178edSThomas Weber NET_GPMC_CONFIG6, 4513b178edSThomas Weber 0 4613b178edSThomas Weber }; 4713b178edSThomas Weber 48a91ef4adSAnthoine Bourgeois static const struct ns16550_platdata devkit8000_serial = { 492f6ed3b8SAdam Ford .base = OMAP34XX_UART3, 502f6ed3b8SAdam Ford .reg_shift = 2, 5117fa0326SHeiko Schocher .clock = V_NS16550_CLK, 5217fa0326SHeiko Schocher .fcr = UART_FCR_DEFVAL, 53a91ef4adSAnthoine Bourgeois }; 54a91ef4adSAnthoine Bourgeois 55a91ef4adSAnthoine Bourgeois U_BOOT_DEVICE(devkit8000_uart) = { 56c7b9686dSThomas Chou "ns16550_serial", 57a91ef4adSAnthoine Bourgeois &devkit8000_serial 58a91ef4adSAnthoine Bourgeois }; 59a91ef4adSAnthoine Bourgeois 60c35d7cf0SFrederik Kriewitz /* 61c35d7cf0SFrederik Kriewitz * Routine: board_init 62c35d7cf0SFrederik Kriewitz * Description: Early hardware init. 63c35d7cf0SFrederik Kriewitz */ 64c35d7cf0SFrederik Kriewitz int board_init(void) 65c35d7cf0SFrederik Kriewitz { 66c35d7cf0SFrederik Kriewitz gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 67c35d7cf0SFrederik Kriewitz /* board id for Linux */ 68c35d7cf0SFrederik Kriewitz gd->bd->bi_arch_number = MACH_TYPE_DEVKIT8000; 69c35d7cf0SFrederik Kriewitz /* boot param addr */ 70c35d7cf0SFrederik Kriewitz gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 71c35d7cf0SFrederik Kriewitz 72c35d7cf0SFrederik Kriewitz return 0; 73c35d7cf0SFrederik Kriewitz } 74c35d7cf0SFrederik Kriewitz 759e70c08bSSimon Schwarz /* Configure GPMC registers for DM9000 */ 769e70c08bSSimon Schwarz static void gpmc_dm9000_config(void) 779e70c08bSSimon Schwarz { 789e70c08bSSimon Schwarz enable_gpmc_cs_config(gpmc_net_config, &gpmc_cfg->cs[6], 799e70c08bSSimon Schwarz CONFIG_DM9000_BASE, GPMC_SIZE_16M); 809e70c08bSSimon Schwarz } 819e70c08bSSimon Schwarz 82c35d7cf0SFrederik Kriewitz /* 83c35d7cf0SFrederik Kriewitz * Routine: misc_init_r 84c35d7cf0SFrederik Kriewitz * Description: Configure board specific parts 85c35d7cf0SFrederik Kriewitz */ 86c35d7cf0SFrederik Kriewitz int misc_init_r(void) 87c35d7cf0SFrederik Kriewitz { 88c35d7cf0SFrederik Kriewitz struct ctrl_id *id_base = (struct ctrl_id *)OMAP34XX_ID_L4_IO_BASE; 89c35d7cf0SFrederik Kriewitz #ifdef CONFIG_DRIVER_DM9000 90c35d7cf0SFrederik Kriewitz uchar enetaddr[6]; 91c35d7cf0SFrederik Kriewitz u32 die_id_0; 92c35d7cf0SFrederik Kriewitz #endif 93c35d7cf0SFrederik Kriewitz 94c35d7cf0SFrederik Kriewitz twl4030_power_init(); 95c35d7cf0SFrederik Kriewitz #ifdef CONFIG_TWL4030_LED 96ead39d7aSGrazvydas Ignotas twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 97c35d7cf0SFrederik Kriewitz #endif 98c35d7cf0SFrederik Kriewitz 99c35d7cf0SFrederik Kriewitz #ifdef CONFIG_DRIVER_DM9000 100c35d7cf0SFrederik Kriewitz /* Configure GPMC registers for DM9000 */ 10113b178edSThomas Weber enable_gpmc_cs_config(gpmc_net_config, &gpmc_cfg->cs[6], 10213b178edSThomas Weber CONFIG_DM9000_BASE, GPMC_SIZE_16M); 103c35d7cf0SFrederik Kriewitz 104c35d7cf0SFrederik Kriewitz /* Use OMAP DIE_ID as MAC address */ 105c35d7cf0SFrederik Kriewitz if (!eth_getenv_enetaddr("ethaddr", enetaddr)) { 106c35d7cf0SFrederik Kriewitz printf("ethaddr not set, using Die ID\n"); 107c35d7cf0SFrederik Kriewitz die_id_0 = readl(&id_base->die_id_0); 108c35d7cf0SFrederik Kriewitz enetaddr[0] = 0x02; /* locally administered */ 109c35d7cf0SFrederik Kriewitz enetaddr[1] = readl(&id_base->die_id_1) & 0xff; 110c35d7cf0SFrederik Kriewitz enetaddr[2] = (die_id_0 & 0xff000000) >> 24; 111c35d7cf0SFrederik Kriewitz enetaddr[3] = (die_id_0 & 0x00ff0000) >> 16; 112c35d7cf0SFrederik Kriewitz enetaddr[4] = (die_id_0 & 0x0000ff00) >> 8; 113c35d7cf0SFrederik Kriewitz enetaddr[5] = (die_id_0 & 0x000000ff); 114*fd1e959eSSimon Glass eth_env_set_enetaddr("ethaddr", enetaddr); 115c35d7cf0SFrederik Kriewitz } 116c35d7cf0SFrederik Kriewitz #endif 117c35d7cf0SFrederik Kriewitz 118679f82c3SPaul Kocialkowski omap_die_id_display(); 119c35d7cf0SFrederik Kriewitz 120c35d7cf0SFrederik Kriewitz return 0; 121c35d7cf0SFrederik Kriewitz } 122c35d7cf0SFrederik Kriewitz 123c35d7cf0SFrederik Kriewitz /* 124c35d7cf0SFrederik Kriewitz * Routine: set_muxconf_regs 125c35d7cf0SFrederik Kriewitz * Description: Setting up the configuration Mux registers specific to the 126c35d7cf0SFrederik Kriewitz * hardware. Many pins need to be moved from protect to primary 127c35d7cf0SFrederik Kriewitz * mode. 128c35d7cf0SFrederik Kriewitz */ 129c35d7cf0SFrederik Kriewitz void set_muxconf_regs(void) 130c35d7cf0SFrederik Kriewitz { 131c35d7cf0SFrederik Kriewitz MUX_DEVKIT8000(); 132c35d7cf0SFrederik Kriewitz } 133c35d7cf0SFrederik Kriewitz 1344aa2ba3aSMasahiro Yamada #if defined(CONFIG_MMC) 135f408501dSTom Rini int board_mmc_init(bd_t *bis) 136f408501dSTom Rini { 137e3913f56SNikita Kiryanov return omap_mmc_init(0, 0, 0, -1, -1); 138f408501dSTom Rini } 139f408501dSTom Rini #endif 140f408501dSTom Rini 1414aa2ba3aSMasahiro Yamada #if defined(CONFIG_MMC) 142aac5450eSPaul Kocialkowski void board_mmc_power_init(void) 143aac5450eSPaul Kocialkowski { 144aac5450eSPaul Kocialkowski twl4030_power_mmc_init(0); 145aac5450eSPaul Kocialkowski } 146aac5450eSPaul Kocialkowski #endif 147aac5450eSPaul Kocialkowski 1483f6a4922SSimon Schwarz #if defined(CONFIG_DRIVER_DM9000) & !defined(CONFIG_SPL_BUILD) 149c35d7cf0SFrederik Kriewitz /* 150c35d7cf0SFrederik Kriewitz * Routine: board_eth_init 151c35d7cf0SFrederik Kriewitz * Description: Setting up the Ethernet hardware. 152c35d7cf0SFrederik Kriewitz */ 153c35d7cf0SFrederik Kriewitz int board_eth_init(bd_t *bis) 154c35d7cf0SFrederik Kriewitz { 155c35d7cf0SFrederik Kriewitz return dm9000_initialize(bis); 156c35d7cf0SFrederik Kriewitz } 157c35d7cf0SFrederik Kriewitz #endif 1589ae0d550STom Rini 1599e70c08bSSimon Schwarz #ifdef CONFIG_SPL_OS_BOOT 1609e70c08bSSimon Schwarz /* 161fc0b5948SRobert P. J. Day * Do board specific preparation before SPL 1629e70c08bSSimon Schwarz * Linux boot 1639e70c08bSSimon Schwarz */ 1649e70c08bSSimon Schwarz void spl_board_prepare_for_linux(void) 1659e70c08bSSimon Schwarz { 1669e70c08bSSimon Schwarz gpmc_dm9000_config(); 1679e70c08bSSimon Schwarz } 1689e70c08bSSimon Schwarz 1692d52a9a3SSimon Schwarz /* 1702d52a9a3SSimon Schwarz * devkit8000 specific implementation of spl_start_uboot() 1712d52a9a3SSimon Schwarz * 1722d52a9a3SSimon Schwarz * RETURN 1732d52a9a3SSimon Schwarz * 0 if the button is not pressed 1742d52a9a3SSimon Schwarz * 1 if the button is pressed 1752d52a9a3SSimon Schwarz */ 1762d52a9a3SSimon Schwarz int spl_start_uboot(void) 1772d52a9a3SSimon Schwarz { 1782d52a9a3SSimon Schwarz int val = 0; 17930372965SStefano Babic if (!gpio_request(SPL_OS_BOOT_KEY, "U-Boot key")) { 18030372965SStefano Babic gpio_direction_input(SPL_OS_BOOT_KEY); 18130372965SStefano Babic val = gpio_get_value(SPL_OS_BOOT_KEY); 18230372965SStefano Babic gpio_free(SPL_OS_BOOT_KEY); 1832d52a9a3SSimon Schwarz } 1842d52a9a3SSimon Schwarz return !val; 1852d52a9a3SSimon Schwarz } 1869e70c08bSSimon Schwarz #endif 1879e70c08bSSimon Schwarz 1889ae0d550STom Rini /* 1899ae0d550STom Rini * Routine: get_board_mem_timings 1909ae0d550STom Rini * Description: If we use SPL then there is no x-loader nor config header 1919ae0d550STom Rini * so we have to setup the DDR timings ourself on the first bank. This 1929ae0d550STom Rini * provides the timing values back to the function that configures 1939ae0d550STom Rini * the memory. We have either one or two banks of 128MB DDR. 1949ae0d550STom Rini */ 1958c4445d2SPeter Barada void get_board_mem_timings(struct board_sdrc_timings *timings) 1969ae0d550STom Rini { 1979ae0d550STom Rini /* General SDRC config */ 1988c4445d2SPeter Barada timings->mcfg = MICRON_V_MCFG_165(128 << 20); 1998c4445d2SPeter Barada timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 2009ae0d550STom Rini 2019ae0d550STom Rini /* AC timings */ 2028c4445d2SPeter Barada timings->ctrla = MICRON_V_ACTIMA_165; 2038c4445d2SPeter Barada timings->ctrlb = MICRON_V_ACTIMB_165; 2049ae0d550STom Rini 2058c4445d2SPeter Barada timings->mr = MICRON_V_MR_165; 2069ae0d550STom Rini } 207