blob: 529129ecc76e9939fa6989239f4677402ce55081 [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>
Simon Glass2dc9c342020-05-10 11:40:01 -060012#include <image.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060013#include <asm/global_data.h>
Grygorii Strashkofc97eb02019-11-22 19:26:31 +020014#include <dm/uclass.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060015#include <env.h>
Simon Glass3bbe70c2019-12-28 10:44:54 -070016#include <fdt_support.h>
Sekhar Nori2ab3c492013-12-10 15:02:15 +053017#include <i2c.h>
Simon Glassa7b51302019-11-14 12:57:46 -070018#include <init.h>
Simon Glass274e0b02020-05-10 11:39:56 -060019#include <net.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090020#include <linux/errno.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053021#include <spl.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053022#include <usb.h>
Madan Srinivas0b6dd122016-06-27 09:19:23 -050023#include <asm/omap_sec_common.h>
Lokesh Vutla85b59362013-07-30 11:36:29 +053024#include <asm/arch/clock.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053025#include <asm/arch/sys_proto.h>
26#include <asm/arch/mux.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053027#include <asm/arch/ddr_defs.h>
Lokesh Vutladd0037a2013-12-10 15:02:23 +053028#include <asm/arch/gpio.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053029#include <asm/emif.h>
Semen Protsenkoa8cb0222017-06-02 18:00:00 +030030#include <asm/omap_common.h>
Nishanth Menon757a9a02016-02-24 12:30:56 -060031#include "../common/board_detect.h"
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053032#include "board.h"
Tom Rini60d2f6f2014-06-23 16:06:29 -040033#include <power/pmic.h>
Tom Rini500908a2014-06-05 11:15:30 -040034#include <power/tps65218.h>
Felipe Balbi3dcd6d82014-12-22 16:26:17 -060035#include <power/tps62362.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053036#include <linux/usb/gadget.h>
37#include <dwc3-uboot.h>
38#include <dwc3-omap-uboot.h>
39#include <ti-usb-phy-uboot.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053040
41DECLARE_GLOBAL_DATA_PTR;
42
Mugunthan V Nc94f9542014-02-18 07:31:54 -050043static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V Nc94f9542014-02-18 07:31:54 -050044
Sekhar Nori2ab3c492013-12-10 15:02:15 +053045/*
46 * Read header information from EEPROM into global structure.
47 */
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053048#ifdef CONFIG_TI_I2C_BOARD_DETECT
49void do_board_detect(void)
Sekhar Nori2ab3c492013-12-10 15:02:15 +053050{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +010051 /* Ensure I2C is initialized for EEPROM access*/
52 gpi2c_init();
Simon Glass4df67572017-05-12 21:09:55 -060053 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
54 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053055 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori2ab3c492013-12-10 15:02:15 +053056}
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053057#endif
Sekhar Nori2ab3c492013-12-10 15:02:15 +053058
Tom Rinie1e85442021-08-27 21:18:30 -040059#if !CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT)
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053060
Lokesh Vutla42c213a2013-12-10 15:02:20 +053061const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
62 { /* 19.2 MHz */
James Doublesin73756a82014-12-22 16:26:10 -060063 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053064 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesin73756a82014-12-22 16:26:10 -060065 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
66 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
67 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
68 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053069 },
70 { /* 24 MHz */
71 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
72 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
73 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
74 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
75 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
76 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
77 },
78 { /* 25 MHz */
79 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
80 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
81 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
82 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
83 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
84 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
85 },
86 { /* 26 MHz */
87 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
88 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
89 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
90 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
91 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
92 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
93 },
94};
95
96const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -060097 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053098 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
99 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
100 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
101};
102
103const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -0600104 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
105 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesin5fd8a6b2014-12-22 16:26:12 -0600106 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesin73756a82014-12-22 16:26:10 -0600107 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530108};
109
James Doublesin73756a82014-12-22 16:26:10 -0600110const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
111 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
112 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
113 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
114 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
115};
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530116
117const struct dpll_params gp_evm_dpll_ddr = {
James Doublesin73756a82014-12-22 16:26:10 -0600118 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530119
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600120static const struct dpll_params idk_dpll_ddr = {
121 400, 23, 1, -1, 2, -1, -1
122};
123
Tom Rinibe8d6352015-06-05 15:51:11 +0530124static 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
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530147const 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,
James Doublesin73756a82014-12-22 16:26:10 -0600170 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500171 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530172 .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,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500176 .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
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530181};
182
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530183const 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,
James Doublesin73756a82014-12-22 16:26:10 -0600191 .emif_sdram_config_ext = 0xc163,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530192};
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,
Lokesh Vutla7854d3e2014-02-18 07:31:57 -0500203 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530204 .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,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500212 .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
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530217};
218
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500219/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
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,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500235 .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
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500240};
241
242/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
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,
Brad Griffisa2e8e422019-04-29 09:59:33 +0530252 .emif_ddr_phy_ctlr_1 = 0x00048008,
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500253 .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,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500258 .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
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500263};
264
Felipe Balbiccc6f842014-06-10 15:01:20 -0500265static 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,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500284 .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
Felipe Balbiccc6f842014-06-10 15:01:20 -0500289};
290
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600291static 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
Tom Rinibe8d6352015-06-05 15:51:11 +0530317void 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
James Doublesin73756a82014-12-22 16:26:10 -0600327const 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];
Madan Srinivas36235022016-05-19 19:10:48 -0500333 else if (board_is_evm() || board_is_sk())
James Doublesin73756a82014-12-22 16:26:10 -0600334 return &gp_evm_dpll_ddr;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600335 else if (board_is_idk())
336 return &idk_dpll_ddr;
James Doublesin73756a82014-12-22 16:26:10 -0600337
Nishanth Menon757a9a02016-02-24 12:30:56 -0600338 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesin73756a82014-12-22 16:26:10 -0600339 return NULL;
340}
341
342
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530343/*
344 * get_opp_offset:
345 * Returns the index for safest OPP of the device to boot.
346 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
347 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
348 * This data is read from dev_attribute register which is e-fused.
349 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
350 * OPP available. Lowest OPP starts with min_off. So returning the
351 * bit with rightmost '0'.
352 */
353static int get_opp_offset(int max_off, int min_off)
354{
355 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rini99311d62014-06-05 11:15:27 -0400356 int opp, offset, i;
357
358 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
359 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530360
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];
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530390}
391
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600392void scale_vcores_generic(u32 m)
Tom Rini500908a2014-06-05 11:15:30 -0400393{
Keerthy00344c42018-05-02 15:06:31 +0530394 int mpu_vdd, ddr_volt;
Tom Rini500908a2014-06-05 11:15:30 -0400395
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100396 if (power_tps65218_init(0))
397 return;
Tom Rini500908a2014-06-05 11:15:30 -0400398
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600399 switch (m) {
Felipe Balbi7948d002014-12-22 16:26:13 -0600400 case 1000:
Tom Rini500908a2014-06-05 11:15:30 -0400401 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600402 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600403 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;
Felipe Balbi7948d002014-12-22 16:26:13 -0600409 case 600:
Tom Rini500908a2014-06-05 11:15:30 -0400410 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600411 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600412 case 300:
413 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
414 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600415 default:
Tom Rini500908a2014-06-05 11:15:30 -0400416 puts("Unknown MPU clock, not scaling\n");
417 return;
418 }
419
420 /* Set DCDC1 (CORE) voltage to 1.1V */
421 if (tps65218_voltage_update(TPS65218_DCDC1,
422 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600423 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400424 return;
425 }
426
427 /* Set DCDC2 (MPU) voltage */
428 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600429 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400430 return;
431 }
Keerthy6417a732017-06-02 15:00:31 +0530432
Keerthy00344c42018-05-02 15:06:31 +0530433 if (board_is_eposevm())
434 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
435 else
436 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
437
Keerthy6417a732017-06-02 15:00:31 +0530438 /* Set DCDC3 (DDR) voltage */
Keerthy00344c42018-05-02 15:06:31 +0530439 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthy6417a732017-06-02 15:00:31 +0530440 printf("%s failure\n", __func__);
441 return;
442 }
Tom Rini500908a2014-06-05 11:15:30 -0400443}
444
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600445void scale_vcores_idk(u32 m)
446{
447 int mpu_vdd;
448
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100449 if (power_tps62362_init(0))
450 return;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600451
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 }
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600472 /* Set VDD_MPU voltage */
473 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
474 printf("%s failure\n", __func__);
475 return;
476 }
477}
Nishanth Menon757a9a02016-02-24 12:30:56 -0600478void gpi2c_init(void)
479{
480 /* When needed to be invoked prior to BSS initialization */
481 static bool first_time = true;
482
483 if (first_time) {
484 enable_i2c0_pin_mux();
Nishanth Menon757a9a02016-02-24 12:30:56 -0600485 first_time = false;
486 }
487}
488
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600489void scale_vcores(void)
490{
491 const struct dpll_params *mpu_params;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600492
Nishanth Menon757a9a02016-02-24 12:30:56 -0600493 /* Ensure I2C is initialized for PMIC configuration */
494 gpi2c_init();
495
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600496 /* Get the frequency */
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
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530505void 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
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530515static void enable_vtt_regulator(void)
516{
517 u32 temp;
518
519 /* enable module */
Dave Gerlach00822ca2014-02-10 11:41:49 -0500520 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530521
Dave Gerlach00822ca2014-02-10 11:41:49 -0500522 /* enable output for GPIO5_7 */
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);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530528}
529
Tero Kristo5d6acae2018-03-17 13:32:52 +0530530enum {
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 * In the rtc_only+DRR in self-refresh boot path we have the board type info
540 * in the rtc scratch pad register hence we bypass the costly i2c reads to
541 * eeprom and directly programthe board name string
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
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530586void sdram_init(void)
587{
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530588 /*
589 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
590 * GP EMV has 1GB DDR3 connected to EMIF
591 * along with VTT regulator.
592 */
593 if (board_is_eposevm()) {
594 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500595 } 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);
Madan Srinivas36235022016-05-19 19:10:48 -0500603 } else if (board_is_evm()) {
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530604 enable_vtt_regulator();
605 config_ddr(0, &ioregs_ddr3, NULL, NULL,
606 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbiccc6f842014-06-10 15:01:20 -0500607 } else if (board_is_sk()) {
608 config_ddr(400, &ioregs_ddr3, NULL, NULL,
609 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600610 } else if (board_is_idk()) {
611 config_ddr(400, &ioregs_ddr3, NULL, NULL,
612 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530613 }
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530614}
615#endif
616
Tom Rini60d2f6f2014-06-23 16:06:29 -0400617/* setup board specific PMIC */
618int power_init_board(void)
619{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100620 int rc;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600621 if (board_is_idk()) {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100622 rc = power_tps62362_init(0);
623 if (rc)
624 goto done;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100625 puts("PMIC: TPS62362\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600626 } else {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100627 rc = power_tps65218_init(0);
628 if (rc)
629 goto done;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100630 puts("PMIC: TPS65218\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600631 }
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100632done:
Tom Rini60d2f6f2014-06-23 16:06:29 -0400633 return 0;
634}
635
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530636int board_init(void)
637{
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500638 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
Lokesh Vutlab82e6e92013-12-10 15:02:12 +0530642 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon gupta3eb6f862014-07-22 16:03:22 +0530643 gpmc_init();
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530644
Faiz Abbasd24bdf12018-01-19 15:32:48 +0530645 /*
646 * Call this to initialize *ctrl again
647 */
648 hw_data_init();
649
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500650 /* Clear all important bits for DSS errata that may need to be tweaked*/
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 /* Setting MReq Priority of the DSS*/
666 mreqprio_0 |= 0x77;
667
668 /*
669 * Set L3 Fast Configuration Register
670 * Limiting bandwith for ARM core to 700 MBPS
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
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530682 return 0;
683}
684
685#ifdef CONFIG_BOARD_LATE_INIT
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100686#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
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530699int board_late_init(void)
700{
Tero Kristo30bc6d82019-09-27 19:14:28 +0300701 struct udevice *dev;
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530702#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon757a9a02016-02-24 12:30:56 -0600703 set_board_info_env(NULL);
Lokesh Vutla1eb0f542016-11-29 11:58:03 +0530704
705 /*
706 * Default FIT boot on HS devices. Non FIT images are not allowed
707 * on HS devices.
708 */
709 if (get_device_type() == HS_DEVICE)
Simon Glass6a38e412017-08-03 12:22:09 -0600710 env_set("boot_fit", "1");
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530711#endif
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100712
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
Tero Kristo30bc6d82019-09-27 19:14:28 +0300719
720 /* Just probe the potentially supported cdce913 device */
Dario Binacchic2de9d42020-12-30 00:16:32 +0100721 uclass_get_device_by_name(UCLASS_CLK, "cdce913@65", &dev);
Tero Kristo30bc6d82019-09-27 19:14:28 +0300722
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530723 return 0;
724}
725#endif
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500726
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100727#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530728#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,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530739 .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,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530757 .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
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300765int 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 /* CONFIG_USB_DWC3 */
776
777#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbas29836a92018-02-15 17:12:11 +0530778int board_usb_init(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530779{
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530780 enable_usb_clocks(index);
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300781#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530782 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;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300787 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
788 ti_usb_phy_uboot_init(&usb_phy1_device);
789 dwc3_uboot_init(&usb_otg_ss1);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530790 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530791 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;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300796 ti_usb_phy_uboot_init(&usb_phy2_device);
797 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
798 dwc3_uboot_init(&usb_otg_ss2);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530799 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530800 break;
801 default:
802 printf("Invalid Controller Index\n");
803 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300804#endif
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530805
806 return 0;
807}
808
Faiz Abbas29836a92018-02-15 17:12:11 +0530809int board_usb_cleanup(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530810{
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300811#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530812 switch (index) {
813 case 0:
814 case 1:
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300815 if (init == USB_INIT_DEVICE) {
816 ti_usb_phy_uboot_exit(index);
817 dwc3_uboot_exit(index);
818 dwc3_omap_uboot_exit(index);
819 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530820 break;
821 default:
822 printf("Invalid Controller Index\n");
823 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300824#endif
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530825 disable_usb_clocks(index);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530826
827 return 0;
828}
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300829#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100830#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530831
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500832#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900833int ft_board_setup(void *blob, struct bd_info *bd)
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500834{
835 ft_cpu_setup(blob, bd);
836
837 return 0;
838}
839#endif
840
Vignesh R5a1880b2018-03-26 13:27:01 +0530841#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530842int board_fit_config_name_match(const char *name)
843{
Vignesh R5a1880b2018-03-26 13:27:01 +0530844 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"))
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530849 return 0;
850 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
851 return 0;
Lokesh Vutla67fb6e02016-05-16 11:11:17 +0530852 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
853 return 0;
Lokesh Vutlab64e0562016-05-16 11:11:18 +0530854 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
855 return 0;
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530856 else
857 return -1;
858}
859#endif
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500860
Vignesh R5a1880b2018-03-26 13:27:01 +0530861#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
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500871#ifdef CONFIG_TI_SECURE_DEVICE
Lokesh Vutlab36dd3e2021-06-11 11:45:05 +0300872void board_fit_image_post_process(const void *fit, int node, void **p_image,
873 size_t *p_size)
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500874{
875 secure_boot_verify_image(p_image, p_size);
876}
Andrew F. Davis54523262017-07-10 14:45:53 -0500877
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);
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500884#endif