blob: 62ed37cb488934bd09672228a2962a8af4eff5da [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>
Grygorii Strashkofc97eb02019-11-22 19:26:31 +020013#include <dm/uclass.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060014#include <env.h>
Simon Glass3bbe70c2019-12-28 10:44:54 -070015#include <fdt_support.h>
Sekhar Nori2ab3c492013-12-10 15:02:15 +053016#include <i2c.h>
Simon Glassa7b51302019-11-14 12:57:46 -070017#include <init.h>
Simon Glass274e0b02020-05-10 11:39:56 -060018#include <net.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090019#include <linux/errno.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053020#include <spl.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053021#include <usb.h>
Madan Srinivas0b6dd122016-06-27 09:19:23 -050022#include <asm/omap_sec_common.h>
Lokesh Vutla85b59362013-07-30 11:36:29 +053023#include <asm/arch/clock.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053024#include <asm/arch/sys_proto.h>
25#include <asm/arch/mux.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053026#include <asm/arch/ddr_defs.h>
Lokesh Vutladd0037a2013-12-10 15:02:23 +053027#include <asm/arch/gpio.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053028#include <asm/emif.h>
Semen Protsenkoa8cb0222017-06-02 18:00:00 +030029#include <asm/omap_common.h>
Nishanth Menon757a9a02016-02-24 12:30:56 -060030#include "../common/board_detect.h"
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053031#include "board.h"
Tom Rini60d2f6f2014-06-23 16:06:29 -040032#include <power/pmic.h>
Tom Rini500908a2014-06-05 11:15:30 -040033#include <power/tps65218.h>
Felipe Balbi3dcd6d82014-12-22 16:26:17 -060034#include <power/tps62362.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053035#include <linux/usb/gadget.h>
36#include <dwc3-uboot.h>
37#include <dwc3-omap-uboot.h>
38#include <ti-usb-phy-uboot.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053039
40DECLARE_GLOBAL_DATA_PTR;
41
Mugunthan V Nc94f9542014-02-18 07:31:54 -050042static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V Nc94f9542014-02-18 07:31:54 -050043
Sekhar Nori2ab3c492013-12-10 15:02:15 +053044/*
45 * Read header information from EEPROM into global structure.
46 */
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053047#ifdef CONFIG_TI_I2C_BOARD_DETECT
48void do_board_detect(void)
Sekhar Nori2ab3c492013-12-10 15:02:15 +053049{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +010050 /* Ensure I2C is initialized for EEPROM access*/
51 gpi2c_init();
Simon Glass4df67572017-05-12 21:09:55 -060052 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
53 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053054 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori2ab3c492013-12-10 15:02:15 +053055}
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053056#endif
Sekhar Nori2ab3c492013-12-10 15:02:15 +053057
Sourav Poddar5248bba2014-05-19 16:53:37 -040058#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053059
Lokesh Vutla42c213a2013-12-10 15:02:20 +053060const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
61 { /* 19.2 MHz */
James Doublesin73756a82014-12-22 16:26:10 -060062 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053063 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesin73756a82014-12-22 16:26:10 -060064 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
65 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
66 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
67 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053068 },
69 { /* 24 MHz */
70 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
71 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
72 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
73 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
74 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
75 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
76 },
77 { /* 25 MHz */
78 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
79 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
80 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
81 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
82 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
83 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
84 },
85 { /* 26 MHz */
86 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
87 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
88 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
89 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
90 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
91 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
92 },
93};
94
95const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -060096 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053097 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
98 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
99 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
100};
101
102const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -0600103 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
104 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesin5fd8a6b2014-12-22 16:26:12 -0600105 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesin73756a82014-12-22 16:26:10 -0600106 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530107};
108
James Doublesin73756a82014-12-22 16:26:10 -0600109const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
110 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
111 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
112 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
113 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
114};
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530115
116const struct dpll_params gp_evm_dpll_ddr = {
James Doublesin73756a82014-12-22 16:26:10 -0600117 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530118
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600119static const struct dpll_params idk_dpll_ddr = {
120 400, 23, 1, -1, 2, -1, -1
121};
122
Tom Rinibe8d6352015-06-05 15:51:11 +0530123static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
124 0x00500050,
125 0x00350035,
126 0x00350035,
127 0x00350035,
128 0x00350035,
129 0x00350035,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x00000000,
138 0x00000000,
139 0x00000000,
140 0x00000000,
141 0x00000000,
142 0x40001000,
143 0x08102040
144};
145
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530146const struct ctrl_ioregs ioregs_lpddr2 = {
147 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
148 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
149 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
150 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
151 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
152 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
153 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
154 .emif_sdram_config_ext = 0x1,
155};
156
157const struct emif_regs emif_regs_lpddr2 = {
158 .sdram_config = 0x808012BA,
159 .ref_ctrl = 0x0000040D,
160 .sdram_tim1 = 0xEA86B411,
161 .sdram_tim2 = 0x103A094A,
162 .sdram_tim3 = 0x0F6BA37F,
163 .read_idle_ctrl = 0x00050000,
164 .zq_config = 0x50074BE4,
165 .temp_alert_config = 0x0,
166 .emif_rd_wr_lvl_rmp_win = 0x0,
167 .emif_rd_wr_lvl_rmp_ctl = 0x0,
168 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesin73756a82014-12-22 16:26:10 -0600169 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500170 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530171 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
172 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
173 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
174 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500175 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
176 .emif_prio_class_serv_map = 0x80000001,
177 .emif_connect_id_serv_1_map = 0x80000094,
178 .emif_connect_id_serv_2_map = 0x00000000,
179 .emif_cos_config = 0x000FFFFF
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530180};
181
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530182const struct ctrl_ioregs ioregs_ddr3 = {
183 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
184 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
185 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
186 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
187 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
188 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
189 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesin73756a82014-12-22 16:26:10 -0600190 .emif_sdram_config_ext = 0xc163,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530191};
192
193const struct emif_regs ddr3_emif_regs_400Mhz = {
194 .sdram_config = 0x638413B2,
195 .ref_ctrl = 0x00000C30,
196 .sdram_tim1 = 0xEAAAD4DB,
197 .sdram_tim2 = 0x266B7FDA,
198 .sdram_tim3 = 0x107F8678,
199 .read_idle_ctrl = 0x00050000,
200 .zq_config = 0x50074BE4,
201 .temp_alert_config = 0x0,
Lokesh Vutla7854d3e2014-02-18 07:31:57 -0500202 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530203 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
204 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
205 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
206 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
207 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
208 .emif_rd_wr_lvl_rmp_win = 0x0,
209 .emif_rd_wr_lvl_rmp_ctl = 0x0,
210 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500211 .emif_rd_wr_exec_thresh = 0x80000405,
212 .emif_prio_class_serv_map = 0x80000001,
213 .emif_connect_id_serv_1_map = 0x80000094,
214 .emif_connect_id_serv_2_map = 0x00000000,
215 .emif_cos_config = 0x000FFFFF
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530216};
217
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500218/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
219const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
220 .sdram_config = 0x638413B2,
221 .ref_ctrl = 0x00000C30,
222 .sdram_tim1 = 0xEAAAD4DB,
223 .sdram_tim2 = 0x266B7FDA,
224 .sdram_tim3 = 0x107F8678,
225 .read_idle_ctrl = 0x00050000,
226 .zq_config = 0x50074BE4,
227 .temp_alert_config = 0x0,
228 .emif_ddr_phy_ctlr_1 = 0x0E004008,
229 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
230 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
231 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
232 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
233 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500234 .emif_rd_wr_exec_thresh = 0x80000405,
235 .emif_prio_class_serv_map = 0x80000001,
236 .emif_connect_id_serv_1_map = 0x80000094,
237 .emif_connect_id_serv_2_map = 0x00000000,
238 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500239};
240
241/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
242const struct emif_regs ddr3_emif_regs_400Mhz_production = {
243 .sdram_config = 0x638413B2,
244 .ref_ctrl = 0x00000C30,
245 .sdram_tim1 = 0xEAAAD4DB,
246 .sdram_tim2 = 0x266B7FDA,
247 .sdram_tim3 = 0x107F8678,
248 .read_idle_ctrl = 0x00050000,
249 .zq_config = 0x50074BE4,
250 .temp_alert_config = 0x0,
Brad Griffisa2e8e422019-04-29 09:59:33 +0530251 .emif_ddr_phy_ctlr_1 = 0x00048008,
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500252 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
253 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
254 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
255 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
256 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500257 .emif_rd_wr_exec_thresh = 0x80000405,
258 .emif_prio_class_serv_map = 0x80000001,
259 .emif_connect_id_serv_1_map = 0x80000094,
260 .emif_connect_id_serv_2_map = 0x00000000,
261 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500262};
263
Felipe Balbiccc6f842014-06-10 15:01:20 -0500264static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
265 .sdram_config = 0x638413b2,
266 .sdram_config2 = 0x00000000,
267 .ref_ctrl = 0x00000c30,
268 .sdram_tim1 = 0xeaaad4db,
269 .sdram_tim2 = 0x266b7fda,
270 .sdram_tim3 = 0x107f8678,
271 .read_idle_ctrl = 0x00050000,
272 .zq_config = 0x50074be4,
273 .temp_alert_config = 0x0,
274 .emif_ddr_phy_ctlr_1 = 0x0e084008,
275 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
276 .emif_ddr_ext_phy_ctrl_2 = 0x89,
277 .emif_ddr_ext_phy_ctrl_3 = 0x90,
278 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
279 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
280 .emif_rd_wr_lvl_rmp_win = 0x0,
281 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
282 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500283 .emif_rd_wr_exec_thresh = 0x80000000,
284 .emif_prio_class_serv_map = 0x80000001,
285 .emif_connect_id_serv_1_map = 0x80000094,
286 .emif_connect_id_serv_2_map = 0x00000000,
287 .emif_cos_config = 0x000FFFFF
Felipe Balbiccc6f842014-06-10 15:01:20 -0500288};
289
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600290static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
291 .sdram_config = 0x61a11b32,
292 .sdram_config2 = 0x00000000,
293 .ref_ctrl = 0x00000c30,
294 .sdram_tim1 = 0xeaaad4db,
295 .sdram_tim2 = 0x266b7fda,
296 .sdram_tim3 = 0x107f8678,
297 .read_idle_ctrl = 0x00050000,
298 .zq_config = 0x50074be4,
299 .temp_alert_config = 0x00000000,
300 .emif_ddr_phy_ctlr_1 = 0x00008009,
301 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
302 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
303 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
304 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
305 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
306 .emif_rd_wr_lvl_rmp_win = 0x00000000,
307 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
308 .emif_rd_wr_lvl_ctl = 0x00000000,
309 .emif_rd_wr_exec_thresh = 0x00000405,
310 .emif_prio_class_serv_map = 0x00000000,
311 .emif_connect_id_serv_1_map = 0x00000000,
312 .emif_connect_id_serv_2_map = 0x00000000,
313 .emif_cos_config = 0x00ffffff
314};
315
Tom Rinibe8d6352015-06-05 15:51:11 +0530316void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
317{
318 if (board_is_eposevm()) {
319 *regs = ext_phy_ctrl_const_base_lpddr2;
320 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
321 }
322
323 return;
324}
325
James Doublesin73756a82014-12-22 16:26:10 -0600326const struct dpll_params *get_dpll_ddr_params(void)
327{
328 int ind = get_sys_clk_index();
329
330 if (board_is_eposevm())
331 return &epos_evm_dpll_ddr[ind];
Madan Srinivas36235022016-05-19 19:10:48 -0500332 else if (board_is_evm() || board_is_sk())
James Doublesin73756a82014-12-22 16:26:10 -0600333 return &gp_evm_dpll_ddr;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600334 else if (board_is_idk())
335 return &idk_dpll_ddr;
James Doublesin73756a82014-12-22 16:26:10 -0600336
Nishanth Menon757a9a02016-02-24 12:30:56 -0600337 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesin73756a82014-12-22 16:26:10 -0600338 return NULL;
339}
340
341
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530342/*
343 * get_opp_offset:
344 * Returns the index for safest OPP of the device to boot.
345 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
346 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
347 * This data is read from dev_attribute register which is e-fused.
348 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
349 * OPP available. Lowest OPP starts with min_off. So returning the
350 * bit with rightmost '0'.
351 */
352static int get_opp_offset(int max_off, int min_off)
353{
354 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rini99311d62014-06-05 11:15:27 -0400355 int opp, offset, i;
356
357 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
358 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530359
360 for (i = max_off; i >= min_off; i--) {
361 offset = opp & (1 << i);
362 if (!offset)
363 return i;
364 }
365
366 return min_off;
367}
368
369const struct dpll_params *get_dpll_mpu_params(void)
370{
371 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
372 u32 ind = get_sys_clk_index();
373
374 return &dpll_mpu[ind][opp];
375}
376
377const struct dpll_params *get_dpll_core_params(void)
378{
379 int ind = get_sys_clk_index();
380
381 return &dpll_core[ind];
382}
383
384const struct dpll_params *get_dpll_per_params(void)
385{
386 int ind = get_sys_clk_index();
387
388 return &dpll_per[ind];
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530389}
390
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600391void scale_vcores_generic(u32 m)
Tom Rini500908a2014-06-05 11:15:30 -0400392{
Keerthy00344c42018-05-02 15:06:31 +0530393 int mpu_vdd, ddr_volt;
Tom Rini500908a2014-06-05 11:15:30 -0400394
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100395#ifndef CONFIG_DM_I2C
Tom Rini500908a2014-06-05 11:15:30 -0400396 if (i2c_probe(TPS65218_CHIP_PM))
397 return;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100398#else
399 if (power_tps65218_init(0))
400 return;
401#endif
Tom Rini500908a2014-06-05 11:15:30 -0400402
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600403 switch (m) {
Felipe Balbi7948d002014-12-22 16:26:13 -0600404 case 1000:
Tom Rini500908a2014-06-05 11:15:30 -0400405 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600406 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600407 case 800:
408 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
409 break;
410 case 720:
411 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
412 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600413 case 600:
Tom Rini500908a2014-06-05 11:15:30 -0400414 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600415 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600416 case 300:
417 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
418 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600419 default:
Tom Rini500908a2014-06-05 11:15:30 -0400420 puts("Unknown MPU clock, not scaling\n");
421 return;
422 }
423
424 /* Set DCDC1 (CORE) voltage to 1.1V */
425 if (tps65218_voltage_update(TPS65218_DCDC1,
426 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600427 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400428 return;
429 }
430
431 /* Set DCDC2 (MPU) voltage */
432 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600433 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400434 return;
435 }
Keerthy6417a732017-06-02 15:00:31 +0530436
Keerthy00344c42018-05-02 15:06:31 +0530437 if (board_is_eposevm())
438 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
439 else
440 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
441
Keerthy6417a732017-06-02 15:00:31 +0530442 /* Set DCDC3 (DDR) voltage */
Keerthy00344c42018-05-02 15:06:31 +0530443 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthy6417a732017-06-02 15:00:31 +0530444 printf("%s failure\n", __func__);
445 return;
446 }
Tom Rini500908a2014-06-05 11:15:30 -0400447}
448
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600449void scale_vcores_idk(u32 m)
450{
451 int mpu_vdd;
452
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100453#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600454 if (i2c_probe(TPS62362_I2C_ADDR))
455 return;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100456#else
457 if (power_tps62362_init(0))
458 return;
459#endif
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600460
461 switch (m) {
462 case 1000:
463 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
464 break;
465 case 800:
466 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
467 break;
468 case 720:
469 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
470 break;
471 case 600:
472 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
473 break;
474 case 300:
475 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
476 break;
477 default:
478 puts("Unknown MPU clock, not scaling\n");
479 return;
480 }
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600481 /* Set VDD_MPU voltage */
482 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
483 printf("%s failure\n", __func__);
484 return;
485 }
486}
Nishanth Menon757a9a02016-02-24 12:30:56 -0600487void gpi2c_init(void)
488{
489 /* When needed to be invoked prior to BSS initialization */
490 static bool first_time = true;
491
492 if (first_time) {
493 enable_i2c0_pin_mux();
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100494#ifndef CONFIG_DM_I2C
Nishanth Menon757a9a02016-02-24 12:30:56 -0600495 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
496 CONFIG_SYS_OMAP24_I2C_SLAVE);
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100497#endif
Nishanth Menon757a9a02016-02-24 12:30:56 -0600498 first_time = false;
499 }
500}
501
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600502void scale_vcores(void)
503{
504 const struct dpll_params *mpu_params;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600505
Nishanth Menon757a9a02016-02-24 12:30:56 -0600506 /* Ensure I2C is initialized for PMIC configuration */
507 gpi2c_init();
508
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600509 /* Get the frequency */
510 mpu_params = get_dpll_mpu_params();
511
512 if (board_is_idk())
513 scale_vcores_idk(mpu_params->m);
514 else
515 scale_vcores_generic(mpu_params->m);
516}
517
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530518void set_uart_mux_conf(void)
519{
520 enable_uart0_pin_mux();
521}
522
523void set_mux_conf_regs(void)
524{
525 enable_board_pin_mux();
526}
527
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530528static void enable_vtt_regulator(void)
529{
530 u32 temp;
531
532 /* enable module */
Dave Gerlach00822ca2014-02-10 11:41:49 -0500533 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530534
Dave Gerlach00822ca2014-02-10 11:41:49 -0500535 /* enable output for GPIO5_7 */
536 writel(GPIO_SETDATAOUT(7),
537 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
538 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
539 temp = temp & ~(GPIO_OE_ENABLE(7));
540 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530541}
542
Tero Kristo5d6acae2018-03-17 13:32:52 +0530543enum {
544 RTC_BOARD_EPOS = 1,
545 RTC_BOARD_EVM14,
546 RTC_BOARD_EVM12,
547 RTC_BOARD_GPEVM,
548 RTC_BOARD_SK,
549};
550
551/*
552 * In the rtc_only+DRR in self-refresh boot path we have the board type info
553 * in the rtc scratch pad register hence we bypass the costly i2c reads to
554 * eeprom and directly programthe board name string
555 */
556void rtc_only_update_board_type(u32 btype)
557{
558 const char *name = "";
559 const char *rev = "1.0";
560
561 switch (btype) {
562 case RTC_BOARD_EPOS:
563 name = "AM43EPOS";
564 break;
565 case RTC_BOARD_EVM14:
566 name = "AM43__GP";
567 rev = "1.4";
568 break;
569 case RTC_BOARD_EVM12:
570 name = "AM43__GP";
571 rev = "1.2";
572 break;
573 case RTC_BOARD_GPEVM:
574 name = "AM43__GP";
575 break;
576 case RTC_BOARD_SK:
577 name = "AM43__SK";
578 break;
579 }
580 ti_i2c_eeprom_am_set(name, rev);
581}
582
583u32 rtc_only_get_board_type(void)
584{
585 if (board_is_eposevm())
586 return RTC_BOARD_EPOS;
587 else if (board_is_evm_14_or_later())
588 return RTC_BOARD_EVM14;
589 else if (board_is_evm_12_or_later())
590 return RTC_BOARD_EVM12;
591 else if (board_is_gpevm())
592 return RTC_BOARD_GPEVM;
593 else if (board_is_sk())
594 return RTC_BOARD_SK;
595
596 return 0;
597}
598
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530599void sdram_init(void)
600{
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530601 /*
602 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
603 * GP EMV has 1GB DDR3 connected to EMIF
604 * along with VTT regulator.
605 */
606 if (board_is_eposevm()) {
607 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500608 } else if (board_is_evm_14_or_later()) {
609 enable_vtt_regulator();
610 config_ddr(0, &ioregs_ddr3, NULL, NULL,
611 &ddr3_emif_regs_400Mhz_production, 0);
612 } else if (board_is_evm_12_or_later()) {
613 enable_vtt_regulator();
614 config_ddr(0, &ioregs_ddr3, NULL, NULL,
615 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivas36235022016-05-19 19:10:48 -0500616 } else if (board_is_evm()) {
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530617 enable_vtt_regulator();
618 config_ddr(0, &ioregs_ddr3, NULL, NULL,
619 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbiccc6f842014-06-10 15:01:20 -0500620 } else if (board_is_sk()) {
621 config_ddr(400, &ioregs_ddr3, NULL, NULL,
622 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600623 } else if (board_is_idk()) {
624 config_ddr(400, &ioregs_ddr3, NULL, NULL,
625 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530626 }
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530627}
628#endif
629
Tom Rini60d2f6f2014-06-23 16:06:29 -0400630/* setup board specific PMIC */
631int power_init_board(void)
632{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100633 int rc;
634#ifndef CONFIG_DM_I2C
635 struct pmic *p = NULL;
636#endif
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600637 if (board_is_idk()) {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100638 rc = power_tps62362_init(0);
639 if (rc)
640 goto done;
641#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600642 p = pmic_get("TPS62362");
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100643 if (!p || pmic_probe(p))
644 goto done;
645#endif
646 puts("PMIC: TPS62362\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600647 } else {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100648 rc = power_tps65218_init(0);
649 if (rc)
650 goto done;
651#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600652 p = pmic_get("TPS65218_PMIC");
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100653 if (!p || pmic_probe(p))
654 goto done;
655#endif
656 puts("PMIC: TPS65218\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600657 }
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100658done:
Tom Rini60d2f6f2014-06-23 16:06:29 -0400659 return 0;
660}
661
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530662int board_init(void)
663{
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500664 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
665 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
666 modena_init0_bw_integer, modena_init0_watermark_0;
667
Lokesh Vutlab82e6e92013-12-10 15:02:12 +0530668 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon gupta3eb6f862014-07-22 16:03:22 +0530669 gpmc_init();
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530670
Faiz Abbasd24bdf12018-01-19 15:32:48 +0530671 /*
672 * Call this to initialize *ctrl again
673 */
674 hw_data_init();
675
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500676 /* Clear all important bits for DSS errata that may need to be tweaked*/
677 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
678 MREQPRIO_0_SAB_INIT0_MASK;
679
680 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
681
682 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
683 BW_LIMITER_BW_FRAC_MASK;
684
685 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
686 BW_LIMITER_BW_INT_MASK;
687
688 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
689 BW_LIMITER_BW_WATERMARK_MASK;
690
691 /* Setting MReq Priority of the DSS*/
692 mreqprio_0 |= 0x77;
693
694 /*
695 * Set L3 Fast Configuration Register
696 * Limiting bandwith for ARM core to 700 MBPS
697 */
698 modena_init0_bw_fractional |= 0x10;
699 modena_init0_bw_integer |= 0x3;
700
701 writel(mreqprio_0, &cdev->mreqprio_0);
702 writel(mreqprio_1, &cdev->mreqprio_1);
703
704 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
705 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
706 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
707
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530708 return 0;
709}
710
711#ifdef CONFIG_BOARD_LATE_INIT
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100712#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
713static int device_okay(const char *path)
714{
715 int node;
716
717 node = fdt_path_offset(gd->fdt_blob, path);
718 if (node < 0)
719 return 0;
720
721 return fdtdec_get_is_enabled(gd->fdt_blob, node);
722}
723#endif
724
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530725int board_late_init(void)
726{
Tero Kristo30bc6d82019-09-27 19:14:28 +0300727 struct udevice *dev;
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530728#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon757a9a02016-02-24 12:30:56 -0600729 set_board_info_env(NULL);
Lokesh Vutla1eb0f542016-11-29 11:58:03 +0530730
731 /*
732 * Default FIT boot on HS devices. Non FIT images are not allowed
733 * on HS devices.
734 */
735 if (get_device_type() == HS_DEVICE)
Simon Glass6a38e412017-08-03 12:22:09 -0600736 env_set("boot_fit", "1");
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530737#endif
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100738
739#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
740 if (device_okay("/ocp/omap_dwc3@48380000"))
741 enable_usb_clocks(0);
742 if (device_okay("/ocp/omap_dwc3@483c0000"))
743 enable_usb_clocks(1);
744#endif
Tero Kristo30bc6d82019-09-27 19:14:28 +0300745
746 /* Just probe the potentially supported cdce913 device */
Dario Binacchic2de9d42020-12-30 00:16:32 +0100747 uclass_get_device_by_name(UCLASS_CLK, "cdce913@65", &dev);
Tero Kristo30bc6d82019-09-27 19:14:28 +0300748
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530749 return 0;
750}
751#endif
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500752
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100753#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530754#ifdef CONFIG_USB_DWC3
755static struct dwc3_device usb_otg_ss1 = {
756 .maximum_speed = USB_SPEED_HIGH,
757 .base = USB_OTG_SS1_BASE,
758 .tx_fifo_resize = false,
759 .index = 0,
760};
761
762static struct dwc3_omap_device usb_otg_ss1_glue = {
763 .base = (void *)USB_OTG_SS1_GLUE_BASE,
764 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530765 .index = 0,
766};
767
768static struct ti_usb_phy_device usb_phy1_device = {
769 .usb2_phy_power = (void *)USB2_PHY1_POWER,
770 .index = 0,
771};
772
773static struct dwc3_device usb_otg_ss2 = {
774 .maximum_speed = USB_SPEED_HIGH,
775 .base = USB_OTG_SS2_BASE,
776 .tx_fifo_resize = false,
777 .index = 1,
778};
779
780static struct dwc3_omap_device usb_otg_ss2_glue = {
781 .base = (void *)USB_OTG_SS2_GLUE_BASE,
782 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530783 .index = 1,
784};
785
786static struct ti_usb_phy_device usb_phy2_device = {
787 .usb2_phy_power = (void *)USB2_PHY2_POWER,
788 .index = 1,
789};
790
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300791int usb_gadget_handle_interrupts(int index)
792{
793 u32 status;
794
795 status = dwc3_omap_uboot_interrupt_status(index);
796 if (status)
797 dwc3_uboot_handle_interrupt(index);
798
799 return 0;
800}
801#endif /* CONFIG_USB_DWC3 */
802
803#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbas29836a92018-02-15 17:12:11 +0530804int board_usb_init(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530805{
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530806 enable_usb_clocks(index);
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300807#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530808 switch (index) {
809 case 0:
810 if (init == USB_INIT_DEVICE) {
811 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
812 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300813 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
814 ti_usb_phy_uboot_init(&usb_phy1_device);
815 dwc3_uboot_init(&usb_otg_ss1);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530816 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530817 break;
818 case 1:
819 if (init == USB_INIT_DEVICE) {
820 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
821 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300822 ti_usb_phy_uboot_init(&usb_phy2_device);
823 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
824 dwc3_uboot_init(&usb_otg_ss2);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530825 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530826 break;
827 default:
828 printf("Invalid Controller Index\n");
829 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300830#endif
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530831
832 return 0;
833}
834
Faiz Abbas29836a92018-02-15 17:12:11 +0530835int board_usb_cleanup(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530836{
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300837#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530838 switch (index) {
839 case 0:
840 case 1:
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300841 if (init == USB_INIT_DEVICE) {
842 ti_usb_phy_uboot_exit(index);
843 dwc3_uboot_exit(index);
844 dwc3_omap_uboot_exit(index);
845 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530846 break;
847 default:
848 printf("Invalid Controller Index\n");
849 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300850#endif
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530851 disable_usb_clocks(index);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530852
853 return 0;
854}
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300855#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100856#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530857
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500858#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900859int ft_board_setup(void *blob, struct bd_info *bd)
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500860{
861 ft_cpu_setup(blob, bd);
862
863 return 0;
864}
865#endif
866
Vignesh R5a1880b2018-03-26 13:27:01 +0530867#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530868int board_fit_config_name_match(const char *name)
869{
Vignesh R5a1880b2018-03-26 13:27:01 +0530870 bool eeprom_read = board_ti_was_eeprom_read();
871
872 if (!strcmp(name, "am4372-generic") && !eeprom_read)
873 return 0;
874 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530875 return 0;
876 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
877 return 0;
Lokesh Vutla67fb6e02016-05-16 11:11:17 +0530878 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
879 return 0;
Lokesh Vutlab64e0562016-05-16 11:11:18 +0530880 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
881 return 0;
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530882 else
883 return -1;
884}
885#endif
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500886
Vignesh R5a1880b2018-03-26 13:27:01 +0530887#ifdef CONFIG_DTB_RESELECT
888int embedded_dtb_select(void)
889{
890 do_board_detect();
891 fdtdec_setup();
892
893 return 0;
894}
895#endif
896
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500897#ifdef CONFIG_TI_SECURE_DEVICE
898void board_fit_image_post_process(void **p_image, size_t *p_size)
899{
900 secure_boot_verify_image(p_image, p_size);
901}
Andrew F. Davis54523262017-07-10 14:45:53 -0500902
903void board_tee_image_process(ulong tee_image, size_t tee_size)
904{
905 secure_tee_install((u32)tee_image);
906}
907
908U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500909#endif