xref: /openbmc/u-boot/board/ti/am57xx/board.c (revision 2399e401)
1 /*
2  * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
3  *
4  * Author: Felipe Balbi <balbi@ti.com>
5  *
6  * Based on board/ti/dra7xx/evm.c
7  *
8  * SPDX-License-Identifier:	GPL-2.0+
9  */
10 
11 #include <common.h>
12 #include <palmas.h>
13 #include <sata.h>
14 #include <usb.h>
15 #include <asm/omap_common.h>
16 #include <asm/omap_sec_common.h>
17 #include <asm/emif.h>
18 #include <asm/gpio.h>
19 #include <asm/arch/gpio.h>
20 #include <asm/arch/clock.h>
21 #include <asm/arch/dra7xx_iodelay.h>
22 #include <asm/arch/sys_proto.h>
23 #include <asm/arch/mmc_host_def.h>
24 #include <asm/arch/sata.h>
25 #include <asm/arch/gpio.h>
26 #include <asm/arch/omap.h>
27 #include <environment.h>
28 #include <usb.h>
29 #include <linux/usb/gadget.h>
30 #include <dwc3-uboot.h>
31 #include <dwc3-omap-uboot.h>
32 #include <ti-usb-phy-uboot.h>
33 
34 #include "../common/board_detect.h"
35 #include "mux_data.h"
36 
37 #define board_is_x15()		board_ti_is("BBRDX15_")
38 #define board_is_x15_revb1()	(board_ti_is("BBRDX15_") && \
39 				 (strncmp("B.10", board_ti_get_rev(), 3) <= 0))
40 #define board_is_am572x_evm()	board_ti_is("AM572PM_")
41 #define board_is_am572x_evm_reva3()	\
42 				(board_ti_is("AM572PM_") && \
43 				 (strncmp("A.30", board_ti_get_rev(), 3) <= 0))
44 #define board_is_am572x_idk()	board_ti_is("AM572IDK")
45 #define board_is_am571x_idk()	board_ti_is("AM571IDK")
46 
47 #ifdef CONFIG_DRIVER_TI_CPSW
48 #include <cpsw.h>
49 #endif
50 
51 DECLARE_GLOBAL_DATA_PTR;
52 
53 #define GPIO_ETH_LCD		GPIO_TO_PIN(2, 22)
54 /* GPIO 7_11 */
55 #define GPIO_DDR_VTT_EN 203
56 
57 /* Touch screen controller to identify the LCD */
58 #define OSD_TS_FT_BUS_ADDRESS	0
59 #define OSD_TS_FT_CHIP_ADDRESS	0x38
60 #define OSD_TS_FT_REG_ID	0xA3
61 /*
62  * Touchscreen IDs for various OSD panels
63  * Ref: http://www.osddisplays.com/TI/OSD101T2587-53TS_A.1.pdf
64  */
65 /* Used on newer osd101t2587 Panels */
66 #define OSD_TS_FT_ID_5x46	0x54
67 /* Used on older osd101t2045 Panels */
68 #define OSD_TS_FT_ID_5606	0x08
69 
70 #define SYSINFO_BOARD_NAME_MAX_LEN	45
71 
72 #define TPS65903X_PRIMARY_SECONDARY_PAD2	0xFB
73 #define TPS65903X_PAD2_POWERHOLD_MASK		0x20
74 
75 const struct omap_sysinfo sysinfo = {
76 	"Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n"
77 };
78 
79 static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = {
80 	.dmm_lisa_map_3 = 0x80740300,
81 	.is_ma_present  = 0x1
82 };
83 
84 static const struct dmm_lisa_map_regs am571x_idk_lisa_regs = {
85 	.dmm_lisa_map_3 = 0x80640100,
86 	.is_ma_present  = 0x1
87 };
88 
89 void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
90 {
91 	if (board_is_am571x_idk())
92 		*dmm_lisa_regs = &am571x_idk_lisa_regs;
93 	else
94 		*dmm_lisa_regs = &beagle_x15_lisa_regs;
95 }
96 
97 static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
98 	.sdram_config_init		= 0x61851b32,
99 	.sdram_config			= 0x61851b32,
100 	.sdram_config2			= 0x08000000,
101 	.ref_ctrl			= 0x000040F1,
102 	.ref_ctrl_final			= 0x00001035,
103 	.sdram_tim1			= 0xcccf36ab,
104 	.sdram_tim2			= 0x308f7fda,
105 	.sdram_tim3			= 0x409f88a8,
106 	.read_idle_ctrl			= 0x00050000,
107 	.zq_config			= 0x5007190b,
108 	.temp_alert_config		= 0x00000000,
109 	.emif_ddr_phy_ctlr_1_init 	= 0x0024400b,
110 	.emif_ddr_phy_ctlr_1		= 0x0e24400b,
111 	.emif_ddr_ext_phy_ctrl_1 	= 0x10040100,
112 	.emif_ddr_ext_phy_ctrl_2 	= 0x00910091,
113 	.emif_ddr_ext_phy_ctrl_3 	= 0x00950095,
114 	.emif_ddr_ext_phy_ctrl_4 	= 0x009b009b,
115 	.emif_ddr_ext_phy_ctrl_5 	= 0x009e009e,
116 	.emif_rd_wr_lvl_rmp_win		= 0x00000000,
117 	.emif_rd_wr_lvl_rmp_ctl		= 0x80000000,
118 	.emif_rd_wr_lvl_ctl		= 0x00000000,
119 	.emif_rd_wr_exec_thresh		= 0x00000305
120 };
121 
122 /* Ext phy ctrl regs 1-35 */
123 static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
124 	0x10040100,
125 	0x00910091,
126 	0x00950095,
127 	0x009B009B,
128 	0x009E009E,
129 	0x00980098,
130 	0x00340034,
131 	0x00350035,
132 	0x00340034,
133 	0x00310031,
134 	0x00340034,
135 	0x007F007F,
136 	0x007F007F,
137 	0x007F007F,
138 	0x007F007F,
139 	0x007F007F,
140 	0x00480048,
141 	0x004A004A,
142 	0x00520052,
143 	0x00550055,
144 	0x00500050,
145 	0x00000000,
146 	0x00600020,
147 	0x40011080,
148 	0x08102040,
149 	0x0,
150 	0x0,
151 	0x0,
152 	0x0,
153 	0x0,
154 	0x0,
155 	0x0,
156 	0x0,
157 	0x0,
158 	0x0
159 };
160 
161 static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
162 	.sdram_config_init		= 0x61851b32,
163 	.sdram_config			= 0x61851b32,
164 	.sdram_config2			= 0x08000000,
165 	.ref_ctrl			= 0x000040F1,
166 	.ref_ctrl_final			= 0x00001035,
167 	.sdram_tim1			= 0xcccf36b3,
168 	.sdram_tim2			= 0x308f7fda,
169 	.sdram_tim3			= 0x407f88a8,
170 	.read_idle_ctrl			= 0x00050000,
171 	.zq_config			= 0x5007190b,
172 	.temp_alert_config		= 0x00000000,
173 	.emif_ddr_phy_ctlr_1_init 	= 0x0024400b,
174 	.emif_ddr_phy_ctlr_1		= 0x0e24400b,
175 	.emif_ddr_ext_phy_ctrl_1 	= 0x10040100,
176 	.emif_ddr_ext_phy_ctrl_2 	= 0x00910091,
177 	.emif_ddr_ext_phy_ctrl_3 	= 0x00950095,
178 	.emif_ddr_ext_phy_ctrl_4 	= 0x009b009b,
179 	.emif_ddr_ext_phy_ctrl_5 	= 0x009e009e,
180 	.emif_rd_wr_lvl_rmp_win		= 0x00000000,
181 	.emif_rd_wr_lvl_rmp_ctl		= 0x80000000,
182 	.emif_rd_wr_lvl_ctl		= 0x00000000,
183 	.emif_rd_wr_exec_thresh		= 0x00000305
184 };
185 
186 static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
187 	0x10040100,
188 	0x00910091,
189 	0x00950095,
190 	0x009B009B,
191 	0x009E009E,
192 	0x00980098,
193 	0x00340034,
194 	0x00350035,
195 	0x00340034,
196 	0x00310031,
197 	0x00340034,
198 	0x007F007F,
199 	0x007F007F,
200 	0x007F007F,
201 	0x007F007F,
202 	0x007F007F,
203 	0x00480048,
204 	0x004A004A,
205 	0x00520052,
206 	0x00550055,
207 	0x00500050,
208 	0x00000000,
209 	0x00600020,
210 	0x40011080,
211 	0x08102040,
212 	0x0,
213 	0x0,
214 	0x0,
215 	0x0,
216 	0x0,
217 	0x0,
218 	0x0,
219 	0x0,
220 	0x0,
221 	0x0
222 };
223 
224 void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
225 {
226 	switch (emif_nr) {
227 	case 1:
228 		*regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
229 		break;
230 	case 2:
231 		*regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs;
232 		break;
233 	}
234 }
235 
236 void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size)
237 {
238 	switch (emif_nr) {
239 	case 1:
240 		*regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs;
241 		*size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs);
242 		break;
243 	case 2:
244 		*regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs;
245 		*size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs);
246 		break;
247 	}
248 }
249 
250 struct vcores_data beagle_x15_volts = {
251 	.mpu.value[OPP_NOM]	= VDD_MPU_DRA7_NOM,
252 	.mpu.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_MPU_NOM,
253 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
254 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
255 	.mpu.pmic		= &tps659038,
256 	.mpu.abb_tx_done_mask	= OMAP_ABB_MPU_TXDONE_MASK,
257 
258 	.eve.value[OPP_NOM]	= VDD_EVE_DRA7_NOM,
259 	.eve.value[OPP_OD]	= VDD_EVE_DRA7_OD,
260 	.eve.value[OPP_HIGH]	= VDD_EVE_DRA7_HIGH,
261 	.eve.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_DSPEVE_NOM,
262 	.eve.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_DSPEVE_OD,
263 	.eve.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
264 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
265 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
266 	.eve.pmic		= &tps659038,
267 	.eve.abb_tx_done_mask	= OMAP_ABB_EVE_TXDONE_MASK,
268 
269 	.gpu.value[OPP_NOM]	= VDD_GPU_DRA7_NOM,
270 	.gpu.value[OPP_OD]	= VDD_GPU_DRA7_OD,
271 	.gpu.value[OPP_HIGH]	= VDD_GPU_DRA7_HIGH,
272 	.gpu.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_GPU_NOM,
273 	.gpu.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_GPU_OD,
274 	.gpu.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_GPU_HIGH,
275 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
276 	.gpu.addr		= TPS659038_REG_ADDR_SMPS45,
277 	.gpu.pmic		= &tps659038,
278 	.gpu.abb_tx_done_mask	= OMAP_ABB_GPU_TXDONE_MASK,
279 
280 	.core.value[OPP_NOM]	= VDD_CORE_DRA7_NOM,
281 	.core.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_CORE_NOM,
282 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
283 	.core.addr		= TPS659038_REG_ADDR_SMPS6,
284 	.core.pmic		= &tps659038,
285 
286 	.iva.value[OPP_NOM]	= VDD_IVA_DRA7_NOM,
287 	.iva.value[OPP_OD]	= VDD_IVA_DRA7_OD,
288 	.iva.value[OPP_HIGH]	= VDD_IVA_DRA7_HIGH,
289 	.iva.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_IVA_NOM,
290 	.iva.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_IVA_OD,
291 	.iva.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_IVA_HIGH,
292 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
293 	.iva.addr		= TPS659038_REG_ADDR_SMPS45,
294 	.iva.pmic		= &tps659038,
295 	.iva.abb_tx_done_mask	= OMAP_ABB_IVA_TXDONE_MASK,
296 };
297 
298 struct vcores_data am572x_idk_volts = {
299 	.mpu.value[OPP_NOM]	= VDD_MPU_DRA7_NOM,
300 	.mpu.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_MPU_NOM,
301 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
302 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
303 	.mpu.pmic		= &tps659038,
304 	.mpu.abb_tx_done_mask	= OMAP_ABB_MPU_TXDONE_MASK,
305 
306 	.eve.value[OPP_NOM]	= VDD_EVE_DRA7_NOM,
307 	.eve.value[OPP_OD]	= VDD_EVE_DRA7_OD,
308 	.eve.value[OPP_HIGH]	= VDD_EVE_DRA7_HIGH,
309 	.eve.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_DSPEVE_NOM,
310 	.eve.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_DSPEVE_OD,
311 	.eve.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
312 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
313 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
314 	.eve.pmic		= &tps659038,
315 	.eve.abb_tx_done_mask	= OMAP_ABB_EVE_TXDONE_MASK,
316 
317 	.gpu.value[OPP_NOM]	= VDD_GPU_DRA7_NOM,
318 	.gpu.value[OPP_OD]	= VDD_GPU_DRA7_OD,
319 	.gpu.value[OPP_HIGH]	= VDD_GPU_DRA7_HIGH,
320 	.gpu.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_GPU_NOM,
321 	.gpu.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_GPU_OD,
322 	.gpu.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_GPU_HIGH,
323 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
324 	.gpu.addr		= TPS659038_REG_ADDR_SMPS6,
325 	.gpu.pmic		= &tps659038,
326 	.gpu.abb_tx_done_mask	= OMAP_ABB_GPU_TXDONE_MASK,
327 
328 	.core.value[OPP_NOM]	= VDD_CORE_DRA7_NOM,
329 	.core.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_CORE_NOM,
330 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
331 	.core.addr		= TPS659038_REG_ADDR_SMPS7,
332 	.core.pmic		= &tps659038,
333 
334 	.iva.value[OPP_NOM]	= VDD_IVA_DRA7_NOM,
335 	.iva.value[OPP_OD]	= VDD_IVA_DRA7_OD,
336 	.iva.value[OPP_HIGH]	= VDD_IVA_DRA7_HIGH,
337 	.iva.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_IVA_NOM,
338 	.iva.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_IVA_OD,
339 	.iva.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_IVA_HIGH,
340 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
341 	.iva.addr		= TPS659038_REG_ADDR_SMPS8,
342 	.iva.pmic		= &tps659038,
343 	.iva.abb_tx_done_mask	= OMAP_ABB_IVA_TXDONE_MASK,
344 };
345 
346 int get_voltrail_opp(int rail_offset)
347 {
348 	int opp;
349 
350 	switch (rail_offset) {
351 	case VOLT_MPU:
352 		opp = DRA7_MPU_OPP;
353 		break;
354 	case VOLT_CORE:
355 		opp = DRA7_CORE_OPP;
356 		break;
357 	case VOLT_GPU:
358 		opp = DRA7_GPU_OPP;
359 		break;
360 	case VOLT_EVE:
361 		opp = DRA7_DSPEVE_OPP;
362 		break;
363 	case VOLT_IVA:
364 		opp = DRA7_IVA_OPP;
365 		break;
366 	default:
367 		opp = OPP_NOM;
368 	}
369 
370 	return opp;
371 }
372 
373 
374 #ifdef CONFIG_SPL_BUILD
375 /* No env to setup for SPL */
376 static inline void setup_board_eeprom_env(void) { }
377 
378 /* Override function to read eeprom information */
379 void do_board_detect(void)
380 {
381 	int rc;
382 
383 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
384 				  CONFIG_EEPROM_CHIP_ADDRESS);
385 	if (rc)
386 		printf("ti_i2c_eeprom_init failed %d\n", rc);
387 }
388 
389 #else	/* CONFIG_SPL_BUILD */
390 
391 /* Override function to read eeprom information: actual i2c read done by SPL*/
392 void do_board_detect(void)
393 {
394 	char *bname = NULL;
395 	int rc;
396 
397 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
398 				  CONFIG_EEPROM_CHIP_ADDRESS);
399 	if (rc)
400 		printf("ti_i2c_eeprom_init failed %d\n", rc);
401 
402 	if (board_is_x15())
403 		bname = "BeagleBoard X15";
404 	else if (board_is_am572x_evm())
405 		bname = "AM572x EVM";
406 	else if (board_is_am572x_idk())
407 		bname = "AM572x IDK";
408 	else if (board_is_am571x_idk())
409 		bname = "AM571x IDK";
410 
411 	if (bname)
412 		snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
413 			 "Board: %s REV %s\n", bname, board_ti_get_rev());
414 }
415 
416 static void setup_board_eeprom_env(void)
417 {
418 	char *name = "beagle_x15";
419 	int rc;
420 
421 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
422 				  CONFIG_EEPROM_CHIP_ADDRESS);
423 	if (rc)
424 		goto invalid_eeprom;
425 
426 	if (board_is_x15()) {
427 		if (board_is_x15_revb1())
428 			name = "beagle_x15_revb1";
429 		else
430 			name = "beagle_x15";
431 	} else if (board_is_am572x_evm()) {
432 		if (board_is_am572x_evm_reva3())
433 			name = "am57xx_evm_reva3";
434 		else
435 			name = "am57xx_evm";
436 	} else if (board_is_am572x_idk()) {
437 		name = "am572x_idk";
438 	} else if (board_is_am571x_idk()) {
439 		name = "am571x_idk";
440 	} else {
441 		printf("Unidentified board claims %s in eeprom header\n",
442 		       board_ti_get_name());
443 	}
444 
445 invalid_eeprom:
446 	set_board_info_env(name);
447 }
448 
449 #endif	/* CONFIG_SPL_BUILD */
450 
451 void vcores_init(void)
452 {
453 	if (board_is_am572x_idk())
454 		*omap_vcores = &am572x_idk_volts;
455 	else
456 		*omap_vcores = &beagle_x15_volts;
457 }
458 
459 void hw_data_init(void)
460 {
461 	*prcm = &dra7xx_prcm;
462 	*dplls_data = &dra7xx_dplls;
463 	*ctrl = &dra7xx_ctrl;
464 }
465 
466 bool am571x_idk_needs_lcd(void)
467 {
468 	bool needs_lcd;
469 
470 	gpio_request(GPIO_ETH_LCD, "nLCD_Detect");
471 	if (gpio_get_value(GPIO_ETH_LCD))
472 		needs_lcd = false;
473 	else
474 		needs_lcd = true;
475 
476 	gpio_free(GPIO_ETH_LCD);
477 
478 	return needs_lcd;
479 }
480 
481 int board_init(void)
482 {
483 	gpmc_init();
484 	gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
485 
486 	return 0;
487 }
488 
489 void am57x_idk_lcd_detect(void)
490 {
491 	int r = -ENODEV;
492 	char *idk_lcd = "no";
493 	uint8_t buf = 0;
494 
495 	/* Only valid for IDKs */
496 	if (board_is_x15() || board_is_am572x_evm())
497 		return;
498 
499 	/* Only AM571x IDK has gpio control detect.. so check that */
500 	if (board_is_am571x_idk() && !am571x_idk_needs_lcd())
501 		goto out;
502 
503 	r = i2c_set_bus_num(OSD_TS_FT_BUS_ADDRESS);
504 	if (r) {
505 		printf("%s: Failed to set bus address to %d: %d\n",
506 		       __func__, OSD_TS_FT_BUS_ADDRESS, r);
507 		goto out;
508 	}
509 	r = i2c_probe(OSD_TS_FT_CHIP_ADDRESS);
510 	if (r) {
511 		/* AM572x IDK has no explicit settings for optional LCD kit */
512 		if (board_is_am571x_idk()) {
513 			printf("%s: Touch screen detect failed: %d!\n",
514 			       __func__, r);
515 		}
516 		goto out;
517 	}
518 
519 	/* Read FT ID */
520 	r = i2c_read(OSD_TS_FT_CHIP_ADDRESS, OSD_TS_FT_REG_ID, 1, &buf, 1);
521 	if (r) {
522 		printf("%s: Touch screen ID read %d:0x%02x[0x%02x] failed:%d\n",
523 		       __func__, OSD_TS_FT_BUS_ADDRESS, OSD_TS_FT_CHIP_ADDRESS,
524 		       OSD_TS_FT_REG_ID, r);
525 		goto out;
526 	}
527 
528 	switch (buf) {
529 	case OSD_TS_FT_ID_5606:
530 		idk_lcd = "osd101t2045";
531 		break;
532 	case OSD_TS_FT_ID_5x46:
533 		idk_lcd = "osd101t2587";
534 		break;
535 	default:
536 		printf("%s: Unidentifed Touch screen ID 0x%02x\n",
537 		       __func__, buf);
538 		/* we will let default be "no lcd" */
539 	}
540 out:
541 	setenv("idk_lcd", idk_lcd);
542 	return;
543 }
544 
545 int board_late_init(void)
546 {
547 	setup_board_eeprom_env();
548 	u8 val;
549 
550 	/*
551 	 * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
552 	 * This is the POWERHOLD-in-Low behavior.
553 	 */
554 	palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
555 
556 	/*
557 	 * Default FIT boot on HS devices. Non FIT images are not allowed
558 	 * on HS devices.
559 	 */
560 	if (get_device_type() == HS_DEVICE)
561 		setenv("boot_fit", "1");
562 
563 	/*
564 	 * Set the GPIO7 Pad to POWERHOLD. This has higher priority
565 	 * over DEV_CTRL.DEV_ON bit. This can be reset in case of
566 	 * PMIC Power off. So to be on the safer side set it back
567 	 * to POWERHOLD mode irrespective of the current state.
568 	 */
569 	palmas_i2c_read_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2,
570 			   &val);
571 	val = val | TPS65903X_PAD2_POWERHOLD_MASK;
572 	palmas_i2c_write_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2,
573 			    val);
574 
575 	omap_die_id_serial();
576 
577 	am57x_idk_lcd_detect();
578 
579 #if !defined(CONFIG_SPL_BUILD)
580 	board_ti_set_ethaddr(2);
581 #endif
582 
583 	return 0;
584 }
585 
586 void set_muxconf_regs(void)
587 {
588 	do_set_mux32((*ctrl)->control_padconf_core_base,
589 		     early_padconf, ARRAY_SIZE(early_padconf));
590 }
591 
592 #ifdef CONFIG_IODELAY_RECALIBRATION
593 void recalibrate_iodelay(void)
594 {
595 	const struct pad_conf_entry *pconf;
596 	const struct iodelay_cfg_entry *iod;
597 	int pconf_sz, iod_sz;
598 	int ret;
599 
600 	if (board_is_am572x_idk()) {
601 		pconf = core_padconf_array_essential_am572x_idk;
602 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am572x_idk);
603 		iod = iodelay_cfg_array_am572x_idk;
604 		iod_sz = ARRAY_SIZE(iodelay_cfg_array_am572x_idk);
605 	} else if (board_is_am571x_idk()) {
606 		pconf = core_padconf_array_essential_am571x_idk;
607 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am571x_idk);
608 		iod = iodelay_cfg_array_am571x_idk;
609 		iod_sz = ARRAY_SIZE(iodelay_cfg_array_am571x_idk);
610 	} else {
611 		/* Common for X15/GPEVM */
612 		pconf = core_padconf_array_essential_x15;
613 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_x15);
614 		/* There never was an SR1.0 X15.. So.. */
615 		if (omap_revision() == DRA752_ES1_1) {
616 			iod = iodelay_cfg_array_x15_sr1_1;
617 			iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr1_1);
618 		} else {
619 			/* Since full production should switch to SR2.0  */
620 			iod = iodelay_cfg_array_x15_sr2_0;
621 			iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr2_0);
622 		}
623 	}
624 
625 	/* Setup I/O isolation */
626 	ret = __recalibrate_iodelay_start();
627 	if (ret)
628 		goto err;
629 
630 	/* Do the muxing here */
631 	do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
632 
633 	/* Now do the weird minor deltas that should be safe */
634 	if (board_is_x15() || board_is_am572x_evm()) {
635 		if (board_is_x15_revb1() || board_is_am572x_evm_reva3()) {
636 			pconf = core_padconf_array_delta_x15_sr2_0;
637 			pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr2_0);
638 		} else {
639 			pconf = core_padconf_array_delta_x15_sr1_1;
640 			pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr1_1);
641 		}
642 		do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
643 	}
644 
645 	if (board_is_am571x_idk()) {
646 		if (am571x_idk_needs_lcd()) {
647 			pconf = core_padconf_array_vout_am571x_idk;
648 			pconf_sz = ARRAY_SIZE(core_padconf_array_vout_am571x_idk);
649 		} else {
650 			pconf = core_padconf_array_icss1eth_am571x_idk;
651 			pconf_sz = ARRAY_SIZE(core_padconf_array_icss1eth_am571x_idk);
652 		}
653 		do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
654 	}
655 
656 	/* Setup IOdelay configuration */
657 	ret = do_set_iodelay((*ctrl)->iodelay_config_base, iod, iod_sz);
658 err:
659 	/* Closeup.. remove isolation */
660 	__recalibrate_iodelay_end(ret);
661 }
662 #endif
663 
664 #if defined(CONFIG_GENERIC_MMC)
665 int board_mmc_init(bd_t *bis)
666 {
667 	omap_mmc_init(0, 0, 0, -1, -1);
668 	omap_mmc_init(1, 0, 0, -1, -1);
669 	return 0;
670 }
671 #endif
672 
673 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
674 int spl_start_uboot(void)
675 {
676 	/* break into full u-boot on 'c' */
677 	if (serial_tstc() && serial_getc() == 'c')
678 		return 1;
679 
680 #ifdef CONFIG_SPL_ENV_SUPPORT
681 	env_init();
682 	env_relocate_spec();
683 	if (getenv_yesno("boot_os") != 1)
684 		return 1;
685 #endif
686 
687 	return 0;
688 }
689 #endif
690 
691 #ifdef CONFIG_USB_DWC3
692 static struct dwc3_device usb_otg_ss2 = {
693 	.maximum_speed = USB_SPEED_HIGH,
694 	.base = DRA7_USB_OTG_SS2_BASE,
695 	.tx_fifo_resize = false,
696 	.index = 1,
697 };
698 
699 static struct dwc3_omap_device usb_otg_ss2_glue = {
700 	.base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
701 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
702 	.index = 1,
703 };
704 
705 static struct ti_usb_phy_device usb_phy2_device = {
706 	.usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
707 	.index = 1,
708 };
709 
710 int usb_gadget_handle_interrupts(int index)
711 {
712 	u32 status;
713 
714 	status = dwc3_omap_uboot_interrupt_status(index);
715 	if (status)
716 		dwc3_uboot_handle_interrupt(index);
717 
718 	return 0;
719 }
720 #endif /* CONFIG_USB_DWC3 */
721 
722 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
723 int board_usb_init(int index, enum usb_init_type init)
724 {
725 	enable_usb_clocks(index);
726 	switch (index) {
727 	case 0:
728 		if (init == USB_INIT_DEVICE) {
729 			printf("port %d can't be used as device\n", index);
730 			disable_usb_clocks(index);
731 			return -EINVAL;
732 		}
733 		break;
734 	case 1:
735 		if (init == USB_INIT_DEVICE) {
736 #ifdef CONFIG_USB_DWC3
737 			usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
738 			usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
739 			ti_usb_phy_uboot_init(&usb_phy2_device);
740 			dwc3_omap_uboot_init(&usb_otg_ss2_glue);
741 			dwc3_uboot_init(&usb_otg_ss2);
742 #endif
743 		} else {
744 			printf("port %d can't be used as host\n", index);
745 			disable_usb_clocks(index);
746 			return -EINVAL;
747 		}
748 
749 		break;
750 	default:
751 		printf("Invalid Controller Index\n");
752 	}
753 
754 	return 0;
755 }
756 
757 int board_usb_cleanup(int index, enum usb_init_type init)
758 {
759 #ifdef CONFIG_USB_DWC3
760 	switch (index) {
761 	case 0:
762 	case 1:
763 		if (init == USB_INIT_DEVICE) {
764 			ti_usb_phy_uboot_exit(index);
765 			dwc3_uboot_exit(index);
766 			dwc3_omap_uboot_exit(index);
767 		}
768 		break;
769 	default:
770 		printf("Invalid Controller Index\n");
771 	}
772 #endif
773 	disable_usb_clocks(index);
774 	return 0;
775 }
776 #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
777 
778 #ifdef CONFIG_DRIVER_TI_CPSW
779 
780 /* Delay value to add to calibrated value */
781 #define RGMII0_TXCTL_DLY_VAL		((0x3 << 5) + 0x8)
782 #define RGMII0_TXD0_DLY_VAL		((0x3 << 5) + 0x8)
783 #define RGMII0_TXD1_DLY_VAL		((0x3 << 5) + 0x2)
784 #define RGMII0_TXD2_DLY_VAL		((0x4 << 5) + 0x0)
785 #define RGMII0_TXD3_DLY_VAL		((0x4 << 5) + 0x0)
786 #define VIN2A_D13_DLY_VAL		((0x3 << 5) + 0x8)
787 #define VIN2A_D17_DLY_VAL		((0x3 << 5) + 0x8)
788 #define VIN2A_D16_DLY_VAL		((0x3 << 5) + 0x2)
789 #define VIN2A_D15_DLY_VAL		((0x4 << 5) + 0x0)
790 #define VIN2A_D14_DLY_VAL		((0x4 << 5) + 0x0)
791 
792 static void cpsw_control(int enabled)
793 {
794 	/* VTP can be added here */
795 }
796 
797 static struct cpsw_slave_data cpsw_slaves[] = {
798 	{
799 		.slave_reg_ofs	= 0x208,
800 		.sliver_reg_ofs	= 0xd80,
801 		.phy_addr	= 1,
802 	},
803 	{
804 		.slave_reg_ofs	= 0x308,
805 		.sliver_reg_ofs	= 0xdc0,
806 		.phy_addr	= 2,
807 	},
808 };
809 
810 static struct cpsw_platform_data cpsw_data = {
811 	.mdio_base		= CPSW_MDIO_BASE,
812 	.cpsw_base		= CPSW_BASE,
813 	.mdio_div		= 0xff,
814 	.channels		= 8,
815 	.cpdma_reg_ofs		= 0x800,
816 	.slaves			= 1,
817 	.slave_data		= cpsw_slaves,
818 	.ale_reg_ofs		= 0xd00,
819 	.ale_entries		= 1024,
820 	.host_port_reg_ofs	= 0x108,
821 	.hw_stats_reg_ofs	= 0x900,
822 	.bd_ram_ofs		= 0x2000,
823 	.mac_control		= (1 << 5),
824 	.control		= cpsw_control,
825 	.host_port_num		= 0,
826 	.version		= CPSW_CTRL_VERSION_2,
827 };
828 
829 static u64 mac_to_u64(u8 mac[6])
830 {
831 	int i;
832 	u64 addr = 0;
833 
834 	for (i = 0; i < 6; i++) {
835 		addr <<= 8;
836 		addr |= mac[i];
837 	}
838 
839 	return addr;
840 }
841 
842 static void u64_to_mac(u64 addr, u8 mac[6])
843 {
844 	mac[5] = addr;
845 	mac[4] = addr >> 8;
846 	mac[3] = addr >> 16;
847 	mac[2] = addr >> 24;
848 	mac[1] = addr >> 32;
849 	mac[0] = addr >> 40;
850 }
851 
852 int board_eth_init(bd_t *bis)
853 {
854 	int ret;
855 	uint8_t mac_addr[6];
856 	uint32_t mac_hi, mac_lo;
857 	uint32_t ctrl_val;
858 	int i;
859 	u64 mac1, mac2;
860 	u8 mac_addr1[6], mac_addr2[6];
861 	int num_macs;
862 
863 	/* try reading mac address from efuse */
864 	mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
865 	mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
866 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
867 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
868 	mac_addr[2] = mac_hi & 0xFF;
869 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
870 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
871 	mac_addr[5] = mac_lo & 0xFF;
872 
873 	if (!getenv("ethaddr")) {
874 		printf("<ethaddr> not set. Validating first E-fuse MAC\n");
875 
876 		if (is_valid_ethaddr(mac_addr))
877 			eth_setenv_enetaddr("ethaddr", mac_addr);
878 	}
879 
880 	mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
881 	mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
882 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
883 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
884 	mac_addr[2] = mac_hi & 0xFF;
885 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
886 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
887 	mac_addr[5] = mac_lo & 0xFF;
888 
889 	if (!getenv("eth1addr")) {
890 		if (is_valid_ethaddr(mac_addr))
891 			eth_setenv_enetaddr("eth1addr", mac_addr);
892 	}
893 
894 	ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
895 	ctrl_val |= 0x22;
896 	writel(ctrl_val, (*ctrl)->control_core_control_io1);
897 
898 	/* The phy address for the AM57xx IDK are different than x15 */
899 	if (board_is_am572x_idk() || board_is_am571x_idk()) {
900 		cpsw_data.slave_data[0].phy_addr = 0;
901 		cpsw_data.slave_data[1].phy_addr = 1;
902 	}
903 
904 	ret = cpsw_register(&cpsw_data);
905 	if (ret < 0)
906 		printf("Error %d registering CPSW switch\n", ret);
907 
908 	/*
909 	 * Export any Ethernet MAC addresses from EEPROM.
910 	 * On AM57xx the 2 MAC addresses define the address range
911 	 */
912 	board_ti_get_eth_mac_addr(0, mac_addr1);
913 	board_ti_get_eth_mac_addr(1, mac_addr2);
914 
915 	if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
916 		mac1 = mac_to_u64(mac_addr1);
917 		mac2 = mac_to_u64(mac_addr2);
918 
919 		/* must contain an address range */
920 		num_macs = mac2 - mac1 + 1;
921 		/* <= 50 to protect against user programming error */
922 		if (num_macs > 0 && num_macs <= 50) {
923 			for (i = 0; i < num_macs; i++) {
924 				u64_to_mac(mac1 + i, mac_addr);
925 				if (is_valid_ethaddr(mac_addr)) {
926 					eth_setenv_enetaddr_by_index("eth",
927 								     i + 2,
928 								     mac_addr);
929 				}
930 			}
931 		}
932 	}
933 
934 	return ret;
935 }
936 #endif
937 
938 #ifdef CONFIG_BOARD_EARLY_INIT_F
939 /* VTT regulator enable */
940 static inline void vtt_regulator_enable(void)
941 {
942 	if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
943 		return;
944 
945 	gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
946 	gpio_direction_output(GPIO_DDR_VTT_EN, 1);
947 }
948 
949 int board_early_init_f(void)
950 {
951 	vtt_regulator_enable();
952 	return 0;
953 }
954 #endif
955 
956 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
957 int ft_board_setup(void *blob, bd_t *bd)
958 {
959 	ft_cpu_setup(blob, bd);
960 
961 	return 0;
962 }
963 #endif
964 
965 #ifdef CONFIG_SPL_LOAD_FIT
966 int board_fit_config_name_match(const char *name)
967 {
968 	if (board_is_x15()) {
969 		if (board_is_x15_revb1()) {
970 			if (!strcmp(name, "am57xx-beagle-x15-revb1"))
971 				return 0;
972 		} else if (!strcmp(name, "am57xx-beagle-x15")) {
973 			return 0;
974 		}
975 	} else if (board_is_am572x_evm() &&
976 		   !strcmp(name, "am57xx-beagle-x15")) {
977 		return 0;
978 	} else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk")) {
979 		return 0;
980 	} else if (board_is_am571x_idk() && !strcmp(name, "am571x-idk")) {
981 		return 0;
982 	}
983 
984 	return -1;
985 }
986 #endif
987 
988 #ifdef CONFIG_TI_SECURE_DEVICE
989 void board_fit_image_post_process(void **p_image, size_t *p_size)
990 {
991 	secure_boot_verify_image(p_image, p_size);
992 }
993 
994 void board_tee_image_process(ulong tee_image, size_t tee_size)
995 {
996 	secure_tee_install((u32)tee_image);
997 }
998 
999 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
1000 #endif
1001