X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=board%2Fdavinci%2Fcommon%2Fmisc.c;h=fa9dd9fe4d0b830aaf14127ec61cbab1002c9f03;hb=17dd883c5b76bdade0f7a48f2eb02d918a5ebef9;hp=be709bf81e9046c74331911644f6c8a37c5687b7;hpb=f61f1e150c84f5b9347fca79a4bc5f2286c545d2;p=u-boot diff --git a/board/davinci/common/misc.c b/board/davinci/common/misc.c index be709bf81e..fa9dd9fe4d 100644 --- a/board/davinci/common/misc.c +++ b/board/davinci/common/misc.c @@ -1,6 +1,7 @@ /* * 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. @@ -25,29 +26,29 @@ #include #include +#include #include +#include +#include "misc.h" DECLARE_GLOBAL_DATA_PTR; int dram_init(void) { - gd->bd->bi_dram[0].start = PHYS_SDRAM_1; - gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; - - return(0); + /* 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; } -static int dv_get_pllm_output(uint32_t pllm) +void dram_init_banksize(void) { - return (pllm + 1) * (CONFIG_SYS_HZ_CLOCK / 1000000); + gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE; + gd->bd->bi_dram[0].size = gd->ram_size; } -void dv_display_clk_infos(void) -{ - printf("ARM Clock: %dMHz\n", dv_get_pllm_output(REG(PLL1_PLLM)) / 2); - printf("DDR Clock: %dMHz\n", dv_get_pllm_output(REG(PLL2_PLLM)) / - ((REG(PLL2_DIV2) & 0x1f) + 1) / 2); -} +#ifdef CONFIG_DRIVER_TI_EMAC /* Read ethernet MAC address from EEPROM for DVEVM compatible boards. * Returns 1 if found, 0 otherwise. @@ -60,8 +61,8 @@ int dvevm_read_mac_address(uint8_t *buf) (uint8_t *) &buf[0], 6)) goto i2cerr; - /* Check that MAC address is not null. */ - if (memcmp(buf, "\0\0\0\0\0\0", 6) == 0) + /* Check that MAC address is valid. */ + if (!is_valid_ether_addr(buf)) goto err; return 1; /* Found */ @@ -74,53 +75,98 @@ err: return 0; } -/* If there is a MAC address in the environment, and if it is not identical to - * the MAC address in the ROM, then a warning is printed and the MAC address - * from the environment is used. - * +/* * If there is no MAC address in the environment, then it will be initialized - * (silently) from the value in the ROM. + * (silently) from the value in the EEPROM. */ -void dv_configure_mac_address(uint8_t *rom_enetaddr) +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 /* DAVINCI_EMAC */ + +/* + * Change the setting of a pin multiplexer field. + * + * Takes an array of pinmux settings similar to: + * + * struct pinmux_config uart_pins[] = { + * { &davinci_syscfg_regs->pinmux[8], 2, 7 }, + * { &davinci_syscfg_regs->pinmux[9], 2, 0 } + * }; + * + * Stepping through the array, each pinmux[n] register has the given value + * set in the pin mux field specified. + * + * The number of pins in the array must be passed (ARRAY_SIZE can provide + * this value conveniently). + * + * Returns 0 if all field numbers and values are in the correct range, + * else returns -1. + */ +int davinci_configure_pin_mux(const struct pinmux_config *pins, + const int n_pins) { int i; - u_int8_t env_enetaddr[6]; - char *tmp = getenv("ethaddr"); - char *end; - - /* Read Ethernet MAC address from the U-Boot environment. - * If it is not defined, env_enetaddr[] will be cleared. */ - for (i = 0; i < 6; i++) { - env_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0; - if (tmp) - tmp = (*end) ? end+1 : end; + + /* check for invalid pinmux values */ + for (i = 0; i < n_pins; i++) { + if (pins[i].field >= PIN_MUX_NUM_FIELDS || + (pins[i].value & ~PIN_MUX_FIELD_MASK) != 0) + return -1; } - /* Check if ROM and U-Boot environment MAC addresses match. */ - if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6) != 0 && - memcmp(env_enetaddr, rom_enetaddr, 6) != 0) { - printf("Warning: MAC addresses don't match:\n"); - printf(" ROM MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n", - rom_enetaddr[0], rom_enetaddr[1], - rom_enetaddr[2], rom_enetaddr[3], - rom_enetaddr[4], rom_enetaddr[5]); - printf(" \"ethaddr\" value: %02X:%02X:%02X:%02X:%02X:%02X\n", - env_enetaddr[0], env_enetaddr[1], - env_enetaddr[2], env_enetaddr[3], - env_enetaddr[4], env_enetaddr[5]) ; - debug("### Using MAC address from environment\n"); + /* configure the pinmuxes */ + for (i = 0; i < n_pins; i++) { + const int offset = pins[i].field * PIN_MUX_FIELD_SIZE; + const unsigned int value = pins[i].value << offset; + const unsigned int mask = PIN_MUX_FIELD_MASK << offset; + const dv_reg *mux = pins[i].mux; + + writel(value | (readl(mux) & (~mask)), mux); } - if (!tmp) { - char ethaddr[20]; - /* There is no MAC address in the environment, so we initialize - * it from the value in the ROM. */ - sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X", - rom_enetaddr[0], rom_enetaddr[1], - rom_enetaddr[2], rom_enetaddr[3], - rom_enetaddr[4], rom_enetaddr[5]) ; - debug("### Setting environment from ROM MAC address = \"%s\"\n", - ethaddr); - setenv("ethaddr", ethaddr); + return 0; +} + +/* + * Configure multiple pinmux resources. + * + * Takes an pinmux_resource array of pinmux_config and pin counts: + * + * const struct pinmux_resource pinmuxes[] = { + * PINMUX_ITEM(uart_pins), + * PINMUX_ITEM(i2c_pins), + * }; + * + * The number of items in the array must be passed (ARRAY_SIZE can provide + * this value conveniently). + * + * Each item entry is configured in the defined order. If configuration + * of any item fails, -1 is returned and none of the following items are + * configured. On success, 0 is returned. + */ +int davinci_configure_pin_mux_items(const struct pinmux_resource *item, + const int n_items) +{ + int i; + + for (i = 0; i < n_items; i++) { + if (davinci_configure_pin_mux(item[i].pins, + item[i].n_pins) != 0) + return -1; } + + return 0; }