]> git.ipfire.org Git - people/ms/u-boot.git/blob - board/ti/am57xx/board.c
board: ti: am57xx: Add support for detection of reva3 variations for GPEVM
[people/ms/u-boot.git] / board / ti / am57xx / board.c
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_am572x_evm() board_ti_is("AM572PM_")
39 #define board_is_am572x_evm_reva3() \
40 (board_ti_is("AM572PM_") && \
41 (strncmp("A.30", board_ti_get_rev(), 3) <= 0))
42 #define board_is_am572x_idk() board_ti_is("AM572IDK")
43
44 #ifdef CONFIG_DRIVER_TI_CPSW
45 #include <cpsw.h>
46 #endif
47
48 DECLARE_GLOBAL_DATA_PTR;
49
50 /* GPIO 7_11 */
51 #define GPIO_DDR_VTT_EN 203
52
53 #define SYSINFO_BOARD_NAME_MAX_LEN 45
54
55 const struct omap_sysinfo sysinfo = {
56 "Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n"
57 };
58
59 static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = {
60 .dmm_lisa_map_3 = 0x80740300,
61 .is_ma_present = 0x1
62 };
63
64 void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
65 {
66 *dmm_lisa_regs = &beagle_x15_lisa_regs;
67 }
68
69 static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
70 .sdram_config_init = 0x61851b32,
71 .sdram_config = 0x61851b32,
72 .sdram_config2 = 0x08000000,
73 .ref_ctrl = 0x000040F1,
74 .ref_ctrl_final = 0x00001035,
75 .sdram_tim1 = 0xcccf36ab,
76 .sdram_tim2 = 0x308f7fda,
77 .sdram_tim3 = 0x409f88a8,
78 .read_idle_ctrl = 0x00050000,
79 .zq_config = 0x5007190b,
80 .temp_alert_config = 0x00000000,
81 .emif_ddr_phy_ctlr_1_init = 0x0024400b,
82 .emif_ddr_phy_ctlr_1 = 0x0e24400b,
83 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
84 .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
85 .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
86 .emif_ddr_ext_phy_ctrl_4 = 0x009b009b,
87 .emif_ddr_ext_phy_ctrl_5 = 0x009e009e,
88 .emif_rd_wr_lvl_rmp_win = 0x00000000,
89 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
90 .emif_rd_wr_lvl_ctl = 0x00000000,
91 .emif_rd_wr_exec_thresh = 0x00000305
92 };
93
94 /* Ext phy ctrl regs 1-35 */
95 static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
96 0x10040100,
97 0x00910091,
98 0x00950095,
99 0x009B009B,
100 0x009E009E,
101 0x00980098,
102 0x00340034,
103 0x00350035,
104 0x00340034,
105 0x00310031,
106 0x00340034,
107 0x007F007F,
108 0x007F007F,
109 0x007F007F,
110 0x007F007F,
111 0x007F007F,
112 0x00480048,
113 0x004A004A,
114 0x00520052,
115 0x00550055,
116 0x00500050,
117 0x00000000,
118 0x00600020,
119 0x40011080,
120 0x08102040,
121 0x0,
122 0x0,
123 0x0,
124 0x0,
125 0x0,
126 0x0,
127 0x0,
128 0x0,
129 0x0,
130 0x0
131 };
132
133 static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
134 .sdram_config_init = 0x61851b32,
135 .sdram_config = 0x61851b32,
136 .sdram_config2 = 0x08000000,
137 .ref_ctrl = 0x000040F1,
138 .ref_ctrl_final = 0x00001035,
139 .sdram_tim1 = 0xcccf36b3,
140 .sdram_tim2 = 0x308f7fda,
141 .sdram_tim3 = 0x407f88a8,
142 .read_idle_ctrl = 0x00050000,
143 .zq_config = 0x5007190b,
144 .temp_alert_config = 0x00000000,
145 .emif_ddr_phy_ctlr_1_init = 0x0024400b,
146 .emif_ddr_phy_ctlr_1 = 0x0e24400b,
147 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
148 .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
149 .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
150 .emif_ddr_ext_phy_ctrl_4 = 0x009b009b,
151 .emif_ddr_ext_phy_ctrl_5 = 0x009e009e,
152 .emif_rd_wr_lvl_rmp_win = 0x00000000,
153 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
154 .emif_rd_wr_lvl_ctl = 0x00000000,
155 .emif_rd_wr_exec_thresh = 0x00000305
156 };
157
158 static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
159 0x10040100,
160 0x00910091,
161 0x00950095,
162 0x009B009B,
163 0x009E009E,
164 0x00980098,
165 0x00340034,
166 0x00350035,
167 0x00340034,
168 0x00310031,
169 0x00340034,
170 0x007F007F,
171 0x007F007F,
172 0x007F007F,
173 0x007F007F,
174 0x007F007F,
175 0x00480048,
176 0x004A004A,
177 0x00520052,
178 0x00550055,
179 0x00500050,
180 0x00000000,
181 0x00600020,
182 0x40011080,
183 0x08102040,
184 0x0,
185 0x0,
186 0x0,
187 0x0,
188 0x0,
189 0x0,
190 0x0,
191 0x0,
192 0x0,
193 0x0
194 };
195
196 void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
197 {
198 switch (emif_nr) {
199 case 1:
200 *regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
201 break;
202 case 2:
203 *regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs;
204 break;
205 }
206 }
207
208 void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size)
209 {
210 switch (emif_nr) {
211 case 1:
212 *regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs;
213 *size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs);
214 break;
215 case 2:
216 *regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs;
217 *size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs);
218 break;
219 }
220 }
221
222 struct vcores_data beagle_x15_volts = {
223 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM,
224 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
225 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
226 .mpu.addr = TPS659038_REG_ADDR_SMPS12,
227 .mpu.pmic = &tps659038,
228 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK,
229
230 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM,
231 .eve.value[OPP_OD] = VDD_EVE_DRA7_OD,
232 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH,
233 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
234 .eve.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_DSPEVE_OD,
235 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
236 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS,
237 .eve.addr = TPS659038_REG_ADDR_SMPS45,
238 .eve.pmic = &tps659038,
239 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK,
240
241 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM,
242 .gpu.value[OPP_OD] = VDD_GPU_DRA7_OD,
243 .gpu.value[OPP_HIGH] = VDD_GPU_DRA7_HIGH,
244 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM,
245 .gpu.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_GPU_OD,
246 .gpu.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_GPU_HIGH,
247 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
248 .gpu.addr = TPS659038_REG_ADDR_SMPS45,
249 .gpu.pmic = &tps659038,
250 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK,
251
252 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM,
253 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM,
254 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS,
255 .core.addr = TPS659038_REG_ADDR_SMPS6,
256 .core.pmic = &tps659038,
257
258 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM,
259 .iva.value[OPP_OD] = VDD_IVA_DRA7_OD,
260 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH,
261 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM,
262 .iva.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_IVA_OD,
263 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH,
264 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS,
265 .iva.addr = TPS659038_REG_ADDR_SMPS45,
266 .iva.pmic = &tps659038,
267 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK,
268 };
269
270 struct vcores_data am572x_idk_volts = {
271 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM,
272 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
273 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
274 .mpu.addr = TPS659038_REG_ADDR_SMPS12,
275 .mpu.pmic = &tps659038,
276 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK,
277
278 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM,
279 .eve.value[OPP_OD] = VDD_EVE_DRA7_OD,
280 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH,
281 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
282 .eve.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_DSPEVE_OD,
283 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
284 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS,
285 .eve.addr = TPS659038_REG_ADDR_SMPS45,
286 .eve.pmic = &tps659038,
287 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK,
288
289 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM,
290 .gpu.value[OPP_OD] = VDD_GPU_DRA7_OD,
291 .gpu.value[OPP_HIGH] = VDD_GPU_DRA7_HIGH,
292 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM,
293 .gpu.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_GPU_OD,
294 .gpu.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_GPU_HIGH,
295 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
296 .gpu.addr = TPS659038_REG_ADDR_SMPS6,
297 .gpu.pmic = &tps659038,
298 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK,
299
300 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM,
301 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM,
302 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS,
303 .core.addr = TPS659038_REG_ADDR_SMPS7,
304 .core.pmic = &tps659038,
305
306 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM,
307 .iva.value[OPP_OD] = VDD_IVA_DRA7_OD,
308 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH,
309 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM,
310 .iva.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_IVA_OD,
311 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH,
312 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS,
313 .iva.addr = TPS659038_REG_ADDR_SMPS8,
314 .iva.pmic = &tps659038,
315 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK,
316 };
317
318 int get_voltrail_opp(int rail_offset)
319 {
320 int opp;
321
322 switch (rail_offset) {
323 case VOLT_MPU:
324 opp = DRA7_MPU_OPP;
325 break;
326 case VOLT_CORE:
327 opp = DRA7_CORE_OPP;
328 break;
329 case VOLT_GPU:
330 opp = DRA7_GPU_OPP;
331 break;
332 case VOLT_EVE:
333 opp = DRA7_DSPEVE_OPP;
334 break;
335 case VOLT_IVA:
336 opp = DRA7_IVA_OPP;
337 break;
338 default:
339 opp = OPP_NOM;
340 }
341
342 return opp;
343 }
344
345
346 #ifdef CONFIG_SPL_BUILD
347 /* No env to setup for SPL */
348 static inline void setup_board_eeprom_env(void) { }
349
350 /* Override function to read eeprom information */
351 void do_board_detect(void)
352 {
353 int rc;
354
355 rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
356 CONFIG_EEPROM_CHIP_ADDRESS);
357 if (rc)
358 printf("ti_i2c_eeprom_init failed %d\n", rc);
359 }
360
361 #else /* CONFIG_SPL_BUILD */
362
363 /* Override function to read eeprom information: actual i2c read done by SPL*/
364 void do_board_detect(void)
365 {
366 char *bname = NULL;
367 int rc;
368
369 rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
370 CONFIG_EEPROM_CHIP_ADDRESS);
371 if (rc)
372 printf("ti_i2c_eeprom_init failed %d\n", rc);
373
374 if (board_is_x15())
375 bname = "BeagleBoard X15";
376 else if (board_is_am572x_evm())
377 bname = "AM572x EVM";
378 else if (board_is_am572x_idk())
379 bname = "AM572x IDK";
380
381 if (bname)
382 snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
383 "Board: %s REV %s\n", bname, board_ti_get_rev());
384 }
385
386 static void setup_board_eeprom_env(void)
387 {
388 char *name = "beagle_x15";
389 int rc;
390
391 rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
392 CONFIG_EEPROM_CHIP_ADDRESS);
393 if (rc)
394 goto invalid_eeprom;
395
396 if (board_is_x15()) {
397 name = "beagle_x15";
398 } else if (board_is_am572x_evm()) {
399 if (board_is_am572x_evm_reva3())
400 name = "am57xx_evm_reva3";
401 else
402 name = "am57xx_evm";
403 } else if (board_is_am572x_idk()) {
404 name = "am572x_idk";
405 } else {
406 printf("Unidentified board claims %s in eeprom header\n",
407 board_ti_get_name());
408 }
409
410 invalid_eeprom:
411 set_board_info_env(name);
412 }
413
414 #endif /* CONFIG_SPL_BUILD */
415
416 void vcores_init(void)
417 {
418 if (board_is_am572x_idk())
419 *omap_vcores = &am572x_idk_volts;
420 else
421 *omap_vcores = &beagle_x15_volts;
422 }
423
424 void hw_data_init(void)
425 {
426 *prcm = &dra7xx_prcm;
427 *dplls_data = &dra7xx_dplls;
428 *ctrl = &dra7xx_ctrl;
429 }
430
431 int board_init(void)
432 {
433 gpmc_init();
434 gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
435
436 return 0;
437 }
438
439 int board_late_init(void)
440 {
441 setup_board_eeprom_env();
442
443 /*
444 * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
445 * This is the POWERHOLD-in-Low behavior.
446 */
447 palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
448
449 /*
450 * Default FIT boot on HS devices. Non FIT images are not allowed
451 * on HS devices.
452 */
453 if (get_device_type() == HS_DEVICE)
454 setenv("boot_fit", "1");
455
456 return 0;
457 }
458
459 void set_muxconf_regs(void)
460 {
461 do_set_mux32((*ctrl)->control_padconf_core_base,
462 early_padconf, ARRAY_SIZE(early_padconf));
463 }
464
465 #ifdef CONFIG_IODELAY_RECALIBRATION
466 void recalibrate_iodelay(void)
467 {
468 const struct pad_conf_entry *pconf;
469 const struct iodelay_cfg_entry *iod;
470 int pconf_sz, iod_sz;
471
472 if (board_is_am572x_idk()) {
473 pconf = core_padconf_array_essential_am572x_idk;
474 pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am572x_idk);
475 iod = iodelay_cfg_array_am572x_idk;
476 iod_sz = ARRAY_SIZE(iodelay_cfg_array_am572x_idk);
477 } else {
478 /* Common for X15/GPEVM */
479 pconf = core_padconf_array_essential_x15;
480 pconf_sz = ARRAY_SIZE(core_padconf_array_essential_x15);
481 iod = iodelay_cfg_array_x15;
482 iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15);
483 }
484
485 __recalibrate_iodelay(pconf, pconf_sz, iod, iod_sz);
486 }
487 #endif
488
489 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
490 int board_mmc_init(bd_t *bis)
491 {
492 omap_mmc_init(0, 0, 0, -1, -1);
493 omap_mmc_init(1, 0, 0, -1, -1);
494 return 0;
495 }
496 #endif
497
498 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
499 int spl_start_uboot(void)
500 {
501 /* break into full u-boot on 'c' */
502 if (serial_tstc() && serial_getc() == 'c')
503 return 1;
504
505 #ifdef CONFIG_SPL_ENV_SUPPORT
506 env_init();
507 env_relocate_spec();
508 if (getenv_yesno("boot_os") != 1)
509 return 1;
510 #endif
511
512 return 0;
513 }
514 #endif
515
516 #ifdef CONFIG_USB_DWC3
517 static struct dwc3_device usb_otg_ss2 = {
518 .maximum_speed = USB_SPEED_HIGH,
519 .base = DRA7_USB_OTG_SS2_BASE,
520 .tx_fifo_resize = false,
521 .index = 1,
522 };
523
524 static struct dwc3_omap_device usb_otg_ss2_glue = {
525 .base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
526 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
527 .index = 1,
528 };
529
530 static struct ti_usb_phy_device usb_phy2_device = {
531 .usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
532 .index = 1,
533 };
534
535 int usb_gadget_handle_interrupts(int index)
536 {
537 u32 status;
538
539 status = dwc3_omap_uboot_interrupt_status(index);
540 if (status)
541 dwc3_uboot_handle_interrupt(index);
542
543 return 0;
544 }
545 #endif /* CONFIG_USB_DWC3 */
546
547 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
548 int board_usb_init(int index, enum usb_init_type init)
549 {
550 enable_usb_clocks(index);
551 switch (index) {
552 case 0:
553 if (init == USB_INIT_DEVICE) {
554 printf("port %d can't be used as device\n", index);
555 disable_usb_clocks(index);
556 return -EINVAL;
557 }
558 break;
559 case 1:
560 if (init == USB_INIT_DEVICE) {
561 #ifdef CONFIG_USB_DWC3
562 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
563 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
564 ti_usb_phy_uboot_init(&usb_phy2_device);
565 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
566 dwc3_uboot_init(&usb_otg_ss2);
567 #endif
568 } else {
569 printf("port %d can't be used as host\n", index);
570 disable_usb_clocks(index);
571 return -EINVAL;
572 }
573
574 break;
575 default:
576 printf("Invalid Controller Index\n");
577 }
578
579 return 0;
580 }
581
582 int board_usb_cleanup(int index, enum usb_init_type init)
583 {
584 #ifdef CONFIG_USB_DWC3
585 switch (index) {
586 case 0:
587 case 1:
588 if (init == USB_INIT_DEVICE) {
589 ti_usb_phy_uboot_exit(index);
590 dwc3_uboot_exit(index);
591 dwc3_omap_uboot_exit(index);
592 }
593 break;
594 default:
595 printf("Invalid Controller Index\n");
596 }
597 #endif
598 disable_usb_clocks(index);
599 return 0;
600 }
601 #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
602
603 #ifdef CONFIG_DRIVER_TI_CPSW
604
605 /* Delay value to add to calibrated value */
606 #define RGMII0_TXCTL_DLY_VAL ((0x3 << 5) + 0x8)
607 #define RGMII0_TXD0_DLY_VAL ((0x3 << 5) + 0x8)
608 #define RGMII0_TXD1_DLY_VAL ((0x3 << 5) + 0x2)
609 #define RGMII0_TXD2_DLY_VAL ((0x4 << 5) + 0x0)
610 #define RGMII0_TXD3_DLY_VAL ((0x4 << 5) + 0x0)
611 #define VIN2A_D13_DLY_VAL ((0x3 << 5) + 0x8)
612 #define VIN2A_D17_DLY_VAL ((0x3 << 5) + 0x8)
613 #define VIN2A_D16_DLY_VAL ((0x3 << 5) + 0x2)
614 #define VIN2A_D15_DLY_VAL ((0x4 << 5) + 0x0)
615 #define VIN2A_D14_DLY_VAL ((0x4 << 5) + 0x0)
616
617 static void cpsw_control(int enabled)
618 {
619 /* VTP can be added here */
620 }
621
622 static struct cpsw_slave_data cpsw_slaves[] = {
623 {
624 .slave_reg_ofs = 0x208,
625 .sliver_reg_ofs = 0xd80,
626 .phy_addr = 1,
627 },
628 {
629 .slave_reg_ofs = 0x308,
630 .sliver_reg_ofs = 0xdc0,
631 .phy_addr = 2,
632 },
633 };
634
635 static struct cpsw_platform_data cpsw_data = {
636 .mdio_base = CPSW_MDIO_BASE,
637 .cpsw_base = CPSW_BASE,
638 .mdio_div = 0xff,
639 .channels = 8,
640 .cpdma_reg_ofs = 0x800,
641 .slaves = 1,
642 .slave_data = cpsw_slaves,
643 .ale_reg_ofs = 0xd00,
644 .ale_entries = 1024,
645 .host_port_reg_ofs = 0x108,
646 .hw_stats_reg_ofs = 0x900,
647 .bd_ram_ofs = 0x2000,
648 .mac_control = (1 << 5),
649 .control = cpsw_control,
650 .host_port_num = 0,
651 .version = CPSW_CTRL_VERSION_2,
652 };
653
654 static u64 mac_to_u64(u8 mac[6])
655 {
656 int i;
657 u64 addr = 0;
658
659 for (i = 0; i < 6; i++) {
660 addr <<= 8;
661 addr |= mac[i];
662 }
663
664 return addr;
665 }
666
667 static void u64_to_mac(u64 addr, u8 mac[6])
668 {
669 mac[5] = addr;
670 mac[4] = addr >> 8;
671 mac[3] = addr >> 16;
672 mac[2] = addr >> 24;
673 mac[1] = addr >> 32;
674 mac[0] = addr >> 40;
675 }
676
677 int board_eth_init(bd_t *bis)
678 {
679 int ret;
680 uint8_t mac_addr[6];
681 uint32_t mac_hi, mac_lo;
682 uint32_t ctrl_val;
683 int i;
684 u64 mac1, mac2;
685 u8 mac_addr1[6], mac_addr2[6];
686 int num_macs;
687
688 /* try reading mac address from efuse */
689 mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
690 mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
691 mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
692 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
693 mac_addr[2] = mac_hi & 0xFF;
694 mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
695 mac_addr[4] = (mac_lo & 0xFF00) >> 8;
696 mac_addr[5] = mac_lo & 0xFF;
697
698 if (!getenv("ethaddr")) {
699 printf("<ethaddr> not set. Validating first E-fuse MAC\n");
700
701 if (is_valid_ethaddr(mac_addr))
702 eth_setenv_enetaddr("ethaddr", mac_addr);
703 }
704
705 mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
706 mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
707 mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
708 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
709 mac_addr[2] = mac_hi & 0xFF;
710 mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
711 mac_addr[4] = (mac_lo & 0xFF00) >> 8;
712 mac_addr[5] = mac_lo & 0xFF;
713
714 if (!getenv("eth1addr")) {
715 if (is_valid_ethaddr(mac_addr))
716 eth_setenv_enetaddr("eth1addr", mac_addr);
717 }
718
719 ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
720 ctrl_val |= 0x22;
721 writel(ctrl_val, (*ctrl)->control_core_control_io1);
722
723 /* The phy address for the AM572x IDK are different than x15 */
724 if (board_is_am572x_idk()) {
725 cpsw_data.slave_data[0].phy_addr = 0;
726 cpsw_data.slave_data[1].phy_addr = 1;
727 }
728
729 ret = cpsw_register(&cpsw_data);
730 if (ret < 0)
731 printf("Error %d registering CPSW switch\n", ret);
732
733 /*
734 * Export any Ethernet MAC addresses from EEPROM.
735 * On AM57xx the 2 MAC addresses define the address range
736 */
737 board_ti_get_eth_mac_addr(0, mac_addr1);
738 board_ti_get_eth_mac_addr(1, mac_addr2);
739
740 if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
741 mac1 = mac_to_u64(mac_addr1);
742 mac2 = mac_to_u64(mac_addr2);
743
744 /* must contain an address range */
745 num_macs = mac2 - mac1 + 1;
746 /* <= 50 to protect against user programming error */
747 if (num_macs > 0 && num_macs <= 50) {
748 for (i = 0; i < num_macs; i++) {
749 u64_to_mac(mac1 + i, mac_addr);
750 if (is_valid_ethaddr(mac_addr)) {
751 eth_setenv_enetaddr_by_index("eth",
752 i + 2,
753 mac_addr);
754 }
755 }
756 }
757 }
758
759 return ret;
760 }
761 #endif
762
763 #ifdef CONFIG_BOARD_EARLY_INIT_F
764 /* VTT regulator enable */
765 static inline void vtt_regulator_enable(void)
766 {
767 if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
768 return;
769
770 gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
771 gpio_direction_output(GPIO_DDR_VTT_EN, 1);
772 }
773
774 int board_early_init_f(void)
775 {
776 vtt_regulator_enable();
777 return 0;
778 }
779 #endif
780
781 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
782 int ft_board_setup(void *blob, bd_t *bd)
783 {
784 ft_cpu_setup(blob, bd);
785
786 return 0;
787 }
788 #endif
789
790 #ifdef CONFIG_SPL_LOAD_FIT
791 int board_fit_config_name_match(const char *name)
792 {
793 if (board_is_x15() && !strcmp(name, "am57xx-beagle-x15"))
794 return 0;
795 else if (board_is_am572x_evm() && !strcmp(name, "am57xx-beagle-x15"))
796 return 0;
797 else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk"))
798 return 0;
799 else
800 return -1;
801 }
802 #endif
803
804 #ifdef CONFIG_TI_SECURE_DEVICE
805 void board_fit_image_post_process(void **p_image, size_t *p_size)
806 {
807 secure_boot_verify_image(p_image, p_size);
808 }
809
810 void board_tee_image_process(ulong tee_image, size_t tee_size)
811 {
812 secure_tee_install((u32)tee_image);
813 }
814
815 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
816 #endif