odroid: remove CONFIG_DM_I2C_COMPAT config
[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) <= 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 int get_voltrail_opp(int rail_offset)
347 {
348         int opp;
349
350         switch (rail_offset) {
351         case VOLT_MPU:
352                 opp = DRA7_MPU_OPP;
353                 break;
354         case VOLT_CORE:
355                 opp = DRA7_CORE_OPP;
356                 break;
357         case VOLT_GPU:
358                 opp = DRA7_GPU_OPP;
359                 break;
360         case VOLT_EVE:
361                 opp = DRA7_DSPEVE_OPP;
362                 break;
363         case VOLT_IVA:
364                 opp = DRA7_IVA_OPP;
365                 break;
366         default:
367                 opp = OPP_NOM;
368         }
369
370         return opp;
371 }
372
373
374 #ifdef CONFIG_SPL_BUILD
375 /* No env to setup for SPL */
376 static inline void setup_board_eeprom_env(void) { }
377
378 /* Override function to read eeprom information */
379 void do_board_detect(void)
380 {
381         int rc;
382
383         rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
384                                   CONFIG_EEPROM_CHIP_ADDRESS);
385         if (rc)
386                 printf("ti_i2c_eeprom_init failed %d\n", rc);
387 }
388
389 #else   /* CONFIG_SPL_BUILD */
390
391 /* Override function to read eeprom information: actual i2c read done by SPL*/
392 void do_board_detect(void)
393 {
394         char *bname = NULL;
395         int rc;
396
397         rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
398                                   CONFIG_EEPROM_CHIP_ADDRESS);
399         if (rc)
400                 printf("ti_i2c_eeprom_init failed %d\n", rc);
401
402         if (board_is_x15())
403                 bname = "BeagleBoard X15";
404         else if (board_is_am572x_evm())
405                 bname = "AM572x EVM";
406         else if (board_is_am572x_idk())
407                 bname = "AM572x IDK";
408         else if (board_is_am571x_idk())
409                 bname = "AM571x IDK";
410
411         if (bname)
412                 snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
413                          "Board: %s REV %s\n", bname, board_ti_get_rev());
414 }
415
416 static void setup_board_eeprom_env(void)
417 {
418         char *name = "beagle_x15";
419         int rc;
420
421         rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
422                                   CONFIG_EEPROM_CHIP_ADDRESS);
423         if (rc)
424                 goto invalid_eeprom;
425
426         if (board_is_x15()) {
427                 if (board_is_x15_revb1())
428                         name = "beagle_x15_revb1";
429                 else
430                         name = "beagle_x15";
431         } else if (board_is_am572x_evm()) {
432                 if (board_is_am572x_evm_reva3())
433                         name = "am57xx_evm_reva3";
434                 else
435                         name = "am57xx_evm";
436         } else if (board_is_am572x_idk()) {
437                 name = "am572x_idk";
438         } else if (board_is_am571x_idk()) {
439                 name = "am571x_idk";
440         } else {
441                 printf("Unidentified board claims %s in eeprom header\n",
442                        board_ti_get_name());
443         }
444
445 invalid_eeprom:
446         set_board_info_env(name);
447 }
448
449 #endif  /* CONFIG_SPL_BUILD */
450
451 void vcores_init(void)
452 {
453         if (board_is_am572x_idk())
454                 *omap_vcores = &am572x_idk_volts;
455         else
456                 *omap_vcores = &beagle_x15_volts;
457 }
458
459 void hw_data_init(void)
460 {
461         *prcm = &dra7xx_prcm;
462         *dplls_data = &dra7xx_dplls;
463         *ctrl = &dra7xx_ctrl;
464 }
465
466 bool am571x_idk_needs_lcd(void)
467 {
468         bool needs_lcd;
469
470         gpio_request(GPIO_ETH_LCD, "nLCD_Detect");
471         if (gpio_get_value(GPIO_ETH_LCD))
472                 needs_lcd = false;
473         else
474                 needs_lcd = true;
475
476         gpio_free(GPIO_ETH_LCD);
477
478         return needs_lcd;
479 }
480
481 int board_init(void)
482 {
483         gpmc_init();
484         gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
485
486         return 0;
487 }
488
489 void am57x_idk_lcd_detect(void)
490 {
491         int r = -ENODEV;
492         char *idk_lcd = "no";
493         uint8_t buf = 0;
494
495         /* Only valid for IDKs */
496         if (board_is_x15() || board_is_am572x_evm())
497                 return;
498
499         /* Only AM571x IDK has gpio control detect.. so check that */
500         if (board_is_am571x_idk() && !am571x_idk_needs_lcd())
501                 goto out;
502
503         r = i2c_set_bus_num(OSD_TS_FT_BUS_ADDRESS);
504         if (r) {
505                 printf("%s: Failed to set bus address to %d: %d\n",
506                        __func__, OSD_TS_FT_BUS_ADDRESS, r);
507                 goto out;
508         }
509         r = i2c_probe(OSD_TS_FT_CHIP_ADDRESS);
510         if (r) {
511                 /* AM572x IDK has no explicit settings for optional LCD kit */
512                 if (board_is_am571x_idk()) {
513                         printf("%s: Touch screen detect failed: %d!\n",
514                                __func__, r);
515                 }
516                 goto out;
517         }
518
519         /* Read FT ID */
520         r = i2c_read(OSD_TS_FT_CHIP_ADDRESS, OSD_TS_FT_REG_ID, 1, &buf, 1);
521         if (r) {
522                 printf("%s: Touch screen ID read %d:0x%02x[0x%02x] failed:%d\n",
523                        __func__, OSD_TS_FT_BUS_ADDRESS, OSD_TS_FT_CHIP_ADDRESS,
524                        OSD_TS_FT_REG_ID, r);
525                 goto out;
526         }
527
528         switch (buf) {
529         case OSD_TS_FT_ID_5606:
530                 idk_lcd = "osd101t2045";
531                 break;
532         case OSD_TS_FT_ID_5x46:
533                 idk_lcd = "osd101t2587";
534                 break;
535         default:
536                 printf("%s: Unidentifed Touch screen ID 0x%02x\n",
537                        __func__, buf);
538                 /* we will let default be "no lcd" */
539         }
540 out:
541         setenv("idk_lcd", idk_lcd);
542         return;
543 }
544
545 int board_late_init(void)
546 {
547         setup_board_eeprom_env();
548         u8 val;
549
550         /*
551          * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
552          * This is the POWERHOLD-in-Low behavior.
553          */
554         palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
555
556         /*
557          * Default FIT boot on HS devices. Non FIT images are not allowed
558          * on HS devices.
559          */
560         if (get_device_type() == HS_DEVICE)
561                 setenv("boot_fit", "1");
562
563         /*
564          * Set the GPIO7 Pad to POWERHOLD. This has higher priority
565          * over DEV_CTRL.DEV_ON bit. This can be reset in case of
566          * PMIC Power off. So to be on the safer side set it back
567          * to POWERHOLD mode irrespective of the current state.
568          */
569         palmas_i2c_read_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2,
570                            &val);
571         val = val | TPS65903X_PAD2_POWERHOLD_MASK;
572         palmas_i2c_write_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2,
573                             val);
574
575         omap_die_id_serial();
576
577         am57x_idk_lcd_detect();
578
579 #if !defined(CONFIG_SPL_BUILD)
580         board_ti_set_ethaddr(2);
581 #endif
582
583         return 0;
584 }
585
586 void set_muxconf_regs(void)
587 {
588         do_set_mux32((*ctrl)->control_padconf_core_base,
589                      early_padconf, ARRAY_SIZE(early_padconf));
590 }
591
592 #ifdef CONFIG_IODELAY_RECALIBRATION
593 void recalibrate_iodelay(void)
594 {
595         const struct pad_conf_entry *pconf;
596         const struct iodelay_cfg_entry *iod;
597         int pconf_sz, iod_sz;
598         int ret;
599
600         if (board_is_am572x_idk()) {
601                 pconf = core_padconf_array_essential_am572x_idk;
602                 pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am572x_idk);
603                 iod = iodelay_cfg_array_am572x_idk;
604                 iod_sz = ARRAY_SIZE(iodelay_cfg_array_am572x_idk);
605         } else if (board_is_am571x_idk()) {
606                 pconf = core_padconf_array_essential_am571x_idk;
607                 pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am571x_idk);
608                 iod = iodelay_cfg_array_am571x_idk;
609                 iod_sz = ARRAY_SIZE(iodelay_cfg_array_am571x_idk);
610         } else {
611                 /* Common for X15/GPEVM */
612                 pconf = core_padconf_array_essential_x15;
613                 pconf_sz = ARRAY_SIZE(core_padconf_array_essential_x15);
614                 /* There never was an SR1.0 X15.. So.. */
615                 if (omap_revision() == DRA752_ES1_1) {
616                         iod = iodelay_cfg_array_x15_sr1_1;
617                         iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr1_1);
618                 } else {
619                         /* Since full production should switch to SR2.0  */
620                         iod = iodelay_cfg_array_x15_sr2_0;
621                         iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr2_0);
622                 }
623         }
624
625         /* Setup I/O isolation */
626         ret = __recalibrate_iodelay_start();
627         if (ret)
628                 goto err;
629
630         /* Do the muxing here */
631         do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
632
633         /* Now do the weird minor deltas that should be safe */
634         if (board_is_x15() || board_is_am572x_evm()) {
635                 if (board_is_x15_revb1() || board_is_am572x_evm_reva3()) {
636                         pconf = core_padconf_array_delta_x15_sr2_0;
637                         pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr2_0);
638                 } else {
639                         pconf = core_padconf_array_delta_x15_sr1_1;
640                         pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr1_1);
641                 }
642                 do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
643         }
644
645         if (board_is_am571x_idk()) {
646                 if (am571x_idk_needs_lcd()) {
647                         pconf = core_padconf_array_vout_am571x_idk;
648                         pconf_sz = ARRAY_SIZE(core_padconf_array_vout_am571x_idk);
649                 } else {
650                         pconf = core_padconf_array_icss1eth_am571x_idk;
651                         pconf_sz = ARRAY_SIZE(core_padconf_array_icss1eth_am571x_idk);
652                 }
653                 do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
654         }
655
656         /* Setup IOdelay configuration */
657         ret = do_set_iodelay((*ctrl)->iodelay_config_base, iod, iod_sz);
658 err:
659         /* Closeup.. remove isolation */
660         __recalibrate_iodelay_end(ret);
661 }
662 #endif
663
664 #if defined(CONFIG_MMC)
665 int board_mmc_init(bd_t *bis)
666 {
667         omap_mmc_init(0, 0, 0, -1, -1);
668         omap_mmc_init(1, 0, 0, -1, -1);
669         return 0;
670 }
671 #endif
672
673 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
674 int spl_start_uboot(void)
675 {
676         /* break into full u-boot on 'c' */
677         if (serial_tstc() && serial_getc() == 'c')
678                 return 1;
679
680 #ifdef CONFIG_SPL_ENV_SUPPORT
681         env_init();
682         env_relocate_spec();
683         if (getenv_yesno("boot_os") != 1)
684                 return 1;
685 #endif
686
687         return 0;
688 }
689 #endif
690
691 #ifdef CONFIG_USB_DWC3
692 static struct dwc3_device usb_otg_ss2 = {
693         .maximum_speed = USB_SPEED_HIGH,
694         .base = DRA7_USB_OTG_SS2_BASE,
695         .tx_fifo_resize = false,
696         .index = 1,
697 };
698
699 static struct dwc3_omap_device usb_otg_ss2_glue = {
700         .base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
701         .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
702         .index = 1,
703 };
704
705 static struct ti_usb_phy_device usb_phy2_device = {
706         .usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
707         .index = 1,
708 };
709
710 int usb_gadget_handle_interrupts(int index)
711 {
712         u32 status;
713
714         status = dwc3_omap_uboot_interrupt_status(index);
715         if (status)
716                 dwc3_uboot_handle_interrupt(index);
717
718         return 0;
719 }
720 #endif /* CONFIG_USB_DWC3 */
721
722 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
723 int omap_xhci_board_usb_init(int index, enum usb_init_type init)
724 {
725         enable_usb_clocks(index);
726         switch (index) {
727         case 0:
728                 if (init == USB_INIT_DEVICE) {
729                         printf("port %d can't be used as device\n", index);
730                         disable_usb_clocks(index);
731                         return -EINVAL;
732                 }
733                 break;
734         case 1:
735                 if (init == USB_INIT_DEVICE) {
736 #ifdef CONFIG_USB_DWC3
737                         usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
738                         usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
739                         ti_usb_phy_uboot_init(&usb_phy2_device);
740                         dwc3_omap_uboot_init(&usb_otg_ss2_glue);
741                         dwc3_uboot_init(&usb_otg_ss2);
742 #endif
743                 } else {
744                         printf("port %d can't be used as host\n", index);
745                         disable_usb_clocks(index);
746                         return -EINVAL;
747                 }
748
749                 break;
750         default:
751                 printf("Invalid Controller Index\n");
752         }
753
754         return 0;
755 }
756
757 int omap_xhci_board_usb_cleanup(int index, enum usb_init_type init)
758 {
759 #ifdef CONFIG_USB_DWC3
760         switch (index) {
761         case 0:
762         case 1:
763                 if (init == USB_INIT_DEVICE) {
764                         ti_usb_phy_uboot_exit(index);
765                         dwc3_uboot_exit(index);
766                         dwc3_omap_uboot_exit(index);
767                 }
768                 break;
769         default:
770                 printf("Invalid Controller Index\n");
771         }
772 #endif
773         disable_usb_clocks(index);
774         return 0;
775 }
776 #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
777
778 #ifdef CONFIG_DRIVER_TI_CPSW
779
780 /* Delay value to add to calibrated value */
781 #define RGMII0_TXCTL_DLY_VAL            ((0x3 << 5) + 0x8)
782 #define RGMII0_TXD0_DLY_VAL             ((0x3 << 5) + 0x8)
783 #define RGMII0_TXD1_DLY_VAL             ((0x3 << 5) + 0x2)
784 #define RGMII0_TXD2_DLY_VAL             ((0x4 << 5) + 0x0)
785 #define RGMII0_TXD3_DLY_VAL             ((0x4 << 5) + 0x0)
786 #define VIN2A_D13_DLY_VAL               ((0x3 << 5) + 0x8)
787 #define VIN2A_D17_DLY_VAL               ((0x3 << 5) + 0x8)
788 #define VIN2A_D16_DLY_VAL               ((0x3 << 5) + 0x2)
789 #define VIN2A_D15_DLY_VAL               ((0x4 << 5) + 0x0)
790 #define VIN2A_D14_DLY_VAL               ((0x4 << 5) + 0x0)
791
792 static void cpsw_control(int enabled)
793 {
794         /* VTP can be added here */
795 }
796
797 static struct cpsw_slave_data cpsw_slaves[] = {
798         {
799                 .slave_reg_ofs  = 0x208,
800                 .sliver_reg_ofs = 0xd80,
801                 .phy_addr       = 1,
802         },
803         {
804                 .slave_reg_ofs  = 0x308,
805                 .sliver_reg_ofs = 0xdc0,
806                 .phy_addr       = 2,
807         },
808 };
809
810 static struct cpsw_platform_data cpsw_data = {
811         .mdio_base              = CPSW_MDIO_BASE,
812         .cpsw_base              = CPSW_BASE,
813         .mdio_div               = 0xff,
814         .channels               = 8,
815         .cpdma_reg_ofs          = 0x800,
816         .slaves                 = 1,
817         .slave_data             = cpsw_slaves,
818         .ale_reg_ofs            = 0xd00,
819         .ale_entries            = 1024,
820         .host_port_reg_ofs      = 0x108,
821         .hw_stats_reg_ofs       = 0x900,
822         .bd_ram_ofs             = 0x2000,
823         .mac_control            = (1 << 5),
824         .control                = cpsw_control,
825         .host_port_num          = 0,
826         .version                = CPSW_CTRL_VERSION_2,
827 };
828
829 static u64 mac_to_u64(u8 mac[6])
830 {
831         int i;
832         u64 addr = 0;
833
834         for (i = 0; i < 6; i++) {
835                 addr <<= 8;
836                 addr |= mac[i];
837         }
838
839         return addr;
840 }
841
842 static void u64_to_mac(u64 addr, u8 mac[6])
843 {
844         mac[5] = addr;
845         mac[4] = addr >> 8;
846         mac[3] = addr >> 16;
847         mac[2] = addr >> 24;
848         mac[1] = addr >> 32;
849         mac[0] = addr >> 40;
850 }
851
852 int board_eth_init(bd_t *bis)
853 {
854         int ret;
855         uint8_t mac_addr[6];
856         uint32_t mac_hi, mac_lo;
857         uint32_t ctrl_val;
858         int i;
859         u64 mac1, mac2;
860         u8 mac_addr1[6], mac_addr2[6];
861         int num_macs;
862
863         /* try reading mac address from efuse */
864         mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
865         mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
866         mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
867         mac_addr[1] = (mac_hi & 0xFF00) >> 8;
868         mac_addr[2] = mac_hi & 0xFF;
869         mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
870         mac_addr[4] = (mac_lo & 0xFF00) >> 8;
871         mac_addr[5] = mac_lo & 0xFF;
872
873         if (!getenv("ethaddr")) {
874                 printf("<ethaddr> not set. Validating first E-fuse MAC\n");
875
876                 if (is_valid_ethaddr(mac_addr))
877                         eth_setenv_enetaddr("ethaddr", mac_addr);
878         }
879
880         mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
881         mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
882         mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
883         mac_addr[1] = (mac_hi & 0xFF00) >> 8;
884         mac_addr[2] = mac_hi & 0xFF;
885         mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
886         mac_addr[4] = (mac_lo & 0xFF00) >> 8;
887         mac_addr[5] = mac_lo & 0xFF;
888
889         if (!getenv("eth1addr")) {
890                 if (is_valid_ethaddr(mac_addr))
891                         eth_setenv_enetaddr("eth1addr", mac_addr);
892         }
893
894         ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
895         ctrl_val |= 0x22;
896         writel(ctrl_val, (*ctrl)->control_core_control_io1);
897
898         /* The phy address for the AM57xx IDK are different than x15 */
899         if (board_is_am572x_idk() || board_is_am571x_idk()) {
900                 cpsw_data.slave_data[0].phy_addr = 0;
901                 cpsw_data.slave_data[1].phy_addr = 1;
902         }
903
904         ret = cpsw_register(&cpsw_data);
905         if (ret < 0)
906                 printf("Error %d registering CPSW switch\n", ret);
907
908         /*
909          * Export any Ethernet MAC addresses from EEPROM.
910          * On AM57xx the 2 MAC addresses define the address range
911          */
912         board_ti_get_eth_mac_addr(0, mac_addr1);
913         board_ti_get_eth_mac_addr(1, mac_addr2);
914
915         if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
916                 mac1 = mac_to_u64(mac_addr1);
917                 mac2 = mac_to_u64(mac_addr2);
918
919                 /* must contain an address range */
920                 num_macs = mac2 - mac1 + 1;
921                 /* <= 50 to protect against user programming error */
922                 if (num_macs > 0 && num_macs <= 50) {
923                         for (i = 0; i < num_macs; i++) {
924                                 u64_to_mac(mac1 + i, mac_addr);
925                                 if (is_valid_ethaddr(mac_addr)) {
926                                         eth_setenv_enetaddr_by_index("eth",
927                                                                      i + 2,
928                                                                      mac_addr);
929                                 }
930                         }
931                 }
932         }
933
934         return ret;
935 }
936 #endif
937
938 #ifdef CONFIG_BOARD_EARLY_INIT_F
939 /* VTT regulator enable */
940 static inline void vtt_regulator_enable(void)
941 {
942         if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
943                 return;
944
945         gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
946         gpio_direction_output(GPIO_DDR_VTT_EN, 1);
947 }
948
949 int board_early_init_f(void)
950 {
951         vtt_regulator_enable();
952         return 0;
953 }
954 #endif
955
956 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
957 int ft_board_setup(void *blob, bd_t *bd)
958 {
959         ft_cpu_setup(blob, bd);
960
961         return 0;
962 }
963 #endif
964
965 #ifdef CONFIG_SPL_LOAD_FIT
966 int board_fit_config_name_match(const char *name)
967 {
968         if (board_is_x15()) {
969                 if (board_is_x15_revb1()) {
970                         if (!strcmp(name, "am57xx-beagle-x15-revb1"))
971                                 return 0;
972                 } else if (!strcmp(name, "am57xx-beagle-x15")) {
973                         return 0;
974                 }
975         } else if (board_is_am572x_evm() &&
976                    !strcmp(name, "am57xx-beagle-x15")) {
977                 return 0;
978         } else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk")) {
979                 return 0;
980         } else if (board_is_am571x_idk() && !strcmp(name, "am571x-idk")) {
981                 return 0;
982         }
983
984         return -1;
985 }
986 #endif
987
988 #ifdef CONFIG_TI_SECURE_DEVICE
989 void board_fit_image_post_process(void **p_image, size_t *p_size)
990 {
991         secure_boot_verify_image(p_image, p_size);
992 }
993
994 void board_tee_image_process(ulong tee_image, size_t tee_size)
995 {
996         secure_tee_install((u32)tee_image);
997 }
998
999 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
1000 #endif