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