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