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