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