]> Git Repo - J-u-boot.git/blame - board/ti/am43xx/board.c
common: Drop net.h from common header
[J-u-boot.git] / board / ti / am43xx / board.c
CommitLineData
83d290c5 1// SPDX-License-Identifier: GPL-2.0+
fbf2728d
LV
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/
fbf2728d
LV
8 */
9
10#include <common.h>
cb3ef681 11#include <eeprom.h>
0a7886c8 12#include <dm/uclass.h>
9fb625ce 13#include <env.h>
807765b0 14#include <fdt_support.h>
9f1a8cd3 15#include <i2c.h>
5255932f 16#include <init.h>
90526e9f 17#include <net.h>
1221ce45 18#include <linux/errno.h>
fbf2728d 19#include <spl.h>
9f81eb77 20#include <usb.h>
e29878fc 21#include <asm/omap_sec_common.h>
3b34ac13 22#include <asm/arch/clock.h>
fbf2728d
LV
23#include <asm/arch/sys_proto.h>
24#include <asm/arch/mux.h>
d3daba10 25#include <asm/arch/ddr_defs.h>
b5e01eec 26#include <asm/arch/gpio.h>
d3daba10 27#include <asm/emif.h>
00bbe96e 28#include <asm/omap_common.h>
5f8bb93b 29#include "../common/board_detect.h"
fbf2728d 30#include "board.h"
7aa5598a 31#include <power/pmic.h>
83bad102 32#include <power/tps65218.h>
403d70ab 33#include <power/tps62362.h>
9f81eb77
KVA
34#include <linux/usb/gadget.h>
35#include <dwc3-uboot.h>
36#include <dwc3-omap-uboot.h>
37#include <ti-usb-phy-uboot.h>
fbf2728d
LV
38
39DECLARE_GLOBAL_DATA_PTR;
40
4cdd7fda 41static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
4cdd7fda 42
9f1a8cd3
SN
43/*
44 * Read header information from EEPROM into global structure.
45 */
140d76a9
LV
46#ifdef CONFIG_TI_I2C_BOARD_DETECT
47void do_board_detect(void)
9f1a8cd3 48{
1514244c
JJH
49 /* Ensure I2C is initialized for EEPROM access*/
50 gpi2c_init();
64a144dc
SG
51 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
52 CONFIG_EEPROM_CHIP_ADDRESS))
140d76a9 53 printf("ti_i2c_eeprom_init failed\n");
9f1a8cd3 54}
140d76a9 55#endif
9f1a8cd3 56
7a5f71bc 57#ifndef CONFIG_SKIP_LOWLEVEL_INIT
fbf2728d 58
cf04d032
LV
59const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
60 { /* 19.2 MHz */
e2a6207b 61 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
cf04d032 62 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
e2a6207b
JD
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 */
cf04d032
LV
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
94const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
e2a6207b 95 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
cf04d032
LV
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
101const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
e2a6207b
JD
102 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
103 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
c87b6a96 104 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
e2a6207b 105 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
cf04d032
LV
106};
107
e2a6207b
JD
108const 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};
cf04d032
LV
114
115const struct dpll_params gp_evm_dpll_ddr = {
e2a6207b 116 50, 2, 1, -1, 2, -1, -1};
fbf2728d 117
403d70ab
FB
118static const struct dpll_params idk_dpll_ddr = {
119 400, 23, 1, -1, 2, -1, -1
120};
121
7c352cd3
TR
122static 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
d3daba10
LV
145const 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
156const 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,
e2a6207b 168 .emif_ddr_phy_ctlr_1 = 0x0E284006,
8038b497 169 .emif_rd_wr_exec_thresh = 0x80000405,
d3daba10
LV
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,
8038b497
CJF
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
d3daba10
LV
179};
180
b5e01eec
LV
181const 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,
e2a6207b 189 .emif_sdram_config_ext = 0xc163,
b5e01eec
LV
190};
191
192const 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,
e27f2dd7 201 .emif_ddr_phy_ctlr_1 = 0x0E004008,
b5e01eec
LV
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,
8038b497
CJF
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
b5e01eec
LV
215};
216
2c952111
FCJ
217/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
218const 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,
8038b497
CJF
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
2c952111
FCJ
238};
239
240/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
241const 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,
5adcbe06 250 .emif_ddr_phy_ctlr_1 = 0x00048008,
2c952111
FCJ
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,
8038b497
CJF
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
2c952111
FCJ
261};
262
9cb9f333
FB
263static 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,
8038b497
CJF
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
9cb9f333
FB
287};
288
403d70ab
FB
289static 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
7c352cd3
TR
315void 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
e2a6207b
JD
325const 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];
a5051b72 331 else if (board_is_evm() || board_is_sk())
e2a6207b 332 return &gp_evm_dpll_ddr;
403d70ab
FB
333 else if (board_is_idk())
334 return &idk_dpll_ddr;
e2a6207b 335
5f8bb93b 336 printf(" Board '%s' not supported\n", board_ti_get_name());
e2a6207b
JD
337 return NULL;
338}
339
340
cf04d032
LV
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 */
351static int get_opp_offset(int max_off, int min_off)
352{
353 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
feca6e67
TR
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;
cf04d032
LV
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
368const 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
376const struct dpll_params *get_dpll_core_params(void)
377{
378 int ind = get_sys_clk_index();
379
380 return &dpll_core[ind];
381}
382
383const struct dpll_params *get_dpll_per_params(void)
384{
385 int ind = get_sys_clk_index();
386
387 return &dpll_per[ind];
fbf2728d
LV
388}
389
403d70ab 390void scale_vcores_generic(u32 m)
83bad102 391{
ebf48500 392 int mpu_vdd, ddr_volt;
83bad102 393
1514244c 394#ifndef CONFIG_DM_I2C
83bad102
TR
395 if (i2c_probe(TPS65218_CHIP_PM))
396 return;
1514244c
JJH
397#else
398 if (power_tps65218_init(0))
399 return;
400#endif
83bad102 401
403d70ab 402 switch (m) {
068ea0a8 403 case 1000:
83bad102 404 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
068ea0a8 405 break;
d5c082a3
FB
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;
068ea0a8 412 case 600:
83bad102 413 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
068ea0a8 414 break;
d5c082a3
FB
415 case 300:
416 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
417 break;
068ea0a8 418 default:
83bad102
TR
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)) {
403d70ab 426 printf("%s failure\n", __func__);
83bad102
TR
427 return;
428 }
429
430 /* Set DCDC2 (MPU) voltage */
431 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
403d70ab 432 printf("%s failure\n", __func__);
83bad102
TR
433 return;
434 }
fc69d472 435
ebf48500
K
436 if (board_is_eposevm())
437 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
438 else
439 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
440
fc69d472 441 /* Set DCDC3 (DDR) voltage */
ebf48500 442 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
fc69d472
K
443 printf("%s failure\n", __func__);
444 return;
445 }
83bad102
TR
446}
447
403d70ab
FB
448void scale_vcores_idk(u32 m)
449{
450 int mpu_vdd;
451
1514244c 452#ifndef CONFIG_DM_I2C
403d70ab
FB
453 if (i2c_probe(TPS62362_I2C_ADDR))
454 return;
1514244c
JJH
455#else
456 if (power_tps62362_init(0))
457 return;
458#endif
403d70ab
FB
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 }
403d70ab
FB
480 /* Set VDD_MPU voltage */
481 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
482 printf("%s failure\n", __func__);
483 return;
484 }
485}
5f8bb93b
NM
486void 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();
1514244c 493#ifndef CONFIG_DM_I2C
5f8bb93b
NM
494 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
495 CONFIG_SYS_OMAP24_I2C_SLAVE);
1514244c 496#endif
5f8bb93b
NM
497 first_time = false;
498 }
499}
500
403d70ab
FB
501void scale_vcores(void)
502{
503 const struct dpll_params *mpu_params;
403d70ab 504
5f8bb93b
NM
505 /* Ensure I2C is initialized for PMIC configuration */
506 gpi2c_init();
507
403d70ab
FB
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
fbf2728d
LV
517void set_uart_mux_conf(void)
518{
519 enable_uart0_pin_mux();
520}
521
522void set_mux_conf_regs(void)
523{
524 enable_board_pin_mux();
525}
526
b5e01eec
LV
527static void enable_vtt_regulator(void)
528{
529 u32 temp;
530
531 /* enable module */
cd8341b7
DG
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);
b5e01eec
LV
540}
541
7619badb
TK
542enum {
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 */
555void 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
582u32 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
fbf2728d
LV
598void sdram_init(void)
599{
b5e01eec
LV
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);
2c952111
FCJ
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);
a5051b72 615 } else if (board_is_evm()) {
b5e01eec
LV
616 enable_vtt_regulator();
617 config_ddr(0, &ioregs_ddr3, NULL, NULL,
618 &ddr3_emif_regs_400Mhz, 0);
9cb9f333
FB
619 } else if (board_is_sk()) {
620 config_ddr(400, &ioregs_ddr3, NULL, NULL,
621 &ddr3_sk_emif_regs_400Mhz, 0);
403d70ab
FB
622 } else if (board_is_idk()) {
623 config_ddr(400, &ioregs_ddr3, NULL, NULL,
624 &ddr3_idk_emif_regs_400Mhz, 0);
b5e01eec 625 }
fbf2728d
LV
626}
627#endif
628
7aa5598a
TR
629/* setup board specific PMIC */
630int power_init_board(void)
631{
1514244c
JJH
632 int rc;
633#ifndef CONFIG_DM_I2C
634 struct pmic *p = NULL;
635#endif
403d70ab 636 if (board_is_idk()) {
1514244c
JJH
637 rc = power_tps62362_init(0);
638 if (rc)
639 goto done;
640#ifndef CONFIG_DM_I2C
403d70ab 641 p = pmic_get("TPS62362");
1514244c
JJH
642 if (!p || pmic_probe(p))
643 goto done;
644#endif
645 puts("PMIC: TPS62362\n");
403d70ab 646 } else {
1514244c
JJH
647 rc = power_tps65218_init(0);
648 if (rc)
649 goto done;
650#ifndef CONFIG_DM_I2C
403d70ab 651 p = pmic_get("TPS65218_PMIC");
1514244c
JJH
652 if (!p || pmic_probe(p))
653 goto done;
654#endif
655 puts("PMIC: TPS65218\n");
403d70ab 656 }
1514244c 657done:
7aa5598a
TR
658 return 0;
659}
660
fbf2728d
LV
661int board_init(void)
662{
8038b497
CJF
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
369cbe1e 667 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
e53ad4b4 668 gpmc_init();
fbf2728d 669
a93feb2e
FA
670 /*
671 * Call this to initialize *ctrl again
672 */
673 hw_data_init();
674
8038b497
CJF
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
fbf2728d
LV
707 return 0;
708}
709
710#ifdef CONFIG_BOARD_LATE_INIT
347631bc
JJH
711#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
712static 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
fbf2728d
LV
724int board_late_init(void)
725{
9850d4e5 726 struct udevice *dev;
f4af163e 727#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
5f8bb93b 728 set_board_info_env(NULL);
5d4d436c
LV
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)
382bee57 735 env_set("boot_fit", "1");
f4af163e 736#endif
347631bc
JJH
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
9850d4e5
TK
744
745 /* Just probe the potentially supported cdce913 device */
746 uclass_get_device(UCLASS_CLK, 0, &dev);
747
fbf2728d
LV
748 return 0;
749}
750#endif
4cdd7fda 751
347631bc 752#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
9f81eb77
KVA
753#ifdef CONFIG_USB_DWC3
754static 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
761static struct dwc3_omap_device usb_otg_ss1_glue = {
762 .base = (void *)USB_OTG_SS1_GLUE_BASE,
763 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
9f81eb77
KVA
764 .index = 0,
765};
766
767static struct ti_usb_phy_device usb_phy1_device = {
768 .usb2_phy_power = (void *)USB2_PHY1_POWER,
769 .index = 0,
770};
771
772static 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
779static struct dwc3_omap_device usb_otg_ss2_glue = {
780 .base = (void *)USB_OTG_SS2_GLUE_BASE,
781 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
9f81eb77
KVA
782 .index = 1,
783};
784
785static struct ti_usb_phy_device usb_phy2_device = {
786 .usb2_phy_power = (void *)USB2_PHY2_POWER,
787 .index = 1,
788};
789
55efadde
RQ
790int 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)
b16c129c 803int board_usb_init(int index, enum usb_init_type init)
9f81eb77 804{
6f1af1e3 805 enable_usb_clocks(index);
55efadde 806#ifdef CONFIG_USB_DWC3
9f81eb77
KVA
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;
55efadde
RQ
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);
9f81eb77 815 }
9f81eb77
KVA
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;
55efadde
RQ
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);
9f81eb77 824 }
9f81eb77
KVA
825 break;
826 default:
827 printf("Invalid Controller Index\n");
828 }
55efadde 829#endif
9f81eb77
KVA
830
831 return 0;
832}
833
b16c129c 834int board_usb_cleanup(int index, enum usb_init_type init)
9f81eb77 835{
55efadde 836#ifdef CONFIG_USB_DWC3
9f81eb77
KVA
837 switch (index) {
838 case 0:
839 case 1:
55efadde
RQ
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 }
9f81eb77
KVA
845 break;
846 default:
847 printf("Invalid Controller Index\n");
848 }
55efadde 849#endif
6f1af1e3 850 disable_usb_clocks(index);
9f81eb77
KVA
851
852 return 0;
853}
55efadde 854#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
347631bc 855#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
9f81eb77 856
7fe463f5
AD
857#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
858int ft_board_setup(void *blob, bd_t *bd)
859{
860 ft_cpu_setup(blob, bd);
861
862 return 0;
863}
864#endif
865
5375a9b5 866#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
5a3775a4
LV
867int board_fit_config_name_match(const char *name)
868{
5375a9b5
V
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"))
5a3775a4
LV
874 return 0;
875 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
876 return 0;
7dd12830
LV
877 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
878 return 0;
54a92e1a
LV
879 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
880 return 0;
5a3775a4
LV
881 else
882 return -1;
883}
884#endif
e29878fc 885
5375a9b5
V
886#ifdef CONFIG_DTB_RESELECT
887int embedded_dtb_select(void)
888{
889 do_board_detect();
890 fdtdec_setup();
891
892 return 0;
893}
894#endif
895
e29878fc
MS
896#ifdef CONFIG_TI_SECURE_DEVICE
897void board_fit_image_post_process(void **p_image, size_t *p_size)
898{
899 secure_boot_verify_image(p_image, p_size);
900}
3630094c
AD
901
902void board_tee_image_process(ulong tee_image, size_t tee_size)
903{
904 secure_tee_install((u32)tee_image);
905}
906
907U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
e29878fc 908#endif
This page took 0.517943 seconds and 4 git commands to generate.