blob: 756b516aa6b896c9cee09257fa249b56b54fb127 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Lokesh Vutlafbf27282013-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 Vutlafbf27282013-07-30 11:36:27 +05308 */
9
10#include <common.h>
Simon Glass9fb625c2019-08-01 09:46:51 -060011#include <env.h>
Alex Kiernan9925f1d2018-04-01 09:22:38 +000012#include <environment.h>
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053013#include <i2c.h>
Masahiro Yamada1221ce42016-09-21 11:28:55 +090014#include <linux/errno.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053015#include <spl.h>
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +053016#include <usb.h>
Madan Srinivase29878f2016-06-27 09:19:23 -050017#include <asm/omap_sec_common.h>
Lokesh Vutla3b34ac12013-07-30 11:36:29 +053018#include <asm/arch/clock.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053019#include <asm/arch/sys_proto.h>
20#include <asm/arch/mux.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053021#include <asm/arch/ddr_defs.h>
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +053022#include <asm/arch/gpio.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053023#include <asm/emif.h>
Semen Protsenko00bbe962017-06-02 18:00:00 +030024#include <asm/omap_common.h>
Nishanth Menon5f8bb932016-02-24 12:30:56 -060025#include "../common/board_detect.h"
Lokesh Vutlafbf27282013-07-30 11:36:27 +053026#include "board.h"
Tom Rini7aa55982014-06-23 16:06:29 -040027#include <power/pmic.h>
Tom Rini83bad102014-06-05 11:15:30 -040028#include <power/tps65218.h>
Felipe Balbi403d70a2014-12-22 16:26:17 -060029#include <power/tps62362.h>
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050030#include <miiphy.h>
31#include <cpsw.h>
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +053032#include <linux/usb/gadget.h>
33#include <dwc3-uboot.h>
34#include <dwc3-omap-uboot.h>
35#include <ti-usb-phy-uboot.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053036
37DECLARE_GLOBAL_DATA_PTR;
38
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050039static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050040
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053041/*
42 * Read header information from EEPROM into global structure.
43 */
Lokesh Vutla140d76a2016-10-14 10:35:25 +053044#ifdef CONFIG_TI_I2C_BOARD_DETECT
45void do_board_detect(void)
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053046{
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +010047 /* Ensure I2C is initialized for EEPROM access*/
48 gpi2c_init();
Simon Glass64a144d2017-05-12 21:09:55 -060049 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
50 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla140d76a2016-10-14 10:35:25 +053051 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053052}
Lokesh Vutla140d76a2016-10-14 10:35:25 +053053#endif
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053054
Sourav Poddar7a5f71b2014-05-19 16:53:37 -040055#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafbf27282013-07-30 11:36:27 +053056
Lokesh Vutlacf04d032013-12-10 15:02:20 +053057const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
58 { /* 19.2 MHz */
James Doublesine2a62072014-12-22 16:26:10 -060059 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053060 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesine2a62072014-12-22 16:26:10 -060061 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
62 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
63 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
64 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053065 },
66 { /* 24 MHz */
67 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
68 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
69 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
70 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
71 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
72 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
73 },
74 { /* 25 MHz */
75 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
76 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
77 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
78 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
79 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
80 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
81 },
82 { /* 26 MHz */
83 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
84 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
85 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
86 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
87 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
88 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
89 },
90};
91
92const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -060093 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053094 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
95 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
96 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
97};
98
99const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -0600100 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
101 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesinc87b6a92014-12-22 16:26:12 -0600102 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesine2a62072014-12-22 16:26:10 -0600103 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530104};
105
James Doublesine2a62072014-12-22 16:26:10 -0600106const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
107 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
108 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
109 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
110 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
111};
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530112
113const struct dpll_params gp_evm_dpll_ddr = {
James Doublesine2a62072014-12-22 16:26:10 -0600114 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530115
Felipe Balbi403d70a2014-12-22 16:26:17 -0600116static const struct dpll_params idk_dpll_ddr = {
117 400, 23, 1, -1, 2, -1, -1
118};
119
Tom Rini7c352cd2015-06-05 15:51:11 +0530120static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
121 0x00500050,
122 0x00350035,
123 0x00350035,
124 0x00350035,
125 0x00350035,
126 0x00350035,
127 0x00000000,
128 0x00000000,
129 0x00000000,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x00000000,
138 0x00000000,
139 0x40001000,
140 0x08102040
141};
142
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530143const struct ctrl_ioregs ioregs_lpddr2 = {
144 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
145 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
146 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
147 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
148 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
149 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
150 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
151 .emif_sdram_config_ext = 0x1,
152};
153
154const struct emif_regs emif_regs_lpddr2 = {
155 .sdram_config = 0x808012BA,
156 .ref_ctrl = 0x0000040D,
157 .sdram_tim1 = 0xEA86B411,
158 .sdram_tim2 = 0x103A094A,
159 .sdram_tim3 = 0x0F6BA37F,
160 .read_idle_ctrl = 0x00050000,
161 .zq_config = 0x50074BE4,
162 .temp_alert_config = 0x0,
163 .emif_rd_wr_lvl_rmp_win = 0x0,
164 .emif_rd_wr_lvl_rmp_ctl = 0x0,
165 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesine2a62072014-12-22 16:26:10 -0600166 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500167 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530168 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
169 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
170 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
171 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500172 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
173 .emif_prio_class_serv_map = 0x80000001,
174 .emif_connect_id_serv_1_map = 0x80000094,
175 .emif_connect_id_serv_2_map = 0x00000000,
176 .emif_cos_config = 0x000FFFFF
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530177};
178
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530179const struct ctrl_ioregs ioregs_ddr3 = {
180 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
181 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
182 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
183 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
184 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
185 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
186 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesine2a62072014-12-22 16:26:10 -0600187 .emif_sdram_config_ext = 0xc163,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530188};
189
190const struct emif_regs ddr3_emif_regs_400Mhz = {
191 .sdram_config = 0x638413B2,
192 .ref_ctrl = 0x00000C30,
193 .sdram_tim1 = 0xEAAAD4DB,
194 .sdram_tim2 = 0x266B7FDA,
195 .sdram_tim3 = 0x107F8678,
196 .read_idle_ctrl = 0x00050000,
197 .zq_config = 0x50074BE4,
198 .temp_alert_config = 0x0,
Lokesh Vutlae27f2dd2014-02-18 07:31:57 -0500199 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530200 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
201 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
202 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
203 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
204 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
205 .emif_rd_wr_lvl_rmp_win = 0x0,
206 .emif_rd_wr_lvl_rmp_ctl = 0x0,
207 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500208 .emif_rd_wr_exec_thresh = 0x80000405,
209 .emif_prio_class_serv_map = 0x80000001,
210 .emif_connect_id_serv_1_map = 0x80000094,
211 .emif_connect_id_serv_2_map = 0x00000000,
212 .emif_cos_config = 0x000FFFFF
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530213};
214
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500215/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
216const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
217 .sdram_config = 0x638413B2,
218 .ref_ctrl = 0x00000C30,
219 .sdram_tim1 = 0xEAAAD4DB,
220 .sdram_tim2 = 0x266B7FDA,
221 .sdram_tim3 = 0x107F8678,
222 .read_idle_ctrl = 0x00050000,
223 .zq_config = 0x50074BE4,
224 .temp_alert_config = 0x0,
225 .emif_ddr_phy_ctlr_1 = 0x0E004008,
226 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
227 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
228 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
229 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
230 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500231 .emif_rd_wr_exec_thresh = 0x80000405,
232 .emif_prio_class_serv_map = 0x80000001,
233 .emif_connect_id_serv_1_map = 0x80000094,
234 .emif_connect_id_serv_2_map = 0x00000000,
235 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500236};
237
238/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
239const struct emif_regs ddr3_emif_regs_400Mhz_production = {
240 .sdram_config = 0x638413B2,
241 .ref_ctrl = 0x00000C30,
242 .sdram_tim1 = 0xEAAAD4DB,
243 .sdram_tim2 = 0x266B7FDA,
244 .sdram_tim3 = 0x107F8678,
245 .read_idle_ctrl = 0x00050000,
246 .zq_config = 0x50074BE4,
247 .temp_alert_config = 0x0,
Brad Griffis5adcbe02019-04-29 09:59:33 +0530248 .emif_ddr_phy_ctlr_1 = 0x00048008,
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500249 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
250 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
251 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
252 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
253 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500254 .emif_rd_wr_exec_thresh = 0x80000405,
255 .emif_prio_class_serv_map = 0x80000001,
256 .emif_connect_id_serv_1_map = 0x80000094,
257 .emif_connect_id_serv_2_map = 0x00000000,
258 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500259};
260
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500261static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
262 .sdram_config = 0x638413b2,
263 .sdram_config2 = 0x00000000,
264 .ref_ctrl = 0x00000c30,
265 .sdram_tim1 = 0xeaaad4db,
266 .sdram_tim2 = 0x266b7fda,
267 .sdram_tim3 = 0x107f8678,
268 .read_idle_ctrl = 0x00050000,
269 .zq_config = 0x50074be4,
270 .temp_alert_config = 0x0,
271 .emif_ddr_phy_ctlr_1 = 0x0e084008,
272 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
273 .emif_ddr_ext_phy_ctrl_2 = 0x89,
274 .emif_ddr_ext_phy_ctrl_3 = 0x90,
275 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
276 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
277 .emif_rd_wr_lvl_rmp_win = 0x0,
278 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
279 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500280 .emif_rd_wr_exec_thresh = 0x80000000,
281 .emif_prio_class_serv_map = 0x80000001,
282 .emif_connect_id_serv_1_map = 0x80000094,
283 .emif_connect_id_serv_2_map = 0x00000000,
284 .emif_cos_config = 0x000FFFFF
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500285};
286
Felipe Balbi403d70a2014-12-22 16:26:17 -0600287static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
288 .sdram_config = 0x61a11b32,
289 .sdram_config2 = 0x00000000,
290 .ref_ctrl = 0x00000c30,
291 .sdram_tim1 = 0xeaaad4db,
292 .sdram_tim2 = 0x266b7fda,
293 .sdram_tim3 = 0x107f8678,
294 .read_idle_ctrl = 0x00050000,
295 .zq_config = 0x50074be4,
296 .temp_alert_config = 0x00000000,
297 .emif_ddr_phy_ctlr_1 = 0x00008009,
298 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
299 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
300 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
301 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
302 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
303 .emif_rd_wr_lvl_rmp_win = 0x00000000,
304 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
305 .emif_rd_wr_lvl_ctl = 0x00000000,
306 .emif_rd_wr_exec_thresh = 0x00000405,
307 .emif_prio_class_serv_map = 0x00000000,
308 .emif_connect_id_serv_1_map = 0x00000000,
309 .emif_connect_id_serv_2_map = 0x00000000,
310 .emif_cos_config = 0x00ffffff
311};
312
Tom Rini7c352cd2015-06-05 15:51:11 +0530313void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
314{
315 if (board_is_eposevm()) {
316 *regs = ext_phy_ctrl_const_base_lpddr2;
317 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
318 }
319
320 return;
321}
322
James Doublesine2a62072014-12-22 16:26:10 -0600323const struct dpll_params *get_dpll_ddr_params(void)
324{
325 int ind = get_sys_clk_index();
326
327 if (board_is_eposevm())
328 return &epos_evm_dpll_ddr[ind];
Madan Srinivasa5051b72016-05-19 19:10:48 -0500329 else if (board_is_evm() || board_is_sk())
James Doublesine2a62072014-12-22 16:26:10 -0600330 return &gp_evm_dpll_ddr;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600331 else if (board_is_idk())
332 return &idk_dpll_ddr;
James Doublesine2a62072014-12-22 16:26:10 -0600333
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600334 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesine2a62072014-12-22 16:26:10 -0600335 return NULL;
336}
337
338
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530339/*
340 * get_opp_offset:
341 * Returns the index for safest OPP of the device to boot.
342 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
343 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
344 * This data is read from dev_attribute register which is e-fused.
345 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
346 * OPP available. Lowest OPP starts with min_off. So returning the
347 * bit with rightmost '0'.
348 */
349static int get_opp_offset(int max_off, int min_off)
350{
351 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rinifeca6e62014-06-05 11:15:27 -0400352 int opp, offset, i;
353
354 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
355 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530356
357 for (i = max_off; i >= min_off; i--) {
358 offset = opp & (1 << i);
359 if (!offset)
360 return i;
361 }
362
363 return min_off;
364}
365
366const struct dpll_params *get_dpll_mpu_params(void)
367{
368 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
369 u32 ind = get_sys_clk_index();
370
371 return &dpll_mpu[ind][opp];
372}
373
374const struct dpll_params *get_dpll_core_params(void)
375{
376 int ind = get_sys_clk_index();
377
378 return &dpll_core[ind];
379}
380
381const struct dpll_params *get_dpll_per_params(void)
382{
383 int ind = get_sys_clk_index();
384
385 return &dpll_per[ind];
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530386}
387
Felipe Balbi403d70a2014-12-22 16:26:17 -0600388void scale_vcores_generic(u32 m)
Tom Rini83bad102014-06-05 11:15:30 -0400389{
Keerthyebf48502018-05-02 15:06:31 +0530390 int mpu_vdd, ddr_volt;
Tom Rini83bad102014-06-05 11:15:30 -0400391
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100392#ifndef CONFIG_DM_I2C
Tom Rini83bad102014-06-05 11:15:30 -0400393 if (i2c_probe(TPS65218_CHIP_PM))
394 return;
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100395#else
396 if (power_tps65218_init(0))
397 return;
398#endif
Tom Rini83bad102014-06-05 11:15:30 -0400399
Felipe Balbi403d70a2014-12-22 16:26:17 -0600400 switch (m) {
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600401 case 1000:
Tom Rini83bad102014-06-05 11:15:30 -0400402 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600403 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600404 case 800:
405 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
406 break;
407 case 720:
408 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
409 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600410 case 600:
Tom Rini83bad102014-06-05 11:15:30 -0400411 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600412 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600413 case 300:
414 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
415 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600416 default:
Tom Rini83bad102014-06-05 11:15:30 -0400417 puts("Unknown MPU clock, not scaling\n");
418 return;
419 }
420
421 /* Set DCDC1 (CORE) voltage to 1.1V */
422 if (tps65218_voltage_update(TPS65218_DCDC1,
423 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600424 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400425 return;
426 }
427
428 /* Set DCDC2 (MPU) voltage */
429 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600430 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400431 return;
432 }
Keerthyfc69d472017-06-02 15:00:31 +0530433
Keerthyebf48502018-05-02 15:06:31 +0530434 if (board_is_eposevm())
435 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
436 else
437 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
438
Keerthyfc69d472017-06-02 15:00:31 +0530439 /* Set DCDC3 (DDR) voltage */
Keerthyebf48502018-05-02 15:06:31 +0530440 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthyfc69d472017-06-02 15:00:31 +0530441 printf("%s failure\n", __func__);
442 return;
443 }
Tom Rini83bad102014-06-05 11:15:30 -0400444}
445
Felipe Balbi403d70a2014-12-22 16:26:17 -0600446void scale_vcores_idk(u32 m)
447{
448 int mpu_vdd;
449
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100450#ifndef CONFIG_DM_I2C
Felipe Balbi403d70a2014-12-22 16:26:17 -0600451 if (i2c_probe(TPS62362_I2C_ADDR))
452 return;
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100453#else
454 if (power_tps62362_init(0))
455 return;
456#endif
Felipe Balbi403d70a2014-12-22 16:26:17 -0600457
458 switch (m) {
459 case 1000:
460 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
461 break;
462 case 800:
463 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
464 break;
465 case 720:
466 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
467 break;
468 case 600:
469 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
470 break;
471 case 300:
472 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
473 break;
474 default:
475 puts("Unknown MPU clock, not scaling\n");
476 return;
477 }
Felipe Balbi403d70a2014-12-22 16:26:17 -0600478 /* Set VDD_MPU voltage */
479 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
480 printf("%s failure\n", __func__);
481 return;
482 }
483}
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600484void gpi2c_init(void)
485{
486 /* When needed to be invoked prior to BSS initialization */
487 static bool first_time = true;
488
489 if (first_time) {
490 enable_i2c0_pin_mux();
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100491#ifndef CONFIG_DM_I2C
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600492 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
493 CONFIG_SYS_OMAP24_I2C_SLAVE);
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100494#endif
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600495 first_time = false;
496 }
497}
498
Felipe Balbi403d70a2014-12-22 16:26:17 -0600499void scale_vcores(void)
500{
501 const struct dpll_params *mpu_params;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600502
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600503 /* Ensure I2C is initialized for PMIC configuration */
504 gpi2c_init();
505
Felipe Balbi403d70a2014-12-22 16:26:17 -0600506 /* Get the frequency */
507 mpu_params = get_dpll_mpu_params();
508
509 if (board_is_idk())
510 scale_vcores_idk(mpu_params->m);
511 else
512 scale_vcores_generic(mpu_params->m);
513}
514
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530515void set_uart_mux_conf(void)
516{
517 enable_uart0_pin_mux();
518}
519
520void set_mux_conf_regs(void)
521{
522 enable_board_pin_mux();
523}
524
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530525static void enable_vtt_regulator(void)
526{
527 u32 temp;
528
529 /* enable module */
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500530 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530531
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500532 /* enable output for GPIO5_7 */
533 writel(GPIO_SETDATAOUT(7),
534 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
535 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
536 temp = temp & ~(GPIO_OE_ENABLE(7));
537 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530538}
539
Tero Kristo7619bad2018-03-17 13:32:52 +0530540enum {
541 RTC_BOARD_EPOS = 1,
542 RTC_BOARD_EVM14,
543 RTC_BOARD_EVM12,
544 RTC_BOARD_GPEVM,
545 RTC_BOARD_SK,
546};
547
548/*
549 * In the rtc_only+DRR in self-refresh boot path we have the board type info
550 * in the rtc scratch pad register hence we bypass the costly i2c reads to
551 * eeprom and directly programthe board name string
552 */
553void rtc_only_update_board_type(u32 btype)
554{
555 const char *name = "";
556 const char *rev = "1.0";
557
558 switch (btype) {
559 case RTC_BOARD_EPOS:
560 name = "AM43EPOS";
561 break;
562 case RTC_BOARD_EVM14:
563 name = "AM43__GP";
564 rev = "1.4";
565 break;
566 case RTC_BOARD_EVM12:
567 name = "AM43__GP";
568 rev = "1.2";
569 break;
570 case RTC_BOARD_GPEVM:
571 name = "AM43__GP";
572 break;
573 case RTC_BOARD_SK:
574 name = "AM43__SK";
575 break;
576 }
577 ti_i2c_eeprom_am_set(name, rev);
578}
579
580u32 rtc_only_get_board_type(void)
581{
582 if (board_is_eposevm())
583 return RTC_BOARD_EPOS;
584 else if (board_is_evm_14_or_later())
585 return RTC_BOARD_EVM14;
586 else if (board_is_evm_12_or_later())
587 return RTC_BOARD_EVM12;
588 else if (board_is_gpevm())
589 return RTC_BOARD_GPEVM;
590 else if (board_is_sk())
591 return RTC_BOARD_SK;
592
593 return 0;
594}
595
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530596void sdram_init(void)
597{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530598 /*
599 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
600 * GP EMV has 1GB DDR3 connected to EMIF
601 * along with VTT regulator.
602 */
603 if (board_is_eposevm()) {
604 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500605 } else if (board_is_evm_14_or_later()) {
606 enable_vtt_regulator();
607 config_ddr(0, &ioregs_ddr3, NULL, NULL,
608 &ddr3_emif_regs_400Mhz_production, 0);
609 } else if (board_is_evm_12_or_later()) {
610 enable_vtt_regulator();
611 config_ddr(0, &ioregs_ddr3, NULL, NULL,
612 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivasa5051b72016-05-19 19:10:48 -0500613 } else if (board_is_evm()) {
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530614 enable_vtt_regulator();
615 config_ddr(0, &ioregs_ddr3, NULL, NULL,
616 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500617 } else if (board_is_sk()) {
618 config_ddr(400, &ioregs_ddr3, NULL, NULL,
619 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi403d70a2014-12-22 16:26:17 -0600620 } else if (board_is_idk()) {
621 config_ddr(400, &ioregs_ddr3, NULL, NULL,
622 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530623 }
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530624}
625#endif
626
Tom Rini7aa55982014-06-23 16:06:29 -0400627/* setup board specific PMIC */
628int power_init_board(void)
629{
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100630 int rc;
631#ifndef CONFIG_DM_I2C
632 struct pmic *p = NULL;
633#endif
Felipe Balbi403d70a2014-12-22 16:26:17 -0600634 if (board_is_idk()) {
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100635 rc = power_tps62362_init(0);
636 if (rc)
637 goto done;
638#ifndef CONFIG_DM_I2C
Felipe Balbi403d70a2014-12-22 16:26:17 -0600639 p = pmic_get("TPS62362");
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100640 if (!p || pmic_probe(p))
641 goto done;
642#endif
643 puts("PMIC: TPS62362\n");
Felipe Balbi403d70a2014-12-22 16:26:17 -0600644 } else {
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100645 rc = power_tps65218_init(0);
646 if (rc)
647 goto done;
648#ifndef CONFIG_DM_I2C
Felipe Balbi403d70a2014-12-22 16:26:17 -0600649 p = pmic_get("TPS65218_PMIC");
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100650 if (!p || pmic_probe(p))
651 goto done;
652#endif
653 puts("PMIC: TPS65218\n");
Felipe Balbi403d70a2014-12-22 16:26:17 -0600654 }
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100655done:
Tom Rini7aa55982014-06-23 16:06:29 -0400656 return 0;
657}
658
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530659int board_init(void)
660{
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500661 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
662 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
663 modena_init0_bw_integer, modena_init0_watermark_0;
664
Lokesh Vutla369cbe12013-12-10 15:02:12 +0530665 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon guptae53ad4b2014-07-22 16:03:22 +0530666 gpmc_init();
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530667
Faiz Abbasa93feb22018-01-19 15:32:48 +0530668 /*
669 * Call this to initialize *ctrl again
670 */
671 hw_data_init();
672
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500673 /* Clear all important bits for DSS errata that may need to be tweaked*/
674 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
675 MREQPRIO_0_SAB_INIT0_MASK;
676
677 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
678
679 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
680 BW_LIMITER_BW_FRAC_MASK;
681
682 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
683 BW_LIMITER_BW_INT_MASK;
684
685 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
686 BW_LIMITER_BW_WATERMARK_MASK;
687
688 /* Setting MReq Priority of the DSS*/
689 mreqprio_0 |= 0x77;
690
691 /*
692 * Set L3 Fast Configuration Register
693 * Limiting bandwith for ARM core to 700 MBPS
694 */
695 modena_init0_bw_fractional |= 0x10;
696 modena_init0_bw_integer |= 0x3;
697
698 writel(mreqprio_0, &cdev->mreqprio_0);
699 writel(mreqprio_1, &cdev->mreqprio_1);
700
701 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
702 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
703 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
704
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530705 return 0;
706}
707
708#ifdef CONFIG_BOARD_LATE_INIT
Jean-Jacques Hiblot347631b2018-12-04 11:30:51 +0100709#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
710static int device_okay(const char *path)
711{
712 int node;
713
714 node = fdt_path_offset(gd->fdt_blob, path);
715 if (node < 0)
716 return 0;
717
718 return fdtdec_get_is_enabled(gd->fdt_blob, node);
719}
720#endif
721
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530722int board_late_init(void)
723{
Sekhar Norif4af1632013-12-10 15:02:16 +0530724#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600725 set_board_info_env(NULL);
Lokesh Vutla5d4d4362016-11-29 11:58:03 +0530726
727 /*
728 * Default FIT boot on HS devices. Non FIT images are not allowed
729 * on HS devices.
730 */
731 if (get_device_type() == HS_DEVICE)
Simon Glass382bee52017-08-03 12:22:09 -0600732 env_set("boot_fit", "1");
Sekhar Norif4af1632013-12-10 15:02:16 +0530733#endif
Jean-Jacques Hiblot347631b2018-12-04 11:30:51 +0100734
735#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
736 if (device_okay("/ocp/omap_dwc3@48380000"))
737 enable_usb_clocks(0);
738 if (device_okay("/ocp/omap_dwc3@483c0000"))
739 enable_usb_clocks(1);
740#endif
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530741 return 0;
742}
743#endif
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500744
Jean-Jacques Hiblot347631b2018-12-04 11:30:51 +0100745#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530746#ifdef CONFIG_USB_DWC3
747static struct dwc3_device usb_otg_ss1 = {
748 .maximum_speed = USB_SPEED_HIGH,
749 .base = USB_OTG_SS1_BASE,
750 .tx_fifo_resize = false,
751 .index = 0,
752};
753
754static struct dwc3_omap_device usb_otg_ss1_glue = {
755 .base = (void *)USB_OTG_SS1_GLUE_BASE,
756 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530757 .index = 0,
758};
759
760static struct ti_usb_phy_device usb_phy1_device = {
761 .usb2_phy_power = (void *)USB2_PHY1_POWER,
762 .index = 0,
763};
764
765static struct dwc3_device usb_otg_ss2 = {
766 .maximum_speed = USB_SPEED_HIGH,
767 .base = USB_OTG_SS2_BASE,
768 .tx_fifo_resize = false,
769 .index = 1,
770};
771
772static struct dwc3_omap_device usb_otg_ss2_glue = {
773 .base = (void *)USB_OTG_SS2_GLUE_BASE,
774 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530775 .index = 1,
776};
777
778static struct ti_usb_phy_device usb_phy2_device = {
779 .usb2_phy_power = (void *)USB2_PHY2_POWER,
780 .index = 1,
781};
782
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530783int usb_gadget_handle_interrupts(int index)
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530784{
785 u32 status;
786
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530787 status = dwc3_omap_uboot_interrupt_status(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530788 if (status)
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530789 dwc3_uboot_handle_interrupt(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530790
791 return 0;
792}
Roger Quadros55efadd2016-05-23 17:37:48 +0300793#endif /* CONFIG_USB_DWC3 */
794
795#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbasb16c1292018-02-15 17:12:11 +0530796int board_usb_init(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300797{
798 enable_usb_clocks(index);
799#ifdef CONFIG_USB_DWC3
800 switch (index) {
801 case 0:
802 if (init == USB_INIT_DEVICE) {
803 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
804 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
805 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
806 ti_usb_phy_uboot_init(&usb_phy1_device);
807 dwc3_uboot_init(&usb_otg_ss1);
808 }
809 break;
810 case 1:
811 if (init == USB_INIT_DEVICE) {
812 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
813 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
814 ti_usb_phy_uboot_init(&usb_phy2_device);
815 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
816 dwc3_uboot_init(&usb_otg_ss2);
817 }
818 break;
819 default:
820 printf("Invalid Controller Index\n");
821 }
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530822#endif
823
Roger Quadros55efadd2016-05-23 17:37:48 +0300824 return 0;
825}
826
Faiz Abbasb16c1292018-02-15 17:12:11 +0530827int board_usb_cleanup(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300828{
829#ifdef CONFIG_USB_DWC3
830 switch (index) {
831 case 0:
832 case 1:
833 if (init == USB_INIT_DEVICE) {
834 ti_usb_phy_uboot_exit(index);
835 dwc3_uboot_exit(index);
836 dwc3_omap_uboot_exit(index);
837 }
838 break;
839 default:
840 printf("Invalid Controller Index\n");
841 }
842#endif
843 disable_usb_clocks(index);
844
845 return 0;
846}
847#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Jean-Jacques Hiblot347631b2018-12-04 11:30:51 +0100848#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
Roger Quadros55efadd2016-05-23 17:37:48 +0300849
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500850#ifdef CONFIG_DRIVER_TI_CPSW
851
852static void cpsw_control(int enabled)
853{
854 /* Additional controls can be added here */
855 return;
856}
857
858static struct cpsw_slave_data cpsw_slaves[] = {
859 {
860 .slave_reg_ofs = 0x208,
861 .sliver_reg_ofs = 0xd80,
862 .phy_addr = 16,
863 },
864 {
865 .slave_reg_ofs = 0x308,
866 .sliver_reg_ofs = 0xdc0,
867 .phy_addr = 1,
868 },
869};
870
871static struct cpsw_platform_data cpsw_data = {
872 .mdio_base = CPSW_MDIO_BASE,
873 .cpsw_base = CPSW_BASE,
874 .mdio_div = 0xff,
875 .channels = 8,
876 .cpdma_reg_ofs = 0x800,
877 .slaves = 1,
878 .slave_data = cpsw_slaves,
879 .ale_reg_ofs = 0xd00,
880 .ale_entries = 1024,
881 .host_port_reg_ofs = 0x108,
882 .hw_stats_reg_ofs = 0x900,
883 .bd_ram_ofs = 0x2000,
884 .mac_control = (1 << 5),
885 .control = cpsw_control,
886 .host_port_num = 0,
887 .version = CPSW_CTRL_VERSION_2,
888};
889
890int board_eth_init(bd_t *bis)
891{
892 int rv;
893 uint8_t mac_addr[6];
894 uint32_t mac_hi, mac_lo;
895
896 /* try reading mac address from efuse */
897 mac_lo = readl(&cdev->macid0l);
898 mac_hi = readl(&cdev->macid0h);
899 mac_addr[0] = mac_hi & 0xFF;
900 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
901 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
902 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
903 mac_addr[4] = mac_lo & 0xFF;
904 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
905
Simon Glass00caae62017-08-03 12:22:12 -0600906 if (!env_get("ethaddr")) {
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500907 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500908 if (is_valid_ethaddr(mac_addr))
Simon Glassfd1e9592017-08-03 12:22:11 -0600909 eth_env_set_enetaddr("ethaddr", mac_addr);
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500910 }
911
912 mac_lo = readl(&cdev->macid1l);
913 mac_hi = readl(&cdev->macid1h);
914 mac_addr[0] = mac_hi & 0xFF;
915 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
916 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
917 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
918 mac_addr[4] = mac_lo & 0xFF;
919 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
920
Simon Glass00caae62017-08-03 12:22:12 -0600921 if (!env_get("eth1addr")) {
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500922 if (is_valid_ethaddr(mac_addr))
Simon Glassfd1e9592017-08-03 12:22:11 -0600923 eth_env_set_enetaddr("eth1addr", mac_addr);
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500924 }
925
926 if (board_is_eposevm()) {
927 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
928 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
929 cpsw_slaves[0].phy_addr = 16;
Felipe Balbi619ce622014-06-10 15:01:21 -0500930 } else if (board_is_sk()) {
931 writel(RGMII_MODE_ENABLE, &cdev->miisel);
932 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
933 cpsw_slaves[0].phy_addr = 4;
934 cpsw_slaves[1].phy_addr = 5;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600935 } else if (board_is_idk()) {
936 writel(RGMII_MODE_ENABLE, &cdev->miisel);
937 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
938 cpsw_slaves[0].phy_addr = 0;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500939 } else {
940 writel(RGMII_MODE_ENABLE, &cdev->miisel);
941 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
942 cpsw_slaves[0].phy_addr = 0;
943 }
944
945 rv = cpsw_register(&cpsw_data);
946 if (rv < 0)
947 printf("Error %d registering CPSW switch\n", rv);
948
949 return rv;
950}
951#endif
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530952
Andrew F. Davis7fe463f2017-07-10 14:45:54 -0500953#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
954int ft_board_setup(void *blob, bd_t *bd)
955{
956 ft_cpu_setup(blob, bd);
957
958 return 0;
959}
960#endif
961
Vignesh R5375a9b2018-03-26 13:27:01 +0530962#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530963int board_fit_config_name_match(const char *name)
964{
Vignesh R5375a9b2018-03-26 13:27:01 +0530965 bool eeprom_read = board_ti_was_eeprom_read();
966
967 if (!strcmp(name, "am4372-generic") && !eeprom_read)
968 return 0;
969 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530970 return 0;
971 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
972 return 0;
Lokesh Vutla7dd12832016-05-16 11:11:17 +0530973 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
974 return 0;
Lokesh Vutla54a92e12016-05-16 11:11:18 +0530975 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
976 return 0;
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530977 else
978 return -1;
979}
980#endif
Madan Srinivase29878f2016-06-27 09:19:23 -0500981
Vignesh R5375a9b2018-03-26 13:27:01 +0530982#ifdef CONFIG_DTB_RESELECT
983int embedded_dtb_select(void)
984{
985 do_board_detect();
986 fdtdec_setup();
987
988 return 0;
989}
990#endif
991
Madan Srinivase29878f2016-06-27 09:19:23 -0500992#ifdef CONFIG_TI_SECURE_DEVICE
993void board_fit_image_post_process(void **p_image, size_t *p_size)
994{
995 secure_boot_verify_image(p_image, p_size);
996}
Andrew F. Davis36300942017-07-10 14:45:53 -0500997
998void board_tee_image_process(ulong tee_image, size_t tee_size)
999{
1000 secure_tee_install((u32)tee_image);
1001}
1002
1003U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Madan Srinivase29878f2016-06-27 09:19:23 -05001004#endif