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> 20*a91ef4adSAnthoine Bourgeois #include <dm.h> 21*a91ef4adSAnthoine 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 48*a91ef4adSAnthoine Bourgeois static const struct ns16550_platdata devkit8000_serial = { 49*a91ef4adSAnthoine Bourgeois OMAP34XX_UART3, 50*a91ef4adSAnthoine Bourgeois 2, 51*a91ef4adSAnthoine Bourgeois V_NS16550_CLK 52*a91ef4adSAnthoine Bourgeois }; 53*a91ef4adSAnthoine Bourgeois 54*a91ef4adSAnthoine Bourgeois U_BOOT_DEVICE(devkit8000_uart) = { 55*a91ef4adSAnthoine Bourgeois "serial_omap", 56*a91ef4adSAnthoine Bourgeois &devkit8000_serial 57*a91ef4adSAnthoine Bourgeois }; 58*a91ef4adSAnthoine Bourgeois 59c35d7cf0SFrederik Kriewitz /* 60c35d7cf0SFrederik Kriewitz * Routine: board_init 61c35d7cf0SFrederik Kriewitz * Description: Early hardware init. 62c35d7cf0SFrederik Kriewitz */ 63c35d7cf0SFrederik Kriewitz int board_init(void) 64c35d7cf0SFrederik Kriewitz { 65c35d7cf0SFrederik Kriewitz gpmc_init(); /* in SRAM or SDRAM, finish GPMC */ 66c35d7cf0SFrederik Kriewitz /* board id for Linux */ 67c35d7cf0SFrederik Kriewitz gd->bd->bi_arch_number = MACH_TYPE_DEVKIT8000; 68c35d7cf0SFrederik Kriewitz /* boot param addr */ 69c35d7cf0SFrederik Kriewitz gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100); 70c35d7cf0SFrederik Kriewitz 71c35d7cf0SFrederik Kriewitz return 0; 72c35d7cf0SFrederik Kriewitz } 73c35d7cf0SFrederik Kriewitz 749e70c08bSSimon Schwarz /* Configure GPMC registers for DM9000 */ 759e70c08bSSimon Schwarz static void gpmc_dm9000_config(void) 769e70c08bSSimon Schwarz { 779e70c08bSSimon Schwarz enable_gpmc_cs_config(gpmc_net_config, &gpmc_cfg->cs[6], 789e70c08bSSimon Schwarz CONFIG_DM9000_BASE, GPMC_SIZE_16M); 799e70c08bSSimon Schwarz } 809e70c08bSSimon Schwarz 81c35d7cf0SFrederik Kriewitz /* 82c35d7cf0SFrederik Kriewitz * Routine: misc_init_r 83c35d7cf0SFrederik Kriewitz * Description: Configure board specific parts 84c35d7cf0SFrederik Kriewitz */ 85c35d7cf0SFrederik Kriewitz int misc_init_r(void) 86c35d7cf0SFrederik Kriewitz { 87c35d7cf0SFrederik Kriewitz struct ctrl_id *id_base = (struct ctrl_id *)OMAP34XX_ID_L4_IO_BASE; 88c35d7cf0SFrederik Kriewitz #ifdef CONFIG_DRIVER_DM9000 89c35d7cf0SFrederik Kriewitz uchar enetaddr[6]; 90c35d7cf0SFrederik Kriewitz u32 die_id_0; 91c35d7cf0SFrederik Kriewitz #endif 92c35d7cf0SFrederik Kriewitz 93c35d7cf0SFrederik Kriewitz twl4030_power_init(); 94c35d7cf0SFrederik Kriewitz #ifdef CONFIG_TWL4030_LED 95ead39d7aSGrazvydas Ignotas twl4030_led_init(TWL4030_LED_LEDEN_LEDAON | TWL4030_LED_LEDEN_LEDBON); 96c35d7cf0SFrederik Kriewitz #endif 97c35d7cf0SFrederik Kriewitz 98c35d7cf0SFrederik Kriewitz #ifdef CONFIG_DRIVER_DM9000 99c35d7cf0SFrederik Kriewitz /* Configure GPMC registers for DM9000 */ 10013b178edSThomas Weber enable_gpmc_cs_config(gpmc_net_config, &gpmc_cfg->cs[6], 10113b178edSThomas Weber CONFIG_DM9000_BASE, GPMC_SIZE_16M); 102c35d7cf0SFrederik Kriewitz 103c35d7cf0SFrederik Kriewitz /* Use OMAP DIE_ID as MAC address */ 104c35d7cf0SFrederik Kriewitz if (!eth_getenv_enetaddr("ethaddr", enetaddr)) { 105c35d7cf0SFrederik Kriewitz printf("ethaddr not set, using Die ID\n"); 106c35d7cf0SFrederik Kriewitz die_id_0 = readl(&id_base->die_id_0); 107c35d7cf0SFrederik Kriewitz enetaddr[0] = 0x02; /* locally administered */ 108c35d7cf0SFrederik Kriewitz enetaddr[1] = readl(&id_base->die_id_1) & 0xff; 109c35d7cf0SFrederik Kriewitz enetaddr[2] = (die_id_0 & 0xff000000) >> 24; 110c35d7cf0SFrederik Kriewitz enetaddr[3] = (die_id_0 & 0x00ff0000) >> 16; 111c35d7cf0SFrederik Kriewitz enetaddr[4] = (die_id_0 & 0x0000ff00) >> 8; 112c35d7cf0SFrederik Kriewitz enetaddr[5] = (die_id_0 & 0x000000ff); 113c35d7cf0SFrederik Kriewitz eth_setenv_enetaddr("ethaddr", enetaddr); 114c35d7cf0SFrederik Kriewitz } 115c35d7cf0SFrederik Kriewitz #endif 116c35d7cf0SFrederik Kriewitz 117c35d7cf0SFrederik Kriewitz dieid_num_r(); 118c35d7cf0SFrederik Kriewitz 119c35d7cf0SFrederik Kriewitz return 0; 120c35d7cf0SFrederik Kriewitz } 121c35d7cf0SFrederik Kriewitz 122c35d7cf0SFrederik Kriewitz /* 123c35d7cf0SFrederik Kriewitz * Routine: set_muxconf_regs 124c35d7cf0SFrederik Kriewitz * Description: Setting up the configuration Mux registers specific to the 125c35d7cf0SFrederik Kriewitz * hardware. Many pins need to be moved from protect to primary 126c35d7cf0SFrederik Kriewitz * mode. 127c35d7cf0SFrederik Kriewitz */ 128c35d7cf0SFrederik Kriewitz void set_muxconf_regs(void) 129c35d7cf0SFrederik Kriewitz { 130c35d7cf0SFrederik Kriewitz MUX_DEVKIT8000(); 131c35d7cf0SFrederik Kriewitz } 132c35d7cf0SFrederik Kriewitz 133c9f3cf14SSimon Schwarz #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD) 134f408501dSTom Rini int board_mmc_init(bd_t *bis) 135f408501dSTom Rini { 136e3913f56SNikita Kiryanov return omap_mmc_init(0, 0, 0, -1, -1); 137f408501dSTom Rini } 138f408501dSTom Rini #endif 139f408501dSTom Rini 140aac5450eSPaul Kocialkowski #if defined(CONFIG_GENERIC_MMC) 141aac5450eSPaul Kocialkowski void board_mmc_power_init(void) 142aac5450eSPaul Kocialkowski { 143aac5450eSPaul Kocialkowski twl4030_power_mmc_init(0); 144aac5450eSPaul Kocialkowski } 145aac5450eSPaul Kocialkowski #endif 146aac5450eSPaul Kocialkowski 1473f6a4922SSimon Schwarz #if defined(CONFIG_DRIVER_DM9000) & !defined(CONFIG_SPL_BUILD) 148c35d7cf0SFrederik Kriewitz /* 149c35d7cf0SFrederik Kriewitz * Routine: board_eth_init 150c35d7cf0SFrederik Kriewitz * Description: Setting up the Ethernet hardware. 151c35d7cf0SFrederik Kriewitz */ 152c35d7cf0SFrederik Kriewitz int board_eth_init(bd_t *bis) 153c35d7cf0SFrederik Kriewitz { 154c35d7cf0SFrederik Kriewitz return dm9000_initialize(bis); 155c35d7cf0SFrederik Kriewitz } 156c35d7cf0SFrederik Kriewitz #endif 1579ae0d550STom Rini 1589e70c08bSSimon Schwarz #ifdef CONFIG_SPL_OS_BOOT 1599e70c08bSSimon Schwarz /* 1609e70c08bSSimon Schwarz * Do board specific preperation before SPL 1619e70c08bSSimon Schwarz * Linux boot 1629e70c08bSSimon Schwarz */ 1639e70c08bSSimon Schwarz void spl_board_prepare_for_linux(void) 1649e70c08bSSimon Schwarz { 1659e70c08bSSimon Schwarz gpmc_dm9000_config(); 1669e70c08bSSimon Schwarz } 1679e70c08bSSimon Schwarz 1682d52a9a3SSimon Schwarz /* 1692d52a9a3SSimon Schwarz * devkit8000 specific implementation of spl_start_uboot() 1702d52a9a3SSimon Schwarz * 1712d52a9a3SSimon Schwarz * RETURN 1722d52a9a3SSimon Schwarz * 0 if the button is not pressed 1732d52a9a3SSimon Schwarz * 1 if the button is pressed 1742d52a9a3SSimon Schwarz */ 1752d52a9a3SSimon Schwarz int spl_start_uboot(void) 1762d52a9a3SSimon Schwarz { 1772d52a9a3SSimon Schwarz int val = 0; 17830372965SStefano Babic if (!gpio_request(SPL_OS_BOOT_KEY, "U-Boot key")) { 17930372965SStefano Babic gpio_direction_input(SPL_OS_BOOT_KEY); 18030372965SStefano Babic val = gpio_get_value(SPL_OS_BOOT_KEY); 18130372965SStefano Babic gpio_free(SPL_OS_BOOT_KEY); 1822d52a9a3SSimon Schwarz } 1832d52a9a3SSimon Schwarz return !val; 1842d52a9a3SSimon Schwarz } 1859e70c08bSSimon Schwarz #endif 1869e70c08bSSimon Schwarz 1879ae0d550STom Rini /* 1889ae0d550STom Rini * Routine: get_board_mem_timings 1899ae0d550STom Rini * Description: If we use SPL then there is no x-loader nor config header 1909ae0d550STom Rini * so we have to setup the DDR timings ourself on the first bank. This 1919ae0d550STom Rini * provides the timing values back to the function that configures 1929ae0d550STom Rini * the memory. We have either one or two banks of 128MB DDR. 1939ae0d550STom Rini */ 1948c4445d2SPeter Barada void get_board_mem_timings(struct board_sdrc_timings *timings) 1959ae0d550STom Rini { 1969ae0d550STom Rini /* General SDRC config */ 1978c4445d2SPeter Barada timings->mcfg = MICRON_V_MCFG_165(128 << 20); 1988c4445d2SPeter Barada timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_165MHz; 1999ae0d550STom Rini 2009ae0d550STom Rini /* AC timings */ 2018c4445d2SPeter Barada timings->ctrla = MICRON_V_ACTIMA_165; 2028c4445d2SPeter Barada timings->ctrlb = MICRON_V_ACTIMB_165; 2039ae0d550STom Rini 2048c4445d2SPeter Barada timings->mr = MICRON_V_MR_165; 2059ae0d550STom Rini } 206