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