blob: 99b83d7ed19bfc98e927bcfa76243388b6beedfc [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Lokesh Vutlafaa680f2013-07-30 11:36:27 +05302/*
3 * board.c
4 *
5 * Board functions for TI AM43XX based boards
6 *
7 * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
Lokesh Vutlafaa680f2013-07-30 11:36:27 +05308 */
9
10#include <common.h>
Simon Glasseba6b8d2019-11-14 12:57:50 -070011#include <eeprom.h>
Grygorii Strashkofc97eb02019-11-22 19:26:31 +020012#include <dm/uclass.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060013#include <env.h>
Sekhar Nori2ab3c492013-12-10 15:02:15 +053014#include <i2c.h>
Simon Glassa7b51302019-11-14 12:57:46 -070015#include <init.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090016#include <linux/errno.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053017#include <spl.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053018#include <usb.h>
Madan Srinivas0b6dd122016-06-27 09:19:23 -050019#include <asm/omap_sec_common.h>
Lokesh Vutla85b59362013-07-30 11:36:29 +053020#include <asm/arch/clock.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053021#include <asm/arch/sys_proto.h>
22#include <asm/arch/mux.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053023#include <asm/arch/ddr_defs.h>
Lokesh Vutladd0037a2013-12-10 15:02:23 +053024#include <asm/arch/gpio.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053025#include <asm/emif.h>
Semen Protsenkoa8cb0222017-06-02 18:00:00 +030026#include <asm/omap_common.h>
Nishanth Menon757a9a02016-02-24 12:30:56 -060027#include "../common/board_detect.h"
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053028#include "board.h"
Tom Rini60d2f6f2014-06-23 16:06:29 -040029#include <power/pmic.h>
Tom Rini500908a2014-06-05 11:15:30 -040030#include <power/tps65218.h>
Felipe Balbi3dcd6d82014-12-22 16:26:17 -060031#include <power/tps62362.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053032#include <linux/usb/gadget.h>
33#include <dwc3-uboot.h>
34#include <dwc3-omap-uboot.h>
35#include <ti-usb-phy-uboot.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053036
37DECLARE_GLOBAL_DATA_PTR;
38
Mugunthan V Nc94f9542014-02-18 07:31:54 -050039static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V Nc94f9542014-02-18 07:31:54 -050040
Sekhar Nori2ab3c492013-12-10 15:02:15 +053041/*
42 * Read header information from EEPROM into global structure.
43 */
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053044#ifdef CONFIG_TI_I2C_BOARD_DETECT
45void do_board_detect(void)
Sekhar Nori2ab3c492013-12-10 15:02:15 +053046{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +010047 /* Ensure I2C is initialized for EEPROM access*/
48 gpi2c_init();
Simon Glass4df67572017-05-12 21:09:55 -060049 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
50 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053051 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori2ab3c492013-12-10 15:02:15 +053052}
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053053#endif
Sekhar Nori2ab3c492013-12-10 15:02:15 +053054
Sourav Poddar5248bba2014-05-19 16:53:37 -040055#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053056
Lokesh Vutla42c213a2013-12-10 15:02:20 +053057const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
58 { /* 19.2 MHz */
James Doublesin73756a82014-12-22 16:26:10 -060059 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053060 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesin73756a82014-12-22 16:26:10 -060061 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
62 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
63 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
64 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053065 },
66 { /* 24 MHz */
67 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
68 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
69 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
70 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
71 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
72 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
73 },
74 { /* 25 MHz */
75 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
76 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
77 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
78 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
79 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
80 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
81 },
82 { /* 26 MHz */
83 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
84 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
85 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
86 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
87 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
88 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
89 },
90};
91
92const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -060093 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053094 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
95 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
96 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
97};
98
99const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -0600100 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
101 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesin5fd8a6b2014-12-22 16:26:12 -0600102 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesin73756a82014-12-22 16:26:10 -0600103 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530104};
105
James Doublesin73756a82014-12-22 16:26:10 -0600106const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
107 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
108 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
109 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
110 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
111};
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530112
113const struct dpll_params gp_evm_dpll_ddr = {
James Doublesin73756a82014-12-22 16:26:10 -0600114 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530115
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600116static const struct dpll_params idk_dpll_ddr = {
117 400, 23, 1, -1, 2, -1, -1
118};
119
Tom Rinibe8d6352015-06-05 15:51:11 +0530120static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
121 0x00500050,
122 0x00350035,
123 0x00350035,
124 0x00350035,
125 0x00350035,
126 0x00350035,
127 0x00000000,
128 0x00000000,
129 0x00000000,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x00000000,
138 0x00000000,
139 0x40001000,
140 0x08102040
141};
142
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530143const struct ctrl_ioregs ioregs_lpddr2 = {
144 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
145 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
146 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
147 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
148 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
149 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
150 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
151 .emif_sdram_config_ext = 0x1,
152};
153
154const struct emif_regs emif_regs_lpddr2 = {
155 .sdram_config = 0x808012BA,
156 .ref_ctrl = 0x0000040D,
157 .sdram_tim1 = 0xEA86B411,
158 .sdram_tim2 = 0x103A094A,
159 .sdram_tim3 = 0x0F6BA37F,
160 .read_idle_ctrl = 0x00050000,
161 .zq_config = 0x50074BE4,
162 .temp_alert_config = 0x0,
163 .emif_rd_wr_lvl_rmp_win = 0x0,
164 .emif_rd_wr_lvl_rmp_ctl = 0x0,
165 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesin73756a82014-12-22 16:26:10 -0600166 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500167 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530168 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
169 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
170 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
171 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500172 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
173 .emif_prio_class_serv_map = 0x80000001,
174 .emif_connect_id_serv_1_map = 0x80000094,
175 .emif_connect_id_serv_2_map = 0x00000000,
176 .emif_cos_config = 0x000FFFFF
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530177};
178
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530179const struct ctrl_ioregs ioregs_ddr3 = {
180 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
181 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
182 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
183 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
184 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
185 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
186 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesin73756a82014-12-22 16:26:10 -0600187 .emif_sdram_config_ext = 0xc163,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530188};
189
190const struct emif_regs ddr3_emif_regs_400Mhz = {
191 .sdram_config = 0x638413B2,
192 .ref_ctrl = 0x00000C30,
193 .sdram_tim1 = 0xEAAAD4DB,
194 .sdram_tim2 = 0x266B7FDA,
195 .sdram_tim3 = 0x107F8678,
196 .read_idle_ctrl = 0x00050000,
197 .zq_config = 0x50074BE4,
198 .temp_alert_config = 0x0,
Lokesh Vutla7854d3e2014-02-18 07:31:57 -0500199 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530200 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
201 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
202 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
203 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
204 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
205 .emif_rd_wr_lvl_rmp_win = 0x0,
206 .emif_rd_wr_lvl_rmp_ctl = 0x0,
207 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500208 .emif_rd_wr_exec_thresh = 0x80000405,
209 .emif_prio_class_serv_map = 0x80000001,
210 .emif_connect_id_serv_1_map = 0x80000094,
211 .emif_connect_id_serv_2_map = 0x00000000,
212 .emif_cos_config = 0x000FFFFF
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530213};
214
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500215/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
216const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
217 .sdram_config = 0x638413B2,
218 .ref_ctrl = 0x00000C30,
219 .sdram_tim1 = 0xEAAAD4DB,
220 .sdram_tim2 = 0x266B7FDA,
221 .sdram_tim3 = 0x107F8678,
222 .read_idle_ctrl = 0x00050000,
223 .zq_config = 0x50074BE4,
224 .temp_alert_config = 0x0,
225 .emif_ddr_phy_ctlr_1 = 0x0E004008,
226 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
227 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
228 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
229 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
230 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500231 .emif_rd_wr_exec_thresh = 0x80000405,
232 .emif_prio_class_serv_map = 0x80000001,
233 .emif_connect_id_serv_1_map = 0x80000094,
234 .emif_connect_id_serv_2_map = 0x00000000,
235 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500236};
237
238/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
239const struct emif_regs ddr3_emif_regs_400Mhz_production = {
240 .sdram_config = 0x638413B2,
241 .ref_ctrl = 0x00000C30,
242 .sdram_tim1 = 0xEAAAD4DB,
243 .sdram_tim2 = 0x266B7FDA,
244 .sdram_tim3 = 0x107F8678,
245 .read_idle_ctrl = 0x00050000,
246 .zq_config = 0x50074BE4,
247 .temp_alert_config = 0x0,
Brad Griffisa2e8e422019-04-29 09:59:33 +0530248 .emif_ddr_phy_ctlr_1 = 0x00048008,
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500249 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
250 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
251 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
252 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
253 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500254 .emif_rd_wr_exec_thresh = 0x80000405,
255 .emif_prio_class_serv_map = 0x80000001,
256 .emif_connect_id_serv_1_map = 0x80000094,
257 .emif_connect_id_serv_2_map = 0x00000000,
258 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500259};
260
Felipe Balbiccc6f842014-06-10 15:01:20 -0500261static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
262 .sdram_config = 0x638413b2,
263 .sdram_config2 = 0x00000000,
264 .ref_ctrl = 0x00000c30,
265 .sdram_tim1 = 0xeaaad4db,
266 .sdram_tim2 = 0x266b7fda,
267 .sdram_tim3 = 0x107f8678,
268 .read_idle_ctrl = 0x00050000,
269 .zq_config = 0x50074be4,
270 .temp_alert_config = 0x0,
271 .emif_ddr_phy_ctlr_1 = 0x0e084008,
272 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
273 .emif_ddr_ext_phy_ctrl_2 = 0x89,
274 .emif_ddr_ext_phy_ctrl_3 = 0x90,
275 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
276 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
277 .emif_rd_wr_lvl_rmp_win = 0x0,
278 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
279 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500280 .emif_rd_wr_exec_thresh = 0x80000000,
281 .emif_prio_class_serv_map = 0x80000001,
282 .emif_connect_id_serv_1_map = 0x80000094,
283 .emif_connect_id_serv_2_map = 0x00000000,
284 .emif_cos_config = 0x000FFFFF
Felipe Balbiccc6f842014-06-10 15:01:20 -0500285};
286
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600287static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
288 .sdram_config = 0x61a11b32,
289 .sdram_config2 = 0x00000000,
290 .ref_ctrl = 0x00000c30,
291 .sdram_tim1 = 0xeaaad4db,
292 .sdram_tim2 = 0x266b7fda,
293 .sdram_tim3 = 0x107f8678,
294 .read_idle_ctrl = 0x00050000,
295 .zq_config = 0x50074be4,
296 .temp_alert_config = 0x00000000,
297 .emif_ddr_phy_ctlr_1 = 0x00008009,
298 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
299 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
300 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
301 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
302 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
303 .emif_rd_wr_lvl_rmp_win = 0x00000000,
304 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
305 .emif_rd_wr_lvl_ctl = 0x00000000,
306 .emif_rd_wr_exec_thresh = 0x00000405,
307 .emif_prio_class_serv_map = 0x00000000,
308 .emif_connect_id_serv_1_map = 0x00000000,
309 .emif_connect_id_serv_2_map = 0x00000000,
310 .emif_cos_config = 0x00ffffff
311};
312
Tom Rinibe8d6352015-06-05 15:51:11 +0530313void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
314{
315 if (board_is_eposevm()) {
316 *regs = ext_phy_ctrl_const_base_lpddr2;
317 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
318 }
319
320 return;
321}
322
James Doublesin73756a82014-12-22 16:26:10 -0600323const struct dpll_params *get_dpll_ddr_params(void)
324{
325 int ind = get_sys_clk_index();
326
327 if (board_is_eposevm())
328 return &epos_evm_dpll_ddr[ind];
Madan Srinivas36235022016-05-19 19:10:48 -0500329 else if (board_is_evm() || board_is_sk())
James Doublesin73756a82014-12-22 16:26:10 -0600330 return &gp_evm_dpll_ddr;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600331 else if (board_is_idk())
332 return &idk_dpll_ddr;
James Doublesin73756a82014-12-22 16:26:10 -0600333
Nishanth Menon757a9a02016-02-24 12:30:56 -0600334 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesin73756a82014-12-22 16:26:10 -0600335 return NULL;
336}
337
338
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530339/*
340 * get_opp_offset:
341 * Returns the index for safest OPP of the device to boot.
342 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
343 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
344 * This data is read from dev_attribute register which is e-fused.
345 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
346 * OPP available. Lowest OPP starts with min_off. So returning the
347 * bit with rightmost '0'.
348 */
349static int get_opp_offset(int max_off, int min_off)
350{
351 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rini99311d62014-06-05 11:15:27 -0400352 int opp, offset, i;
353
354 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
355 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530356
357 for (i = max_off; i >= min_off; i--) {
358 offset = opp & (1 << i);
359 if (!offset)
360 return i;
361 }
362
363 return min_off;
364}
365
366const struct dpll_params *get_dpll_mpu_params(void)
367{
368 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
369 u32 ind = get_sys_clk_index();
370
371 return &dpll_mpu[ind][opp];
372}
373
374const struct dpll_params *get_dpll_core_params(void)
375{
376 int ind = get_sys_clk_index();
377
378 return &dpll_core[ind];
379}
380
381const struct dpll_params *get_dpll_per_params(void)
382{
383 int ind = get_sys_clk_index();
384
385 return &dpll_per[ind];
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530386}
387
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600388void scale_vcores_generic(u32 m)
Tom Rini500908a2014-06-05 11:15:30 -0400389{
Keerthy00344c42018-05-02 15:06:31 +0530390 int mpu_vdd, ddr_volt;
Tom Rini500908a2014-06-05 11:15:30 -0400391
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100392#ifndef CONFIG_DM_I2C
Tom Rini500908a2014-06-05 11:15:30 -0400393 if (i2c_probe(TPS65218_CHIP_PM))
394 return;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100395#else
396 if (power_tps65218_init(0))
397 return;
398#endif
Tom Rini500908a2014-06-05 11:15:30 -0400399
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600400 switch (m) {
Felipe Balbi7948d002014-12-22 16:26:13 -0600401 case 1000:
Tom Rini500908a2014-06-05 11:15:30 -0400402 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600403 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600404 case 800:
405 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
406 break;
407 case 720:
408 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
409 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600410 case 600:
Tom Rini500908a2014-06-05 11:15:30 -0400411 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600412 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600413 case 300:
414 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
415 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600416 default:
Tom Rini500908a2014-06-05 11:15:30 -0400417 puts("Unknown MPU clock, not scaling\n");
418 return;
419 }
420
421 /* Set DCDC1 (CORE) voltage to 1.1V */
422 if (tps65218_voltage_update(TPS65218_DCDC1,
423 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600424 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400425 return;
426 }
427
428 /* Set DCDC2 (MPU) voltage */
429 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600430 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400431 return;
432 }
Keerthy6417a732017-06-02 15:00:31 +0530433
Keerthy00344c42018-05-02 15:06:31 +0530434 if (board_is_eposevm())
435 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
436 else
437 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
438
Keerthy6417a732017-06-02 15:00:31 +0530439 /* Set DCDC3 (DDR) voltage */
Keerthy00344c42018-05-02 15:06:31 +0530440 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthy6417a732017-06-02 15:00:31 +0530441 printf("%s failure\n", __func__);
442 return;
443 }
Tom Rini500908a2014-06-05 11:15:30 -0400444}
445
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600446void scale_vcores_idk(u32 m)
447{
448 int mpu_vdd;
449
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100450#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600451 if (i2c_probe(TPS62362_I2C_ADDR))
452 return;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100453#else
454 if (power_tps62362_init(0))
455 return;
456#endif
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600457
458 switch (m) {
459 case 1000:
460 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
461 break;
462 case 800:
463 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
464 break;
465 case 720:
466 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
467 break;
468 case 600:
469 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
470 break;
471 case 300:
472 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
473 break;
474 default:
475 puts("Unknown MPU clock, not scaling\n");
476 return;
477 }
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600478 /* Set VDD_MPU voltage */
479 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
480 printf("%s failure\n", __func__);
481 return;
482 }
483}
Nishanth Menon757a9a02016-02-24 12:30:56 -0600484void gpi2c_init(void)
485{
486 /* When needed to be invoked prior to BSS initialization */
487 static bool first_time = true;
488
489 if (first_time) {
490 enable_i2c0_pin_mux();
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100491#ifndef CONFIG_DM_I2C
Nishanth Menon757a9a02016-02-24 12:30:56 -0600492 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
493 CONFIG_SYS_OMAP24_I2C_SLAVE);
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100494#endif
Nishanth Menon757a9a02016-02-24 12:30:56 -0600495 first_time = false;
496 }
497}
498
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600499void scale_vcores(void)
500{
501 const struct dpll_params *mpu_params;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600502
Nishanth Menon757a9a02016-02-24 12:30:56 -0600503 /* Ensure I2C is initialized for PMIC configuration */
504 gpi2c_init();
505
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600506 /* Get the frequency */
507 mpu_params = get_dpll_mpu_params();
508
509 if (board_is_idk())
510 scale_vcores_idk(mpu_params->m);
511 else
512 scale_vcores_generic(mpu_params->m);
513}
514
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530515void set_uart_mux_conf(void)
516{
517 enable_uart0_pin_mux();
518}
519
520void set_mux_conf_regs(void)
521{
522 enable_board_pin_mux();
523}
524
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530525static void enable_vtt_regulator(void)
526{
527 u32 temp;
528
529 /* enable module */
Dave Gerlach00822ca2014-02-10 11:41:49 -0500530 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530531
Dave Gerlach00822ca2014-02-10 11:41:49 -0500532 /* enable output for GPIO5_7 */
533 writel(GPIO_SETDATAOUT(7),
534 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
535 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
536 temp = temp & ~(GPIO_OE_ENABLE(7));
537 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530538}
539
Tero Kristo5d6acae2018-03-17 13:32:52 +0530540enum {
541 RTC_BOARD_EPOS = 1,
542 RTC_BOARD_EVM14,
543 RTC_BOARD_EVM12,
544 RTC_BOARD_GPEVM,
545 RTC_BOARD_SK,
546};
547
548/*
549 * In the rtc_only+DRR in self-refresh boot path we have the board type info
550 * in the rtc scratch pad register hence we bypass the costly i2c reads to
551 * eeprom and directly programthe board name string
552 */
553void rtc_only_update_board_type(u32 btype)
554{
555 const char *name = "";
556 const char *rev = "1.0";
557
558 switch (btype) {
559 case RTC_BOARD_EPOS:
560 name = "AM43EPOS";
561 break;
562 case RTC_BOARD_EVM14:
563 name = "AM43__GP";
564 rev = "1.4";
565 break;
566 case RTC_BOARD_EVM12:
567 name = "AM43__GP";
568 rev = "1.2";
569 break;
570 case RTC_BOARD_GPEVM:
571 name = "AM43__GP";
572 break;
573 case RTC_BOARD_SK:
574 name = "AM43__SK";
575 break;
576 }
577 ti_i2c_eeprom_am_set(name, rev);
578}
579
580u32 rtc_only_get_board_type(void)
581{
582 if (board_is_eposevm())
583 return RTC_BOARD_EPOS;
584 else if (board_is_evm_14_or_later())
585 return RTC_BOARD_EVM14;
586 else if (board_is_evm_12_or_later())
587 return RTC_BOARD_EVM12;
588 else if (board_is_gpevm())
589 return RTC_BOARD_GPEVM;
590 else if (board_is_sk())
591 return RTC_BOARD_SK;
592
593 return 0;
594}
595
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530596void sdram_init(void)
597{
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530598 /*
599 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
600 * GP EMV has 1GB DDR3 connected to EMIF
601 * along with VTT regulator.
602 */
603 if (board_is_eposevm()) {
604 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500605 } else if (board_is_evm_14_or_later()) {
606 enable_vtt_regulator();
607 config_ddr(0, &ioregs_ddr3, NULL, NULL,
608 &ddr3_emif_regs_400Mhz_production, 0);
609 } else if (board_is_evm_12_or_later()) {
610 enable_vtt_regulator();
611 config_ddr(0, &ioregs_ddr3, NULL, NULL,
612 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivas36235022016-05-19 19:10:48 -0500613 } else if (board_is_evm()) {
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530614 enable_vtt_regulator();
615 config_ddr(0, &ioregs_ddr3, NULL, NULL,
616 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbiccc6f842014-06-10 15:01:20 -0500617 } else if (board_is_sk()) {
618 config_ddr(400, &ioregs_ddr3, NULL, NULL,
619 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600620 } else if (board_is_idk()) {
621 config_ddr(400, &ioregs_ddr3, NULL, NULL,
622 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530623 }
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530624}
625#endif
626
Tom Rini60d2f6f2014-06-23 16:06:29 -0400627/* setup board specific PMIC */
628int power_init_board(void)
629{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100630 int rc;
631#ifndef CONFIG_DM_I2C
632 struct pmic *p = NULL;
633#endif
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600634 if (board_is_idk()) {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100635 rc = power_tps62362_init(0);
636 if (rc)
637 goto done;
638#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600639 p = pmic_get("TPS62362");
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100640 if (!p || pmic_probe(p))
641 goto done;
642#endif
643 puts("PMIC: TPS62362\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600644 } else {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100645 rc = power_tps65218_init(0);
646 if (rc)
647 goto done;
648#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600649 p = pmic_get("TPS65218_PMIC");
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100650 if (!p || pmic_probe(p))
651 goto done;
652#endif
653 puts("PMIC: TPS65218\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600654 }
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100655done:
Tom Rini60d2f6f2014-06-23 16:06:29 -0400656 return 0;
657}
658
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530659int board_init(void)
660{
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500661 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
662 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
663 modena_init0_bw_integer, modena_init0_watermark_0;
664
Lokesh Vutlab82e6e92013-12-10 15:02:12 +0530665 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon gupta3eb6f862014-07-22 16:03:22 +0530666 gpmc_init();
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530667
Faiz Abbasd24bdf12018-01-19 15:32:48 +0530668 /*
669 * Call this to initialize *ctrl again
670 */
671 hw_data_init();
672
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500673 /* Clear all important bits for DSS errata that may need to be tweaked*/
674 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
675 MREQPRIO_0_SAB_INIT0_MASK;
676
677 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
678
679 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
680 BW_LIMITER_BW_FRAC_MASK;
681
682 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
683 BW_LIMITER_BW_INT_MASK;
684
685 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
686 BW_LIMITER_BW_WATERMARK_MASK;
687
688 /* Setting MReq Priority of the DSS*/
689 mreqprio_0 |= 0x77;
690
691 /*
692 * Set L3 Fast Configuration Register
693 * Limiting bandwith for ARM core to 700 MBPS
694 */
695 modena_init0_bw_fractional |= 0x10;
696 modena_init0_bw_integer |= 0x3;
697
698 writel(mreqprio_0, &cdev->mreqprio_0);
699 writel(mreqprio_1, &cdev->mreqprio_1);
700
701 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
702 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
703 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
704
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530705 return 0;
706}
707
708#ifdef CONFIG_BOARD_LATE_INIT
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100709#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
710static int device_okay(const char *path)
711{
712 int node;
713
714 node = fdt_path_offset(gd->fdt_blob, path);
715 if (node < 0)
716 return 0;
717
718 return fdtdec_get_is_enabled(gd->fdt_blob, node);
719}
720#endif
721
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530722int board_late_init(void)
723{
Tero Kristo30bc6d82019-09-27 19:14:28 +0300724 struct udevice *dev;
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530725#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon757a9a02016-02-24 12:30:56 -0600726 set_board_info_env(NULL);
Lokesh Vutla1eb0f542016-11-29 11:58:03 +0530727
728 /*
729 * Default FIT boot on HS devices. Non FIT images are not allowed
730 * on HS devices.
731 */
732 if (get_device_type() == HS_DEVICE)
Simon Glass6a38e412017-08-03 12:22:09 -0600733 env_set("boot_fit", "1");
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530734#endif
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100735
736#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
737 if (device_okay("/ocp/omap_dwc3@48380000"))
738 enable_usb_clocks(0);
739 if (device_okay("/ocp/omap_dwc3@483c0000"))
740 enable_usb_clocks(1);
741#endif
Tero Kristo30bc6d82019-09-27 19:14:28 +0300742
743 /* Just probe the potentially supported cdce913 device */
744 uclass_get_device(UCLASS_CLK, 0, &dev);
745
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530746 return 0;
747}
748#endif
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500749
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100750#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530751#ifdef CONFIG_USB_DWC3
752static struct dwc3_device usb_otg_ss1 = {
753 .maximum_speed = USB_SPEED_HIGH,
754 .base = USB_OTG_SS1_BASE,
755 .tx_fifo_resize = false,
756 .index = 0,
757};
758
759static struct dwc3_omap_device usb_otg_ss1_glue = {
760 .base = (void *)USB_OTG_SS1_GLUE_BASE,
761 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530762 .index = 0,
763};
764
765static struct ti_usb_phy_device usb_phy1_device = {
766 .usb2_phy_power = (void *)USB2_PHY1_POWER,
767 .index = 0,
768};
769
770static struct dwc3_device usb_otg_ss2 = {
771 .maximum_speed = USB_SPEED_HIGH,
772 .base = USB_OTG_SS2_BASE,
773 .tx_fifo_resize = false,
774 .index = 1,
775};
776
777static struct dwc3_omap_device usb_otg_ss2_glue = {
778 .base = (void *)USB_OTG_SS2_GLUE_BASE,
779 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530780 .index = 1,
781};
782
783static struct ti_usb_phy_device usb_phy2_device = {
784 .usb2_phy_power = (void *)USB2_PHY2_POWER,
785 .index = 1,
786};
787
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300788int usb_gadget_handle_interrupts(int index)
789{
790 u32 status;
791
792 status = dwc3_omap_uboot_interrupt_status(index);
793 if (status)
794 dwc3_uboot_handle_interrupt(index);
795
796 return 0;
797}
798#endif /* CONFIG_USB_DWC3 */
799
800#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbas29836a92018-02-15 17:12:11 +0530801int board_usb_init(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530802{
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530803 enable_usb_clocks(index);
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300804#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530805 switch (index) {
806 case 0:
807 if (init == USB_INIT_DEVICE) {
808 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
809 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300810 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
811 ti_usb_phy_uboot_init(&usb_phy1_device);
812 dwc3_uboot_init(&usb_otg_ss1);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530813 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530814 break;
815 case 1:
816 if (init == USB_INIT_DEVICE) {
817 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
818 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300819 ti_usb_phy_uboot_init(&usb_phy2_device);
820 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
821 dwc3_uboot_init(&usb_otg_ss2);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530822 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530823 break;
824 default:
825 printf("Invalid Controller Index\n");
826 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300827#endif
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530828
829 return 0;
830}
831
Faiz Abbas29836a92018-02-15 17:12:11 +0530832int board_usb_cleanup(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530833{
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300834#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530835 switch (index) {
836 case 0:
837 case 1:
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300838 if (init == USB_INIT_DEVICE) {
839 ti_usb_phy_uboot_exit(index);
840 dwc3_uboot_exit(index);
841 dwc3_omap_uboot_exit(index);
842 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530843 break;
844 default:
845 printf("Invalid Controller Index\n");
846 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300847#endif
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530848 disable_usb_clocks(index);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530849
850 return 0;
851}
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300852#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100853#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530854
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500855#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
856int ft_board_setup(void *blob, bd_t *bd)
857{
858 ft_cpu_setup(blob, bd);
859
860 return 0;
861}
862#endif
863
Vignesh R5a1880b2018-03-26 13:27:01 +0530864#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530865int board_fit_config_name_match(const char *name)
866{
Vignesh R5a1880b2018-03-26 13:27:01 +0530867 bool eeprom_read = board_ti_was_eeprom_read();
868
869 if (!strcmp(name, "am4372-generic") && !eeprom_read)
870 return 0;
871 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530872 return 0;
873 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
874 return 0;
Lokesh Vutla67fb6e02016-05-16 11:11:17 +0530875 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
876 return 0;
Lokesh Vutlab64e0562016-05-16 11:11:18 +0530877 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
878 return 0;
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530879 else
880 return -1;
881}
882#endif
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500883
Vignesh R5a1880b2018-03-26 13:27:01 +0530884#ifdef CONFIG_DTB_RESELECT
885int embedded_dtb_select(void)
886{
887 do_board_detect();
888 fdtdec_setup();
889
890 return 0;
891}
892#endif
893
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500894#ifdef CONFIG_TI_SECURE_DEVICE
895void board_fit_image_post_process(void **p_image, size_t *p_size)
896{
897 secure_boot_verify_image(p_image, p_size);
898}
Andrew F. Davis54523262017-07-10 14:45:53 -0500899
900void board_tee_image_process(ulong tee_image, size_t tee_size)
901{
902 secure_tee_install((u32)tee_image);
903}
904
905U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500906#endif