part: Drop disk_partition_t typedef
[oweals/u-boot.git] / board / ti / am43xx / board.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * board.c
4  *
5  * Board functions for TI AM43XX based boards
6  *
7  * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
8  */
9
10 #include <common.h>
11 #include <eeprom.h>
12 #include <dm/uclass.h>
13 #include <env.h>
14 #include <fdt_support.h>
15 #include <i2c.h>
16 #include <init.h>
17 #include <net.h>
18 #include <linux/errno.h>
19 #include <spl.h>
20 #include <usb.h>
21 #include <asm/omap_sec_common.h>
22 #include <asm/arch/clock.h>
23 #include <asm/arch/sys_proto.h>
24 #include <asm/arch/mux.h>
25 #include <asm/arch/ddr_defs.h>
26 #include <asm/arch/gpio.h>
27 #include <asm/emif.h>
28 #include <asm/omap_common.h>
29 #include "../common/board_detect.h"
30 #include "board.h"
31 #include <power/pmic.h>
32 #include <power/tps65218.h>
33 #include <power/tps62362.h>
34 #include <linux/usb/gadget.h>
35 #include <dwc3-uboot.h>
36 #include <dwc3-omap-uboot.h>
37 #include <ti-usb-phy-uboot.h>
38
39 DECLARE_GLOBAL_DATA_PTR;
40
41 static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
42
43 /*
44  * Read header information from EEPROM into global structure.
45  */
46 #ifdef CONFIG_TI_I2C_BOARD_DETECT
47 void do_board_detect(void)
48 {
49         /* Ensure I2C is initialized for EEPROM access*/
50         gpi2c_init();
51         if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
52                                  CONFIG_EEPROM_CHIP_ADDRESS))
53                 printf("ti_i2c_eeprom_init failed\n");
54 }
55 #endif
56
57 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
58
59 const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
60         {       /* 19.2 MHz */
61                 {125, 3, 2, -1, -1, -1, -1},    /* OPP 50 */
62                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP RESERVED */
63                 {125, 3, 1, -1, -1, -1, -1},    /* OPP 100 */
64                 {150, 3, 1, -1, -1, -1, -1},    /* OPP 120 */
65                 {125, 2, 1, -1, -1, -1, -1},    /* OPP TB */
66                 {625, 11, 1, -1, -1, -1, -1}    /* OPP NT */
67         },
68         {       /* 24 MHz */
69                 {300, 23, 1, -1, -1, -1, -1},   /* OPP 50 */
70                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP RESERVED */
71                 {600, 23, 1, -1, -1, -1, -1},   /* OPP 100 */
72                 {720, 23, 1, -1, -1, -1, -1},   /* OPP 120 */
73                 {800, 23, 1, -1, -1, -1, -1},   /* OPP TB */
74                 {1000, 23, 1, -1, -1, -1, -1}   /* OPP NT */
75         },
76         {       /* 25 MHz */
77                 {300, 24, 1, -1, -1, -1, -1},   /* OPP 50 */
78                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP RESERVED */
79                 {600, 24, 1, -1, -1, -1, -1},   /* OPP 100 */
80                 {720, 24, 1, -1, -1, -1, -1},   /* OPP 120 */
81                 {800, 24, 1, -1, -1, -1, -1},   /* OPP TB */
82                 {1000, 24, 1, -1, -1, -1, -1}   /* OPP NT */
83         },
84         {       /* 26 MHz */
85                 {300, 25, 1, -1, -1, -1, -1},   /* OPP 50 */
86                 {-1, -1, -1, -1, -1, -1, -1},   /* OPP RESERVED */
87                 {600, 25, 1, -1, -1, -1, -1},   /* OPP 100 */
88                 {720, 25, 1, -1, -1, -1, -1},   /* OPP 120 */
89                 {800, 25, 1, -1, -1, -1, -1},   /* OPP TB */
90                 {1000, 25, 1, -1, -1, -1, -1}   /* OPP NT */
91         },
92 };
93
94 const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
95                 {625, 11, -1, -1, 10, 8, 4},    /* 19.2 MHz */
96                 {1000, 23, -1, -1, 10, 8, 4},   /* 24 MHz */
97                 {1000, 24, -1, -1, 10, 8, 4},   /* 25 MHz */
98                 {1000, 25, -1, -1, 10, 8, 4}    /* 26 MHz */
99 };
100
101 const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
102                 {400, 7, 5, -1, -1, -1, -1},    /* 19.2 MHz */
103                 {400, 9, 5, -1, -1, -1, -1},    /* 24 MHz */
104                 {384, 9, 5, -1, -1, -1, -1},    /* 25 MHz */
105                 {480, 12, 5, -1, -1, -1, -1}    /* 26 MHz */
106 };
107
108 const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
109                 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
110                 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
111                 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
112                 {133, 12, 1, -1, 4, -1, -1}  /* 26 MHz */
113 };
114
115 const struct dpll_params gp_evm_dpll_ddr = {
116                 50, 2, 1, -1, 2, -1, -1};
117
118 static const struct dpll_params idk_dpll_ddr = {
119         400, 23, 1, -1, 2, -1, -1
120 };
121
122 static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
123         0x00500050,
124         0x00350035,
125         0x00350035,
126         0x00350035,
127         0x00350035,
128         0x00350035,
129         0x00000000,
130         0x00000000,
131         0x00000000,
132         0x00000000,
133         0x00000000,
134         0x00000000,
135         0x00000000,
136         0x00000000,
137         0x00000000,
138         0x00000000,
139         0x00000000,
140         0x00000000,
141         0x40001000,
142         0x08102040
143 };
144
145 const struct ctrl_ioregs ioregs_lpddr2 = {
146         .cm0ioctl               = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
147         .cm1ioctl               = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
148         .cm2ioctl               = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
149         .dt0ioctl               = LPDDR2_DATA0_IOCTRL_VALUE,
150         .dt1ioctl               = LPDDR2_DATA0_IOCTRL_VALUE,
151         .dt2ioctrl              = LPDDR2_DATA0_IOCTRL_VALUE,
152         .dt3ioctrl              = LPDDR2_DATA0_IOCTRL_VALUE,
153         .emif_sdram_config_ext  = 0x1,
154 };
155
156 const struct emif_regs emif_regs_lpddr2 = {
157         .sdram_config                   = 0x808012BA,
158         .ref_ctrl                       = 0x0000040D,
159         .sdram_tim1                     = 0xEA86B411,
160         .sdram_tim2                     = 0x103A094A,
161         .sdram_tim3                     = 0x0F6BA37F,
162         .read_idle_ctrl                 = 0x00050000,
163         .zq_config                      = 0x50074BE4,
164         .temp_alert_config              = 0x0,
165         .emif_rd_wr_lvl_rmp_win         = 0x0,
166         .emif_rd_wr_lvl_rmp_ctl         = 0x0,
167         .emif_rd_wr_lvl_ctl             = 0x0,
168         .emif_ddr_phy_ctlr_1            = 0x0E284006,
169         .emif_rd_wr_exec_thresh         = 0x80000405,
170         .emif_ddr_ext_phy_ctrl_1        = 0x04010040,
171         .emif_ddr_ext_phy_ctrl_2        = 0x00500050,
172         .emif_ddr_ext_phy_ctrl_3        = 0x00500050,
173         .emif_ddr_ext_phy_ctrl_4        = 0x00500050,
174         .emif_ddr_ext_phy_ctrl_5        = 0x00500050,
175         .emif_prio_class_serv_map       = 0x80000001,
176         .emif_connect_id_serv_1_map     = 0x80000094,
177         .emif_connect_id_serv_2_map     = 0x00000000,
178         .emif_cos_config                        = 0x000FFFFF
179 };
180
181 const struct ctrl_ioregs ioregs_ddr3 = {
182         .cm0ioctl               = DDR3_ADDRCTRL_IOCTRL_VALUE,
183         .cm1ioctl               = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
184         .cm2ioctl               = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
185         .dt0ioctl               = DDR3_DATA0_IOCTRL_VALUE,
186         .dt1ioctl               = DDR3_DATA0_IOCTRL_VALUE,
187         .dt2ioctrl              = DDR3_DATA0_IOCTRL_VALUE,
188         .dt3ioctrl              = DDR3_DATA0_IOCTRL_VALUE,
189         .emif_sdram_config_ext  = 0xc163,
190 };
191
192 const struct emif_regs ddr3_emif_regs_400Mhz = {
193         .sdram_config                   = 0x638413B2,
194         .ref_ctrl                       = 0x00000C30,
195         .sdram_tim1                     = 0xEAAAD4DB,
196         .sdram_tim2                     = 0x266B7FDA,
197         .sdram_tim3                     = 0x107F8678,
198         .read_idle_ctrl                 = 0x00050000,
199         .zq_config                      = 0x50074BE4,
200         .temp_alert_config              = 0x0,
201         .emif_ddr_phy_ctlr_1            = 0x0E004008,
202         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
203         .emif_ddr_ext_phy_ctrl_2        = 0x00400040,
204         .emif_ddr_ext_phy_ctrl_3        = 0x00400040,
205         .emif_ddr_ext_phy_ctrl_4        = 0x00400040,
206         .emif_ddr_ext_phy_ctrl_5        = 0x00400040,
207         .emif_rd_wr_lvl_rmp_win         = 0x0,
208         .emif_rd_wr_lvl_rmp_ctl         = 0x0,
209         .emif_rd_wr_lvl_ctl             = 0x0,
210         .emif_rd_wr_exec_thresh         = 0x80000405,
211         .emif_prio_class_serv_map       = 0x80000001,
212         .emif_connect_id_serv_1_map     = 0x80000094,
213         .emif_connect_id_serv_2_map     = 0x00000000,
214         .emif_cos_config                = 0x000FFFFF
215 };
216
217 /* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
218 const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
219         .sdram_config                   = 0x638413B2,
220         .ref_ctrl                       = 0x00000C30,
221         .sdram_tim1                     = 0xEAAAD4DB,
222         .sdram_tim2                     = 0x266B7FDA,
223         .sdram_tim3                     = 0x107F8678,
224         .read_idle_ctrl                 = 0x00050000,
225         .zq_config                      = 0x50074BE4,
226         .temp_alert_config              = 0x0,
227         .emif_ddr_phy_ctlr_1            = 0x0E004008,
228         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
229         .emif_ddr_ext_phy_ctrl_2        = 0x00000065,
230         .emif_ddr_ext_phy_ctrl_3        = 0x00000091,
231         .emif_ddr_ext_phy_ctrl_4        = 0x000000B5,
232         .emif_ddr_ext_phy_ctrl_5        = 0x000000E5,
233         .emif_rd_wr_exec_thresh         = 0x80000405,
234         .emif_prio_class_serv_map       = 0x80000001,
235         .emif_connect_id_serv_1_map     = 0x80000094,
236         .emif_connect_id_serv_2_map     = 0x00000000,
237         .emif_cos_config                = 0x000FFFFF
238 };
239
240 /* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
241 const struct emif_regs ddr3_emif_regs_400Mhz_production = {
242         .sdram_config                   = 0x638413B2,
243         .ref_ctrl                       = 0x00000C30,
244         .sdram_tim1                     = 0xEAAAD4DB,
245         .sdram_tim2                     = 0x266B7FDA,
246         .sdram_tim3                     = 0x107F8678,
247         .read_idle_ctrl                 = 0x00050000,
248         .zq_config                      = 0x50074BE4,
249         .temp_alert_config              = 0x0,
250         .emif_ddr_phy_ctlr_1            = 0x00048008,
251         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
252         .emif_ddr_ext_phy_ctrl_2        = 0x00000066,
253         .emif_ddr_ext_phy_ctrl_3        = 0x00000091,
254         .emif_ddr_ext_phy_ctrl_4        = 0x000000B9,
255         .emif_ddr_ext_phy_ctrl_5        = 0x000000E6,
256         .emif_rd_wr_exec_thresh         = 0x80000405,
257         .emif_prio_class_serv_map       = 0x80000001,
258         .emif_connect_id_serv_1_map     = 0x80000094,
259         .emif_connect_id_serv_2_map     = 0x00000000,
260         .emif_cos_config                = 0x000FFFFF
261 };
262
263 static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
264         .sdram_config                   = 0x638413b2,
265         .sdram_config2                  = 0x00000000,
266         .ref_ctrl                       = 0x00000c30,
267         .sdram_tim1                     = 0xeaaad4db,
268         .sdram_tim2                     = 0x266b7fda,
269         .sdram_tim3                     = 0x107f8678,
270         .read_idle_ctrl                 = 0x00050000,
271         .zq_config                      = 0x50074be4,
272         .temp_alert_config              = 0x0,
273         .emif_ddr_phy_ctlr_1            = 0x0e084008,
274         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
275         .emif_ddr_ext_phy_ctrl_2        = 0x89,
276         .emif_ddr_ext_phy_ctrl_3        = 0x90,
277         .emif_ddr_ext_phy_ctrl_4        = 0x8e,
278         .emif_ddr_ext_phy_ctrl_5        = 0x8d,
279         .emif_rd_wr_lvl_rmp_win         = 0x0,
280         .emif_rd_wr_lvl_rmp_ctl         = 0x00000000,
281         .emif_rd_wr_lvl_ctl             = 0x00000000,
282         .emif_rd_wr_exec_thresh         = 0x80000000,
283         .emif_prio_class_serv_map       = 0x80000001,
284         .emif_connect_id_serv_1_map     = 0x80000094,
285         .emif_connect_id_serv_2_map     = 0x00000000,
286         .emif_cos_config                = 0x000FFFFF
287 };
288
289 static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
290         .sdram_config                   = 0x61a11b32,
291         .sdram_config2                  = 0x00000000,
292         .ref_ctrl                       = 0x00000c30,
293         .sdram_tim1                     = 0xeaaad4db,
294         .sdram_tim2                     = 0x266b7fda,
295         .sdram_tim3                     = 0x107f8678,
296         .read_idle_ctrl                 = 0x00050000,
297         .zq_config                      = 0x50074be4,
298         .temp_alert_config              = 0x00000000,
299         .emif_ddr_phy_ctlr_1            = 0x00008009,
300         .emif_ddr_ext_phy_ctrl_1        = 0x08020080,
301         .emif_ddr_ext_phy_ctrl_2        = 0x00000040,
302         .emif_ddr_ext_phy_ctrl_3        = 0x0000003e,
303         .emif_ddr_ext_phy_ctrl_4        = 0x00000051,
304         .emif_ddr_ext_phy_ctrl_5        = 0x00000051,
305         .emif_rd_wr_lvl_rmp_win         = 0x00000000,
306         .emif_rd_wr_lvl_rmp_ctl         = 0x00000000,
307         .emif_rd_wr_lvl_ctl             = 0x00000000,
308         .emif_rd_wr_exec_thresh         = 0x00000405,
309         .emif_prio_class_serv_map       = 0x00000000,
310         .emif_connect_id_serv_1_map     = 0x00000000,
311         .emif_connect_id_serv_2_map     = 0x00000000,
312         .emif_cos_config                = 0x00ffffff
313 };
314
315 void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
316 {
317         if (board_is_eposevm()) {
318                 *regs = ext_phy_ctrl_const_base_lpddr2;
319                 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
320         }
321
322         return;
323 }
324
325 const struct dpll_params *get_dpll_ddr_params(void)
326 {
327         int ind = get_sys_clk_index();
328
329         if (board_is_eposevm())
330                 return &epos_evm_dpll_ddr[ind];
331         else if (board_is_evm() || board_is_sk())
332                 return &gp_evm_dpll_ddr;
333         else if (board_is_idk())
334                 return &idk_dpll_ddr;
335
336         printf(" Board '%s' not supported\n", board_ti_get_name());
337         return NULL;
338 }
339
340
341 /*
342  * get_opp_offset:
343  * Returns the index for safest OPP of the device to boot.
344  * max_off:     Index of the MAX OPP in DEV ATTRIBUTE register.
345  * min_off:     Index of the MIN OPP in DEV ATTRIBUTE register.
346  * This data is read from dev_attribute register which is e-fused.
347  * A'1' in bit indicates OPP disabled and not available, a '0' indicates
348  * OPP available. Lowest OPP starts with min_off. So returning the
349  * bit with rightmost '0'.
350  */
351 static int get_opp_offset(int max_off, int min_off)
352 {
353         struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
354         int opp, offset, i;
355
356         /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
357         opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
358
359         for (i = max_off; i >= min_off; i--) {
360                 offset = opp & (1 << i);
361                 if (!offset)
362                         return i;
363         }
364
365         return min_off;
366 }
367
368 const struct dpll_params *get_dpll_mpu_params(void)
369 {
370         int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
371         u32 ind = get_sys_clk_index();
372
373         return &dpll_mpu[ind][opp];
374 }
375
376 const struct dpll_params *get_dpll_core_params(void)
377 {
378         int ind = get_sys_clk_index();
379
380         return &dpll_core[ind];
381 }
382
383 const struct dpll_params *get_dpll_per_params(void)
384 {
385         int ind = get_sys_clk_index();
386
387         return &dpll_per[ind];
388 }
389
390 void scale_vcores_generic(u32 m)
391 {
392         int mpu_vdd, ddr_volt;
393
394 #ifndef CONFIG_DM_I2C
395         if (i2c_probe(TPS65218_CHIP_PM))
396                 return;
397 #else
398         if (power_tps65218_init(0))
399                 return;
400 #endif
401
402         switch (m) {
403         case 1000:
404                 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
405                 break;
406         case 800:
407                 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
408                 break;
409         case 720:
410                 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
411                 break;
412         case 600:
413                 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
414                 break;
415         case 300:
416                 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
417                 break;
418         default:
419                 puts("Unknown MPU clock, not scaling\n");
420                 return;
421         }
422
423         /* Set DCDC1 (CORE) voltage to 1.1V */
424         if (tps65218_voltage_update(TPS65218_DCDC1,
425                                     TPS65218_DCDC_VOLT_SEL_1100MV)) {
426                 printf("%s failure\n", __func__);
427                 return;
428         }
429
430         /* Set DCDC2 (MPU) voltage */
431         if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
432                 printf("%s failure\n", __func__);
433                 return;
434         }
435
436         if (board_is_eposevm())
437                 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
438         else
439                 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
440
441         /* Set DCDC3 (DDR) voltage */
442         if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
443                 printf("%s failure\n", __func__);
444                 return;
445         }
446 }
447
448 void scale_vcores_idk(u32 m)
449 {
450         int mpu_vdd;
451
452 #ifndef CONFIG_DM_I2C
453         if (i2c_probe(TPS62362_I2C_ADDR))
454                 return;
455 #else
456         if (power_tps62362_init(0))
457                 return;
458 #endif
459
460         switch (m) {
461         case 1000:
462                 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
463                 break;
464         case 800:
465                 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
466                 break;
467         case 720:
468                 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
469                 break;
470         case 600:
471                 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
472                 break;
473         case 300:
474                 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
475                 break;
476         default:
477                 puts("Unknown MPU clock, not scaling\n");
478                 return;
479         }
480         /* Set VDD_MPU voltage */
481         if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
482                 printf("%s failure\n", __func__);
483                 return;
484         }
485 }
486 void gpi2c_init(void)
487 {
488         /* When needed to be invoked prior to BSS initialization */
489         static bool first_time = true;
490
491         if (first_time) {
492                 enable_i2c0_pin_mux();
493 #ifndef CONFIG_DM_I2C
494                 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
495                          CONFIG_SYS_OMAP24_I2C_SLAVE);
496 #endif
497                 first_time = false;
498         }
499 }
500
501 void scale_vcores(void)
502 {
503         const struct dpll_params *mpu_params;
504
505         /* Ensure I2C is initialized for PMIC configuration */
506         gpi2c_init();
507
508         /* Get the frequency */
509         mpu_params = get_dpll_mpu_params();
510
511         if (board_is_idk())
512                 scale_vcores_idk(mpu_params->m);
513         else
514                 scale_vcores_generic(mpu_params->m);
515 }
516
517 void set_uart_mux_conf(void)
518 {
519         enable_uart0_pin_mux();
520 }
521
522 void set_mux_conf_regs(void)
523 {
524         enable_board_pin_mux();
525 }
526
527 static void enable_vtt_regulator(void)
528 {
529         u32 temp;
530
531         /* enable module */
532         writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
533
534         /* enable output for GPIO5_7 */
535         writel(GPIO_SETDATAOUT(7),
536                AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
537         temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
538         temp = temp & ~(GPIO_OE_ENABLE(7));
539         writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
540 }
541
542 enum {
543         RTC_BOARD_EPOS = 1,
544         RTC_BOARD_EVM14,
545         RTC_BOARD_EVM12,
546         RTC_BOARD_GPEVM,
547         RTC_BOARD_SK,
548 };
549
550 /*
551  * In the rtc_only+DRR in self-refresh boot path we have the board type info
552  * in the rtc scratch pad register hence we bypass the costly i2c reads to
553  * eeprom and directly programthe board name string
554  */
555 void rtc_only_update_board_type(u32 btype)
556 {
557         const char *name = "";
558         const char *rev = "1.0";
559
560         switch (btype) {
561         case RTC_BOARD_EPOS:
562                 name = "AM43EPOS";
563                 break;
564         case RTC_BOARD_EVM14:
565                 name = "AM43__GP";
566                 rev = "1.4";
567                 break;
568         case RTC_BOARD_EVM12:
569                 name = "AM43__GP";
570                 rev = "1.2";
571                 break;
572         case RTC_BOARD_GPEVM:
573                 name = "AM43__GP";
574                 break;
575         case RTC_BOARD_SK:
576                 name = "AM43__SK";
577                 break;
578         }
579         ti_i2c_eeprom_am_set(name, rev);
580 }
581
582 u32 rtc_only_get_board_type(void)
583 {
584         if (board_is_eposevm())
585                 return RTC_BOARD_EPOS;
586         else if (board_is_evm_14_or_later())
587                 return RTC_BOARD_EVM14;
588         else if (board_is_evm_12_or_later())
589                 return RTC_BOARD_EVM12;
590         else if (board_is_gpevm())
591                 return RTC_BOARD_GPEVM;
592         else if (board_is_sk())
593                 return RTC_BOARD_SK;
594
595         return 0;
596 }
597
598 void sdram_init(void)
599 {
600         /*
601          * EPOS EVM has 1GB LPDDR2 connected to EMIF.
602          * GP EMV has 1GB DDR3 connected to EMIF
603          * along with VTT regulator.
604          */
605         if (board_is_eposevm()) {
606                 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
607         } else if (board_is_evm_14_or_later()) {
608                 enable_vtt_regulator();
609                 config_ddr(0, &ioregs_ddr3, NULL, NULL,
610                            &ddr3_emif_regs_400Mhz_production, 0);
611         } else if (board_is_evm_12_or_later()) {
612                 enable_vtt_regulator();
613                 config_ddr(0, &ioregs_ddr3, NULL, NULL,
614                            &ddr3_emif_regs_400Mhz_beta, 0);
615         } else if (board_is_evm()) {
616                 enable_vtt_regulator();
617                 config_ddr(0, &ioregs_ddr3, NULL, NULL,
618                            &ddr3_emif_regs_400Mhz, 0);
619         } else if (board_is_sk()) {
620                 config_ddr(400, &ioregs_ddr3, NULL, NULL,
621                            &ddr3_sk_emif_regs_400Mhz, 0);
622         } else if (board_is_idk()) {
623                 config_ddr(400, &ioregs_ddr3, NULL, NULL,
624                            &ddr3_idk_emif_regs_400Mhz, 0);
625         }
626 }
627 #endif
628
629 /* setup board specific PMIC */
630 int power_init_board(void)
631 {
632         int rc;
633 #ifndef CONFIG_DM_I2C
634         struct pmic *p = NULL;
635 #endif
636         if (board_is_idk()) {
637                 rc = power_tps62362_init(0);
638                 if (rc)
639                         goto done;
640 #ifndef CONFIG_DM_I2C
641                 p = pmic_get("TPS62362");
642                 if (!p || pmic_probe(p))
643                         goto done;
644 #endif
645                 puts("PMIC:  TPS62362\n");
646         } else {
647                 rc = power_tps65218_init(0);
648                 if (rc)
649                         goto done;
650 #ifndef CONFIG_DM_I2C
651                 p = pmic_get("TPS65218_PMIC");
652                 if (!p || pmic_probe(p))
653                         goto done;
654 #endif
655                 puts("PMIC:  TPS65218\n");
656         }
657 done:
658         return 0;
659 }
660
661 int board_init(void)
662 {
663         struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
664         u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
665             modena_init0_bw_integer, modena_init0_watermark_0;
666
667         gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
668         gpmc_init();
669
670         /*
671          * Call this to initialize *ctrl again
672          */
673         hw_data_init();
674
675         /* Clear all important bits for DSS errata that may need to be tweaked*/
676         mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
677                            MREQPRIO_0_SAB_INIT0_MASK;
678
679         mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
680
681         modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
682                                            BW_LIMITER_BW_FRAC_MASK;
683
684         modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
685                                         BW_LIMITER_BW_INT_MASK;
686
687         modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
688                                          BW_LIMITER_BW_WATERMARK_MASK;
689
690         /* Setting MReq Priority of the DSS*/
691         mreqprio_0 |= 0x77;
692
693         /*
694          * Set L3 Fast Configuration Register
695          * Limiting bandwith for ARM core to 700 MBPS
696          */
697         modena_init0_bw_fractional |= 0x10;
698         modena_init0_bw_integer |= 0x3;
699
700         writel(mreqprio_0, &cdev->mreqprio_0);
701         writel(mreqprio_1, &cdev->mreqprio_1);
702
703         writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
704         writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
705         writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
706
707         return 0;
708 }
709
710 #ifdef CONFIG_BOARD_LATE_INIT
711 #if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
712 static int device_okay(const char *path)
713 {
714         int node;
715
716         node = fdt_path_offset(gd->fdt_blob, path);
717         if (node < 0)
718                 return 0;
719
720         return fdtdec_get_is_enabled(gd->fdt_blob, node);
721 }
722 #endif
723
724 int board_late_init(void)
725 {
726         struct udevice *dev;
727 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
728         set_board_info_env(NULL);
729
730         /*
731          * Default FIT boot on HS devices. Non FIT images are not allowed
732          * on HS devices.
733          */
734         if (get_device_type() == HS_DEVICE)
735                 env_set("boot_fit", "1");
736 #endif
737
738 #if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
739         if (device_okay("/ocp/omap_dwc3@48380000"))
740                 enable_usb_clocks(0);
741         if (device_okay("/ocp/omap_dwc3@483c0000"))
742                 enable_usb_clocks(1);
743 #endif
744
745         /* Just probe the potentially supported cdce913 device */
746         uclass_get_device(UCLASS_CLK, 0, &dev);
747
748         return 0;
749 }
750 #endif
751
752 #if !CONFIG_IS_ENABLED(DM_USB_GADGET)
753 #ifdef CONFIG_USB_DWC3
754 static struct dwc3_device usb_otg_ss1 = {
755         .maximum_speed = USB_SPEED_HIGH,
756         .base = USB_OTG_SS1_BASE,
757         .tx_fifo_resize = false,
758         .index = 0,
759 };
760
761 static struct dwc3_omap_device usb_otg_ss1_glue = {
762         .base = (void *)USB_OTG_SS1_GLUE_BASE,
763         .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
764         .index = 0,
765 };
766
767 static struct ti_usb_phy_device usb_phy1_device = {
768         .usb2_phy_power = (void *)USB2_PHY1_POWER,
769         .index = 0,
770 };
771
772 static struct dwc3_device usb_otg_ss2 = {
773         .maximum_speed = USB_SPEED_HIGH,
774         .base = USB_OTG_SS2_BASE,
775         .tx_fifo_resize = false,
776         .index = 1,
777 };
778
779 static struct dwc3_omap_device usb_otg_ss2_glue = {
780         .base = (void *)USB_OTG_SS2_GLUE_BASE,
781         .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
782         .index = 1,
783 };
784
785 static struct ti_usb_phy_device usb_phy2_device = {
786         .usb2_phy_power = (void *)USB2_PHY2_POWER,
787         .index = 1,
788 };
789
790 int usb_gadget_handle_interrupts(int index)
791 {
792         u32 status;
793
794         status = dwc3_omap_uboot_interrupt_status(index);
795         if (status)
796                 dwc3_uboot_handle_interrupt(index);
797
798         return 0;
799 }
800 #endif /* CONFIG_USB_DWC3 */
801
802 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
803 int board_usb_init(int index, enum usb_init_type init)
804 {
805         enable_usb_clocks(index);
806 #ifdef CONFIG_USB_DWC3
807         switch (index) {
808         case 0:
809                 if (init == USB_INIT_DEVICE) {
810                         usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
811                         usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
812                         dwc3_omap_uboot_init(&usb_otg_ss1_glue);
813                         ti_usb_phy_uboot_init(&usb_phy1_device);
814                         dwc3_uboot_init(&usb_otg_ss1);
815                 }
816                 break;
817         case 1:
818                 if (init == USB_INIT_DEVICE) {
819                         usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
820                         usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
821                         ti_usb_phy_uboot_init(&usb_phy2_device);
822                         dwc3_omap_uboot_init(&usb_otg_ss2_glue);
823                         dwc3_uboot_init(&usb_otg_ss2);
824                 }
825                 break;
826         default:
827                 printf("Invalid Controller Index\n");
828         }
829 #endif
830
831         return 0;
832 }
833
834 int board_usb_cleanup(int index, enum usb_init_type init)
835 {
836 #ifdef CONFIG_USB_DWC3
837         switch (index) {
838         case 0:
839         case 1:
840                 if (init == USB_INIT_DEVICE) {
841                         ti_usb_phy_uboot_exit(index);
842                         dwc3_uboot_exit(index);
843                         dwc3_omap_uboot_exit(index);
844                 }
845                 break;
846         default:
847                 printf("Invalid Controller Index\n");
848         }
849 #endif
850         disable_usb_clocks(index);
851
852         return 0;
853 }
854 #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
855 #endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
856
857 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
858 int ft_board_setup(void *blob, bd_t *bd)
859 {
860         ft_cpu_setup(blob, bd);
861
862         return 0;
863 }
864 #endif
865
866 #if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
867 int board_fit_config_name_match(const char *name)
868 {
869         bool eeprom_read = board_ti_was_eeprom_read();
870
871         if (!strcmp(name, "am4372-generic") && !eeprom_read)
872                 return 0;
873         else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
874                 return 0;
875         else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
876                 return 0;
877         else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
878                 return 0;
879         else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
880                 return 0;
881         else
882                 return -1;
883 }
884 #endif
885
886 #ifdef CONFIG_DTB_RESELECT
887 int embedded_dtb_select(void)
888 {
889         do_board_detect();
890         fdtdec_setup();
891
892         return 0;
893 }
894 #endif
895
896 #ifdef CONFIG_TI_SECURE_DEVICE
897 void board_fit_image_post_process(void **p_image, size_t *p_size)
898 {
899         secure_boot_verify_image(p_image, p_size);
900 }
901
902 void board_tee_image_process(ulong tee_image, size_t tee_size)
903 {
904         secure_tee_install((u32)tee_image);
905 }
906
907 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
908 #endif