/* * Miscelaneous DaVinci functions. * * Copyright (C) 2009 Nick Thompson, GE Fanuc Ltd, * Copyright (C) 2007 Sergey Kubushyn * Copyright (C) 2008 Lyrtech * Copyright (C) 2004 Texas Instruments. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include DECLARE_GLOBAL_DATA_PTR; #ifndef CONFIG_PRELOADER int dram_init(void) { /* dram_init must store complete ramsize in gd->ram_size */ gd->ram_size = get_ram_size( (volatile void *)CONFIG_SYS_SDRAM_BASE, CONFIG_MAX_RAM_BANK_SIZE); return 0; } void dram_init_banksize(void) { gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE; gd->bd->bi_dram[0].size = gd->ram_size; } #endif #ifdef CONFIG_DRIVER_TI_EMAC /* Read ethernet MAC address from EEPROM for DVEVM compatible boards. * Returns 1 if found, 0 otherwise. */ int dvevm_read_mac_address(uint8_t *buf) { #ifdef CONFIG_SYS_I2C_EEPROM_ADDR /* Read MAC address. */ if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0x7F00, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, (uint8_t *) &buf[0], 6)) goto i2cerr; /* Check that MAC address is valid. */ if (!is_valid_ether_addr(buf)) goto err; return 1; /* Found */ i2cerr: printf("Read from EEPROM @ 0x%02x failed\n", CONFIG_SYS_I2C_EEPROM_ADDR); err: #endif /* CONFIG_SYS_I2C_EEPROM_ADDR */ return 0; } /* Write ethernet MAC address to EEPROM for DVEVM compatible boards. * Returns 1 if successfull, 0 otherwise. */ int dvevm_write_mac_address(char *ethaddr) { #ifdef CONFIG_SYS_I2C_EEPROM_ADDR int i; char *end; u_int8_t env_enetaddr[6]; /* Convert MAC address to numbers */ for (i = 0; i < 6; i++) { env_enetaddr[i] = ethaddr ? simple_strtoul(ethaddr, &end, 16) : 0; if (ethaddr) ethaddr = (*end) ? end+1 : end; } /* Check that MAC address is valid. */ if (!is_valid_ether_addr(env_enetaddr)) goto err; /* Write MAC address. */ if (i2c_write(CONFIG_SYS_I2C_EEPROM_ADDR, 0x7F00, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, (uint8_t *) &env_enetaddr[0], 6)) goto i2cerr; return 1; /* Found */ i2cerr: printf("Write to EEPROM @ 0x%02x failed\n", CONFIG_SYS_I2C_EEPROM_ADDR); err: #endif /* CONFIG_SYS_I2C_EEPROM_ADDR */ return 0; } /* * Set the mii mode as MII or RMII */ #if defined(CONFIG_SOC_DA8XX) void davinci_emac_mii_mode_sel(int mode_sel) { int val; val = readl(&davinci_syscfg_regs->cfgchip3); if (mode_sel == 0) val &= ~(1 << 8); else val |= (1 << 8); writel(val, &davinci_syscfg_regs->cfgchip3); } #endif /* * If there is no MAC address in the environment, then it will be initialized * (silently) from the value in the EEPROM. */ void davinci_sync_env_enetaddr(uint8_t *rom_enetaddr) { uint8_t env_enetaddr[6]; eth_getenv_enetaddr_by_index(0, env_enetaddr); if (!memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) { /* There is no MAC address in the environment, so we initialize * it from the value in the EEPROM. */ debug("### Setting environment from EEPROM MAC address = " "\"%pM\"\n", env_enetaddr); eth_setenv_enetaddr("ethaddr", rom_enetaddr); } } #endif /* CONFIG_DRIVER_TI_EMAC */ #if defined(CONFIG_SOC_DA8XX) #ifndef CONFIG_USE_IRQ void irq_init(void) { /* * Mask all IRQs by clearing the global enable and setting * the enable clear for all the 90 interrupts. */ writel(0, &davinci_aintc_regs->ger); writel(0, &davinci_aintc_regs->hier); writel(0xffffffff, &davinci_aintc_regs->ecr1); writel(0xffffffff, &davinci_aintc_regs->ecr2); writel(0xffffffff, &davinci_aintc_regs->ecr3); } #endif /* * Enable PSC for various peripherals. */ int da8xx_configure_lpsc_items(const struct lpsc_resource *item, const int n_items) { int i; for (i = 0; i < n_items; i++) lpsc_on(item[i].lpsc_no); return 0; } #endif