blob: d12f1ebfdf9534e1852fe4ed9cabfa8d848b7289 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Lokesh Vutlafaa680f2013-07-30 11:36:27 +05302/*
3 * board.c
4 *
5 * Board functions for TI AM43XX based boards
6 *
7 * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
Lokesh Vutlafaa680f2013-07-30 11:36:27 +05308 */
9
10#include <common.h>
Simon Glasseba6b8d2019-11-14 12:57:50 -070011#include <eeprom.h>
Simon Glass5e6201b2019-08-01 09:46:51 -060012#include <env.h>
Sekhar Nori2ab3c492013-12-10 15:02:15 +053013#include <i2c.h>
Simon Glassa7b51302019-11-14 12:57:46 -070014#include <init.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090015#include <linux/errno.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053016#include <spl.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053017#include <usb.h>
Madan Srinivas0b6dd122016-06-27 09:19:23 -050018#include <asm/omap_sec_common.h>
Lokesh Vutla85b59362013-07-30 11:36:29 +053019#include <asm/arch/clock.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053020#include <asm/arch/sys_proto.h>
21#include <asm/arch/mux.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053022#include <asm/arch/ddr_defs.h>
Lokesh Vutladd0037a2013-12-10 15:02:23 +053023#include <asm/arch/gpio.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053024#include <asm/emif.h>
Semen Protsenkoa8cb0222017-06-02 18:00:00 +030025#include <asm/omap_common.h>
Nishanth Menon757a9a02016-02-24 12:30:56 -060026#include "../common/board_detect.h"
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053027#include "board.h"
Tom Rini60d2f6f2014-06-23 16:06:29 -040028#include <power/pmic.h>
Tom Rini500908a2014-06-05 11:15:30 -040029#include <power/tps65218.h>
Felipe Balbi3dcd6d82014-12-22 16:26:17 -060030#include <power/tps62362.h>
Mugunthan V Nc94f9542014-02-18 07:31:54 -050031#include <miiphy.h>
32#include <cpsw.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
Sourav Poddar5248bba2014-05-19 16:53:37 -040056#ifndef CONFIG_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
339
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530340/*
341 * get_opp_offset:
342 * Returns the index for safest OPP of the device to boot.
343 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
344 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
345 * This data is read from dev_attribute register which is e-fused.
346 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
347 * OPP available. Lowest OPP starts with min_off. So returning the
348 * bit with rightmost '0'.
349 */
350static int get_opp_offset(int max_off, int min_off)
351{
352 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rini99311d62014-06-05 11:15:27 -0400353 int opp, offset, i;
354
355 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
356 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530357
358 for (i = max_off; i >= min_off; i--) {
359 offset = opp & (1 << i);
360 if (!offset)
361 return i;
362 }
363
364 return min_off;
365}
366
367const struct dpll_params *get_dpll_mpu_params(void)
368{
369 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
370 u32 ind = get_sys_clk_index();
371
372 return &dpll_mpu[ind][opp];
373}
374
375const struct dpll_params *get_dpll_core_params(void)
376{
377 int ind = get_sys_clk_index();
378
379 return &dpll_core[ind];
380}
381
382const struct dpll_params *get_dpll_per_params(void)
383{
384 int ind = get_sys_clk_index();
385
386 return &dpll_per[ind];
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530387}
388
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600389void scale_vcores_generic(u32 m)
Tom Rini500908a2014-06-05 11:15:30 -0400390{
Keerthy00344c42018-05-02 15:06:31 +0530391 int mpu_vdd, ddr_volt;
Tom Rini500908a2014-06-05 11:15:30 -0400392
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100393#ifndef CONFIG_DM_I2C
Tom Rini500908a2014-06-05 11:15:30 -0400394 if (i2c_probe(TPS65218_CHIP_PM))
395 return;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100396#else
397 if (power_tps65218_init(0))
398 return;
399#endif
Tom Rini500908a2014-06-05 11:15:30 -0400400
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600401 switch (m) {
Felipe Balbi7948d002014-12-22 16:26:13 -0600402 case 1000:
Tom Rini500908a2014-06-05 11:15:30 -0400403 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600404 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600405 case 800:
406 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
407 break;
408 case 720:
409 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
410 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600411 case 600:
Tom Rini500908a2014-06-05 11:15:30 -0400412 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600413 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600414 case 300:
415 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
416 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600417 default:
Tom Rini500908a2014-06-05 11:15:30 -0400418 puts("Unknown MPU clock, not scaling\n");
419 return;
420 }
421
422 /* Set DCDC1 (CORE) voltage to 1.1V */
423 if (tps65218_voltage_update(TPS65218_DCDC1,
424 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600425 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400426 return;
427 }
428
429 /* Set DCDC2 (MPU) voltage */
430 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600431 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400432 return;
433 }
Keerthy6417a732017-06-02 15:00:31 +0530434
Keerthy00344c42018-05-02 15:06:31 +0530435 if (board_is_eposevm())
436 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
437 else
438 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
439
Keerthy6417a732017-06-02 15:00:31 +0530440 /* Set DCDC3 (DDR) voltage */
Keerthy00344c42018-05-02 15:06:31 +0530441 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthy6417a732017-06-02 15:00:31 +0530442 printf("%s failure\n", __func__);
443 return;
444 }
Tom Rini500908a2014-06-05 11:15:30 -0400445}
446
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600447void scale_vcores_idk(u32 m)
448{
449 int mpu_vdd;
450
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100451#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600452 if (i2c_probe(TPS62362_I2C_ADDR))
453 return;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100454#else
455 if (power_tps62362_init(0))
456 return;
457#endif
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600458
459 switch (m) {
460 case 1000:
461 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
462 break;
463 case 800:
464 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
465 break;
466 case 720:
467 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
468 break;
469 case 600:
470 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
471 break;
472 case 300:
473 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
474 break;
475 default:
476 puts("Unknown MPU clock, not scaling\n");
477 return;
478 }
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600479 /* Set VDD_MPU voltage */
480 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
481 printf("%s failure\n", __func__);
482 return;
483 }
484}
Nishanth Menon757a9a02016-02-24 12:30:56 -0600485void gpi2c_init(void)
486{
487 /* When needed to be invoked prior to BSS initialization */
488 static bool first_time = true;
489
490 if (first_time) {
491 enable_i2c0_pin_mux();
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100492#ifndef CONFIG_DM_I2C
Nishanth Menon757a9a02016-02-24 12:30:56 -0600493 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
494 CONFIG_SYS_OMAP24_I2C_SLAVE);
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100495#endif
Nishanth Menon757a9a02016-02-24 12:30:56 -0600496 first_time = false;
497 }
498}
499
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600500void scale_vcores(void)
501{
502 const struct dpll_params *mpu_params;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600503
Nishanth Menon757a9a02016-02-24 12:30:56 -0600504 /* Ensure I2C is initialized for PMIC configuration */
505 gpi2c_init();
506
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600507 /* Get the frequency */
508 mpu_params = get_dpll_mpu_params();
509
510 if (board_is_idk())
511 scale_vcores_idk(mpu_params->m);
512 else
513 scale_vcores_generic(mpu_params->m);
514}
515
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530516void set_uart_mux_conf(void)
517{
518 enable_uart0_pin_mux();
519}
520
521void set_mux_conf_regs(void)
522{
523 enable_board_pin_mux();
524}
525
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530526static void enable_vtt_regulator(void)
527{
528 u32 temp;
529
530 /* enable module */
Dave Gerlach00822ca2014-02-10 11:41:49 -0500531 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530532
Dave Gerlach00822ca2014-02-10 11:41:49 -0500533 /* enable output for GPIO5_7 */
534 writel(GPIO_SETDATAOUT(7),
535 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
536 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
537 temp = temp & ~(GPIO_OE_ENABLE(7));
538 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530539}
540
Tero Kristo5d6acae2018-03-17 13:32:52 +0530541enum {
542 RTC_BOARD_EPOS = 1,
543 RTC_BOARD_EVM14,
544 RTC_BOARD_EVM12,
545 RTC_BOARD_GPEVM,
546 RTC_BOARD_SK,
547};
548
549/*
550 * In the rtc_only+DRR in self-refresh boot path we have the board type info
551 * in the rtc scratch pad register hence we bypass the costly i2c reads to
552 * eeprom and directly programthe board name string
553 */
554void rtc_only_update_board_type(u32 btype)
555{
556 const char *name = "";
557 const char *rev = "1.0";
558
559 switch (btype) {
560 case RTC_BOARD_EPOS:
561 name = "AM43EPOS";
562 break;
563 case RTC_BOARD_EVM14:
564 name = "AM43__GP";
565 rev = "1.4";
566 break;
567 case RTC_BOARD_EVM12:
568 name = "AM43__GP";
569 rev = "1.2";
570 break;
571 case RTC_BOARD_GPEVM:
572 name = "AM43__GP";
573 break;
574 case RTC_BOARD_SK:
575 name = "AM43__SK";
576 break;
577 }
578 ti_i2c_eeprom_am_set(name, rev);
579}
580
581u32 rtc_only_get_board_type(void)
582{
583 if (board_is_eposevm())
584 return RTC_BOARD_EPOS;
585 else if (board_is_evm_14_or_later())
586 return RTC_BOARD_EVM14;
587 else if (board_is_evm_12_or_later())
588 return RTC_BOARD_EVM12;
589 else if (board_is_gpevm())
590 return RTC_BOARD_GPEVM;
591 else if (board_is_sk())
592 return RTC_BOARD_SK;
593
594 return 0;
595}
596
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530597void sdram_init(void)
598{
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530599 /*
600 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
601 * GP EMV has 1GB DDR3 connected to EMIF
602 * along with VTT regulator.
603 */
604 if (board_is_eposevm()) {
605 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500606 } else if (board_is_evm_14_or_later()) {
607 enable_vtt_regulator();
608 config_ddr(0, &ioregs_ddr3, NULL, NULL,
609 &ddr3_emif_regs_400Mhz_production, 0);
610 } else if (board_is_evm_12_or_later()) {
611 enable_vtt_regulator();
612 config_ddr(0, &ioregs_ddr3, NULL, NULL,
613 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivas36235022016-05-19 19:10:48 -0500614 } else if (board_is_evm()) {
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530615 enable_vtt_regulator();
616 config_ddr(0, &ioregs_ddr3, NULL, NULL,
617 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbiccc6f842014-06-10 15:01:20 -0500618 } else if (board_is_sk()) {
619 config_ddr(400, &ioregs_ddr3, NULL, NULL,
620 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600621 } else if (board_is_idk()) {
622 config_ddr(400, &ioregs_ddr3, NULL, NULL,
623 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530624 }
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530625}
626#endif
627
Tom Rini60d2f6f2014-06-23 16:06:29 -0400628/* setup board specific PMIC */
629int power_init_board(void)
630{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100631 int rc;
632#ifndef CONFIG_DM_I2C
633 struct pmic *p = NULL;
634#endif
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600635 if (board_is_idk()) {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100636 rc = power_tps62362_init(0);
637 if (rc)
638 goto done;
639#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600640 p = pmic_get("TPS62362");
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100641 if (!p || pmic_probe(p))
642 goto done;
643#endif
644 puts("PMIC: TPS62362\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600645 } else {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100646 rc = power_tps65218_init(0);
647 if (rc)
648 goto done;
649#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600650 p = pmic_get("TPS65218_PMIC");
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100651 if (!p || pmic_probe(p))
652 goto done;
653#endif
654 puts("PMIC: TPS65218\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600655 }
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100656done:
Tom Rini60d2f6f2014-06-23 16:06:29 -0400657 return 0;
658}
659
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530660int board_init(void)
661{
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500662 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
663 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
664 modena_init0_bw_integer, modena_init0_watermark_0;
665
Lokesh Vutlab82e6e92013-12-10 15:02:12 +0530666 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon gupta3eb6f862014-07-22 16:03:22 +0530667 gpmc_init();
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530668
Faiz Abbasd24bdf12018-01-19 15:32:48 +0530669 /*
670 * Call this to initialize *ctrl again
671 */
672 hw_data_init();
673
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500674 /* Clear all important bits for DSS errata that may need to be tweaked*/
675 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
676 MREQPRIO_0_SAB_INIT0_MASK;
677
678 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
679
680 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
681 BW_LIMITER_BW_FRAC_MASK;
682
683 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
684 BW_LIMITER_BW_INT_MASK;
685
686 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
687 BW_LIMITER_BW_WATERMARK_MASK;
688
689 /* Setting MReq Priority of the DSS*/
690 mreqprio_0 |= 0x77;
691
692 /*
693 * Set L3 Fast Configuration Register
694 * Limiting bandwith for ARM core to 700 MBPS
695 */
696 modena_init0_bw_fractional |= 0x10;
697 modena_init0_bw_integer |= 0x3;
698
699 writel(mreqprio_0, &cdev->mreqprio_0);
700 writel(mreqprio_1, &cdev->mreqprio_1);
701
702 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
703 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
704 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
705
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530706 return 0;
707}
708
709#ifdef CONFIG_BOARD_LATE_INIT
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100710#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
711static int device_okay(const char *path)
712{
713 int node;
714
715 node = fdt_path_offset(gd->fdt_blob, path);
716 if (node < 0)
717 return 0;
718
719 return fdtdec_get_is_enabled(gd->fdt_blob, node);
720}
721#endif
722
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530723int board_late_init(void)
724{
Tero Kristo30bc6d82019-09-27 19:14:28 +0300725 struct udevice *dev;
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530726#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon757a9a02016-02-24 12:30:56 -0600727 set_board_info_env(NULL);
Lokesh Vutla1eb0f542016-11-29 11:58:03 +0530728
729 /*
730 * Default FIT boot on HS devices. Non FIT images are not allowed
731 * on HS devices.
732 */
733 if (get_device_type() == HS_DEVICE)
Simon Glass6a38e412017-08-03 12:22:09 -0600734 env_set("boot_fit", "1");
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530735#endif
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100736
737#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
738 if (device_okay("/ocp/omap_dwc3@48380000"))
739 enable_usb_clocks(0);
740 if (device_okay("/ocp/omap_dwc3@483c0000"))
741 enable_usb_clocks(1);
742#endif
Tero Kristo30bc6d82019-09-27 19:14:28 +0300743
744 /* Just probe the potentially supported cdce913 device */
745 uclass_get_device(UCLASS_CLK, 0, &dev);
746
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530747 return 0;
748}
749#endif
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500750
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100751#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530752#ifdef CONFIG_USB_DWC3
753static struct dwc3_device usb_otg_ss1 = {
754 .maximum_speed = USB_SPEED_HIGH,
755 .base = USB_OTG_SS1_BASE,
756 .tx_fifo_resize = false,
757 .index = 0,
758};
759
760static struct dwc3_omap_device usb_otg_ss1_glue = {
761 .base = (void *)USB_OTG_SS1_GLUE_BASE,
762 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530763 .index = 0,
764};
765
766static struct ti_usb_phy_device usb_phy1_device = {
767 .usb2_phy_power = (void *)USB2_PHY1_POWER,
768 .index = 0,
769};
770
771static struct dwc3_device usb_otg_ss2 = {
772 .maximum_speed = USB_SPEED_HIGH,
773 .base = USB_OTG_SS2_BASE,
774 .tx_fifo_resize = false,
775 .index = 1,
776};
777
778static struct dwc3_omap_device usb_otg_ss2_glue = {
779 .base = (void *)USB_OTG_SS2_GLUE_BASE,
780 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530781 .index = 1,
782};
783
784static struct ti_usb_phy_device usb_phy2_device = {
785 .usb2_phy_power = (void *)USB2_PHY2_POWER,
786 .index = 1,
787};
788
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300789int usb_gadget_handle_interrupts(int index)
790{
791 u32 status;
792
793 status = dwc3_omap_uboot_interrupt_status(index);
794 if (status)
795 dwc3_uboot_handle_interrupt(index);
796
797 return 0;
798}
799#endif /* CONFIG_USB_DWC3 */
800
801#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbas29836a92018-02-15 17:12:11 +0530802int board_usb_init(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530803{
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530804 enable_usb_clocks(index);
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300805#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530806 switch (index) {
807 case 0:
808 if (init == USB_INIT_DEVICE) {
809 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
810 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300811 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
812 ti_usb_phy_uboot_init(&usb_phy1_device);
813 dwc3_uboot_init(&usb_otg_ss1);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530814 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530815 break;
816 case 1:
817 if (init == USB_INIT_DEVICE) {
818 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
819 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300820 ti_usb_phy_uboot_init(&usb_phy2_device);
821 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
822 dwc3_uboot_init(&usb_otg_ss2);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530823 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530824 break;
825 default:
826 printf("Invalid Controller Index\n");
827 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300828#endif
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530829
830 return 0;
831}
832
Faiz Abbas29836a92018-02-15 17:12:11 +0530833int board_usb_cleanup(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530834{
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300835#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530836 switch (index) {
837 case 0:
838 case 1:
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300839 if (init == USB_INIT_DEVICE) {
840 ti_usb_phy_uboot_exit(index);
841 dwc3_uboot_exit(index);
842 dwc3_omap_uboot_exit(index);
843 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530844 break;
845 default:
846 printf("Invalid Controller Index\n");
847 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300848#endif
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530849 disable_usb_clocks(index);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530850
851 return 0;
852}
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300853#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100854#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530855
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500856#ifdef CONFIG_DRIVER_TI_CPSW
857
858static void cpsw_control(int enabled)
859{
860 /* Additional controls can be added here */
861 return;
862}
863
864static struct cpsw_slave_data cpsw_slaves[] = {
865 {
866 .slave_reg_ofs = 0x208,
867 .sliver_reg_ofs = 0xd80,
868 .phy_addr = 16,
869 },
870 {
871 .slave_reg_ofs = 0x308,
872 .sliver_reg_ofs = 0xdc0,
873 .phy_addr = 1,
874 },
875};
876
877static struct cpsw_platform_data cpsw_data = {
878 .mdio_base = CPSW_MDIO_BASE,
879 .cpsw_base = CPSW_BASE,
880 .mdio_div = 0xff,
881 .channels = 8,
882 .cpdma_reg_ofs = 0x800,
883 .slaves = 1,
884 .slave_data = cpsw_slaves,
885 .ale_reg_ofs = 0xd00,
886 .ale_entries = 1024,
887 .host_port_reg_ofs = 0x108,
888 .hw_stats_reg_ofs = 0x900,
889 .bd_ram_ofs = 0x2000,
890 .mac_control = (1 << 5),
891 .control = cpsw_control,
892 .host_port_num = 0,
893 .version = CPSW_CTRL_VERSION_2,
894};
895
896int board_eth_init(bd_t *bis)
897{
898 int rv;
899 uint8_t mac_addr[6];
900 uint32_t mac_hi, mac_lo;
901
902 /* try reading mac address from efuse */
903 mac_lo = readl(&cdev->macid0l);
904 mac_hi = readl(&cdev->macid0h);
905 mac_addr[0] = mac_hi & 0xFF;
906 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
907 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
908 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
909 mac_addr[4] = mac_lo & 0xFF;
910 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
911
Simon Glass64b723f2017-08-03 12:22:12 -0600912 if (!env_get("ethaddr")) {
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500913 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger8ecdbed2015-04-08 01:41:04 -0500914 if (is_valid_ethaddr(mac_addr))
Simon Glass8551d552017-08-03 12:22:11 -0600915 eth_env_set_enetaddr("ethaddr", mac_addr);
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500916 }
917
918 mac_lo = readl(&cdev->macid1l);
919 mac_hi = readl(&cdev->macid1h);
920 mac_addr[0] = mac_hi & 0xFF;
921 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
922 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
923 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
924 mac_addr[4] = mac_lo & 0xFF;
925 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
926
Simon Glass64b723f2017-08-03 12:22:12 -0600927 if (!env_get("eth1addr")) {
Joe Hershberger8ecdbed2015-04-08 01:41:04 -0500928 if (is_valid_ethaddr(mac_addr))
Simon Glass8551d552017-08-03 12:22:11 -0600929 eth_env_set_enetaddr("eth1addr", mac_addr);
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500930 }
931
932 if (board_is_eposevm()) {
933 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
934 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
935 cpsw_slaves[0].phy_addr = 16;
Felipe Balbie3d0b692014-06-10 15:01:21 -0500936 } else if (board_is_sk()) {
937 writel(RGMII_MODE_ENABLE, &cdev->miisel);
938 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
939 cpsw_slaves[0].phy_addr = 4;
940 cpsw_slaves[1].phy_addr = 5;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600941 } else if (board_is_idk()) {
942 writel(RGMII_MODE_ENABLE, &cdev->miisel);
943 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
944 cpsw_slaves[0].phy_addr = 0;
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500945 } else {
946 writel(RGMII_MODE_ENABLE, &cdev->miisel);
947 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
948 cpsw_slaves[0].phy_addr = 0;
949 }
950
951 rv = cpsw_register(&cpsw_data);
952 if (rv < 0)
953 printf("Error %d registering CPSW switch\n", rv);
954
955 return rv;
956}
957#endif
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530958
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500959#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
960int ft_board_setup(void *blob, bd_t *bd)
961{
962 ft_cpu_setup(blob, bd);
963
964 return 0;
965}
966#endif
967
Vignesh R5a1880b2018-03-26 13:27:01 +0530968#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530969int board_fit_config_name_match(const char *name)
970{
Vignesh R5a1880b2018-03-26 13:27:01 +0530971 bool eeprom_read = board_ti_was_eeprom_read();
972
973 if (!strcmp(name, "am4372-generic") && !eeprom_read)
974 return 0;
975 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530976 return 0;
977 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
978 return 0;
Lokesh Vutla67fb6e02016-05-16 11:11:17 +0530979 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
980 return 0;
Lokesh Vutlab64e0562016-05-16 11:11:18 +0530981 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
982 return 0;
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530983 else
984 return -1;
985}
986#endif
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500987
Vignesh R5a1880b2018-03-26 13:27:01 +0530988#ifdef CONFIG_DTB_RESELECT
989int embedded_dtb_select(void)
990{
991 do_board_detect();
992 fdtdec_setup();
993
994 return 0;
995}
996#endif
997
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500998#ifdef CONFIG_TI_SECURE_DEVICE
999void board_fit_image_post_process(void **p_image, size_t *p_size)
1000{
1001 secure_boot_verify_image(p_image, p_size);
1002}
Andrew F. Davis54523262017-07-10 14:45:53 -05001003
1004void board_tee_image_process(ulong tee_image, size_t tee_size)
1005{
1006 secure_tee_install((u32)tee_image);
1007}
1008
1009U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Madan Srinivas0b6dd122016-06-27 09:19:23 -05001010#endif