blob: 0431cd46067004738c6b0aac96473ebcc3ffb796 [file] [log] [blame]
Lokesh Vutlafbf27282013-07-30 11:36:27 +05301/*
2 * board.c
3 *
4 * Board functions for TI AM43XX based boards
5 *
6 * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
7 *
8 * SPDX-License-Identifier: GPL-2.0+
9 */
10
11#include <common.h>
Alex Kiernan9925f1d2018-04-01 09:22:38 +000012#include <environment.h>
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053013#include <i2c.h>
Masahiro Yamada1221ce42016-09-21 11:28:55 +090014#include <linux/errno.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053015#include <spl.h>
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +053016#include <usb.h>
Madan Srinivase29878f2016-06-27 09:19:23 -050017#include <asm/omap_sec_common.h>
Lokesh Vutla3b34ac12013-07-30 11:36:29 +053018#include <asm/arch/clock.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053019#include <asm/arch/sys_proto.h>
20#include <asm/arch/mux.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053021#include <asm/arch/ddr_defs.h>
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +053022#include <asm/arch/gpio.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053023#include <asm/emif.h>
Semen Protsenko00bbe962017-06-02 18:00:00 +030024#include <asm/omap_common.h>
Nishanth Menon5f8bb932016-02-24 12:30:56 -060025#include "../common/board_detect.h"
Lokesh Vutlafbf27282013-07-30 11:36:27 +053026#include "board.h"
Tom Rini7aa55982014-06-23 16:06:29 -040027#include <power/pmic.h>
Tom Rini83bad102014-06-05 11:15:30 -040028#include <power/tps65218.h>
Felipe Balbi403d70a2014-12-22 16:26:17 -060029#include <power/tps62362.h>
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050030#include <miiphy.h>
31#include <cpsw.h>
Kishon Vijay Abraham I9f81eb72015-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 Vutlafbf27282013-07-30 11:36:27 +053036
37DECLARE_GLOBAL_DATA_PTR;
38
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050039static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050040
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053041/*
42 * Read header information from EEPROM into global structure.
43 */
Lokesh Vutla140d76a2016-10-14 10:35:25 +053044#ifdef CONFIG_TI_I2C_BOARD_DETECT
45void do_board_detect(void)
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053046{
Simon Glass64a144d2017-05-12 21:09:55 -060047 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
48 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla140d76a2016-10-14 10:35:25 +053049 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053050}
Lokesh Vutla140d76a2016-10-14 10:35:25 +053051#endif
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053052
Sourav Poddar7a5f71b2014-05-19 16:53:37 -040053#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafbf27282013-07-30 11:36:27 +053054
Lokesh Vutlacf04d032013-12-10 15:02:20 +053055const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
56 { /* 19.2 MHz */
James Doublesine2a62072014-12-22 16:26:10 -060057 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053058 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesine2a62072014-12-22 16:26:10 -060059 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
60 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
61 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
62 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053063 },
64 { /* 24 MHz */
65 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
66 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
67 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
68 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
69 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
70 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
71 },
72 { /* 25 MHz */
73 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
74 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
75 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
76 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
77 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
78 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
79 },
80 { /* 26 MHz */
81 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
82 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
83 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
84 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
85 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
86 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
87 },
88};
89
90const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -060091 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053092 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
93 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
94 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
95};
96
97const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -060098 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
99 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesinc87b6a92014-12-22 16:26:12 -0600100 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesine2a62072014-12-22 16:26:10 -0600101 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530102};
103
James Doublesine2a62072014-12-22 16:26:10 -0600104const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
105 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
106 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
107 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
108 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
109};
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530110
111const struct dpll_params gp_evm_dpll_ddr = {
James Doublesine2a62072014-12-22 16:26:10 -0600112 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530113
Felipe Balbi403d70a2014-12-22 16:26:17 -0600114static const struct dpll_params idk_dpll_ddr = {
115 400, 23, 1, -1, 2, -1, -1
116};
117
Tom Rini7c352cd2015-06-05 15:51:11 +0530118static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
119 0x00500050,
120 0x00350035,
121 0x00350035,
122 0x00350035,
123 0x00350035,
124 0x00350035,
125 0x00000000,
126 0x00000000,
127 0x00000000,
128 0x00000000,
129 0x00000000,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x40001000,
138 0x08102040
139};
140
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530141const struct ctrl_ioregs ioregs_lpddr2 = {
142 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
143 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
144 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
145 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
146 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
147 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
148 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
149 .emif_sdram_config_ext = 0x1,
150};
151
152const struct emif_regs emif_regs_lpddr2 = {
153 .sdram_config = 0x808012BA,
154 .ref_ctrl = 0x0000040D,
155 .sdram_tim1 = 0xEA86B411,
156 .sdram_tim2 = 0x103A094A,
157 .sdram_tim3 = 0x0F6BA37F,
158 .read_idle_ctrl = 0x00050000,
159 .zq_config = 0x50074BE4,
160 .temp_alert_config = 0x0,
161 .emif_rd_wr_lvl_rmp_win = 0x0,
162 .emif_rd_wr_lvl_rmp_ctl = 0x0,
163 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesine2a62072014-12-22 16:26:10 -0600164 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500165 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530166 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
167 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
168 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
169 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500170 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
171 .emif_prio_class_serv_map = 0x80000001,
172 .emif_connect_id_serv_1_map = 0x80000094,
173 .emif_connect_id_serv_2_map = 0x00000000,
174 .emif_cos_config = 0x000FFFFF
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530175};
176
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530177const struct ctrl_ioregs ioregs_ddr3 = {
178 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
179 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
180 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
181 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
182 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
183 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
184 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesine2a62072014-12-22 16:26:10 -0600185 .emif_sdram_config_ext = 0xc163,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530186};
187
188const struct emif_regs ddr3_emif_regs_400Mhz = {
189 .sdram_config = 0x638413B2,
190 .ref_ctrl = 0x00000C30,
191 .sdram_tim1 = 0xEAAAD4DB,
192 .sdram_tim2 = 0x266B7FDA,
193 .sdram_tim3 = 0x107F8678,
194 .read_idle_ctrl = 0x00050000,
195 .zq_config = 0x50074BE4,
196 .temp_alert_config = 0x0,
Lokesh Vutlae27f2dd2014-02-18 07:31:57 -0500197 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530198 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
199 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
200 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
201 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
202 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
203 .emif_rd_wr_lvl_rmp_win = 0x0,
204 .emif_rd_wr_lvl_rmp_ctl = 0x0,
205 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500206 .emif_rd_wr_exec_thresh = 0x80000405,
207 .emif_prio_class_serv_map = 0x80000001,
208 .emif_connect_id_serv_1_map = 0x80000094,
209 .emif_connect_id_serv_2_map = 0x00000000,
210 .emif_cos_config = 0x000FFFFF
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530211};
212
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500213/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
214const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
215 .sdram_config = 0x638413B2,
216 .ref_ctrl = 0x00000C30,
217 .sdram_tim1 = 0xEAAAD4DB,
218 .sdram_tim2 = 0x266B7FDA,
219 .sdram_tim3 = 0x107F8678,
220 .read_idle_ctrl = 0x00050000,
221 .zq_config = 0x50074BE4,
222 .temp_alert_config = 0x0,
223 .emif_ddr_phy_ctlr_1 = 0x0E004008,
224 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
225 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
226 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
227 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
228 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500229 .emif_rd_wr_exec_thresh = 0x80000405,
230 .emif_prio_class_serv_map = 0x80000001,
231 .emif_connect_id_serv_1_map = 0x80000094,
232 .emif_connect_id_serv_2_map = 0x00000000,
233 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500234};
235
236/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
237const struct emif_regs ddr3_emif_regs_400Mhz_production = {
238 .sdram_config = 0x638413B2,
239 .ref_ctrl = 0x00000C30,
240 .sdram_tim1 = 0xEAAAD4DB,
241 .sdram_tim2 = 0x266B7FDA,
242 .sdram_tim3 = 0x107F8678,
243 .read_idle_ctrl = 0x00050000,
244 .zq_config = 0x50074BE4,
245 .temp_alert_config = 0x0,
246 .emif_ddr_phy_ctlr_1 = 0x0E004008,
247 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
248 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
249 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
250 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
251 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500252 .emif_rd_wr_exec_thresh = 0x80000405,
253 .emif_prio_class_serv_map = 0x80000001,
254 .emif_connect_id_serv_1_map = 0x80000094,
255 .emif_connect_id_serv_2_map = 0x00000000,
256 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500257};
258
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500259static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
260 .sdram_config = 0x638413b2,
261 .sdram_config2 = 0x00000000,
262 .ref_ctrl = 0x00000c30,
263 .sdram_tim1 = 0xeaaad4db,
264 .sdram_tim2 = 0x266b7fda,
265 .sdram_tim3 = 0x107f8678,
266 .read_idle_ctrl = 0x00050000,
267 .zq_config = 0x50074be4,
268 .temp_alert_config = 0x0,
269 .emif_ddr_phy_ctlr_1 = 0x0e084008,
270 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
271 .emif_ddr_ext_phy_ctrl_2 = 0x89,
272 .emif_ddr_ext_phy_ctrl_3 = 0x90,
273 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
274 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
275 .emif_rd_wr_lvl_rmp_win = 0x0,
276 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
277 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500278 .emif_rd_wr_exec_thresh = 0x80000000,
279 .emif_prio_class_serv_map = 0x80000001,
280 .emif_connect_id_serv_1_map = 0x80000094,
281 .emif_connect_id_serv_2_map = 0x00000000,
282 .emif_cos_config = 0x000FFFFF
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500283};
284
Felipe Balbi403d70a2014-12-22 16:26:17 -0600285static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
286 .sdram_config = 0x61a11b32,
287 .sdram_config2 = 0x00000000,
288 .ref_ctrl = 0x00000c30,
289 .sdram_tim1 = 0xeaaad4db,
290 .sdram_tim2 = 0x266b7fda,
291 .sdram_tim3 = 0x107f8678,
292 .read_idle_ctrl = 0x00050000,
293 .zq_config = 0x50074be4,
294 .temp_alert_config = 0x00000000,
295 .emif_ddr_phy_ctlr_1 = 0x00008009,
296 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
297 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
298 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
299 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
300 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
301 .emif_rd_wr_lvl_rmp_win = 0x00000000,
302 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
303 .emif_rd_wr_lvl_ctl = 0x00000000,
304 .emif_rd_wr_exec_thresh = 0x00000405,
305 .emif_prio_class_serv_map = 0x00000000,
306 .emif_connect_id_serv_1_map = 0x00000000,
307 .emif_connect_id_serv_2_map = 0x00000000,
308 .emif_cos_config = 0x00ffffff
309};
310
Tom Rini7c352cd2015-06-05 15:51:11 +0530311void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
312{
313 if (board_is_eposevm()) {
314 *regs = ext_phy_ctrl_const_base_lpddr2;
315 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
316 }
317
318 return;
319}
320
James Doublesine2a62072014-12-22 16:26:10 -0600321const struct dpll_params *get_dpll_ddr_params(void)
322{
323 int ind = get_sys_clk_index();
324
325 if (board_is_eposevm())
326 return &epos_evm_dpll_ddr[ind];
Madan Srinivasa5051b72016-05-19 19:10:48 -0500327 else if (board_is_evm() || board_is_sk())
James Doublesine2a62072014-12-22 16:26:10 -0600328 return &gp_evm_dpll_ddr;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600329 else if (board_is_idk())
330 return &idk_dpll_ddr;
James Doublesine2a62072014-12-22 16:26:10 -0600331
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600332 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesine2a62072014-12-22 16:26:10 -0600333 return NULL;
334}
335
336
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530337/*
338 * get_opp_offset:
339 * Returns the index for safest OPP of the device to boot.
340 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
341 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
342 * This data is read from dev_attribute register which is e-fused.
343 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
344 * OPP available. Lowest OPP starts with min_off. So returning the
345 * bit with rightmost '0'.
346 */
347static int get_opp_offset(int max_off, int min_off)
348{
349 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rinifeca6e62014-06-05 11:15:27 -0400350 int opp, offset, i;
351
352 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
353 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530354
355 for (i = max_off; i >= min_off; i--) {
356 offset = opp & (1 << i);
357 if (!offset)
358 return i;
359 }
360
361 return min_off;
362}
363
364const struct dpll_params *get_dpll_mpu_params(void)
365{
366 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
367 u32 ind = get_sys_clk_index();
368
369 return &dpll_mpu[ind][opp];
370}
371
372const struct dpll_params *get_dpll_core_params(void)
373{
374 int ind = get_sys_clk_index();
375
376 return &dpll_core[ind];
377}
378
379const struct dpll_params *get_dpll_per_params(void)
380{
381 int ind = get_sys_clk_index();
382
383 return &dpll_per[ind];
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530384}
385
Felipe Balbi403d70a2014-12-22 16:26:17 -0600386void scale_vcores_generic(u32 m)
Tom Rini83bad102014-06-05 11:15:30 -0400387{
Tom Rini83bad102014-06-05 11:15:30 -0400388 int mpu_vdd;
Tom Rini83bad102014-06-05 11:15:30 -0400389
390 if (i2c_probe(TPS65218_CHIP_PM))
391 return;
392
Felipe Balbi403d70a2014-12-22 16:26:17 -0600393 switch (m) {
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600394 case 1000:
Tom Rini83bad102014-06-05 11:15:30 -0400395 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600396 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600397 case 800:
398 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
399 break;
400 case 720:
401 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
402 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600403 case 600:
Tom Rini83bad102014-06-05 11:15:30 -0400404 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600405 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600406 case 300:
407 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
408 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600409 default:
Tom Rini83bad102014-06-05 11:15:30 -0400410 puts("Unknown MPU clock, not scaling\n");
411 return;
412 }
413
414 /* Set DCDC1 (CORE) voltage to 1.1V */
415 if (tps65218_voltage_update(TPS65218_DCDC1,
416 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600417 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400418 return;
419 }
420
421 /* Set DCDC2 (MPU) voltage */
422 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600423 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400424 return;
425 }
Keerthyfc69d472017-06-02 15:00:31 +0530426
427 /* Set DCDC3 (DDR) voltage */
428 if (tps65218_voltage_update(TPS65218_DCDC3,
429 TPS65218_DCDC3_VOLT_SEL_1350MV)) {
430 printf("%s failure\n", __func__);
431 return;
432 }
Tom Rini83bad102014-06-05 11:15:30 -0400433}
434
Felipe Balbi403d70a2014-12-22 16:26:17 -0600435void scale_vcores_idk(u32 m)
436{
437 int mpu_vdd;
438
439 if (i2c_probe(TPS62362_I2C_ADDR))
440 return;
441
442 switch (m) {
443 case 1000:
444 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
445 break;
446 case 800:
447 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
448 break;
449 case 720:
450 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
451 break;
452 case 600:
453 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
454 break;
455 case 300:
456 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
457 break;
458 default:
459 puts("Unknown MPU clock, not scaling\n");
460 return;
461 }
462
463 /* Set VDD_MPU voltage */
464 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
465 printf("%s failure\n", __func__);
466 return;
467 }
468}
469
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600470void gpi2c_init(void)
471{
472 /* When needed to be invoked prior to BSS initialization */
473 static bool first_time = true;
474
475 if (first_time) {
476 enable_i2c0_pin_mux();
477 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
478 CONFIG_SYS_OMAP24_I2C_SLAVE);
479 first_time = false;
480 }
481}
482
Felipe Balbi403d70a2014-12-22 16:26:17 -0600483void scale_vcores(void)
484{
485 const struct dpll_params *mpu_params;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600486
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600487 /* Ensure I2C is initialized for PMIC configuration */
488 gpi2c_init();
489
Felipe Balbi403d70a2014-12-22 16:26:17 -0600490 /* Get the frequency */
491 mpu_params = get_dpll_mpu_params();
492
493 if (board_is_idk())
494 scale_vcores_idk(mpu_params->m);
495 else
496 scale_vcores_generic(mpu_params->m);
497}
498
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530499void set_uart_mux_conf(void)
500{
501 enable_uart0_pin_mux();
502}
503
504void set_mux_conf_regs(void)
505{
506 enable_board_pin_mux();
507}
508
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530509static void enable_vtt_regulator(void)
510{
511 u32 temp;
512
513 /* enable module */
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500514 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530515
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500516 /* enable output for GPIO5_7 */
517 writel(GPIO_SETDATAOUT(7),
518 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
519 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
520 temp = temp & ~(GPIO_OE_ENABLE(7));
521 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530522}
523
Tero Kristo7619bad2018-03-17 13:32:52 +0530524enum {
525 RTC_BOARD_EPOS = 1,
526 RTC_BOARD_EVM14,
527 RTC_BOARD_EVM12,
528 RTC_BOARD_GPEVM,
529 RTC_BOARD_SK,
530};
531
532/*
533 * In the rtc_only+DRR in self-refresh boot path we have the board type info
534 * in the rtc scratch pad register hence we bypass the costly i2c reads to
535 * eeprom and directly programthe board name string
536 */
537void rtc_only_update_board_type(u32 btype)
538{
539 const char *name = "";
540 const char *rev = "1.0";
541
542 switch (btype) {
543 case RTC_BOARD_EPOS:
544 name = "AM43EPOS";
545 break;
546 case RTC_BOARD_EVM14:
547 name = "AM43__GP";
548 rev = "1.4";
549 break;
550 case RTC_BOARD_EVM12:
551 name = "AM43__GP";
552 rev = "1.2";
553 break;
554 case RTC_BOARD_GPEVM:
555 name = "AM43__GP";
556 break;
557 case RTC_BOARD_SK:
558 name = "AM43__SK";
559 break;
560 }
561 ti_i2c_eeprom_am_set(name, rev);
562}
563
564u32 rtc_only_get_board_type(void)
565{
566 if (board_is_eposevm())
567 return RTC_BOARD_EPOS;
568 else if (board_is_evm_14_or_later())
569 return RTC_BOARD_EVM14;
570 else if (board_is_evm_12_or_later())
571 return RTC_BOARD_EVM12;
572 else if (board_is_gpevm())
573 return RTC_BOARD_GPEVM;
574 else if (board_is_sk())
575 return RTC_BOARD_SK;
576
577 return 0;
578}
579
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530580void sdram_init(void)
581{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530582 /*
583 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
584 * GP EMV has 1GB DDR3 connected to EMIF
585 * along with VTT regulator.
586 */
587 if (board_is_eposevm()) {
588 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500589 } else if (board_is_evm_14_or_later()) {
590 enable_vtt_regulator();
591 config_ddr(0, &ioregs_ddr3, NULL, NULL,
592 &ddr3_emif_regs_400Mhz_production, 0);
593 } else if (board_is_evm_12_or_later()) {
594 enable_vtt_regulator();
595 config_ddr(0, &ioregs_ddr3, NULL, NULL,
596 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivasa5051b72016-05-19 19:10:48 -0500597 } else if (board_is_evm()) {
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530598 enable_vtt_regulator();
599 config_ddr(0, &ioregs_ddr3, NULL, NULL,
600 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500601 } else if (board_is_sk()) {
602 config_ddr(400, &ioregs_ddr3, NULL, NULL,
603 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi403d70a2014-12-22 16:26:17 -0600604 } else if (board_is_idk()) {
605 config_ddr(400, &ioregs_ddr3, NULL, NULL,
606 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530607 }
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530608}
609#endif
610
Tom Rini7aa55982014-06-23 16:06:29 -0400611/* setup board specific PMIC */
612int power_init_board(void)
613{
614 struct pmic *p;
615
Felipe Balbi403d70a2014-12-22 16:26:17 -0600616 if (board_is_idk()) {
617 power_tps62362_init(I2C_PMIC);
618 p = pmic_get("TPS62362");
619 if (p && !pmic_probe(p))
620 puts("PMIC: TPS62362\n");
621 } else {
622 power_tps65218_init(I2C_PMIC);
623 p = pmic_get("TPS65218_PMIC");
624 if (p && !pmic_probe(p))
625 puts("PMIC: TPS65218\n");
626 }
Tom Rini7aa55982014-06-23 16:06:29 -0400627
628 return 0;
629}
630
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530631int board_init(void)
632{
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500633 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
634 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
635 modena_init0_bw_integer, modena_init0_watermark_0;
636
Lokesh Vutla369cbe12013-12-10 15:02:12 +0530637 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon guptae53ad4b2014-07-22 16:03:22 +0530638 gpmc_init();
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530639
Faiz Abbasa93feb22018-01-19 15:32:48 +0530640 /*
641 * Call this to initialize *ctrl again
642 */
643 hw_data_init();
644
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500645 /* Clear all important bits for DSS errata that may need to be tweaked*/
646 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
647 MREQPRIO_0_SAB_INIT0_MASK;
648
649 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
650
651 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
652 BW_LIMITER_BW_FRAC_MASK;
653
654 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
655 BW_LIMITER_BW_INT_MASK;
656
657 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
658 BW_LIMITER_BW_WATERMARK_MASK;
659
660 /* Setting MReq Priority of the DSS*/
661 mreqprio_0 |= 0x77;
662
663 /*
664 * Set L3 Fast Configuration Register
665 * Limiting bandwith for ARM core to 700 MBPS
666 */
667 modena_init0_bw_fractional |= 0x10;
668 modena_init0_bw_integer |= 0x3;
669
670 writel(mreqprio_0, &cdev->mreqprio_0);
671 writel(mreqprio_1, &cdev->mreqprio_1);
672
673 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
674 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
675 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
676
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530677 return 0;
678}
679
680#ifdef CONFIG_BOARD_LATE_INIT
681int board_late_init(void)
682{
Sekhar Norif4af1632013-12-10 15:02:16 +0530683#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600684 set_board_info_env(NULL);
Lokesh Vutla5d4d4362016-11-29 11:58:03 +0530685
686 /*
687 * Default FIT boot on HS devices. Non FIT images are not allowed
688 * on HS devices.
689 */
690 if (get_device_type() == HS_DEVICE)
Simon Glass382bee52017-08-03 12:22:09 -0600691 env_set("boot_fit", "1");
Sekhar Norif4af1632013-12-10 15:02:16 +0530692#endif
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530693 return 0;
694}
695#endif
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500696
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530697#ifdef CONFIG_USB_DWC3
698static struct dwc3_device usb_otg_ss1 = {
699 .maximum_speed = USB_SPEED_HIGH,
700 .base = USB_OTG_SS1_BASE,
701 .tx_fifo_resize = false,
702 .index = 0,
703};
704
705static struct dwc3_omap_device usb_otg_ss1_glue = {
706 .base = (void *)USB_OTG_SS1_GLUE_BASE,
707 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530708 .index = 0,
709};
710
711static struct ti_usb_phy_device usb_phy1_device = {
712 .usb2_phy_power = (void *)USB2_PHY1_POWER,
713 .index = 0,
714};
715
716static struct dwc3_device usb_otg_ss2 = {
717 .maximum_speed = USB_SPEED_HIGH,
718 .base = USB_OTG_SS2_BASE,
719 .tx_fifo_resize = false,
720 .index = 1,
721};
722
723static struct dwc3_omap_device usb_otg_ss2_glue = {
724 .base = (void *)USB_OTG_SS2_GLUE_BASE,
725 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530726 .index = 1,
727};
728
729static struct ti_usb_phy_device usb_phy2_device = {
730 .usb2_phy_power = (void *)USB2_PHY2_POWER,
731 .index = 1,
732};
733
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530734int usb_gadget_handle_interrupts(int index)
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530735{
736 u32 status;
737
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530738 status = dwc3_omap_uboot_interrupt_status(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530739 if (status)
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530740 dwc3_uboot_handle_interrupt(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530741
742 return 0;
743}
Roger Quadros55efadd2016-05-23 17:37:48 +0300744#endif /* CONFIG_USB_DWC3 */
745
746#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbasb16c1292018-02-15 17:12:11 +0530747int board_usb_init(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300748{
749 enable_usb_clocks(index);
750#ifdef CONFIG_USB_DWC3
751 switch (index) {
752 case 0:
753 if (init == USB_INIT_DEVICE) {
754 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
755 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
756 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
757 ti_usb_phy_uboot_init(&usb_phy1_device);
758 dwc3_uboot_init(&usb_otg_ss1);
759 }
760 break;
761 case 1:
762 if (init == USB_INIT_DEVICE) {
763 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
764 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
765 ti_usb_phy_uboot_init(&usb_phy2_device);
766 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
767 dwc3_uboot_init(&usb_otg_ss2);
768 }
769 break;
770 default:
771 printf("Invalid Controller Index\n");
772 }
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530773#endif
774
Roger Quadros55efadd2016-05-23 17:37:48 +0300775 return 0;
776}
777
Faiz Abbasb16c1292018-02-15 17:12:11 +0530778int board_usb_cleanup(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300779{
780#ifdef CONFIG_USB_DWC3
781 switch (index) {
782 case 0:
783 case 1:
784 if (init == USB_INIT_DEVICE) {
785 ti_usb_phy_uboot_exit(index);
786 dwc3_uboot_exit(index);
787 dwc3_omap_uboot_exit(index);
788 }
789 break;
790 default:
791 printf("Invalid Controller Index\n");
792 }
793#endif
794 disable_usb_clocks(index);
795
796 return 0;
797}
798#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
799
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500800#ifdef CONFIG_DRIVER_TI_CPSW
801
802static void cpsw_control(int enabled)
803{
804 /* Additional controls can be added here */
805 return;
806}
807
808static struct cpsw_slave_data cpsw_slaves[] = {
809 {
810 .slave_reg_ofs = 0x208,
811 .sliver_reg_ofs = 0xd80,
812 .phy_addr = 16,
813 },
814 {
815 .slave_reg_ofs = 0x308,
816 .sliver_reg_ofs = 0xdc0,
817 .phy_addr = 1,
818 },
819};
820
821static struct cpsw_platform_data cpsw_data = {
822 .mdio_base = CPSW_MDIO_BASE,
823 .cpsw_base = CPSW_BASE,
824 .mdio_div = 0xff,
825 .channels = 8,
826 .cpdma_reg_ofs = 0x800,
827 .slaves = 1,
828 .slave_data = cpsw_slaves,
829 .ale_reg_ofs = 0xd00,
830 .ale_entries = 1024,
831 .host_port_reg_ofs = 0x108,
832 .hw_stats_reg_ofs = 0x900,
833 .bd_ram_ofs = 0x2000,
834 .mac_control = (1 << 5),
835 .control = cpsw_control,
836 .host_port_num = 0,
837 .version = CPSW_CTRL_VERSION_2,
838};
839
840int board_eth_init(bd_t *bis)
841{
842 int rv;
843 uint8_t mac_addr[6];
844 uint32_t mac_hi, mac_lo;
845
846 /* try reading mac address from efuse */
847 mac_lo = readl(&cdev->macid0l);
848 mac_hi = readl(&cdev->macid0h);
849 mac_addr[0] = mac_hi & 0xFF;
850 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
851 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
852 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
853 mac_addr[4] = mac_lo & 0xFF;
854 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
855
Simon Glass00caae62017-08-03 12:22:12 -0600856 if (!env_get("ethaddr")) {
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500857 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500858 if (is_valid_ethaddr(mac_addr))
Simon Glassfd1e9592017-08-03 12:22:11 -0600859 eth_env_set_enetaddr("ethaddr", mac_addr);
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500860 }
861
862 mac_lo = readl(&cdev->macid1l);
863 mac_hi = readl(&cdev->macid1h);
864 mac_addr[0] = mac_hi & 0xFF;
865 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
866 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
867 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
868 mac_addr[4] = mac_lo & 0xFF;
869 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
870
Simon Glass00caae62017-08-03 12:22:12 -0600871 if (!env_get("eth1addr")) {
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500872 if (is_valid_ethaddr(mac_addr))
Simon Glassfd1e9592017-08-03 12:22:11 -0600873 eth_env_set_enetaddr("eth1addr", mac_addr);
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500874 }
875
876 if (board_is_eposevm()) {
877 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
878 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
879 cpsw_slaves[0].phy_addr = 16;
Felipe Balbi619ce622014-06-10 15:01:21 -0500880 } else if (board_is_sk()) {
881 writel(RGMII_MODE_ENABLE, &cdev->miisel);
882 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
883 cpsw_slaves[0].phy_addr = 4;
884 cpsw_slaves[1].phy_addr = 5;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600885 } else if (board_is_idk()) {
886 writel(RGMII_MODE_ENABLE, &cdev->miisel);
887 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
888 cpsw_slaves[0].phy_addr = 0;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500889 } else {
890 writel(RGMII_MODE_ENABLE, &cdev->miisel);
891 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
892 cpsw_slaves[0].phy_addr = 0;
893 }
894
895 rv = cpsw_register(&cpsw_data);
896 if (rv < 0)
897 printf("Error %d registering CPSW switch\n", rv);
898
899 return rv;
900}
901#endif
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530902
Andrew F. Davis7fe463f2017-07-10 14:45:54 -0500903#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
904int ft_board_setup(void *blob, bd_t *bd)
905{
906 ft_cpu_setup(blob, bd);
907
908 return 0;
909}
910#endif
911
Vignesh R5375a9b2018-03-26 13:27:01 +0530912#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530913int board_fit_config_name_match(const char *name)
914{
Vignesh R5375a9b2018-03-26 13:27:01 +0530915 bool eeprom_read = board_ti_was_eeprom_read();
916
917 if (!strcmp(name, "am4372-generic") && !eeprom_read)
918 return 0;
919 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530920 return 0;
921 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
922 return 0;
Lokesh Vutla7dd12832016-05-16 11:11:17 +0530923 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
924 return 0;
Lokesh Vutla54a92e12016-05-16 11:11:18 +0530925 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
926 return 0;
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530927 else
928 return -1;
929}
930#endif
Madan Srinivase29878f2016-06-27 09:19:23 -0500931
Vignesh R5375a9b2018-03-26 13:27:01 +0530932#ifdef CONFIG_DTB_RESELECT
933int embedded_dtb_select(void)
934{
935 do_board_detect();
936 fdtdec_setup();
937
938 return 0;
939}
940#endif
941
Madan Srinivase29878f2016-06-27 09:19:23 -0500942#ifdef CONFIG_TI_SECURE_DEVICE
943void board_fit_image_post_process(void **p_image, size_t *p_size)
944{
945 secure_boot_verify_image(p_image, p_size);
946}
Andrew F. Davis36300942017-07-10 14:45:53 -0500947
948void board_tee_image_process(ulong tee_image, size_t tee_size)
949{
950 secure_tee_install((u32)tee_image);
951}
952
953U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Madan Srinivase29878f2016-06-27 09:19:23 -0500954#endif