blob: 44f9774eb9439f76638fd5f898a340c3c7f904a9 [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{
Keerthyebf48502018-05-02 15:06:31 +0530388 int mpu_vdd, ddr_volt;
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
Keerthyebf48502018-05-02 15:06:31 +0530427 if (board_is_eposevm())
428 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
429 else
430 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
431
Keerthyfc69d472017-06-02 15:00:31 +0530432 /* Set DCDC3 (DDR) voltage */
Keerthyebf48502018-05-02 15:06:31 +0530433 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthyfc69d472017-06-02 15:00:31 +0530434 printf("%s failure\n", __func__);
435 return;
436 }
Tom Rini83bad102014-06-05 11:15:30 -0400437}
438
Felipe Balbi403d70a2014-12-22 16:26:17 -0600439void scale_vcores_idk(u32 m)
440{
441 int mpu_vdd;
442
443 if (i2c_probe(TPS62362_I2C_ADDR))
444 return;
445
446 switch (m) {
447 case 1000:
448 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
449 break;
450 case 800:
451 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
452 break;
453 case 720:
454 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
455 break;
456 case 600:
457 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
458 break;
459 case 300:
460 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
461 break;
462 default:
463 puts("Unknown MPU clock, not scaling\n");
464 return;
465 }
466
467 /* Set VDD_MPU voltage */
468 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
469 printf("%s failure\n", __func__);
470 return;
471 }
472}
473
Nishanth Menon5f8bb932016-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();
481 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
482 CONFIG_SYS_OMAP24_I2C_SLAVE);
483 first_time = false;
484 }
485}
486
Felipe Balbi403d70a2014-12-22 16:26:17 -0600487void scale_vcores(void)
488{
489 const struct dpll_params *mpu_params;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600490
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600491 /* Ensure I2C is initialized for PMIC configuration */
492 gpi2c_init();
493
Felipe Balbi403d70a2014-12-22 16:26:17 -0600494 /* Get the frequency */
495 mpu_params = get_dpll_mpu_params();
496
497 if (board_is_idk())
498 scale_vcores_idk(mpu_params->m);
499 else
500 scale_vcores_generic(mpu_params->m);
501}
502
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530503void set_uart_mux_conf(void)
504{
505 enable_uart0_pin_mux();
506}
507
508void set_mux_conf_regs(void)
509{
510 enable_board_pin_mux();
511}
512
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530513static void enable_vtt_regulator(void)
514{
515 u32 temp;
516
517 /* enable module */
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500518 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530519
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500520 /* enable output for GPIO5_7 */
521 writel(GPIO_SETDATAOUT(7),
522 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
523 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
524 temp = temp & ~(GPIO_OE_ENABLE(7));
525 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530526}
527
Tero Kristo7619bad2018-03-17 13:32:52 +0530528enum {
529 RTC_BOARD_EPOS = 1,
530 RTC_BOARD_EVM14,
531 RTC_BOARD_EVM12,
532 RTC_BOARD_GPEVM,
533 RTC_BOARD_SK,
534};
535
536/*
537 * In the rtc_only+DRR in self-refresh boot path we have the board type info
538 * in the rtc scratch pad register hence we bypass the costly i2c reads to
539 * eeprom and directly programthe board name string
540 */
541void rtc_only_update_board_type(u32 btype)
542{
543 const char *name = "";
544 const char *rev = "1.0";
545
546 switch (btype) {
547 case RTC_BOARD_EPOS:
548 name = "AM43EPOS";
549 break;
550 case RTC_BOARD_EVM14:
551 name = "AM43__GP";
552 rev = "1.4";
553 break;
554 case RTC_BOARD_EVM12:
555 name = "AM43__GP";
556 rev = "1.2";
557 break;
558 case RTC_BOARD_GPEVM:
559 name = "AM43__GP";
560 break;
561 case RTC_BOARD_SK:
562 name = "AM43__SK";
563 break;
564 }
565 ti_i2c_eeprom_am_set(name, rev);
566}
567
568u32 rtc_only_get_board_type(void)
569{
570 if (board_is_eposevm())
571 return RTC_BOARD_EPOS;
572 else if (board_is_evm_14_or_later())
573 return RTC_BOARD_EVM14;
574 else if (board_is_evm_12_or_later())
575 return RTC_BOARD_EVM12;
576 else if (board_is_gpevm())
577 return RTC_BOARD_GPEVM;
578 else if (board_is_sk())
579 return RTC_BOARD_SK;
580
581 return 0;
582}
583
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530584void sdram_init(void)
585{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530586 /*
587 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
588 * GP EMV has 1GB DDR3 connected to EMIF
589 * along with VTT regulator.
590 */
591 if (board_is_eposevm()) {
592 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500593 } else if (board_is_evm_14_or_later()) {
594 enable_vtt_regulator();
595 config_ddr(0, &ioregs_ddr3, NULL, NULL,
596 &ddr3_emif_regs_400Mhz_production, 0);
597 } else if (board_is_evm_12_or_later()) {
598 enable_vtt_regulator();
599 config_ddr(0, &ioregs_ddr3, NULL, NULL,
600 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivasa5051b72016-05-19 19:10:48 -0500601 } else if (board_is_evm()) {
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530602 enable_vtt_regulator();
603 config_ddr(0, &ioregs_ddr3, NULL, NULL,
604 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500605 } else if (board_is_sk()) {
606 config_ddr(400, &ioregs_ddr3, NULL, NULL,
607 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi403d70a2014-12-22 16:26:17 -0600608 } else if (board_is_idk()) {
609 config_ddr(400, &ioregs_ddr3, NULL, NULL,
610 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530611 }
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530612}
613#endif
614
Tom Rini7aa55982014-06-23 16:06:29 -0400615/* setup board specific PMIC */
616int power_init_board(void)
617{
618 struct pmic *p;
619
Felipe Balbi403d70a2014-12-22 16:26:17 -0600620 if (board_is_idk()) {
621 power_tps62362_init(I2C_PMIC);
622 p = pmic_get("TPS62362");
623 if (p && !pmic_probe(p))
624 puts("PMIC: TPS62362\n");
625 } else {
626 power_tps65218_init(I2C_PMIC);
627 p = pmic_get("TPS65218_PMIC");
628 if (p && !pmic_probe(p))
629 puts("PMIC: TPS65218\n");
630 }
Tom Rini7aa55982014-06-23 16:06:29 -0400631
632 return 0;
633}
634
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530635int board_init(void)
636{
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500637 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
638 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
639 modena_init0_bw_integer, modena_init0_watermark_0;
640
Lokesh Vutla369cbe12013-12-10 15:02:12 +0530641 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon guptae53ad4b2014-07-22 16:03:22 +0530642 gpmc_init();
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530643
Faiz Abbasa93feb22018-01-19 15:32:48 +0530644 /*
645 * Call this to initialize *ctrl again
646 */
647 hw_data_init();
648
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500649 /* Clear all important bits for DSS errata that may need to be tweaked*/
650 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
651 MREQPRIO_0_SAB_INIT0_MASK;
652
653 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
654
655 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
656 BW_LIMITER_BW_FRAC_MASK;
657
658 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
659 BW_LIMITER_BW_INT_MASK;
660
661 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
662 BW_LIMITER_BW_WATERMARK_MASK;
663
664 /* Setting MReq Priority of the DSS*/
665 mreqprio_0 |= 0x77;
666
667 /*
668 * Set L3 Fast Configuration Register
669 * Limiting bandwith for ARM core to 700 MBPS
670 */
671 modena_init0_bw_fractional |= 0x10;
672 modena_init0_bw_integer |= 0x3;
673
674 writel(mreqprio_0, &cdev->mreqprio_0);
675 writel(mreqprio_1, &cdev->mreqprio_1);
676
677 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
678 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
679 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
680
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530681 return 0;
682}
683
684#ifdef CONFIG_BOARD_LATE_INIT
685int board_late_init(void)
686{
Sekhar Norif4af1632013-12-10 15:02:16 +0530687#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600688 set_board_info_env(NULL);
Lokesh Vutla5d4d4362016-11-29 11:58:03 +0530689
690 /*
691 * Default FIT boot on HS devices. Non FIT images are not allowed
692 * on HS devices.
693 */
694 if (get_device_type() == HS_DEVICE)
Simon Glass382bee52017-08-03 12:22:09 -0600695 env_set("boot_fit", "1");
Sekhar Norif4af1632013-12-10 15:02:16 +0530696#endif
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530697 return 0;
698}
699#endif
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500700
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530701#ifdef CONFIG_USB_DWC3
702static struct dwc3_device usb_otg_ss1 = {
703 .maximum_speed = USB_SPEED_HIGH,
704 .base = USB_OTG_SS1_BASE,
705 .tx_fifo_resize = false,
706 .index = 0,
707};
708
709static struct dwc3_omap_device usb_otg_ss1_glue = {
710 .base = (void *)USB_OTG_SS1_GLUE_BASE,
711 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530712 .index = 0,
713};
714
715static struct ti_usb_phy_device usb_phy1_device = {
716 .usb2_phy_power = (void *)USB2_PHY1_POWER,
717 .index = 0,
718};
719
720static struct dwc3_device usb_otg_ss2 = {
721 .maximum_speed = USB_SPEED_HIGH,
722 .base = USB_OTG_SS2_BASE,
723 .tx_fifo_resize = false,
724 .index = 1,
725};
726
727static struct dwc3_omap_device usb_otg_ss2_glue = {
728 .base = (void *)USB_OTG_SS2_GLUE_BASE,
729 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530730 .index = 1,
731};
732
733static struct ti_usb_phy_device usb_phy2_device = {
734 .usb2_phy_power = (void *)USB2_PHY2_POWER,
735 .index = 1,
736};
737
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530738int usb_gadget_handle_interrupts(int index)
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530739{
740 u32 status;
741
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530742 status = dwc3_omap_uboot_interrupt_status(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530743 if (status)
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530744 dwc3_uboot_handle_interrupt(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530745
746 return 0;
747}
Roger Quadros55efadd2016-05-23 17:37:48 +0300748#endif /* CONFIG_USB_DWC3 */
749
750#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbasb16c1292018-02-15 17:12:11 +0530751int board_usb_init(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300752{
753 enable_usb_clocks(index);
754#ifdef CONFIG_USB_DWC3
755 switch (index) {
756 case 0:
757 if (init == USB_INIT_DEVICE) {
758 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
759 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
760 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
761 ti_usb_phy_uboot_init(&usb_phy1_device);
762 dwc3_uboot_init(&usb_otg_ss1);
763 }
764 break;
765 case 1:
766 if (init == USB_INIT_DEVICE) {
767 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
768 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
769 ti_usb_phy_uboot_init(&usb_phy2_device);
770 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
771 dwc3_uboot_init(&usb_otg_ss2);
772 }
773 break;
774 default:
775 printf("Invalid Controller Index\n");
776 }
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530777#endif
778
Roger Quadros55efadd2016-05-23 17:37:48 +0300779 return 0;
780}
781
Faiz Abbasb16c1292018-02-15 17:12:11 +0530782int board_usb_cleanup(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300783{
784#ifdef CONFIG_USB_DWC3
785 switch (index) {
786 case 0:
787 case 1:
788 if (init == USB_INIT_DEVICE) {
789 ti_usb_phy_uboot_exit(index);
790 dwc3_uboot_exit(index);
791 dwc3_omap_uboot_exit(index);
792 }
793 break;
794 default:
795 printf("Invalid Controller Index\n");
796 }
797#endif
798 disable_usb_clocks(index);
799
800 return 0;
801}
802#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
803
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500804#ifdef CONFIG_DRIVER_TI_CPSW
805
806static void cpsw_control(int enabled)
807{
808 /* Additional controls can be added here */
809 return;
810}
811
812static struct cpsw_slave_data cpsw_slaves[] = {
813 {
814 .slave_reg_ofs = 0x208,
815 .sliver_reg_ofs = 0xd80,
816 .phy_addr = 16,
817 },
818 {
819 .slave_reg_ofs = 0x308,
820 .sliver_reg_ofs = 0xdc0,
821 .phy_addr = 1,
822 },
823};
824
825static struct cpsw_platform_data cpsw_data = {
826 .mdio_base = CPSW_MDIO_BASE,
827 .cpsw_base = CPSW_BASE,
828 .mdio_div = 0xff,
829 .channels = 8,
830 .cpdma_reg_ofs = 0x800,
831 .slaves = 1,
832 .slave_data = cpsw_slaves,
833 .ale_reg_ofs = 0xd00,
834 .ale_entries = 1024,
835 .host_port_reg_ofs = 0x108,
836 .hw_stats_reg_ofs = 0x900,
837 .bd_ram_ofs = 0x2000,
838 .mac_control = (1 << 5),
839 .control = cpsw_control,
840 .host_port_num = 0,
841 .version = CPSW_CTRL_VERSION_2,
842};
843
844int board_eth_init(bd_t *bis)
845{
846 int rv;
847 uint8_t mac_addr[6];
848 uint32_t mac_hi, mac_lo;
849
850 /* try reading mac address from efuse */
851 mac_lo = readl(&cdev->macid0l);
852 mac_hi = readl(&cdev->macid0h);
853 mac_addr[0] = mac_hi & 0xFF;
854 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
855 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
856 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
857 mac_addr[4] = mac_lo & 0xFF;
858 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
859
Simon Glass00caae62017-08-03 12:22:12 -0600860 if (!env_get("ethaddr")) {
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500861 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500862 if (is_valid_ethaddr(mac_addr))
Simon Glassfd1e9592017-08-03 12:22:11 -0600863 eth_env_set_enetaddr("ethaddr", mac_addr);
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500864 }
865
866 mac_lo = readl(&cdev->macid1l);
867 mac_hi = readl(&cdev->macid1h);
868 mac_addr[0] = mac_hi & 0xFF;
869 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
870 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
871 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
872 mac_addr[4] = mac_lo & 0xFF;
873 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
874
Simon Glass00caae62017-08-03 12:22:12 -0600875 if (!env_get("eth1addr")) {
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500876 if (is_valid_ethaddr(mac_addr))
Simon Glassfd1e9592017-08-03 12:22:11 -0600877 eth_env_set_enetaddr("eth1addr", mac_addr);
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500878 }
879
880 if (board_is_eposevm()) {
881 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
882 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
883 cpsw_slaves[0].phy_addr = 16;
Felipe Balbi619ce622014-06-10 15:01:21 -0500884 } else if (board_is_sk()) {
885 writel(RGMII_MODE_ENABLE, &cdev->miisel);
886 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
887 cpsw_slaves[0].phy_addr = 4;
888 cpsw_slaves[1].phy_addr = 5;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600889 } else if (board_is_idk()) {
890 writel(RGMII_MODE_ENABLE, &cdev->miisel);
891 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
892 cpsw_slaves[0].phy_addr = 0;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500893 } else {
894 writel(RGMII_MODE_ENABLE, &cdev->miisel);
895 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
896 cpsw_slaves[0].phy_addr = 0;
897 }
898
899 rv = cpsw_register(&cpsw_data);
900 if (rv < 0)
901 printf("Error %d registering CPSW switch\n", rv);
902
903 return rv;
904}
905#endif
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530906
Andrew F. Davis7fe463f2017-07-10 14:45:54 -0500907#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
908int ft_board_setup(void *blob, bd_t *bd)
909{
910 ft_cpu_setup(blob, bd);
911
912 return 0;
913}
914#endif
915
Vignesh R5375a9b2018-03-26 13:27:01 +0530916#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530917int board_fit_config_name_match(const char *name)
918{
Vignesh R5375a9b2018-03-26 13:27:01 +0530919 bool eeprom_read = board_ti_was_eeprom_read();
920
921 if (!strcmp(name, "am4372-generic") && !eeprom_read)
922 return 0;
923 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530924 return 0;
925 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
926 return 0;
Lokesh Vutla7dd12832016-05-16 11:11:17 +0530927 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
928 return 0;
Lokesh Vutla54a92e12016-05-16 11:11:18 +0530929 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
930 return 0;
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530931 else
932 return -1;
933}
934#endif
Madan Srinivase29878f2016-06-27 09:19:23 -0500935
Vignesh R5375a9b2018-03-26 13:27:01 +0530936#ifdef CONFIG_DTB_RESELECT
937int embedded_dtb_select(void)
938{
939 do_board_detect();
940 fdtdec_setup();
941
942 return 0;
943}
944#endif
945
Madan Srinivase29878f2016-06-27 09:19:23 -0500946#ifdef CONFIG_TI_SECURE_DEVICE
947void board_fit_image_post_process(void **p_image, size_t *p_size)
948{
949 secure_boot_verify_image(p_image, p_size);
950}
Andrew F. Davis36300942017-07-10 14:45:53 -0500951
952void board_tee_image_process(ulong tee_image, size_t tee_size)
953{
954 secure_tee_install((u32)tee_image);
955}
956
957U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Madan Srinivase29878f2016-06-27 09:19:23 -0500958#endif