]>
Commit | Line | Data |
---|---|---|
264bbdd1 HV |
1 | /* |
2 | * Miscelaneous DaVinci functions. | |
3 | * | |
ca8480d4 | 4 | * Copyright (C) 2009 Nick Thompson, GE Fanuc Ltd, <nick.thompson@gefanuc.com> |
264bbdd1 HV |
5 | * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> |
6 | * Copyright (C) 2008 Lyrtech <www.lyrtech.com> | |
7 | * Copyright (C) 2004 Texas Instruments. | |
8 | * | |
9 | * See file CREDITS for list of people who contributed to this | |
10 | * project. | |
11 | * | |
12 | * This program is free software; you can redistribute it and/or modify | |
13 | * it under the terms of the GNU General Public License as published by | |
14 | * the Free Software Foundation; either version 2 of the License, or | |
15 | * (at your option) any later version. | |
16 | * | |
17 | * This program is distributed in the hope that it will be useful, | |
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 | * GNU General Public License for more details. | |
21 | * | |
22 | * You should have received a copy of the GNU General Public License | |
23 | * along with this program; if not, write to the Free Software | |
24 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
25 | */ | |
26 | ||
27 | #include <common.h> | |
28 | #include <i2c.h> | |
641e0925 | 29 | #include <net.h> |
264bbdd1 | 30 | #include <asm/arch/hardware.h> |
ca8480d4 NT |
31 | #include <asm/io.h> |
32 | #include "misc.h" | |
7a4f511b | 33 | |
264bbdd1 HV |
34 | DECLARE_GLOBAL_DATA_PTR; |
35 | ||
97003756 BG |
36 | int dram_init(void) |
37 | { | |
38 | /* dram_init must store complete ramsize in gd->ram_size */ | |
39 | gd->ram_size = get_ram_size( | |
40 | (volatile void *)CONFIG_SYS_SDRAM_BASE, | |
41 | CONFIG_MAX_RAM_BANK_SIZE); | |
42 | return 0; | |
43 | } | |
44 | ||
45 | void dram_init_banksize(void) | |
46 | { | |
47 | gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE; | |
48 | gd->bd->bi_dram[0].size = gd->ram_size; | |
49 | } | |
264bbdd1 | 50 | |
641e0925 DB |
51 | #ifdef CONFIG_DRIVER_TI_EMAC |
52 | ||
264bbdd1 HV |
53 | /* Read ethernet MAC address from EEPROM for DVEVM compatible boards. |
54 | * Returns 1 if found, 0 otherwise. | |
55 | */ | |
56 | int dvevm_read_mac_address(uint8_t *buf) | |
57 | { | |
6d0f6bcf | 58 | #ifdef CONFIG_SYS_I2C_EEPROM_ADDR |
264bbdd1 | 59 | /* Read MAC address. */ |
6d0f6bcf | 60 | if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0x7F00, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, |
264bbdd1 HV |
61 | (uint8_t *) &buf[0], 6)) |
62 | goto i2cerr; | |
63 | ||
641e0925 DB |
64 | /* Check that MAC address is valid. */ |
65 | if (!is_valid_ether_addr(buf)) | |
264bbdd1 HV |
66 | goto err; |
67 | ||
68 | return 1; /* Found */ | |
69 | ||
70 | i2cerr: | |
6d0f6bcf | 71 | printf("Read from EEPROM @ 0x%02x failed\n", CONFIG_SYS_I2C_EEPROM_ADDR); |
264bbdd1 | 72 | err: |
6d0f6bcf | 73 | #endif /* CONFIG_SYS_I2C_EEPROM_ADDR */ |
264bbdd1 HV |
74 | |
75 | return 0; | |
76 | } | |
77 | ||
7b37a27e | 78 | /* |
264bbdd1 | 79 | * If there is no MAC address in the environment, then it will be initialized |
641e0925 | 80 | * (silently) from the value in the EEPROM. |
264bbdd1 | 81 | */ |
7b37a27e | 82 | void davinci_sync_env_enetaddr(uint8_t *rom_enetaddr) |
264bbdd1 | 83 | { |
7b37a27e | 84 | uint8_t env_enetaddr[6]; |
264bbdd1 | 85 | |
7b37a27e BG |
86 | eth_getenv_enetaddr_by_index(0, env_enetaddr); |
87 | if (!memcmp(env_enetaddr, "\0\0\0\0\0\0", 6)) { | |
264bbdd1 | 88 | /* There is no MAC address in the environment, so we initialize |
641e0925 | 89 | * it from the value in the EEPROM. */ |
7b37a27e BG |
90 | debug("### Setting environment from EEPROM MAC address = " |
91 | "\"%pM\"\n", | |
92 | env_enetaddr); | |
93 | eth_setenv_enetaddr("ethaddr", rom_enetaddr); | |
264bbdd1 HV |
94 | } |
95 | } | |
641e0925 DB |
96 | |
97 | #endif /* DAVINCI_EMAC */ | |
ca8480d4 NT |
98 | |
99 | /* | |
100 | * Change the setting of a pin multiplexer field. | |
101 | * | |
102 | * Takes an array of pinmux settings similar to: | |
103 | * | |
104 | * struct pinmux_config uart_pins[] = { | |
105 | * { &davinci_syscfg_regs->pinmux[8], 2, 7 }, | |
106 | * { &davinci_syscfg_regs->pinmux[9], 2, 0 } | |
107 | * }; | |
108 | * | |
109 | * Stepping through the array, each pinmux[n] register has the given value | |
110 | * set in the pin mux field specified. | |
111 | * | |
112 | * The number of pins in the array must be passed (ARRAY_SIZE can provide | |
113 | * this value conveniently). | |
114 | * | |
115 | * Returns 0 if all field numbers and values are in the correct range, | |
116 | * else returns -1. | |
117 | */ | |
118 | int davinci_configure_pin_mux(const struct pinmux_config *pins, | |
119 | const int n_pins) | |
120 | { | |
121 | int i; | |
122 | ||
123 | /* check for invalid pinmux values */ | |
124 | for (i = 0; i < n_pins; i++) { | |
125 | if (pins[i].field >= PIN_MUX_NUM_FIELDS || | |
126 | (pins[i].value & ~PIN_MUX_FIELD_MASK) != 0) | |
127 | return -1; | |
128 | } | |
129 | ||
130 | /* configure the pinmuxes */ | |
131 | for (i = 0; i < n_pins; i++) { | |
132 | const int offset = pins[i].field * PIN_MUX_FIELD_SIZE; | |
133 | const unsigned int value = pins[i].value << offset; | |
134 | const unsigned int mask = PIN_MUX_FIELD_MASK << offset; | |
135 | const dv_reg *mux = pins[i].mux; | |
136 | ||
137 | writel(value | (readl(mux) & (~mask)), mux); | |
138 | } | |
139 | ||
140 | return 0; | |
141 | } | |
90110e0e NT |
142 | |
143 | /* | |
144 | * Configure multiple pinmux resources. | |
145 | * | |
146 | * Takes an pinmux_resource array of pinmux_config and pin counts: | |
147 | * | |
148 | * const struct pinmux_resource pinmuxes[] = { | |
149 | * PINMUX_ITEM(uart_pins), | |
150 | * PINMUX_ITEM(i2c_pins), | |
151 | * }; | |
152 | * | |
153 | * The number of items in the array must be passed (ARRAY_SIZE can provide | |
154 | * this value conveniently). | |
155 | * | |
156 | * Each item entry is configured in the defined order. If configuration | |
157 | * of any item fails, -1 is returned and none of the following items are | |
158 | * configured. On success, 0 is returned. | |
159 | */ | |
160 | int davinci_configure_pin_mux_items(const struct pinmux_resource *item, | |
161 | const int n_items) | |
162 | { | |
163 | int i; | |
164 | ||
165 | for (i = 0; i < n_items; i++) { | |
166 | if (davinci_configure_pin_mux(item[i].pins, | |
167 | item[i].n_pins) != 0) | |
168 | return -1; | |
169 | } | |
170 | ||
171 | return 0; | |
172 | } |