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