xref: /openbmc/u-boot/board/ti/am43xx/board.c (revision 6b02d06f)
1 /*
2  * board.c
3  *
4  * Board functions for TI AM43XX based boards
5  *
6  * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
7  *
8  * SPDX-License-Identifier:	GPL-2.0+
9  */
10 
11 #include <common.h>
12 #include <i2c.h>
13 #include <asm/errno.h>
14 #include <spl.h>
15 #include <asm/arch/clock.h>
16 #include <asm/arch/sys_proto.h>
17 #include <asm/arch/mux.h>
18 #include <asm/arch/ddr_defs.h>
19 #include <asm/arch/gpio.h>
20 #include <asm/emif.h>
21 #include "board.h"
22 #include <power/tps65218.h>
23 #include <miiphy.h>
24 #include <cpsw.h>
25 
26 DECLARE_GLOBAL_DATA_PTR;
27 
28 static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
29 
30 /*
31  * Read header information from EEPROM into global structure.
32  */
33 static int read_eeprom(struct am43xx_board_id *header)
34 {
35 	/* Check if baseboard eeprom is available */
36 	if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
37 		printf("Could not probe the EEPROM at 0x%x\n",
38 		       CONFIG_SYS_I2C_EEPROM_ADDR);
39 		return -ENODEV;
40 	}
41 
42 	/* read the eeprom using i2c */
43 	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header,
44 		     sizeof(struct am43xx_board_id))) {
45 		printf("Could not read the EEPROM\n");
46 		return -EIO;
47 	}
48 
49 	if (header->magic != 0xEE3355AA) {
50 		/*
51 		 * read the eeprom using i2c again,
52 		 * but use only a 1 byte address
53 		 */
54 		if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header,
55 			     sizeof(struct am43xx_board_id))) {
56 			printf("Could not read the EEPROM at 0x%x\n",
57 			       CONFIG_SYS_I2C_EEPROM_ADDR);
58 			return -EIO;
59 		}
60 
61 		if (header->magic != 0xEE3355AA) {
62 			printf("Incorrect magic number (0x%x) in EEPROM\n",
63 			       header->magic);
64 			return -EINVAL;
65 		}
66 	}
67 
68 	strncpy(am43xx_board_name, (char *)header->name, sizeof(header->name));
69 	am43xx_board_name[sizeof(header->name)] = 0;
70 
71 	strncpy(am43xx_board_rev, (char *)header->version, sizeof(header->version));
72 	am43xx_board_rev[sizeof(header->version)] = 0;
73 
74 	return 0;
75 }
76 
77 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
78 
79 #define NUM_OPPS	6
80 
81 const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
82 	{	/* 19.2 MHz */
83 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP 50 */
84 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
85 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP 100 */
86 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP 120 */
87 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP TB */
88 		{-1, -1, -1, -1, -1, -1, -1}	/* OPP NT */
89 	},
90 	{	/* 24 MHz */
91 		{300, 23, 1, -1, -1, -1, -1},	/* OPP 50 */
92 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
93 		{600, 23, 1, -1, -1, -1, -1},	/* OPP 100 */
94 		{720, 23, 1, -1, -1, -1, -1},	/* OPP 120 */
95 		{800, 23, 1, -1, -1, -1, -1},	/* OPP TB */
96 		{1000, 23, 1, -1, -1, -1, -1}	/* OPP NT */
97 	},
98 	{	/* 25 MHz */
99 		{300, 24, 1, -1, -1, -1, -1},	/* OPP 50 */
100 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
101 		{600, 24, 1, -1, -1, -1, -1},	/* OPP 100 */
102 		{720, 24, 1, -1, -1, -1, -1},	/* OPP 120 */
103 		{800, 24, 1, -1, -1, -1, -1},	/* OPP TB */
104 		{1000, 24, 1, -1, -1, -1, -1}	/* OPP NT */
105 	},
106 	{	/* 26 MHz */
107 		{300, 25, 1, -1, -1, -1, -1},	/* OPP 50 */
108 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
109 		{600, 25, 1, -1, -1, -1, -1},	/* OPP 100 */
110 		{720, 25, 1, -1, -1, -1, -1},	/* OPP 120 */
111 		{800, 25, 1, -1, -1, -1, -1},	/* OPP TB */
112 		{1000, 25, 1, -1, -1, -1, -1}	/* OPP NT */
113 	},
114 };
115 
116 const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
117 		{-1, -1, -1, -1, -1, -1, -1},	/* 19.2 MHz */
118 		{1000, 23, -1, -1, 10, 8, 4},	/* 24 MHz */
119 		{1000, 24, -1, -1, 10, 8, 4},	/* 25 MHz */
120 		{1000, 25, -1, -1, 10, 8, 4}	/* 26 MHz */
121 };
122 
123 const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
124 		{-1, -1, -1, -1, -1, -1, -1},	/* 19.2 MHz */
125 		{960, 23, 5, -1, -1, -1, -1},	/* 24 MHz */
126 		{960, 24, 5, -1, -1, -1, -1},	/* 25 MHz */
127 		{960, 25, 5, -1, -1, -1, -1}	/* 26 MHz */
128 };
129 
130 const struct dpll_params epos_evm_dpll_ddr = {
131 		266, 24, 1, -1, 1, -1, -1};
132 
133 const struct dpll_params gp_evm_dpll_ddr = {
134 		400, 23, 1, -1, 1, -1, -1};
135 
136 const struct ctrl_ioregs ioregs_lpddr2 = {
137 	.cm0ioctl		= LPDDR2_ADDRCTRL_IOCTRL_VALUE,
138 	.cm1ioctl		= LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
139 	.cm2ioctl		= LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
140 	.dt0ioctl		= LPDDR2_DATA0_IOCTRL_VALUE,
141 	.dt1ioctl		= LPDDR2_DATA0_IOCTRL_VALUE,
142 	.dt2ioctrl		= LPDDR2_DATA0_IOCTRL_VALUE,
143 	.dt3ioctrl		= LPDDR2_DATA0_IOCTRL_VALUE,
144 	.emif_sdram_config_ext	= 0x1,
145 };
146 
147 const struct emif_regs emif_regs_lpddr2 = {
148 	.sdram_config			= 0x808012BA,
149 	.ref_ctrl			= 0x0000040D,
150 	.sdram_tim1			= 0xEA86B411,
151 	.sdram_tim2			= 0x103A094A,
152 	.sdram_tim3			= 0x0F6BA37F,
153 	.read_idle_ctrl			= 0x00050000,
154 	.zq_config			= 0x50074BE4,
155 	.temp_alert_config		= 0x0,
156 	.emif_rd_wr_lvl_rmp_win		= 0x0,
157 	.emif_rd_wr_lvl_rmp_ctl		= 0x0,
158 	.emif_rd_wr_lvl_ctl		= 0x0,
159 	.emif_ddr_phy_ctlr_1		= 0x0E084006,
160 	.emif_rd_wr_exec_thresh		= 0x80000405,
161 	.emif_ddr_ext_phy_ctrl_1	= 0x04010040,
162 	.emif_ddr_ext_phy_ctrl_2	= 0x00500050,
163 	.emif_ddr_ext_phy_ctrl_3	= 0x00500050,
164 	.emif_ddr_ext_phy_ctrl_4	= 0x00500050,
165 	.emif_ddr_ext_phy_ctrl_5	= 0x00500050,
166 	.emif_prio_class_serv_map	= 0x80000001,
167 	.emif_connect_id_serv_1_map	= 0x80000094,
168 	.emif_connect_id_serv_2_map	= 0x00000000,
169 	.emif_cos_config			= 0x000FFFFF
170 };
171 
172 const u32 ext_phy_ctrl_const_base_lpddr2[] = {
173 	0x00500050,
174 	0x00350035,
175 	0x00350035,
176 	0x00350035,
177 	0x00350035,
178 	0x00350035,
179 	0x00000000,
180 	0x00000000,
181 	0x00000000,
182 	0x00000000,
183 	0x00000000,
184 	0x00000000,
185 	0x00000000,
186 	0x00000000,
187 	0x00000000,
188 	0x00000000,
189 	0x00000000,
190 	0x00000000,
191 	0x40001000,
192 	0x08102040
193 };
194 
195 const struct ctrl_ioregs ioregs_ddr3 = {
196 	.cm0ioctl		= DDR3_ADDRCTRL_IOCTRL_VALUE,
197 	.cm1ioctl		= DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
198 	.cm2ioctl		= DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
199 	.dt0ioctl		= DDR3_DATA0_IOCTRL_VALUE,
200 	.dt1ioctl		= DDR3_DATA0_IOCTRL_VALUE,
201 	.dt2ioctrl		= DDR3_DATA0_IOCTRL_VALUE,
202 	.dt3ioctrl		= DDR3_DATA0_IOCTRL_VALUE,
203 	.emif_sdram_config_ext	= 0x0143,
204 };
205 
206 const struct emif_regs ddr3_emif_regs_400Mhz = {
207 	.sdram_config			= 0x638413B2,
208 	.ref_ctrl			= 0x00000C30,
209 	.sdram_tim1			= 0xEAAAD4DB,
210 	.sdram_tim2			= 0x266B7FDA,
211 	.sdram_tim3			= 0x107F8678,
212 	.read_idle_ctrl			= 0x00050000,
213 	.zq_config			= 0x50074BE4,
214 	.temp_alert_config		= 0x0,
215 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
216 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
217 	.emif_ddr_ext_phy_ctrl_2	= 0x00400040,
218 	.emif_ddr_ext_phy_ctrl_3	= 0x00400040,
219 	.emif_ddr_ext_phy_ctrl_4	= 0x00400040,
220 	.emif_ddr_ext_phy_ctrl_5	= 0x00400040,
221 	.emif_rd_wr_lvl_rmp_win		= 0x0,
222 	.emif_rd_wr_lvl_rmp_ctl		= 0x0,
223 	.emif_rd_wr_lvl_ctl		= 0x0,
224 	.emif_rd_wr_exec_thresh		= 0x80000405,
225 	.emif_prio_class_serv_map	= 0x80000001,
226 	.emif_connect_id_serv_1_map	= 0x80000094,
227 	.emif_connect_id_serv_2_map	= 0x00000000,
228 	.emif_cos_config		= 0x000FFFFF
229 };
230 
231 /* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
232 const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
233 	.sdram_config			= 0x638413B2,
234 	.ref_ctrl			= 0x00000C30,
235 	.sdram_tim1			= 0xEAAAD4DB,
236 	.sdram_tim2			= 0x266B7FDA,
237 	.sdram_tim3			= 0x107F8678,
238 	.read_idle_ctrl			= 0x00050000,
239 	.zq_config			= 0x50074BE4,
240 	.temp_alert_config		= 0x0,
241 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
242 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
243 	.emif_ddr_ext_phy_ctrl_2	= 0x00000065,
244 	.emif_ddr_ext_phy_ctrl_3	= 0x00000091,
245 	.emif_ddr_ext_phy_ctrl_4	= 0x000000B5,
246 	.emif_ddr_ext_phy_ctrl_5	= 0x000000E5,
247 	.emif_rd_wr_exec_thresh		= 0x80000405,
248 	.emif_prio_class_serv_map	= 0x80000001,
249 	.emif_connect_id_serv_1_map	= 0x80000094,
250 	.emif_connect_id_serv_2_map	= 0x00000000,
251 	.emif_cos_config		= 0x000FFFFF
252 };
253 
254 /* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
255 const struct emif_regs ddr3_emif_regs_400Mhz_production = {
256 	.sdram_config			= 0x638413B2,
257 	.ref_ctrl			= 0x00000C30,
258 	.sdram_tim1			= 0xEAAAD4DB,
259 	.sdram_tim2			= 0x266B7FDA,
260 	.sdram_tim3			= 0x107F8678,
261 	.read_idle_ctrl			= 0x00050000,
262 	.zq_config			= 0x50074BE4,
263 	.temp_alert_config		= 0x0,
264 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
265 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
266 	.emif_ddr_ext_phy_ctrl_2	= 0x00000066,
267 	.emif_ddr_ext_phy_ctrl_3	= 0x00000091,
268 	.emif_ddr_ext_phy_ctrl_4	= 0x000000B9,
269 	.emif_ddr_ext_phy_ctrl_5	= 0x000000E6,
270 	.emif_rd_wr_exec_thresh		= 0x80000405,
271 	.emif_prio_class_serv_map	= 0x80000001,
272 	.emif_connect_id_serv_1_map	= 0x80000094,
273 	.emif_connect_id_serv_2_map	= 0x00000000,
274 	.emif_cos_config		= 0x000FFFFF
275 };
276 
277 static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
278 	.sdram_config			= 0x638413b2,
279 	.sdram_config2			= 0x00000000,
280 	.ref_ctrl			= 0x00000c30,
281 	.sdram_tim1			= 0xeaaad4db,
282 	.sdram_tim2			= 0x266b7fda,
283 	.sdram_tim3			= 0x107f8678,
284 	.read_idle_ctrl			= 0x00050000,
285 	.zq_config			= 0x50074be4,
286 	.temp_alert_config		= 0x0,
287 	.emif_ddr_phy_ctlr_1		= 0x0e084008,
288 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
289 	.emif_ddr_ext_phy_ctrl_2	= 0x89,
290 	.emif_ddr_ext_phy_ctrl_3	= 0x90,
291 	.emif_ddr_ext_phy_ctrl_4	= 0x8e,
292 	.emif_ddr_ext_phy_ctrl_5	= 0x8d,
293 	.emif_rd_wr_lvl_rmp_win		= 0x0,
294 	.emif_rd_wr_lvl_rmp_ctl		= 0x00000000,
295 	.emif_rd_wr_lvl_ctl		= 0x00000000,
296 	.emif_rd_wr_exec_thresh		= 0x80000000,
297 	.emif_prio_class_serv_map	= 0x80000001,
298 	.emif_connect_id_serv_1_map	= 0x80000094,
299 	.emif_connect_id_serv_2_map	= 0x00000000,
300 	.emif_cos_config		= 0x000FFFFF
301 };
302 
303 const u32 ext_phy_ctrl_const_base_ddr3[] = {
304 	0x00400040,
305 	0x00350035,
306 	0x00350035,
307 	0x00350035,
308 	0x00350035,
309 	0x00350035,
310 	0x00000000,
311 	0x00000000,
312 	0x00000000,
313 	0x00000000,
314 	0x00000000,
315 	0x00340034,
316 	0x00340034,
317 	0x00340034,
318 	0x00340034,
319 	0x00340034,
320 	0x0,
321 	0x0,
322 	0x40000000,
323 	0x08102040
324 };
325 
326 const u32 ext_phy_ctrl_const_base_ddr3_beta[] = {
327 	0x00000000,
328 	0x00000045,
329 	0x00000046,
330 	0x00000048,
331 	0x00000047,
332 	0x00000000,
333 	0x0000004C,
334 	0x00000070,
335 	0x00000085,
336 	0x000000A3,
337 	0x00000000,
338 	0x0000000C,
339 	0x00000030,
340 	0x00000045,
341 	0x00000063,
342 	0x00000000,
343 	0x0,
344 	0x0,
345 	0x40000000,
346 	0x08102040
347 };
348 
349 const u32 ext_phy_ctrl_const_base_ddr3_production[] = {
350 	0x00000000,
351 	0x00000044,
352 	0x00000044,
353 	0x00000046,
354 	0x00000046,
355 	0x00000000,
356 	0x00000059,
357 	0x00000077,
358 	0x00000093,
359 	0x000000A8,
360 	0x00000000,
361 	0x00000019,
362 	0x00000037,
363 	0x00000053,
364 	0x00000068,
365 	0x00000000,
366 	0x0,
367 	0x0,
368 	0x40000000,
369 	0x08102040
370 };
371 
372 static const u32 ext_phy_ctrl_const_base_ddr3_sk[] = {
373 	/* first 5 are taken care by emif_regs */
374 	0x00700070,
375 
376 	0x00350035,
377 	0x00350035,
378 	0x00350035,
379 	0x00350035,
380 	0x00350035,
381 
382 	0x00000000,
383 	0x00000000,
384 	0x00000000,
385 	0x00000000,
386 	0x00000000,
387 
388 	0x00150015,
389 	0x00150015,
390 	0x00150015,
391 	0x00150015,
392 	0x00150015,
393 
394 	0x00800080,
395 	0x00800080,
396 
397 	0x40000000,
398 
399 	0x08102040,
400 
401 	0x00000000,
402 	0x00000000,
403 	0x00000000,
404 	0x00000000,
405 	0x00000000,
406 	0x00000000,
407 	0x00000000,
408 	0x00000000,
409 	0x00000000,
410 	0x00000000,
411 	0x00000000,
412 };
413 
414 void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
415 {
416 	if (board_is_eposevm()) {
417 		*regs = ext_phy_ctrl_const_base_lpddr2;
418 		*size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
419 	} else if (board_is_evm_14_or_later()) {
420 		*regs = ext_phy_ctrl_const_base_ddr3_production;
421 		*size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_production);
422 	} else if (board_is_evm_12_or_later()) {
423 		*regs = ext_phy_ctrl_const_base_ddr3_beta;
424 		*size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_beta);
425 	} else if (board_is_gpevm()) {
426 		*regs = ext_phy_ctrl_const_base_ddr3;
427 		*size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3);
428 	} else if (board_is_sk()) {
429 		*regs = ext_phy_ctrl_const_base_ddr3_sk;
430 		*size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_sk);
431 	}
432 
433 	return;
434 }
435 
436 const struct dpll_params *get_dpll_ddr_params(void)
437 {
438 	if (board_is_eposevm())
439 		return &epos_evm_dpll_ddr;
440 	else if (board_is_gpevm() || board_is_sk())
441 		return &gp_evm_dpll_ddr;
442 
443 	printf(" Board '%s' not supported\n", am43xx_board_name);
444 	return NULL;
445 }
446 
447 /*
448  * get_sys_clk_index : returns the index of the sys_clk read from
449  *			ctrl status register. This value is either
450  *			read from efuse or sysboot pins.
451  */
452 static u32 get_sys_clk_index(void)
453 {
454 	struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
455 	u32 ind = readl(&ctrl->statusreg), src;
456 
457 	src = (ind & CTRL_CRYSTAL_FREQ_SRC_MASK) >> CTRL_CRYSTAL_FREQ_SRC_SHIFT;
458 	if (src == CTRL_CRYSTAL_FREQ_SRC_EFUSE) /* Value read from EFUSE */
459 		return ((ind & CTRL_CRYSTAL_FREQ_SELECTION_MASK) >>
460 			CTRL_CRYSTAL_FREQ_SELECTION_SHIFT);
461 	else /* Value read from SYS BOOT pins */
462 		return ((ind & CTRL_SYSBOOT_15_14_MASK) >>
463 			CTRL_SYSBOOT_15_14_SHIFT);
464 }
465 
466 /*
467  * get_opp_offset:
468  * Returns the index for safest OPP of the device to boot.
469  * max_off:	Index of the MAX OPP in DEV ATTRIBUTE register.
470  * min_off:	Index of the MIN OPP in DEV ATTRIBUTE register.
471  * This data is read from dev_attribute register which is e-fused.
472  * A'1' in bit indicates OPP disabled and not available, a '0' indicates
473  * OPP available. Lowest OPP starts with min_off. So returning the
474  * bit with rightmost '0'.
475  */
476 static int get_opp_offset(int max_off, int min_off)
477 {
478 	struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
479 	int opp, offset, i;
480 
481 	/* Bits 0:11 are defined to be the MPU_MAX_FREQ */
482 	opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
483 
484 	for (i = max_off; i >= min_off; i--) {
485 		offset = opp & (1 << i);
486 		if (!offset)
487 			return i;
488 	}
489 
490 	return min_off;
491 }
492 
493 const struct dpll_params *get_dpll_mpu_params(void)
494 {
495 	int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
496 	u32 ind = get_sys_clk_index();
497 
498 	return &dpll_mpu[ind][opp];
499 }
500 
501 const struct dpll_params *get_dpll_core_params(void)
502 {
503 	int ind = get_sys_clk_index();
504 
505 	return &dpll_core[ind];
506 }
507 
508 const struct dpll_params *get_dpll_per_params(void)
509 {
510 	int ind = get_sys_clk_index();
511 
512 	return &dpll_per[ind];
513 }
514 
515 void scale_vcores(void)
516 {
517 	const struct dpll_params *mpu_params;
518 	int mpu_vdd;
519 	struct am43xx_board_id header;
520 
521 	enable_i2c0_pin_mux();
522 	i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
523 	if (read_eeprom(&header) < 0)
524 		puts("Could not get board ID.\n");
525 
526 	/* Get the frequency */
527 	mpu_params = get_dpll_mpu_params();
528 
529 	if (i2c_probe(TPS65218_CHIP_PM))
530 		return;
531 
532 	if (mpu_params->m == 1000) {
533 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
534 	} else if (mpu_params->m == 600) {
535 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
536 	} else {
537 		puts("Unknown MPU clock, not scaling\n");
538 		return;
539 	}
540 
541 	/* Set DCDC1 (CORE) voltage to 1.1V */
542 	if (tps65218_voltage_update(TPS65218_DCDC1,
543 				    TPS65218_DCDC_VOLT_SEL_1100MV)) {
544 		puts("tps65218_voltage_update failure\n");
545 		return;
546 	}
547 
548 	/* Set DCDC2 (MPU) voltage */
549 	if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
550 		puts("tps65218_voltage_update failure\n");
551 		return;
552 	}
553 }
554 
555 void set_uart_mux_conf(void)
556 {
557 	enable_uart0_pin_mux();
558 }
559 
560 void set_mux_conf_regs(void)
561 {
562 	enable_board_pin_mux();
563 }
564 
565 static void enable_vtt_regulator(void)
566 {
567 	u32 temp;
568 
569 	/* enable module */
570 	writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
571 
572 	/* enable output for GPIO5_7 */
573 	writel(GPIO_SETDATAOUT(7),
574 	       AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
575 	temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
576 	temp = temp & ~(GPIO_OE_ENABLE(7));
577 	writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
578 }
579 
580 void sdram_init(void)
581 {
582 	/*
583 	 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
584 	 * GP EMV has 1GB DDR3 connected to EMIF
585 	 * along with VTT regulator.
586 	 */
587 	if (board_is_eposevm()) {
588 		config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
589 	} else if (board_is_evm_14_or_later()) {
590 		enable_vtt_regulator();
591 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
592 			   &ddr3_emif_regs_400Mhz_production, 0);
593 	} else if (board_is_evm_12_or_later()) {
594 		enable_vtt_regulator();
595 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
596 			   &ddr3_emif_regs_400Mhz_beta, 0);
597 	} else if (board_is_gpevm()) {
598 		enable_vtt_regulator();
599 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
600 			   &ddr3_emif_regs_400Mhz, 0);
601 	} else if (board_is_sk()) {
602 		config_ddr(400, &ioregs_ddr3, NULL, NULL,
603 			   &ddr3_sk_emif_regs_400Mhz, 0);
604 	}
605 }
606 #endif
607 
608 int board_init(void)
609 {
610 	struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
611 	u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
612 	    modena_init0_bw_integer, modena_init0_watermark_0;
613 
614 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
615 
616 	/* Clear all important bits for DSS errata that may need to be tweaked*/
617 	mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
618 	                   MREQPRIO_0_SAB_INIT0_MASK;
619 
620 	mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
621 
622 	modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
623 	                                   BW_LIMITER_BW_FRAC_MASK;
624 
625 	modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
626 	                                BW_LIMITER_BW_INT_MASK;
627 
628 	modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
629 	                                 BW_LIMITER_BW_WATERMARK_MASK;
630 
631 	/* Setting MReq Priority of the DSS*/
632 	mreqprio_0 |= 0x77;
633 
634 	/*
635 	 * Set L3 Fast Configuration Register
636 	 * Limiting bandwith for ARM core to 700 MBPS
637 	 */
638 	modena_init0_bw_fractional |= 0x10;
639 	modena_init0_bw_integer |= 0x3;
640 
641 	writel(mreqprio_0, &cdev->mreqprio_0);
642 	writel(mreqprio_1, &cdev->mreqprio_1);
643 
644 	writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
645 	writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
646 	writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
647 
648 	return 0;
649 }
650 
651 #ifdef CONFIG_BOARD_LATE_INIT
652 int board_late_init(void)
653 {
654 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
655 	char safe_string[HDR_NAME_LEN + 1];
656 	struct am43xx_board_id header;
657 
658 	if (read_eeprom(&header) < 0)
659 		puts("Could not get board ID.\n");
660 
661 	/* Now set variables based on the header. */
662 	strncpy(safe_string, (char *)header.name, sizeof(header.name));
663 	safe_string[sizeof(header.name)] = 0;
664 	setenv("board_name", safe_string);
665 
666 	strncpy(safe_string, (char *)header.version, sizeof(header.version));
667 	safe_string[sizeof(header.version)] = 0;
668 	setenv("board_rev", safe_string);
669 #endif
670 	return 0;
671 }
672 #endif
673 
674 #ifdef CONFIG_DRIVER_TI_CPSW
675 
676 static void cpsw_control(int enabled)
677 {
678 	/* Additional controls can be added here */
679 	return;
680 }
681 
682 static struct cpsw_slave_data cpsw_slaves[] = {
683 	{
684 		.slave_reg_ofs	= 0x208,
685 		.sliver_reg_ofs	= 0xd80,
686 		.phy_addr	= 16,
687 	},
688 	{
689 		.slave_reg_ofs	= 0x308,
690 		.sliver_reg_ofs	= 0xdc0,
691 		.phy_addr	= 1,
692 	},
693 };
694 
695 static struct cpsw_platform_data cpsw_data = {
696 	.mdio_base		= CPSW_MDIO_BASE,
697 	.cpsw_base		= CPSW_BASE,
698 	.mdio_div		= 0xff,
699 	.channels		= 8,
700 	.cpdma_reg_ofs		= 0x800,
701 	.slaves			= 1,
702 	.slave_data		= cpsw_slaves,
703 	.ale_reg_ofs		= 0xd00,
704 	.ale_entries		= 1024,
705 	.host_port_reg_ofs	= 0x108,
706 	.hw_stats_reg_ofs	= 0x900,
707 	.bd_ram_ofs		= 0x2000,
708 	.mac_control		= (1 << 5),
709 	.control		= cpsw_control,
710 	.host_port_num		= 0,
711 	.version		= CPSW_CTRL_VERSION_2,
712 };
713 
714 int board_eth_init(bd_t *bis)
715 {
716 	int rv;
717 	uint8_t mac_addr[6];
718 	uint32_t mac_hi, mac_lo;
719 
720 	/* try reading mac address from efuse */
721 	mac_lo = readl(&cdev->macid0l);
722 	mac_hi = readl(&cdev->macid0h);
723 	mac_addr[0] = mac_hi & 0xFF;
724 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
725 	mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
726 	mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
727 	mac_addr[4] = mac_lo & 0xFF;
728 	mac_addr[5] = (mac_lo & 0xFF00) >> 8;
729 
730 	if (!getenv("ethaddr")) {
731 		puts("<ethaddr> not set. Validating first E-fuse MAC\n");
732 		if (is_valid_ether_addr(mac_addr))
733 			eth_setenv_enetaddr("ethaddr", mac_addr);
734 	}
735 
736 	mac_lo = readl(&cdev->macid1l);
737 	mac_hi = readl(&cdev->macid1h);
738 	mac_addr[0] = mac_hi & 0xFF;
739 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
740 	mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
741 	mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
742 	mac_addr[4] = mac_lo & 0xFF;
743 	mac_addr[5] = (mac_lo & 0xFF00) >> 8;
744 
745 	if (!getenv("eth1addr")) {
746 		if (is_valid_ether_addr(mac_addr))
747 			eth_setenv_enetaddr("eth1addr", mac_addr);
748 	}
749 
750 	if (board_is_eposevm()) {
751 		writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
752 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
753 		cpsw_slaves[0].phy_addr = 16;
754 	} else if (board_is_sk()) {
755 		writel(RGMII_MODE_ENABLE, &cdev->miisel);
756 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
757 		cpsw_slaves[0].phy_addr = 4;
758 		cpsw_slaves[1].phy_addr = 5;
759 	} else {
760 		writel(RGMII_MODE_ENABLE, &cdev->miisel);
761 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
762 		cpsw_slaves[0].phy_addr = 0;
763 	}
764 
765 	rv = cpsw_register(&cpsw_data);
766 	if (rv < 0)
767 		printf("Error %d registering CPSW switch\n", rv);
768 
769 	return rv;
770 }
771 #endif
772