blob: 44f9774eb9439f76638fd5f898a340c3c7f904a9 [file] [log] [blame]
Lokesh Vutlafaa680f2013-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 Kiernan9c215492018-04-01 09:22:38 +000012#include <environment.h>
Sekhar Nori2ab3c492013-12-10 15:02:15 +053013#include <i2c.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090014#include <linux/errno.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053015#include <spl.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053016#include <usb.h>
Madan Srinivas0b6dd122016-06-27 09:19:23 -050017#include <asm/omap_sec_common.h>
Lokesh Vutla85b59362013-07-30 11:36:29 +053018#include <asm/arch/clock.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053019#include <asm/arch/sys_proto.h>
20#include <asm/arch/mux.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053021#include <asm/arch/ddr_defs.h>
Lokesh Vutladd0037a2013-12-10 15:02:23 +053022#include <asm/arch/gpio.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053023#include <asm/emif.h>
Semen Protsenkoa8cb0222017-06-02 18:00:00 +030024#include <asm/omap_common.h>
Nishanth Menon757a9a02016-02-24 12:30:56 -060025#include "../common/board_detect.h"
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053026#include "board.h"
Tom Rini60d2f6f2014-06-23 16:06:29 -040027#include <power/pmic.h>
Tom Rini500908a2014-06-05 11:15:30 -040028#include <power/tps65218.h>
Felipe Balbi3dcd6d82014-12-22 16:26:17 -060029#include <power/tps62362.h>
Mugunthan V Nc94f9542014-02-18 07:31:54 -050030#include <miiphy.h>
31#include <cpsw.h>
Kishon Vijay Abraham I08ff0fd2015-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 Vutlafaa680f2013-07-30 11:36:27 +053036
37DECLARE_GLOBAL_DATA_PTR;
38
Mugunthan V Nc94f9542014-02-18 07:31:54 -050039static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V Nc94f9542014-02-18 07:31:54 -050040
Sekhar Nori2ab3c492013-12-10 15:02:15 +053041/*
42 * Read header information from EEPROM into global structure.
43 */
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053044#ifdef CONFIG_TI_I2C_BOARD_DETECT
45void do_board_detect(void)
Sekhar Nori2ab3c492013-12-10 15:02:15 +053046{
Simon Glass4df67572017-05-12 21:09:55 -060047 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
48 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053049 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori2ab3c492013-12-10 15:02:15 +053050}
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053051#endif
Sekhar Nori2ab3c492013-12-10 15:02:15 +053052
Sourav Poddar5248bba2014-05-19 16:53:37 -040053#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053054
Lokesh Vutla42c213a2013-12-10 15:02:20 +053055const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
56 { /* 19.2 MHz */
James Doublesin73756a82014-12-22 16:26:10 -060057 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053058 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesin73756a82014-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 Vutla42c213a2013-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 Doublesin73756a82014-12-22 16:26:10 -060091 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutla42c213a2013-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 Doublesin73756a82014-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 Doublesin5fd8a6b2014-12-22 16:26:12 -0600100 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesin73756a82014-12-22 16:26:10 -0600101 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530102};
103
James Doublesin73756a82014-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 Vutla42c213a2013-12-10 15:02:20 +0530110
111const struct dpll_params gp_evm_dpll_ddr = {
James Doublesin73756a82014-12-22 16:26:10 -0600112 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530113
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600114static const struct dpll_params idk_dpll_ddr = {
115 400, 23, 1, -1, 2, -1, -1
116};
117
Tom Rinibe8d6352015-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 Vutlaa82d4e12013-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 Doublesin73756a82014-12-22 16:26:10 -0600164 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500165 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlaa82d4e12013-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., Franklindf25e352014-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 Vutlaa82d4e12013-12-10 15:02:22 +0530175};
176
Lokesh Vutladd0037a2013-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 Doublesin73756a82014-12-22 16:26:10 -0600185 .emif_sdram_config_ext = 0xc163,
Lokesh Vutladd0037a2013-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 Vutla7854d3e2014-02-18 07:31:57 -0500197 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutladd0037a2013-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., Franklindf25e352014-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 Vutladd0037a2013-12-10 15:02:23 +0530211};
212
Franklin S. Cooper Jrcc76fc42014-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., Franklindf25e352014-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 Jrcc76fc42014-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., Franklindf25e352014-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 Jrcc76fc42014-06-27 13:31:14 -0500257};
258
Felipe Balbiccc6f842014-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., Franklindf25e352014-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 Balbiccc6f842014-06-10 15:01:20 -0500283};
284
Felipe Balbi3dcd6d82014-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 Rinibe8d6352015-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 Doublesin73756a82014-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 Srinivas36235022016-05-19 19:10:48 -0500327 else if (board_is_evm() || board_is_sk())
James Doublesin73756a82014-12-22 16:26:10 -0600328 return &gp_evm_dpll_ddr;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600329 else if (board_is_idk())
330 return &idk_dpll_ddr;
James Doublesin73756a82014-12-22 16:26:10 -0600331
Nishanth Menon757a9a02016-02-24 12:30:56 -0600332 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesin73756a82014-12-22 16:26:10 -0600333 return NULL;
334}
335
336
Lokesh Vutla42c213a2013-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 Rini99311d62014-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 Vutla42c213a2013-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 Vutlafaa680f2013-07-30 11:36:27 +0530384}
385
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600386void scale_vcores_generic(u32 m)
Tom Rini500908a2014-06-05 11:15:30 -0400387{
Keerthy00344c42018-05-02 15:06:31 +0530388 int mpu_vdd, ddr_volt;
Tom Rini500908a2014-06-05 11:15:30 -0400389
390 if (i2c_probe(TPS65218_CHIP_PM))
391 return;
392
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600393 switch (m) {
Felipe Balbi7948d002014-12-22 16:26:13 -0600394 case 1000:
Tom Rini500908a2014-06-05 11:15:30 -0400395 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600396 break;
Felipe Balbicc8535c2014-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 Balbi7948d002014-12-22 16:26:13 -0600403 case 600:
Tom Rini500908a2014-06-05 11:15:30 -0400404 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600405 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600406 case 300:
407 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
408 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600409 default:
Tom Rini500908a2014-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 Balbi3dcd6d82014-12-22 16:26:17 -0600417 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400418 return;
419 }
420
421 /* Set DCDC2 (MPU) voltage */
422 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600423 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400424 return;
425 }
Keerthy6417a732017-06-02 15:00:31 +0530426
Keerthy00344c42018-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
Keerthy6417a732017-06-02 15:00:31 +0530432 /* Set DCDC3 (DDR) voltage */
Keerthy00344c42018-05-02 15:06:31 +0530433 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthy6417a732017-06-02 15:00:31 +0530434 printf("%s failure\n", __func__);
435 return;
436 }
Tom Rini500908a2014-06-05 11:15:30 -0400437}
438
Felipe Balbi3dcd6d82014-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 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();
481 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
482 CONFIG_SYS_OMAP24_I2C_SLAVE);
483 first_time = false;
484 }
485}
486
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600487void scale_vcores(void)
488{
489 const struct dpll_params *mpu_params;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600490
Nishanth Menon757a9a02016-02-24 12:30:56 -0600491 /* Ensure I2C is initialized for PMIC configuration */
492 gpi2c_init();
493
Felipe Balbi3dcd6d82014-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 Vutlafaa680f2013-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 Vutladd0037a2013-12-10 15:02:23 +0530513static void enable_vtt_regulator(void)
514{
515 u32 temp;
516
517 /* enable module */
Dave Gerlach00822ca2014-02-10 11:41:49 -0500518 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530519
Dave Gerlach00822ca2014-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 Vutladd0037a2013-12-10 15:02:23 +0530526}
527
Tero Kristo5d6acae2018-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 Vutlafaa680f2013-07-30 11:36:27 +0530584void sdram_init(void)
585{
Lokesh Vutladd0037a2013-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 Jrcc76fc42014-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 Srinivas36235022016-05-19 19:10:48 -0500601 } else if (board_is_evm()) {
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530602 enable_vtt_regulator();
603 config_ddr(0, &ioregs_ddr3, NULL, NULL,
604 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbiccc6f842014-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 Balbi3dcd6d82014-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 Vutladd0037a2013-12-10 15:02:23 +0530611 }
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530612}
613#endif
614
Tom Rini60d2f6f2014-06-23 16:06:29 -0400615/* setup board specific PMIC */
616int power_init_board(void)
617{
618 struct pmic *p;
619
Felipe Balbi3dcd6d82014-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 Rini60d2f6f2014-06-23 16:06:29 -0400631
632 return 0;
633}
634
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530635int board_init(void)
636{
Cooper Jr., Franklindf25e352014-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 Vutlab82e6e92013-12-10 15:02:12 +0530641 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon gupta3eb6f862014-07-22 16:03:22 +0530642 gpmc_init();
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530643
Faiz Abbasd24bdf12018-01-19 15:32:48 +0530644 /*
645 * Call this to initialize *ctrl again
646 */
647 hw_data_init();
648
Cooper Jr., Franklindf25e352014-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 Vutlafaa680f2013-07-30 11:36:27 +0530681 return 0;
682}
683
684#ifdef CONFIG_BOARD_LATE_INIT
685int board_late_init(void)
686{
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530687#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon757a9a02016-02-24 12:30:56 -0600688 set_board_info_env(NULL);
Lokesh Vutla1eb0f542016-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 Glass6a38e412017-08-03 12:22:09 -0600695 env_set("boot_fit", "1");
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530696#endif
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530697 return 0;
698}
699#endif
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500700
Kishon Vijay Abraham I08ff0fd2015-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 I08ff0fd2015-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 I08ff0fd2015-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
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300738int usb_gadget_handle_interrupts(int index)
739{
740 u32 status;
741
742 status = dwc3_omap_uboot_interrupt_status(index);
743 if (status)
744 dwc3_uboot_handle_interrupt(index);
745
746 return 0;
747}
748#endif /* CONFIG_USB_DWC3 */
749
750#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbas29836a92018-02-15 17:12:11 +0530751int board_usb_init(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530752{
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530753 enable_usb_clocks(index);
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300754#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530755 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;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300760 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
761 ti_usb_phy_uboot_init(&usb_phy1_device);
762 dwc3_uboot_init(&usb_otg_ss1);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530763 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530764 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;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300769 ti_usb_phy_uboot_init(&usb_phy2_device);
770 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
771 dwc3_uboot_init(&usb_otg_ss2);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530772 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530773 break;
774 default:
775 printf("Invalid Controller Index\n");
776 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300777#endif
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530778
779 return 0;
780}
781
Faiz Abbas29836a92018-02-15 17:12:11 +0530782int board_usb_cleanup(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530783{
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300784#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530785 switch (index) {
786 case 0:
787 case 1:
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300788 if (init == USB_INIT_DEVICE) {
789 ti_usb_phy_uboot_exit(index);
790 dwc3_uboot_exit(index);
791 dwc3_omap_uboot_exit(index);
792 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530793 break;
794 default:
795 printf("Invalid Controller Index\n");
796 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300797#endif
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530798 disable_usb_clocks(index);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530799
800 return 0;
801}
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300802#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530803
Mugunthan V Nc94f9542014-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 Glass64b723f2017-08-03 12:22:12 -0600860 if (!env_get("ethaddr")) {
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500861 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger8ecdbed2015-04-08 01:41:04 -0500862 if (is_valid_ethaddr(mac_addr))
Simon Glass8551d552017-08-03 12:22:11 -0600863 eth_env_set_enetaddr("ethaddr", mac_addr);
Mugunthan V Nc94f9542014-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 Glass64b723f2017-08-03 12:22:12 -0600875 if (!env_get("eth1addr")) {
Joe Hershberger8ecdbed2015-04-08 01:41:04 -0500876 if (is_valid_ethaddr(mac_addr))
Simon Glass8551d552017-08-03 12:22:11 -0600877 eth_env_set_enetaddr("eth1addr", mac_addr);
Mugunthan V Nc94f9542014-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 Balbie3d0b692014-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 Balbi3dcd6d82014-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 Nc94f9542014-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 Vutlabb30b192016-05-16 11:11:15 +0530906
Andrew F. Davisc73b3992017-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 R5a1880b2018-03-26 13:27:01 +0530916#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530917int board_fit_config_name_match(const char *name)
918{
Vignesh R5a1880b2018-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 Vutlabb30b192016-05-16 11:11:15 +0530924 return 0;
925 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
926 return 0;
Lokesh Vutla67fb6e02016-05-16 11:11:17 +0530927 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
928 return 0;
Lokesh Vutlab64e0562016-05-16 11:11:18 +0530929 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
930 return 0;
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530931 else
932 return -1;
933}
934#endif
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500935
Vignesh R5a1880b2018-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 Srinivas0b6dd122016-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. Davis54523262017-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 Srinivas0b6dd122016-06-27 09:19:23 -0500958#endif