blob: 36f86926bc31345a09fc263288c15e9ed6a4d7fb [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>
Simon Glass3bbe70c2019-12-28 10:44:54 -070013#include <fdt_support.h>
Sekhar Nori2ab3c492013-12-10 15:02:15 +053014#include <i2c.h>
Simon Glassa7b51302019-11-14 12:57:46 -070015#include <init.h>
Masahiro Yamada56a931c2016-09-21 11:28:55 +090016#include <linux/errno.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053017#include <spl.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053018#include <usb.h>
Madan Srinivas0b6dd122016-06-27 09:19:23 -050019#include <asm/omap_sec_common.h>
Lokesh Vutla85b59362013-07-30 11:36:29 +053020#include <asm/arch/clock.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053021#include <asm/arch/sys_proto.h>
22#include <asm/arch/mux.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053023#include <asm/arch/ddr_defs.h>
Lokesh Vutladd0037a2013-12-10 15:02:23 +053024#include <asm/arch/gpio.h>
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +053025#include <asm/emif.h>
Semen Protsenkoa8cb0222017-06-02 18:00:00 +030026#include <asm/omap_common.h>
Nishanth Menon757a9a02016-02-24 12:30:56 -060027#include "../common/board_detect.h"
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053028#include "board.h"
Tom Rini60d2f6f2014-06-23 16:06:29 -040029#include <power/pmic.h>
Tom Rini500908a2014-06-05 11:15:30 -040030#include <power/tps65218.h>
Felipe Balbi3dcd6d82014-12-22 16:26:17 -060031#include <power/tps62362.h>
Mugunthan V Nc94f9542014-02-18 07:31:54 -050032#include <miiphy.h>
33#include <cpsw.h>
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +053034#include <linux/usb/gadget.h>
35#include <dwc3-uboot.h>
36#include <dwc3-omap-uboot.h>
37#include <ti-usb-phy-uboot.h>
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053038
39DECLARE_GLOBAL_DATA_PTR;
40
Mugunthan V Nc94f9542014-02-18 07:31:54 -050041static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V Nc94f9542014-02-18 07:31:54 -050042
Sekhar Nori2ab3c492013-12-10 15:02:15 +053043/*
44 * Read header information from EEPROM into global structure.
45 */
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053046#ifdef CONFIG_TI_I2C_BOARD_DETECT
47void do_board_detect(void)
Sekhar Nori2ab3c492013-12-10 15:02:15 +053048{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +010049 /* Ensure I2C is initialized for EEPROM access*/
50 gpi2c_init();
Simon Glass4df67572017-05-12 21:09:55 -060051 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
52 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053053 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori2ab3c492013-12-10 15:02:15 +053054}
Lokesh Vutla93e0f5b2016-10-14 10:35:25 +053055#endif
Sekhar Nori2ab3c492013-12-10 15:02:15 +053056
Sourav Poddar5248bba2014-05-19 16:53:37 -040057#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafaa680f2013-07-30 11:36:27 +053058
Lokesh Vutla42c213a2013-12-10 15:02:20 +053059const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
60 { /* 19.2 MHz */
James Doublesin73756a82014-12-22 16:26:10 -060061 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053062 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesin73756a82014-12-22 16:26:10 -060063 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
64 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
65 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
66 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053067 },
68 { /* 24 MHz */
69 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
70 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
71 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
72 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
73 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
74 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
75 },
76 { /* 25 MHz */
77 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
78 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
79 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
80 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
81 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
82 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
83 },
84 { /* 26 MHz */
85 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
86 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
87 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
88 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
89 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
90 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
91 },
92};
93
94const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -060095 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +053096 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
97 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
98 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
99};
100
101const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesin73756a82014-12-22 16:26:10 -0600102 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
103 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesin5fd8a6b2014-12-22 16:26:12 -0600104 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesin73756a82014-12-22 16:26:10 -0600105 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530106};
107
James Doublesin73756a82014-12-22 16:26:10 -0600108const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
109 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
110 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
111 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
112 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
113};
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530114
115const struct dpll_params gp_evm_dpll_ddr = {
James Doublesin73756a82014-12-22 16:26:10 -0600116 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530117
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600118static const struct dpll_params idk_dpll_ddr = {
119 400, 23, 1, -1, 2, -1, -1
120};
121
Tom Rinibe8d6352015-06-05 15:51:11 +0530122static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
123 0x00500050,
124 0x00350035,
125 0x00350035,
126 0x00350035,
127 0x00350035,
128 0x00350035,
129 0x00000000,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x00000000,
138 0x00000000,
139 0x00000000,
140 0x00000000,
141 0x40001000,
142 0x08102040
143};
144
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530145const struct ctrl_ioregs ioregs_lpddr2 = {
146 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
147 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
148 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
149 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
150 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
151 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
152 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
153 .emif_sdram_config_ext = 0x1,
154};
155
156const struct emif_regs emif_regs_lpddr2 = {
157 .sdram_config = 0x808012BA,
158 .ref_ctrl = 0x0000040D,
159 .sdram_tim1 = 0xEA86B411,
160 .sdram_tim2 = 0x103A094A,
161 .sdram_tim3 = 0x0F6BA37F,
162 .read_idle_ctrl = 0x00050000,
163 .zq_config = 0x50074BE4,
164 .temp_alert_config = 0x0,
165 .emif_rd_wr_lvl_rmp_win = 0x0,
166 .emif_rd_wr_lvl_rmp_ctl = 0x0,
167 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesin73756a82014-12-22 16:26:10 -0600168 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500169 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530170 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
171 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
172 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
173 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500174 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
175 .emif_prio_class_serv_map = 0x80000001,
176 .emif_connect_id_serv_1_map = 0x80000094,
177 .emif_connect_id_serv_2_map = 0x00000000,
178 .emif_cos_config = 0x000FFFFF
Lokesh Vutlaa82d4e12013-12-10 15:02:22 +0530179};
180
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530181const struct ctrl_ioregs ioregs_ddr3 = {
182 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
183 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
184 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
185 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
186 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
187 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
188 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesin73756a82014-12-22 16:26:10 -0600189 .emif_sdram_config_ext = 0xc163,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530190};
191
192const struct emif_regs ddr3_emif_regs_400Mhz = {
193 .sdram_config = 0x638413B2,
194 .ref_ctrl = 0x00000C30,
195 .sdram_tim1 = 0xEAAAD4DB,
196 .sdram_tim2 = 0x266B7FDA,
197 .sdram_tim3 = 0x107F8678,
198 .read_idle_ctrl = 0x00050000,
199 .zq_config = 0x50074BE4,
200 .temp_alert_config = 0x0,
Lokesh Vutla7854d3e2014-02-18 07:31:57 -0500201 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530202 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
203 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
204 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
205 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
206 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
207 .emif_rd_wr_lvl_rmp_win = 0x0,
208 .emif_rd_wr_lvl_rmp_ctl = 0x0,
209 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500210 .emif_rd_wr_exec_thresh = 0x80000405,
211 .emif_prio_class_serv_map = 0x80000001,
212 .emif_connect_id_serv_1_map = 0x80000094,
213 .emif_connect_id_serv_2_map = 0x00000000,
214 .emif_cos_config = 0x000FFFFF
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530215};
216
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500217/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
218const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
219 .sdram_config = 0x638413B2,
220 .ref_ctrl = 0x00000C30,
221 .sdram_tim1 = 0xEAAAD4DB,
222 .sdram_tim2 = 0x266B7FDA,
223 .sdram_tim3 = 0x107F8678,
224 .read_idle_ctrl = 0x00050000,
225 .zq_config = 0x50074BE4,
226 .temp_alert_config = 0x0,
227 .emif_ddr_phy_ctlr_1 = 0x0E004008,
228 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
229 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
230 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
231 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
232 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500233 .emif_rd_wr_exec_thresh = 0x80000405,
234 .emif_prio_class_serv_map = 0x80000001,
235 .emif_connect_id_serv_1_map = 0x80000094,
236 .emif_connect_id_serv_2_map = 0x00000000,
237 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500238};
239
240/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
241const struct emif_regs ddr3_emif_regs_400Mhz_production = {
242 .sdram_config = 0x638413B2,
243 .ref_ctrl = 0x00000C30,
244 .sdram_tim1 = 0xEAAAD4DB,
245 .sdram_tim2 = 0x266B7FDA,
246 .sdram_tim3 = 0x107F8678,
247 .read_idle_ctrl = 0x00050000,
248 .zq_config = 0x50074BE4,
249 .temp_alert_config = 0x0,
Brad Griffisa2e8e422019-04-29 09:59:33 +0530250 .emif_ddr_phy_ctlr_1 = 0x00048008,
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500251 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
252 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
253 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
254 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
255 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500256 .emif_rd_wr_exec_thresh = 0x80000405,
257 .emif_prio_class_serv_map = 0x80000001,
258 .emif_connect_id_serv_1_map = 0x80000094,
259 .emif_connect_id_serv_2_map = 0x00000000,
260 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500261};
262
Felipe Balbiccc6f842014-06-10 15:01:20 -0500263static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
264 .sdram_config = 0x638413b2,
265 .sdram_config2 = 0x00000000,
266 .ref_ctrl = 0x00000c30,
267 .sdram_tim1 = 0xeaaad4db,
268 .sdram_tim2 = 0x266b7fda,
269 .sdram_tim3 = 0x107f8678,
270 .read_idle_ctrl = 0x00050000,
271 .zq_config = 0x50074be4,
272 .temp_alert_config = 0x0,
273 .emif_ddr_phy_ctlr_1 = 0x0e084008,
274 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
275 .emif_ddr_ext_phy_ctrl_2 = 0x89,
276 .emif_ddr_ext_phy_ctrl_3 = 0x90,
277 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
278 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
279 .emif_rd_wr_lvl_rmp_win = 0x0,
280 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
281 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500282 .emif_rd_wr_exec_thresh = 0x80000000,
283 .emif_prio_class_serv_map = 0x80000001,
284 .emif_connect_id_serv_1_map = 0x80000094,
285 .emif_connect_id_serv_2_map = 0x00000000,
286 .emif_cos_config = 0x000FFFFF
Felipe Balbiccc6f842014-06-10 15:01:20 -0500287};
288
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600289static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
290 .sdram_config = 0x61a11b32,
291 .sdram_config2 = 0x00000000,
292 .ref_ctrl = 0x00000c30,
293 .sdram_tim1 = 0xeaaad4db,
294 .sdram_tim2 = 0x266b7fda,
295 .sdram_tim3 = 0x107f8678,
296 .read_idle_ctrl = 0x00050000,
297 .zq_config = 0x50074be4,
298 .temp_alert_config = 0x00000000,
299 .emif_ddr_phy_ctlr_1 = 0x00008009,
300 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
301 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
302 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
303 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
304 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
305 .emif_rd_wr_lvl_rmp_win = 0x00000000,
306 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
307 .emif_rd_wr_lvl_ctl = 0x00000000,
308 .emif_rd_wr_exec_thresh = 0x00000405,
309 .emif_prio_class_serv_map = 0x00000000,
310 .emif_connect_id_serv_1_map = 0x00000000,
311 .emif_connect_id_serv_2_map = 0x00000000,
312 .emif_cos_config = 0x00ffffff
313};
314
Tom Rinibe8d6352015-06-05 15:51:11 +0530315void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
316{
317 if (board_is_eposevm()) {
318 *regs = ext_phy_ctrl_const_base_lpddr2;
319 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
320 }
321
322 return;
323}
324
James Doublesin73756a82014-12-22 16:26:10 -0600325const struct dpll_params *get_dpll_ddr_params(void)
326{
327 int ind = get_sys_clk_index();
328
329 if (board_is_eposevm())
330 return &epos_evm_dpll_ddr[ind];
Madan Srinivas36235022016-05-19 19:10:48 -0500331 else if (board_is_evm() || board_is_sk())
James Doublesin73756a82014-12-22 16:26:10 -0600332 return &gp_evm_dpll_ddr;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600333 else if (board_is_idk())
334 return &idk_dpll_ddr;
James Doublesin73756a82014-12-22 16:26:10 -0600335
Nishanth Menon757a9a02016-02-24 12:30:56 -0600336 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesin73756a82014-12-22 16:26:10 -0600337 return NULL;
338}
339
340
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530341/*
342 * get_opp_offset:
343 * Returns the index for safest OPP of the device to boot.
344 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
345 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
346 * This data is read from dev_attribute register which is e-fused.
347 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
348 * OPP available. Lowest OPP starts with min_off. So returning the
349 * bit with rightmost '0'.
350 */
351static int get_opp_offset(int max_off, int min_off)
352{
353 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rini99311d62014-06-05 11:15:27 -0400354 int opp, offset, i;
355
356 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
357 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutla42c213a2013-12-10 15:02:20 +0530358
359 for (i = max_off; i >= min_off; i--) {
360 offset = opp & (1 << i);
361 if (!offset)
362 return i;
363 }
364
365 return min_off;
366}
367
368const struct dpll_params *get_dpll_mpu_params(void)
369{
370 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
371 u32 ind = get_sys_clk_index();
372
373 return &dpll_mpu[ind][opp];
374}
375
376const struct dpll_params *get_dpll_core_params(void)
377{
378 int ind = get_sys_clk_index();
379
380 return &dpll_core[ind];
381}
382
383const struct dpll_params *get_dpll_per_params(void)
384{
385 int ind = get_sys_clk_index();
386
387 return &dpll_per[ind];
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530388}
389
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600390void scale_vcores_generic(u32 m)
Tom Rini500908a2014-06-05 11:15:30 -0400391{
Keerthy00344c42018-05-02 15:06:31 +0530392 int mpu_vdd, ddr_volt;
Tom Rini500908a2014-06-05 11:15:30 -0400393
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100394#ifndef CONFIG_DM_I2C
Tom Rini500908a2014-06-05 11:15:30 -0400395 if (i2c_probe(TPS65218_CHIP_PM))
396 return;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100397#else
398 if (power_tps65218_init(0))
399 return;
400#endif
Tom Rini500908a2014-06-05 11:15:30 -0400401
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600402 switch (m) {
Felipe Balbi7948d002014-12-22 16:26:13 -0600403 case 1000:
Tom Rini500908a2014-06-05 11:15:30 -0400404 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600405 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600406 case 800:
407 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
408 break;
409 case 720:
410 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
411 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600412 case 600:
Tom Rini500908a2014-06-05 11:15:30 -0400413 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi7948d002014-12-22 16:26:13 -0600414 break;
Felipe Balbicc8535c2014-12-22 16:26:15 -0600415 case 300:
416 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
417 break;
Felipe Balbi7948d002014-12-22 16:26:13 -0600418 default:
Tom Rini500908a2014-06-05 11:15:30 -0400419 puts("Unknown MPU clock, not scaling\n");
420 return;
421 }
422
423 /* Set DCDC1 (CORE) voltage to 1.1V */
424 if (tps65218_voltage_update(TPS65218_DCDC1,
425 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600426 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400427 return;
428 }
429
430 /* Set DCDC2 (MPU) voltage */
431 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600432 printf("%s failure\n", __func__);
Tom Rini500908a2014-06-05 11:15:30 -0400433 return;
434 }
Keerthy6417a732017-06-02 15:00:31 +0530435
Keerthy00344c42018-05-02 15:06:31 +0530436 if (board_is_eposevm())
437 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
438 else
439 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
440
Keerthy6417a732017-06-02 15:00:31 +0530441 /* Set DCDC3 (DDR) voltage */
Keerthy00344c42018-05-02 15:06:31 +0530442 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthy6417a732017-06-02 15:00:31 +0530443 printf("%s failure\n", __func__);
444 return;
445 }
Tom Rini500908a2014-06-05 11:15:30 -0400446}
447
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600448void scale_vcores_idk(u32 m)
449{
450 int mpu_vdd;
451
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100452#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600453 if (i2c_probe(TPS62362_I2C_ADDR))
454 return;
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100455#else
456 if (power_tps62362_init(0))
457 return;
458#endif
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600459
460 switch (m) {
461 case 1000:
462 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
463 break;
464 case 800:
465 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
466 break;
467 case 720:
468 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
469 break;
470 case 600:
471 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
472 break;
473 case 300:
474 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
475 break;
476 default:
477 puts("Unknown MPU clock, not scaling\n");
478 return;
479 }
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600480 /* Set VDD_MPU voltage */
481 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
482 printf("%s failure\n", __func__);
483 return;
484 }
485}
Nishanth Menon757a9a02016-02-24 12:30:56 -0600486void gpi2c_init(void)
487{
488 /* When needed to be invoked prior to BSS initialization */
489 static bool first_time = true;
490
491 if (first_time) {
492 enable_i2c0_pin_mux();
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100493#ifndef CONFIG_DM_I2C
Nishanth Menon757a9a02016-02-24 12:30:56 -0600494 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
495 CONFIG_SYS_OMAP24_I2C_SLAVE);
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100496#endif
Nishanth Menon757a9a02016-02-24 12:30:56 -0600497 first_time = false;
498 }
499}
500
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600501void scale_vcores(void)
502{
503 const struct dpll_params *mpu_params;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600504
Nishanth Menon757a9a02016-02-24 12:30:56 -0600505 /* Ensure I2C is initialized for PMIC configuration */
506 gpi2c_init();
507
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600508 /* Get the frequency */
509 mpu_params = get_dpll_mpu_params();
510
511 if (board_is_idk())
512 scale_vcores_idk(mpu_params->m);
513 else
514 scale_vcores_generic(mpu_params->m);
515}
516
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530517void set_uart_mux_conf(void)
518{
519 enable_uart0_pin_mux();
520}
521
522void set_mux_conf_regs(void)
523{
524 enable_board_pin_mux();
525}
526
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530527static void enable_vtt_regulator(void)
528{
529 u32 temp;
530
531 /* enable module */
Dave Gerlach00822ca2014-02-10 11:41:49 -0500532 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530533
Dave Gerlach00822ca2014-02-10 11:41:49 -0500534 /* enable output for GPIO5_7 */
535 writel(GPIO_SETDATAOUT(7),
536 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
537 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
538 temp = temp & ~(GPIO_OE_ENABLE(7));
539 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530540}
541
Tero Kristo5d6acae2018-03-17 13:32:52 +0530542enum {
543 RTC_BOARD_EPOS = 1,
544 RTC_BOARD_EVM14,
545 RTC_BOARD_EVM12,
546 RTC_BOARD_GPEVM,
547 RTC_BOARD_SK,
548};
549
550/*
551 * In the rtc_only+DRR in self-refresh boot path we have the board type info
552 * in the rtc scratch pad register hence we bypass the costly i2c reads to
553 * eeprom and directly programthe board name string
554 */
555void rtc_only_update_board_type(u32 btype)
556{
557 const char *name = "";
558 const char *rev = "1.0";
559
560 switch (btype) {
561 case RTC_BOARD_EPOS:
562 name = "AM43EPOS";
563 break;
564 case RTC_BOARD_EVM14:
565 name = "AM43__GP";
566 rev = "1.4";
567 break;
568 case RTC_BOARD_EVM12:
569 name = "AM43__GP";
570 rev = "1.2";
571 break;
572 case RTC_BOARD_GPEVM:
573 name = "AM43__GP";
574 break;
575 case RTC_BOARD_SK:
576 name = "AM43__SK";
577 break;
578 }
579 ti_i2c_eeprom_am_set(name, rev);
580}
581
582u32 rtc_only_get_board_type(void)
583{
584 if (board_is_eposevm())
585 return RTC_BOARD_EPOS;
586 else if (board_is_evm_14_or_later())
587 return RTC_BOARD_EVM14;
588 else if (board_is_evm_12_or_later())
589 return RTC_BOARD_EVM12;
590 else if (board_is_gpevm())
591 return RTC_BOARD_GPEVM;
592 else if (board_is_sk())
593 return RTC_BOARD_SK;
594
595 return 0;
596}
597
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530598void sdram_init(void)
599{
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530600 /*
601 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
602 * GP EMV has 1GB DDR3 connected to EMIF
603 * along with VTT regulator.
604 */
605 if (board_is_eposevm()) {
606 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jrcc76fc42014-06-27 13:31:14 -0500607 } else if (board_is_evm_14_or_later()) {
608 enable_vtt_regulator();
609 config_ddr(0, &ioregs_ddr3, NULL, NULL,
610 &ddr3_emif_regs_400Mhz_production, 0);
611 } else if (board_is_evm_12_or_later()) {
612 enable_vtt_regulator();
613 config_ddr(0, &ioregs_ddr3, NULL, NULL,
614 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivas36235022016-05-19 19:10:48 -0500615 } else if (board_is_evm()) {
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530616 enable_vtt_regulator();
617 config_ddr(0, &ioregs_ddr3, NULL, NULL,
618 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbiccc6f842014-06-10 15:01:20 -0500619 } else if (board_is_sk()) {
620 config_ddr(400, &ioregs_ddr3, NULL, NULL,
621 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600622 } else if (board_is_idk()) {
623 config_ddr(400, &ioregs_ddr3, NULL, NULL,
624 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutladd0037a2013-12-10 15:02:23 +0530625 }
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530626}
627#endif
628
Tom Rini60d2f6f2014-06-23 16:06:29 -0400629/* setup board specific PMIC */
630int power_init_board(void)
631{
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100632 int rc;
633#ifndef CONFIG_DM_I2C
634 struct pmic *p = NULL;
635#endif
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600636 if (board_is_idk()) {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100637 rc = power_tps62362_init(0);
638 if (rc)
639 goto done;
640#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600641 p = pmic_get("TPS62362");
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100642 if (!p || pmic_probe(p))
643 goto done;
644#endif
645 puts("PMIC: TPS62362\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600646 } else {
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100647 rc = power_tps65218_init(0);
648 if (rc)
649 goto done;
650#ifndef CONFIG_DM_I2C
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600651 p = pmic_get("TPS65218_PMIC");
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100652 if (!p || pmic_probe(p))
653 goto done;
654#endif
655 puts("PMIC: TPS65218\n");
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600656 }
Jean-Jacques Hiblot52a51512018-12-07 14:50:49 +0100657done:
Tom Rini60d2f6f2014-06-23 16:06:29 -0400658 return 0;
659}
660
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530661int board_init(void)
662{
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500663 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
664 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
665 modena_init0_bw_integer, modena_init0_watermark_0;
666
Lokesh Vutlab82e6e92013-12-10 15:02:12 +0530667 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon gupta3eb6f862014-07-22 16:03:22 +0530668 gpmc_init();
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530669
Faiz Abbasd24bdf12018-01-19 15:32:48 +0530670 /*
671 * Call this to initialize *ctrl again
672 */
673 hw_data_init();
674
Cooper Jr., Franklindf25e352014-06-27 13:31:15 -0500675 /* Clear all important bits for DSS errata that may need to be tweaked*/
676 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
677 MREQPRIO_0_SAB_INIT0_MASK;
678
679 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
680
681 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
682 BW_LIMITER_BW_FRAC_MASK;
683
684 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
685 BW_LIMITER_BW_INT_MASK;
686
687 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
688 BW_LIMITER_BW_WATERMARK_MASK;
689
690 /* Setting MReq Priority of the DSS*/
691 mreqprio_0 |= 0x77;
692
693 /*
694 * Set L3 Fast Configuration Register
695 * Limiting bandwith for ARM core to 700 MBPS
696 */
697 modena_init0_bw_fractional |= 0x10;
698 modena_init0_bw_integer |= 0x3;
699
700 writel(mreqprio_0, &cdev->mreqprio_0);
701 writel(mreqprio_1, &cdev->mreqprio_1);
702
703 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
704 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
705 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
706
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530707 return 0;
708}
709
710#ifdef CONFIG_BOARD_LATE_INIT
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100711#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
712static int device_okay(const char *path)
713{
714 int node;
715
716 node = fdt_path_offset(gd->fdt_blob, path);
717 if (node < 0)
718 return 0;
719
720 return fdtdec_get_is_enabled(gd->fdt_blob, node);
721}
722#endif
723
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530724int board_late_init(void)
725{
Tero Kristo30bc6d82019-09-27 19:14:28 +0300726 struct udevice *dev;
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530727#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon757a9a02016-02-24 12:30:56 -0600728 set_board_info_env(NULL);
Lokesh Vutla1eb0f542016-11-29 11:58:03 +0530729
730 /*
731 * Default FIT boot on HS devices. Non FIT images are not allowed
732 * on HS devices.
733 */
734 if (get_device_type() == HS_DEVICE)
Simon Glass6a38e412017-08-03 12:22:09 -0600735 env_set("boot_fit", "1");
Sekhar Nori00dc07d2013-12-10 15:02:16 +0530736#endif
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100737
738#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
739 if (device_okay("/ocp/omap_dwc3@48380000"))
740 enable_usb_clocks(0);
741 if (device_okay("/ocp/omap_dwc3@483c0000"))
742 enable_usb_clocks(1);
743#endif
Tero Kristo30bc6d82019-09-27 19:14:28 +0300744
745 /* Just probe the potentially supported cdce913 device */
746 uclass_get_device(UCLASS_CLK, 0, &dev);
747
Lokesh Vutlafaa680f2013-07-30 11:36:27 +0530748 return 0;
749}
750#endif
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500751
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100752#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530753#ifdef CONFIG_USB_DWC3
754static struct dwc3_device usb_otg_ss1 = {
755 .maximum_speed = USB_SPEED_HIGH,
756 .base = USB_OTG_SS1_BASE,
757 .tx_fifo_resize = false,
758 .index = 0,
759};
760
761static struct dwc3_omap_device usb_otg_ss1_glue = {
762 .base = (void *)USB_OTG_SS1_GLUE_BASE,
763 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530764 .index = 0,
765};
766
767static struct ti_usb_phy_device usb_phy1_device = {
768 .usb2_phy_power = (void *)USB2_PHY1_POWER,
769 .index = 0,
770};
771
772static struct dwc3_device usb_otg_ss2 = {
773 .maximum_speed = USB_SPEED_HIGH,
774 .base = USB_OTG_SS2_BASE,
775 .tx_fifo_resize = false,
776 .index = 1,
777};
778
779static struct dwc3_omap_device usb_otg_ss2_glue = {
780 .base = (void *)USB_OTG_SS2_GLUE_BASE,
781 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530782 .index = 1,
783};
784
785static struct ti_usb_phy_device usb_phy2_device = {
786 .usb2_phy_power = (void *)USB2_PHY2_POWER,
787 .index = 1,
788};
789
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300790int usb_gadget_handle_interrupts(int index)
791{
792 u32 status;
793
794 status = dwc3_omap_uboot_interrupt_status(index);
795 if (status)
796 dwc3_uboot_handle_interrupt(index);
797
798 return 0;
799}
800#endif /* CONFIG_USB_DWC3 */
801
802#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbas29836a92018-02-15 17:12:11 +0530803int board_usb_init(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530804{
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530805 enable_usb_clocks(index);
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300806#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530807 switch (index) {
808 case 0:
809 if (init == USB_INIT_DEVICE) {
810 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
811 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300812 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
813 ti_usb_phy_uboot_init(&usb_phy1_device);
814 dwc3_uboot_init(&usb_otg_ss1);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530815 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530816 break;
817 case 1:
818 if (init == USB_INIT_DEVICE) {
819 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
820 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300821 ti_usb_phy_uboot_init(&usb_phy2_device);
822 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
823 dwc3_uboot_init(&usb_otg_ss2);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530824 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530825 break;
826 default:
827 printf("Invalid Controller Index\n");
828 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300829#endif
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530830
831 return 0;
832}
833
Faiz Abbas29836a92018-02-15 17:12:11 +0530834int board_usb_cleanup(int index, enum usb_init_type init)
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530835{
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300836#ifdef CONFIG_USB_DWC3
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530837 switch (index) {
838 case 0:
839 case 1:
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300840 if (init == USB_INIT_DEVICE) {
841 ti_usb_phy_uboot_exit(index);
842 dwc3_uboot_exit(index);
843 dwc3_omap_uboot_exit(index);
844 }
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530845 break;
846 default:
847 printf("Invalid Controller Index\n");
848 }
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300849#endif
Kishon Vijay Abraham I831bcba2015-08-19 16:16:27 +0530850 disable_usb_clocks(index);
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530851
852 return 0;
853}
Roger Quadrosaeb92b92016-05-23 17:37:48 +0300854#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Jean-Jacques Hiblotf1ef3142018-12-04 11:30:51 +0100855#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
Kishon Vijay Abraham I08ff0fd2015-02-23 18:40:21 +0530856
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500857#ifdef CONFIG_DRIVER_TI_CPSW
858
859static void cpsw_control(int enabled)
860{
861 /* Additional controls can be added here */
862 return;
863}
864
865static struct cpsw_slave_data cpsw_slaves[] = {
866 {
867 .slave_reg_ofs = 0x208,
868 .sliver_reg_ofs = 0xd80,
869 .phy_addr = 16,
870 },
871 {
872 .slave_reg_ofs = 0x308,
873 .sliver_reg_ofs = 0xdc0,
874 .phy_addr = 1,
875 },
876};
877
878static struct cpsw_platform_data cpsw_data = {
879 .mdio_base = CPSW_MDIO_BASE,
880 .cpsw_base = CPSW_BASE,
881 .mdio_div = 0xff,
882 .channels = 8,
883 .cpdma_reg_ofs = 0x800,
884 .slaves = 1,
885 .slave_data = cpsw_slaves,
886 .ale_reg_ofs = 0xd00,
887 .ale_entries = 1024,
888 .host_port_reg_ofs = 0x108,
889 .hw_stats_reg_ofs = 0x900,
890 .bd_ram_ofs = 0x2000,
891 .mac_control = (1 << 5),
892 .control = cpsw_control,
893 .host_port_num = 0,
894 .version = CPSW_CTRL_VERSION_2,
895};
896
897int board_eth_init(bd_t *bis)
898{
899 int rv;
900 uint8_t mac_addr[6];
901 uint32_t mac_hi, mac_lo;
902
903 /* try reading mac address from efuse */
904 mac_lo = readl(&cdev->macid0l);
905 mac_hi = readl(&cdev->macid0h);
906 mac_addr[0] = mac_hi & 0xFF;
907 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
908 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
909 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
910 mac_addr[4] = mac_lo & 0xFF;
911 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
912
Simon Glass64b723f2017-08-03 12:22:12 -0600913 if (!env_get("ethaddr")) {
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500914 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger8ecdbed2015-04-08 01:41:04 -0500915 if (is_valid_ethaddr(mac_addr))
Simon Glass8551d552017-08-03 12:22:11 -0600916 eth_env_set_enetaddr("ethaddr", mac_addr);
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500917 }
918
919 mac_lo = readl(&cdev->macid1l);
920 mac_hi = readl(&cdev->macid1h);
921 mac_addr[0] = mac_hi & 0xFF;
922 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
923 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
924 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
925 mac_addr[4] = mac_lo & 0xFF;
926 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
927
Simon Glass64b723f2017-08-03 12:22:12 -0600928 if (!env_get("eth1addr")) {
Joe Hershberger8ecdbed2015-04-08 01:41:04 -0500929 if (is_valid_ethaddr(mac_addr))
Simon Glass8551d552017-08-03 12:22:11 -0600930 eth_env_set_enetaddr("eth1addr", mac_addr);
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500931 }
932
933 if (board_is_eposevm()) {
934 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
935 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
936 cpsw_slaves[0].phy_addr = 16;
Felipe Balbie3d0b692014-06-10 15:01:21 -0500937 } else if (board_is_sk()) {
938 writel(RGMII_MODE_ENABLE, &cdev->miisel);
939 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
940 cpsw_slaves[0].phy_addr = 4;
941 cpsw_slaves[1].phy_addr = 5;
Felipe Balbi3dcd6d82014-12-22 16:26:17 -0600942 } else if (board_is_idk()) {
943 writel(RGMII_MODE_ENABLE, &cdev->miisel);
944 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
945 cpsw_slaves[0].phy_addr = 0;
Mugunthan V Nc94f9542014-02-18 07:31:54 -0500946 } else {
947 writel(RGMII_MODE_ENABLE, &cdev->miisel);
948 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
949 cpsw_slaves[0].phy_addr = 0;
950 }
951
952 rv = cpsw_register(&cpsw_data);
953 if (rv < 0)
954 printf("Error %d registering CPSW switch\n", rv);
955
956 return rv;
957}
958#endif
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530959
Andrew F. Davisc73b3992017-07-10 14:45:54 -0500960#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
961int ft_board_setup(void *blob, bd_t *bd)
962{
963 ft_cpu_setup(blob, bd);
964
965 return 0;
966}
967#endif
968
Vignesh R5a1880b2018-03-26 13:27:01 +0530969#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530970int board_fit_config_name_match(const char *name)
971{
Vignesh R5a1880b2018-03-26 13:27:01 +0530972 bool eeprom_read = board_ti_was_eeprom_read();
973
974 if (!strcmp(name, "am4372-generic") && !eeprom_read)
975 return 0;
976 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530977 return 0;
978 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
979 return 0;
Lokesh Vutla67fb6e02016-05-16 11:11:17 +0530980 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
981 return 0;
Lokesh Vutlab64e0562016-05-16 11:11:18 +0530982 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
983 return 0;
Lokesh Vutlabb30b192016-05-16 11:11:15 +0530984 else
985 return -1;
986}
987#endif
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500988
Vignesh R5a1880b2018-03-26 13:27:01 +0530989#ifdef CONFIG_DTB_RESELECT
990int embedded_dtb_select(void)
991{
992 do_board_detect();
993 fdtdec_setup();
994
995 return 0;
996}
997#endif
998
Madan Srinivas0b6dd122016-06-27 09:19:23 -0500999#ifdef CONFIG_TI_SECURE_DEVICE
1000void board_fit_image_post_process(void **p_image, size_t *p_size)
1001{
1002 secure_boot_verify_image(p_image, p_size);
1003}
Andrew F. Davis54523262017-07-10 14:45:53 -05001004
1005void board_tee_image_process(ulong tee_image, size_t tee_size)
1006{
1007 secure_tee_install((u32)tee_image);
1008}
1009
1010U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Madan Srinivas0b6dd122016-06-27 09:19:23 -05001011#endif