blob: 431372954b2a9e5bb3468b94cba0ffc4b38e7f4c [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 *
Nishanth Menoneaa39c62023-11-01 15:56:03 -05007 * Copyright (C) 2013, Texas Instruments, Incorporated - https://www.ti.com/
Lokesh Vutlafaa680f2013-07-30 11:36:27 +05308 */
9
Tom Rinidec7ea02024-05-20 13:35:03 -060010#include <config.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060011#include <asm/global_data.h>
Grygorii Strashkofc97eb02019-11-22 19:26:31 +020012#include <dm/uclass.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060013#include <env.h>
Simon Glass3bbe70c2019-12-28 10:44:54 -070014#include <fdt_support.h>
Sekhar Nori2ab3c492013-12-10 15:02:15 +053015#include <i2c.h>
Simon Glassa7b51302019-11-14 12:57:46 -070016#include <init.h>
Simon Glass274e0b02020-05-10 11:39:56 -060017#include <net.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090018#include <linux/errno.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053019#include <spl.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053020#include <usb.h>
Lokesh Vutla85b59362013-07-30 11:36:29 +053021#include <asm/arch/clock.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053022#include <asm/arch/sys_proto.h>
23#include <asm/arch/mux.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053024#include <asm/arch/ddr_defs.h>
Lokesh Vutladd0037a2013-12-10 15:02:23 +053025#include <asm/arch/gpio.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053026#include <asm/emif.h>
Semen Protsenkoa8cb0222017-06-02 18:00:00 +030027#include <asm/omap_common.h>
Nishanth Menon757a9a02016-02-24 12:30:56 -060028#include "../common/board_detect.h"
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053029#include "board.h"
Tom Rini60d2f6f2014-06-23 16:06:29 -040030#include <power/pmic.h>
Tom Rini500908a2014-06-05 11:15:30 -040031#include <power/tps65218.h>
Felipe Balbi3dcd6d82014-12-22 16:26:17 -060032#include <power/tps62362.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053033#include <linux/usb/gadget.h>
34#include <dwc3-uboot.h>
35#include <dwc3-omap-uboot.h>
36#include <ti-usb-phy-uboot.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053037
38DECLARE_GLOBAL_DATA_PTR;
39
Mugunthan V Nc94f9542014-02-18 07:31:54 -050040static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V Nc94f9542014-02-18 07:31:54 -050041
Sekhar Nori2ab3c492013-12-10 15:02:15 +053042/*
43 * Read header information from EEPROM into global structure.
44 */
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053045#ifdef CONFIG_TI_I2C_BOARD_DETECT
46void do_board_detect(void)
Sekhar Nori2ab3c492013-12-10 15:02:15 +053047{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +010048 /* Ensure I2C is initialized for EEPROM access*/
49 gpi2c_init();
Simon Glass4df67572017-05-12 21:09:55 -060050 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
51 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053052 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori2ab3c492013-12-10 15:02:15 +053053}
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053054#endif
Sekhar Nori2ab3c492013-12-10 15:02:15 +053055
Tom Rinie1e85442021-08-27 21:18:30 -040056#if !CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT)
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053057
Lokesh Vutla42c213a2013-12-10 15:02:20 +053058const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
59 { /* 19.2 MHz */
James Doublesin73756a82014-12-22 16:26:10 -060060 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053061 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesin73756a82014-12-22 16:26:10 -060062 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
63 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
64 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
65 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053066 },
67 { /* 24 MHz */
68 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
69 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
70 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
71 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
72 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
73 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
74 },
75 { /* 25 MHz */
76 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
77 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
78 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
79 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
80 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
81 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
82 },
83 { /* 26 MHz */
84 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
85 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
86 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
87 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
88 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
89 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
90 },
91};
92
93const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -060094 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053095 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
96 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
97 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
98};
99
100const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -0600101 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
102 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesin5fd8a6b2014-12-22 16:26:12 -0600103 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesin73756a82014-12-22 16:26:10 -0600104 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530105};
106
James Doublesin73756a82014-12-22 16:26:10 -0600107const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
108 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
109 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
110 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
111 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
112};
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530113
114const struct dpll_params gp_evm_dpll_ddr = {
James Doublesin73756a82014-12-22 16:26:10 -0600115 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530116
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600117static const struct dpll_params idk_dpll_ddr = {
118 400, 23, 1, -1, 2, -1, -1
119};
120
Tom Rinibe8d6352015-06-05 15:51:11 +0530121static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
122 0x00500050,
123 0x00350035,
124 0x00350035,
125 0x00350035,
126 0x00350035,
127 0x00350035,
128 0x00000000,
129 0x00000000,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x00000000,
138 0x00000000,
139 0x00000000,
140 0x40001000,
141 0x08102040
142};
143
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530144const struct ctrl_ioregs ioregs_lpddr2 = {
145 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
146 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
147 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
148 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
149 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
150 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
151 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
152 .emif_sdram_config_ext = 0x1,
153};
154
155const struct emif_regs emif_regs_lpddr2 = {
156 .sdram_config = 0x808012BA,
157 .ref_ctrl = 0x0000040D,
158 .sdram_tim1 = 0xEA86B411,
159 .sdram_tim2 = 0x103A094A,
160 .sdram_tim3 = 0x0F6BA37F,
161 .read_idle_ctrl = 0x00050000,
162 .zq_config = 0x50074BE4,
163 .temp_alert_config = 0x0,
164 .emif_rd_wr_lvl_rmp_win = 0x0,
165 .emif_rd_wr_lvl_rmp_ctl = 0x0,
166 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesin73756a82014-12-22 16:26:10 -0600167 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500168 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530169 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
170 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
171 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
172 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500173 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
174 .emif_prio_class_serv_map = 0x80000001,
175 .emif_connect_id_serv_1_map = 0x80000094,
176 .emif_connect_id_serv_2_map = 0x00000000,
177 .emif_cos_config = 0x000FFFFF
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530178};
179
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530180const struct ctrl_ioregs ioregs_ddr3 = {
181 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
182 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
183 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
184 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
185 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
186 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
187 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesin73756a82014-12-22 16:26:10 -0600188 .emif_sdram_config_ext = 0xc163,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530189};
190
191const struct emif_regs ddr3_emif_regs_400Mhz = {
192 .sdram_config = 0x638413B2,
193 .ref_ctrl = 0x00000C30,
194 .sdram_tim1 = 0xEAAAD4DB,
195 .sdram_tim2 = 0x266B7FDA,
196 .sdram_tim3 = 0x107F8678,
197 .read_idle_ctrl = 0x00050000,
198 .zq_config = 0x50074BE4,
199 .temp_alert_config = 0x0,
Lokesh Vutla7854d3e2014-02-18 07:31:57 -0500200 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530201 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
202 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
203 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
204 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
205 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
206 .emif_rd_wr_lvl_rmp_win = 0x0,
207 .emif_rd_wr_lvl_rmp_ctl = 0x0,
208 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500209 .emif_rd_wr_exec_thresh = 0x80000405,
210 .emif_prio_class_serv_map = 0x80000001,
211 .emif_connect_id_serv_1_map = 0x80000094,
212 .emif_connect_id_serv_2_map = 0x00000000,
213 .emif_cos_config = 0x000FFFFF
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530214};
215
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500216/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
217const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
218 .sdram_config = 0x638413B2,
219 .ref_ctrl = 0x00000C30,
220 .sdram_tim1 = 0xEAAAD4DB,
221 .sdram_tim2 = 0x266B7FDA,
222 .sdram_tim3 = 0x107F8678,
223 .read_idle_ctrl = 0x00050000,
224 .zq_config = 0x50074BE4,
225 .temp_alert_config = 0x0,
226 .emif_ddr_phy_ctlr_1 = 0x0E004008,
227 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
228 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
229 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
230 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
231 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500232 .emif_rd_wr_exec_thresh = 0x80000405,
233 .emif_prio_class_serv_map = 0x80000001,
234 .emif_connect_id_serv_1_map = 0x80000094,
235 .emif_connect_id_serv_2_map = 0x00000000,
236 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500237};
238
239/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
240const struct emif_regs ddr3_emif_regs_400Mhz_production = {
241 .sdram_config = 0x638413B2,
242 .ref_ctrl = 0x00000C30,
243 .sdram_tim1 = 0xEAAAD4DB,
244 .sdram_tim2 = 0x266B7FDA,
245 .sdram_tim3 = 0x107F8678,
246 .read_idle_ctrl = 0x00050000,
247 .zq_config = 0x50074BE4,
248 .temp_alert_config = 0x0,
Brad Griffisa2e8e422019-04-29 09:59:33 +0530249 .emif_ddr_phy_ctlr_1 = 0x00048008,
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500250 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
251 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
252 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
253 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
254 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500255 .emif_rd_wr_exec_thresh = 0x80000405,
256 .emif_prio_class_serv_map = 0x80000001,
257 .emif_connect_id_serv_1_map = 0x80000094,
258 .emif_connect_id_serv_2_map = 0x00000000,
259 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500260};
261
Felipe Balbiccc6f842014-06-10 15:01:20 -0500262static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
263 .sdram_config = 0x638413b2,
264 .sdram_config2 = 0x00000000,
265 .ref_ctrl = 0x00000c30,
266 .sdram_tim1 = 0xeaaad4db,
267 .sdram_tim2 = 0x266b7fda,
268 .sdram_tim3 = 0x107f8678,
269 .read_idle_ctrl = 0x00050000,
270 .zq_config = 0x50074be4,
271 .temp_alert_config = 0x0,
272 .emif_ddr_phy_ctlr_1 = 0x0e084008,
273 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
274 .emif_ddr_ext_phy_ctrl_2 = 0x89,
275 .emif_ddr_ext_phy_ctrl_3 = 0x90,
276 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
277 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
278 .emif_rd_wr_lvl_rmp_win = 0x0,
279 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
280 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500281 .emif_rd_wr_exec_thresh = 0x80000000,
282 .emif_prio_class_serv_map = 0x80000001,
283 .emif_connect_id_serv_1_map = 0x80000094,
284 .emif_connect_id_serv_2_map = 0x00000000,
285 .emif_cos_config = 0x000FFFFF
Felipe Balbiccc6f842014-06-10 15:01:20 -0500286};
287
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600288static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
289 .sdram_config = 0x61a11b32,
290 .sdram_config2 = 0x00000000,
291 .ref_ctrl = 0x00000c30,
292 .sdram_tim1 = 0xeaaad4db,
293 .sdram_tim2 = 0x266b7fda,
294 .sdram_tim3 = 0x107f8678,
295 .read_idle_ctrl = 0x00050000,
296 .zq_config = 0x50074be4,
297 .temp_alert_config = 0x00000000,
298 .emif_ddr_phy_ctlr_1 = 0x00008009,
299 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
300 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
301 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
302 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
303 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
304 .emif_rd_wr_lvl_rmp_win = 0x00000000,
305 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
306 .emif_rd_wr_lvl_ctl = 0x00000000,
307 .emif_rd_wr_exec_thresh = 0x00000405,
308 .emif_prio_class_serv_map = 0x00000000,
309 .emif_connect_id_serv_1_map = 0x00000000,
310 .emif_connect_id_serv_2_map = 0x00000000,
311 .emif_cos_config = 0x00ffffff
312};
313
Tom Rinibe8d6352015-06-05 15:51:11 +0530314void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
315{
316 if (board_is_eposevm()) {
317 *regs = ext_phy_ctrl_const_base_lpddr2;
318 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
319 }
320
321 return;
322}
323
James Doublesin73756a82014-12-22 16:26:10 -0600324const struct dpll_params *get_dpll_ddr_params(void)
325{
326 int ind = get_sys_clk_index();
327
328 if (board_is_eposevm())
329 return &epos_evm_dpll_ddr[ind];
Madan Srinivas36235022016-05-19 19:10:48 -0500330 else if (board_is_evm() || board_is_sk())
James Doublesin73756a82014-12-22 16:26:10 -0600331 return &gp_evm_dpll_ddr;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600332 else if (board_is_idk())
333 return &idk_dpll_ddr;
James Doublesin73756a82014-12-22 16:26:10 -0600334
Nishanth Menon757a9a02016-02-24 12:30:56 -0600335 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesin73756a82014-12-22 16:26:10 -0600336 return NULL;
337}
338
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530339/*
340 * get_opp_offset:
341 * Returns the index for safest OPP of the device to boot.
342 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
343 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
344 * This data is read from dev_attribute register which is e-fused.
345 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
346 * OPP available. Lowest OPP starts with min_off. So returning the
347 * bit with rightmost '0'.
348 */
349static int get_opp_offset(int max_off, int min_off)
350{
351 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rini99311d62014-06-05 11:15:27 -0400352 int opp, offset, i;
353
354 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
355 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530356
357 for (i = max_off; i >= min_off; i--) {
358 offset = opp & (1 << i);
359 if (!offset)
360 return i;
361 }
362
363 return min_off;
364}
365
366const struct dpll_params *get_dpll_mpu_params(void)
367{
368 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
369 u32 ind = get_sys_clk_index();
370
371 return &dpll_mpu[ind][opp];
372}
373
374const struct dpll_params *get_dpll_core_params(void)
375{
376 int ind = get_sys_clk_index();
377
378 return &dpll_core[ind];
379}
380
381const struct dpll_params *get_dpll_per_params(void)
382{
383 int ind = get_sys_clk_index();
384
385 return &dpll_per[ind];
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530386}
387
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600388void scale_vcores_generic(u32 m)
Tom Rini500908a2014-06-05 11:15:30 -0400389{
Keerthy00344c42018-05-02 15:06:31 +0530390 int mpu_vdd, ddr_volt;
Tom Rini500908a2014-06-05 11:15:30 -0400391
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100392 if (power_tps65218_init(0))
393 return;
Tom Rini500908a2014-06-05 11:15:30 -0400394
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600395 switch (m) {
Felipe Balbi7948d002014-12-22 16:26:13 -0600396 case 1000:
Tom Rini500908a2014-06-05 11:15:30 -0400397 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600398 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600399 case 800:
400 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
401 break;
402 case 720:
403 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
404 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600405 case 600:
Tom Rini500908a2014-06-05 11:15:30 -0400406 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600407 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600408 case 300:
409 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
410 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600411 default:
Tom Rini500908a2014-06-05 11:15:30 -0400412 puts("Unknown MPU clock, not scaling\n");
413 return;
414 }
415
416 /* Set DCDC1 (CORE) voltage to 1.1V */
417 if (tps65218_voltage_update(TPS65218_DCDC1,
418 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600419 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400420 return;
421 }
422
423 /* Set DCDC2 (MPU) voltage */
424 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600425 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400426 return;
427 }
Keerthy6417a732017-06-02 15:00:31 +0530428
Keerthy00344c42018-05-02 15:06:31 +0530429 if (board_is_eposevm())
430 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
431 else
432 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
433
Keerthy6417a732017-06-02 15:00:31 +0530434 /* Set DCDC3 (DDR) voltage */
Keerthy00344c42018-05-02 15:06:31 +0530435 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthy6417a732017-06-02 15:00:31 +0530436 printf("%s failure\n", __func__);
437 return;
438 }
Tom Rini500908a2014-06-05 11:15:30 -0400439}
440
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600441void scale_vcores_idk(u32 m)
442{
443 int mpu_vdd;
444
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100445 if (power_tps62362_init(0))
446 return;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600447
448 switch (m) {
449 case 1000:
450 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
451 break;
452 case 800:
453 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
454 break;
455 case 720:
456 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
457 break;
458 case 600:
459 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
460 break;
461 case 300:
462 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
463 break;
464 default:
465 puts("Unknown MPU clock, not scaling\n");
466 return;
467 }
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600468 /* Set VDD_MPU voltage */
469 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
470 printf("%s failure\n", __func__);
471 return;
472 }
473}
Nishanth Menon757a9a02016-02-24 12:30:56 -0600474void gpi2c_init(void)
475{
476 /* When needed to be invoked prior to BSS initialization */
477 static bool first_time = true;
478
479 if (first_time) {
480 enable_i2c0_pin_mux();
Nishanth Menon757a9a02016-02-24 12:30:56 -0600481 first_time = false;
482 }
483}
484
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600485void scale_vcores(void)
486{
487 const struct dpll_params *mpu_params;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600488
Nishanth Menon757a9a02016-02-24 12:30:56 -0600489 /* Ensure I2C is initialized for PMIC configuration */
490 gpi2c_init();
491
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600492 /* Get the frequency */
493 mpu_params = get_dpll_mpu_params();
494
495 if (board_is_idk())
496 scale_vcores_idk(mpu_params->m);
497 else
498 scale_vcores_generic(mpu_params->m);
499}
500
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530501void set_uart_mux_conf(void)
502{
503 enable_uart0_pin_mux();
504}
505
506void set_mux_conf_regs(void)
507{
508 enable_board_pin_mux();
509}
510
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530511static void enable_vtt_regulator(void)
512{
513 u32 temp;
514
515 /* enable module */
Dave Gerlach00822ca2014-02-10 11:41:49 -0500516 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530517
Dave Gerlach00822ca2014-02-10 11:41:49 -0500518 /* enable output for GPIO5_7 */
519 writel(GPIO_SETDATAOUT(7),
520 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
521 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
522 temp = temp & ~(GPIO_OE_ENABLE(7));
523 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530524}
525
Tero Kristo5d6acae2018-03-17 13:32:52 +0530526enum {
527 RTC_BOARD_EPOS = 1,
528 RTC_BOARD_EVM14,
529 RTC_BOARD_EVM12,
530 RTC_BOARD_GPEVM,
531 RTC_BOARD_SK,
532};
533
534/*
535 * In the rtc_only+DRR in self-refresh boot path we have the board type info
536 * in the rtc scratch pad register hence we bypass the costly i2c reads to
537 * eeprom and directly programthe board name string
538 */
539void rtc_only_update_board_type(u32 btype)
540{
541 const char *name = "";
542 const char *rev = "1.0";
543
544 switch (btype) {
545 case RTC_BOARD_EPOS:
546 name = "AM43EPOS";
547 break;
548 case RTC_BOARD_EVM14:
549 name = "AM43__GP";
550 rev = "1.4";
551 break;
552 case RTC_BOARD_EVM12:
553 name = "AM43__GP";
554 rev = "1.2";
555 break;
556 case RTC_BOARD_GPEVM:
557 name = "AM43__GP";
558 break;
559 case RTC_BOARD_SK:
560 name = "AM43__SK";
561 break;
562 }
563 ti_i2c_eeprom_am_set(name, rev);
564}
565
566u32 rtc_only_get_board_type(void)
567{
568 if (board_is_eposevm())
569 return RTC_BOARD_EPOS;
570 else if (board_is_evm_14_or_later())
571 return RTC_BOARD_EVM14;
572 else if (board_is_evm_12_or_later())
573 return RTC_BOARD_EVM12;
574 else if (board_is_gpevm())
575 return RTC_BOARD_GPEVM;
576 else if (board_is_sk())
577 return RTC_BOARD_SK;
578
579 return 0;
580}
581
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530582void sdram_init(void)
583{
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530584 /*
585 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
586 * GP EMV has 1GB DDR3 connected to EMIF
587 * along with VTT regulator.
588 */
589 if (board_is_eposevm()) {
590 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500591 } else if (board_is_evm_14_or_later()) {
592 enable_vtt_regulator();
593 config_ddr(0, &ioregs_ddr3, NULL, NULL,
594 &ddr3_emif_regs_400Mhz_production, 0);
595 } else if (board_is_evm_12_or_later()) {
596 enable_vtt_regulator();
597 config_ddr(0, &ioregs_ddr3, NULL, NULL,
598 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivas36235022016-05-19 19:10:48 -0500599 } else if (board_is_evm()) {
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530600 enable_vtt_regulator();
601 config_ddr(0, &ioregs_ddr3, NULL, NULL,
602 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbiccc6f842014-06-10 15:01:20 -0500603 } else if (board_is_sk()) {
604 config_ddr(400, &ioregs_ddr3, NULL, NULL,
605 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600606 } else if (board_is_idk()) {
607 config_ddr(400, &ioregs_ddr3, NULL, NULL,
608 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530609 }
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530610}
611#endif
612
Tom Rini60d2f6f2014-06-23 16:06:29 -0400613/* setup board specific PMIC */
614int power_init_board(void)
615{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100616 int rc;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600617 if (board_is_idk()) {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100618 rc = power_tps62362_init(0);
619 if (rc)
620 goto done;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100621 puts("PMIC: TPS62362\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600622 } else {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100623 rc = power_tps65218_init(0);
624 if (rc)
625 goto done;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100626 puts("PMIC: TPS65218\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600627 }
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100628done:
Tom Rini60d2f6f2014-06-23 16:06:29 -0400629 return 0;
630}
631
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530632int board_init(void)
633{
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500634 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
635 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
636 modena_init0_bw_integer, modena_init0_watermark_0;
637
Tom Rinibb4dd962022-11-16 13:10:37 -0500638 gd->bd->bi_boot_params = CFG_SYS_SDRAM_BASE + 0x100;
pekon gupta3eb6f862014-07-22 16:03:22 +0530639 gpmc_init();
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530640
Faiz Abbasd24bdf12018-01-19 15:32:48 +0530641 /*
642 * Call this to initialize *ctrl again
643 */
644 hw_data_init();
645
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500646 /* Clear all important bits for DSS errata that may need to be tweaked*/
647 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
648 MREQPRIO_0_SAB_INIT0_MASK;
649
650 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
651
652 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
653 BW_LIMITER_BW_FRAC_MASK;
654
655 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
656 BW_LIMITER_BW_INT_MASK;
657
658 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
659 BW_LIMITER_BW_WATERMARK_MASK;
660
661 /* Setting MReq Priority of the DSS*/
662 mreqprio_0 |= 0x77;
663
664 /*
665 * Set L3 Fast Configuration Register
666 * Limiting bandwith for ARM core to 700 MBPS
667 */
668 modena_init0_bw_fractional |= 0x10;
669 modena_init0_bw_integer |= 0x3;
670
671 writel(mreqprio_0, &cdev->mreqprio_0);
672 writel(mreqprio_1, &cdev->mreqprio_1);
673
674 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
675 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
676 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
677
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530678 return 0;
679}
680
681#ifdef CONFIG_BOARD_LATE_INIT
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100682#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
683static int device_okay(const char *path)
684{
685 int node;
686
687 node = fdt_path_offset(gd->fdt_blob, path);
688 if (node < 0)
689 return 0;
690
691 return fdtdec_get_is_enabled(gd->fdt_blob, node);
692}
693#endif
694
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530695int board_late_init(void)
696{
Tero Kristo30bc6d82019-09-27 19:14:28 +0300697 struct udevice *dev;
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530698#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon757a9a02016-02-24 12:30:56 -0600699 set_board_info_env(NULL);
Lokesh Vutla1eb0f542016-11-29 11:58:03 +0530700
701 /*
702 * Default FIT boot on HS devices. Non FIT images are not allowed
703 * on HS devices.
704 */
705 if (get_device_type() == HS_DEVICE)
Simon Glass6a38e412017-08-03 12:22:09 -0600706 env_set("boot_fit", "1");
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530707#endif
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100708
709#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
710 if (device_okay("/ocp/omap_dwc3@48380000"))
711 enable_usb_clocks(0);
712 if (device_okay("/ocp/omap_dwc3@483c0000"))
713 enable_usb_clocks(1);
714#endif
Tero Kristo30bc6d82019-09-27 19:14:28 +0300715
716 /* Just probe the potentially supported cdce913 device */
Dario Binacchic2de9d42020-12-30 00:16:32 +0100717 uclass_get_device_by_name(UCLASS_CLK, "cdce913@65", &dev);
Tero Kristo30bc6d82019-09-27 19:14:28 +0300718
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530719 return 0;
720}
721#endif
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500722
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100723#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530724#ifdef CONFIG_USB_DWC3
725static struct dwc3_device usb_otg_ss1 = {
726 .maximum_speed = USB_SPEED_HIGH,
727 .base = USB_OTG_SS1_BASE,
728 .tx_fifo_resize = false,
729 .index = 0,
730};
731
732static struct dwc3_omap_device usb_otg_ss1_glue = {
733 .base = (void *)USB_OTG_SS1_GLUE_BASE,
734 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530735 .index = 0,
736};
737
738static struct ti_usb_phy_device usb_phy1_device = {
739 .usb2_phy_power = (void *)USB2_PHY1_POWER,
740 .index = 0,
741};
742
743static struct dwc3_device usb_otg_ss2 = {
744 .maximum_speed = USB_SPEED_HIGH,
745 .base = USB_OTG_SS2_BASE,
746 .tx_fifo_resize = false,
747 .index = 1,
748};
749
750static struct dwc3_omap_device usb_otg_ss2_glue = {
751 .base = (void *)USB_OTG_SS2_GLUE_BASE,
752 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530753 .index = 1,
754};
755
756static struct ti_usb_phy_device usb_phy2_device = {
757 .usb2_phy_power = (void *)USB2_PHY2_POWER,
758 .index = 1,
759};
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300760#endif /* CONFIG_USB_DWC3 */
761
762#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbas29836a92018-02-15 17:12:11 +0530763int board_usb_init(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530764{
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530765 enable_usb_clocks(index);
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300766#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530767 switch (index) {
768 case 0:
769 if (init == USB_INIT_DEVICE) {
770 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
771 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300772 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
773 ti_usb_phy_uboot_init(&usb_phy1_device);
774 dwc3_uboot_init(&usb_otg_ss1);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530775 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530776 break;
777 case 1:
778 if (init == USB_INIT_DEVICE) {
779 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
780 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300781 ti_usb_phy_uboot_init(&usb_phy2_device);
782 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
783 dwc3_uboot_init(&usb_otg_ss2);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530784 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530785 break;
786 default:
787 printf("Invalid Controller Index\n");
788 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300789#endif
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530790
791 return 0;
792}
793
Faiz Abbas29836a92018-02-15 17:12:11 +0530794int board_usb_cleanup(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530795{
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300796#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530797 switch (index) {
798 case 0:
799 case 1:
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300800 if (init == USB_INIT_DEVICE) {
801 ti_usb_phy_uboot_exit(index);
802 dwc3_uboot_exit(index);
803 dwc3_omap_uboot_exit(index);
804 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530805 break;
806 default:
807 printf("Invalid Controller Index\n");
808 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300809#endif
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530810 disable_usb_clocks(index);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530811
812 return 0;
813}
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300814#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100815#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530816
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500817#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900818int ft_board_setup(void *blob, struct bd_info *bd)
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500819{
820 ft_cpu_setup(blob, bd);
821
822 return 0;
823}
824#endif
825
Vignesh R5a1880b2018-03-26 13:27:01 +0530826#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530827int board_fit_config_name_match(const char *name)
828{
Vignesh R5a1880b2018-03-26 13:27:01 +0530829 bool eeprom_read = board_ti_was_eeprom_read();
830
831 if (!strcmp(name, "am4372-generic") && !eeprom_read)
832 return 0;
833 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530834 return 0;
835 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
836 return 0;
Lokesh Vutla67fb6e02016-05-16 11:11:17 +0530837 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
838 return 0;
Lokesh Vutlab64e0562016-05-16 11:11:18 +0530839 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
840 return 0;
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530841 else
842 return -1;
843}
844#endif
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500845
Vignesh R5a1880b2018-03-26 13:27:01 +0530846#ifdef CONFIG_DTB_RESELECT
847int embedded_dtb_select(void)
848{
849 do_board_detect();
850 fdtdec_setup();
851
852 return 0;
853}
854#endif