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