blob: f5ecf871bca87097d96501873c3fef0ceaea5cb0 [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>
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053012#include <i2c.h>
Masahiro Yamada1221ce42016-09-21 11:28:55 +090013#include <linux/errno.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053014#include <spl.h>
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +053015#include <usb.h>
Madan Srinivase29878f2016-06-27 09:19:23 -050016#include <asm/omap_sec_common.h>
Lokesh Vutla3b34ac12013-07-30 11:36:29 +053017#include <asm/arch/clock.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053018#include <asm/arch/sys_proto.h>
19#include <asm/arch/mux.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053020#include <asm/arch/ddr_defs.h>
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +053021#include <asm/arch/gpio.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053022#include <asm/emif.h>
Semen Protsenko00bbe962017-06-02 18:00:00 +030023#include <asm/omap_common.h>
Nishanth Menon5f8bb932016-02-24 12:30:56 -060024#include "../common/board_detect.h"
Lokesh Vutlafbf27282013-07-30 11:36:27 +053025#include "board.h"
Tom Rini7aa55982014-06-23 16:06:29 -040026#include <power/pmic.h>
Tom Rini83bad102014-06-05 11:15:30 -040027#include <power/tps65218.h>
Felipe Balbi403d70a2014-12-22 16:26:17 -060028#include <power/tps62362.h>
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050029#include <miiphy.h>
30#include <cpsw.h>
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +053031#include <linux/usb/gadget.h>
32#include <dwc3-uboot.h>
33#include <dwc3-omap-uboot.h>
34#include <ti-usb-phy-uboot.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053035
36DECLARE_GLOBAL_DATA_PTR;
37
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050038static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050039
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053040/*
41 * Read header information from EEPROM into global structure.
42 */
Lokesh Vutla140d76a2016-10-14 10:35:25 +053043#ifdef CONFIG_TI_I2C_BOARD_DETECT
44void do_board_detect(void)
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053045{
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +010046 /* Ensure I2C is initialized for EEPROM access*/
47 gpi2c_init();
Simon Glass64a144d2017-05-12 21:09:55 -060048 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
49 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla140d76a2016-10-14 10:35:25 +053050 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053051}
Lokesh Vutla140d76a2016-10-14 10:35:25 +053052#endif
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053053
Sourav Poddar7a5f71b2014-05-19 16:53:37 -040054#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafbf27282013-07-30 11:36:27 +053055
Lokesh Vutlacf04d032013-12-10 15:02:20 +053056const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
57 { /* 19.2 MHz */
James Doublesine2a62072014-12-22 16:26:10 -060058 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053059 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesine2a62072014-12-22 16:26:10 -060060 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
61 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
62 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
63 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053064 },
65 { /* 24 MHz */
66 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
67 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
68 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
69 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
70 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
71 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
72 },
73 { /* 25 MHz */
74 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
75 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
76 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
77 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
78 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
79 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
80 },
81 { /* 26 MHz */
82 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
83 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
84 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
85 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
86 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
87 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
88 },
89};
90
91const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -060092 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053093 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
94 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
95 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
96};
97
98const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -060099 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
100 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesinc87b6a92014-12-22 16:26:12 -0600101 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesine2a62072014-12-22 16:26:10 -0600102 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530103};
104
James Doublesine2a62072014-12-22 16:26:10 -0600105const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
106 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
107 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
108 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
109 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
110};
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530111
112const struct dpll_params gp_evm_dpll_ddr = {
James Doublesine2a62072014-12-22 16:26:10 -0600113 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530114
Felipe Balbi403d70a2014-12-22 16:26:17 -0600115static const struct dpll_params idk_dpll_ddr = {
116 400, 23, 1, -1, 2, -1, -1
117};
118
Tom Rini7c352cd2015-06-05 15:51:11 +0530119static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
120 0x00500050,
121 0x00350035,
122 0x00350035,
123 0x00350035,
124 0x00350035,
125 0x00350035,
126 0x00000000,
127 0x00000000,
128 0x00000000,
129 0x00000000,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x00000000,
138 0x40001000,
139 0x08102040
140};
141
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530142const struct ctrl_ioregs ioregs_lpddr2 = {
143 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
144 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
145 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
146 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
147 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
148 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
149 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
150 .emif_sdram_config_ext = 0x1,
151};
152
153const struct emif_regs emif_regs_lpddr2 = {
154 .sdram_config = 0x808012BA,
155 .ref_ctrl = 0x0000040D,
156 .sdram_tim1 = 0xEA86B411,
157 .sdram_tim2 = 0x103A094A,
158 .sdram_tim3 = 0x0F6BA37F,
159 .read_idle_ctrl = 0x00050000,
160 .zq_config = 0x50074BE4,
161 .temp_alert_config = 0x0,
162 .emif_rd_wr_lvl_rmp_win = 0x0,
163 .emif_rd_wr_lvl_rmp_ctl = 0x0,
164 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesine2a62072014-12-22 16:26:10 -0600165 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500166 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530167 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
168 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
169 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
170 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500171 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
172 .emif_prio_class_serv_map = 0x80000001,
173 .emif_connect_id_serv_1_map = 0x80000094,
174 .emif_connect_id_serv_2_map = 0x00000000,
175 .emif_cos_config = 0x000FFFFF
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530176};
177
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530178const struct ctrl_ioregs ioregs_ddr3 = {
179 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
180 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
181 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
182 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
183 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
184 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
185 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesine2a62072014-12-22 16:26:10 -0600186 .emif_sdram_config_ext = 0xc163,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530187};
188
189const struct emif_regs ddr3_emif_regs_400Mhz = {
190 .sdram_config = 0x638413B2,
191 .ref_ctrl = 0x00000C30,
192 .sdram_tim1 = 0xEAAAD4DB,
193 .sdram_tim2 = 0x266B7FDA,
194 .sdram_tim3 = 0x107F8678,
195 .read_idle_ctrl = 0x00050000,
196 .zq_config = 0x50074BE4,
197 .temp_alert_config = 0x0,
Lokesh Vutlae27f2dd2014-02-18 07:31:57 -0500198 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530199 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
200 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
201 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
202 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
203 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
204 .emif_rd_wr_lvl_rmp_win = 0x0,
205 .emif_rd_wr_lvl_rmp_ctl = 0x0,
206 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500207 .emif_rd_wr_exec_thresh = 0x80000405,
208 .emif_prio_class_serv_map = 0x80000001,
209 .emif_connect_id_serv_1_map = 0x80000094,
210 .emif_connect_id_serv_2_map = 0x00000000,
211 .emif_cos_config = 0x000FFFFF
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530212};
213
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500214/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
215const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
216 .sdram_config = 0x638413B2,
217 .ref_ctrl = 0x00000C30,
218 .sdram_tim1 = 0xEAAAD4DB,
219 .sdram_tim2 = 0x266B7FDA,
220 .sdram_tim3 = 0x107F8678,
221 .read_idle_ctrl = 0x00050000,
222 .zq_config = 0x50074BE4,
223 .temp_alert_config = 0x0,
224 .emif_ddr_phy_ctlr_1 = 0x0E004008,
225 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
226 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
227 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
228 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
229 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500230 .emif_rd_wr_exec_thresh = 0x80000405,
231 .emif_prio_class_serv_map = 0x80000001,
232 .emif_connect_id_serv_1_map = 0x80000094,
233 .emif_connect_id_serv_2_map = 0x00000000,
234 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500235};
236
237/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
238const struct emif_regs ddr3_emif_regs_400Mhz_production = {
239 .sdram_config = 0x638413B2,
240 .ref_ctrl = 0x00000C30,
241 .sdram_tim1 = 0xEAAAD4DB,
242 .sdram_tim2 = 0x266B7FDA,
243 .sdram_tim3 = 0x107F8678,
244 .read_idle_ctrl = 0x00050000,
245 .zq_config = 0x50074BE4,
246 .temp_alert_config = 0x0,
Brad Griffis5adcbe02019-04-29 09:59:33 +0530247 .emif_ddr_phy_ctlr_1 = 0x00048008,
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500248 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
249 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
250 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
251 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
252 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500253 .emif_rd_wr_exec_thresh = 0x80000405,
254 .emif_prio_class_serv_map = 0x80000001,
255 .emif_connect_id_serv_1_map = 0x80000094,
256 .emif_connect_id_serv_2_map = 0x00000000,
257 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500258};
259
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500260static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
261 .sdram_config = 0x638413b2,
262 .sdram_config2 = 0x00000000,
263 .ref_ctrl = 0x00000c30,
264 .sdram_tim1 = 0xeaaad4db,
265 .sdram_tim2 = 0x266b7fda,
266 .sdram_tim3 = 0x107f8678,
267 .read_idle_ctrl = 0x00050000,
268 .zq_config = 0x50074be4,
269 .temp_alert_config = 0x0,
270 .emif_ddr_phy_ctlr_1 = 0x0e084008,
271 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
272 .emif_ddr_ext_phy_ctrl_2 = 0x89,
273 .emif_ddr_ext_phy_ctrl_3 = 0x90,
274 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
275 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
276 .emif_rd_wr_lvl_rmp_win = 0x0,
277 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
278 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500279 .emif_rd_wr_exec_thresh = 0x80000000,
280 .emif_prio_class_serv_map = 0x80000001,
281 .emif_connect_id_serv_1_map = 0x80000094,
282 .emif_connect_id_serv_2_map = 0x00000000,
283 .emif_cos_config = 0x000FFFFF
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500284};
285
Felipe Balbi403d70a2014-12-22 16:26:17 -0600286static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
287 .sdram_config = 0x61a11b32,
288 .sdram_config2 = 0x00000000,
289 .ref_ctrl = 0x00000c30,
290 .sdram_tim1 = 0xeaaad4db,
291 .sdram_tim2 = 0x266b7fda,
292 .sdram_tim3 = 0x107f8678,
293 .read_idle_ctrl = 0x00050000,
294 .zq_config = 0x50074be4,
295 .temp_alert_config = 0x00000000,
296 .emif_ddr_phy_ctlr_1 = 0x00008009,
297 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
298 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
299 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
300 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
301 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
302 .emif_rd_wr_lvl_rmp_win = 0x00000000,
303 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
304 .emif_rd_wr_lvl_ctl = 0x00000000,
305 .emif_rd_wr_exec_thresh = 0x00000405,
306 .emif_prio_class_serv_map = 0x00000000,
307 .emif_connect_id_serv_1_map = 0x00000000,
308 .emif_connect_id_serv_2_map = 0x00000000,
309 .emif_cos_config = 0x00ffffff
310};
311
Tom Rini7c352cd2015-06-05 15:51:11 +0530312void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
313{
314 if (board_is_eposevm()) {
315 *regs = ext_phy_ctrl_const_base_lpddr2;
316 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
317 }
318
319 return;
320}
321
James Doublesine2a62072014-12-22 16:26:10 -0600322const struct dpll_params *get_dpll_ddr_params(void)
323{
324 int ind = get_sys_clk_index();
325
326 if (board_is_eposevm())
327 return &epos_evm_dpll_ddr[ind];
Madan Srinivasa5051b72016-05-19 19:10:48 -0500328 else if (board_is_evm() || board_is_sk())
James Doublesine2a62072014-12-22 16:26:10 -0600329 return &gp_evm_dpll_ddr;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600330 else if (board_is_idk())
331 return &idk_dpll_ddr;
James Doublesine2a62072014-12-22 16:26:10 -0600332
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600333 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesine2a62072014-12-22 16:26:10 -0600334 return NULL;
335}
336
337
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530338/*
339 * get_opp_offset:
340 * Returns the index for safest OPP of the device to boot.
341 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
342 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
343 * This data is read from dev_attribute register which is e-fused.
344 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
345 * OPP available. Lowest OPP starts with min_off. So returning the
346 * bit with rightmost '0'.
347 */
348static int get_opp_offset(int max_off, int min_off)
349{
350 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rinifeca6e62014-06-05 11:15:27 -0400351 int opp, offset, i;
352
353 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
354 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530355
356 for (i = max_off; i >= min_off; i--) {
357 offset = opp & (1 << i);
358 if (!offset)
359 return i;
360 }
361
362 return min_off;
363}
364
365const struct dpll_params *get_dpll_mpu_params(void)
366{
367 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
368 u32 ind = get_sys_clk_index();
369
370 return &dpll_mpu[ind][opp];
371}
372
373const struct dpll_params *get_dpll_core_params(void)
374{
375 int ind = get_sys_clk_index();
376
377 return &dpll_core[ind];
378}
379
380const struct dpll_params *get_dpll_per_params(void)
381{
382 int ind = get_sys_clk_index();
383
384 return &dpll_per[ind];
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530385}
386
Felipe Balbi403d70a2014-12-22 16:26:17 -0600387void scale_vcores_generic(u32 m)
Tom Rini83bad102014-06-05 11:15:30 -0400388{
Keerthyebf48502018-05-02 15:06:31 +0530389 int mpu_vdd, ddr_volt;
Tom Rini83bad102014-06-05 11:15:30 -0400390
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100391#ifndef CONFIG_DM_I2C
Tom Rini83bad102014-06-05 11:15:30 -0400392 if (i2c_probe(TPS65218_CHIP_PM))
393 return;
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100394#else
395 if (power_tps65218_init(0))
396 return;
397#endif
Tom Rini83bad102014-06-05 11:15:30 -0400398
Felipe Balbi403d70a2014-12-22 16:26:17 -0600399 switch (m) {
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600400 case 1000:
Tom Rini83bad102014-06-05 11:15:30 -0400401 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600402 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600403 case 800:
404 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
405 break;
406 case 720:
407 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
408 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600409 case 600:
Tom Rini83bad102014-06-05 11:15:30 -0400410 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600411 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600412 case 300:
413 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
414 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600415 default:
Tom Rini83bad102014-06-05 11:15:30 -0400416 puts("Unknown MPU clock, not scaling\n");
417 return;
418 }
419
420 /* Set DCDC1 (CORE) voltage to 1.1V */
421 if (tps65218_voltage_update(TPS65218_DCDC1,
422 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600423 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400424 return;
425 }
426
427 /* Set DCDC2 (MPU) voltage */
428 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600429 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400430 return;
431 }
Keerthyfc69d472017-06-02 15:00:31 +0530432
Keerthyebf48502018-05-02 15:06:31 +0530433 if (board_is_eposevm())
434 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
435 else
436 ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
437
Keerthyfc69d472017-06-02 15:00:31 +0530438 /* Set DCDC3 (DDR) voltage */
Keerthyebf48502018-05-02 15:06:31 +0530439 if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
Keerthyfc69d472017-06-02 15:00:31 +0530440 printf("%s failure\n", __func__);
441 return;
442 }
Tom Rini83bad102014-06-05 11:15:30 -0400443}
444
Felipe Balbi403d70a2014-12-22 16:26:17 -0600445void scale_vcores_idk(u32 m)
446{
447 int mpu_vdd;
448
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100449#ifndef CONFIG_DM_I2C
Felipe Balbi403d70a2014-12-22 16:26:17 -0600450 if (i2c_probe(TPS62362_I2C_ADDR))
451 return;
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100452#else
453 if (power_tps62362_init(0))
454 return;
455#endif
Felipe Balbi403d70a2014-12-22 16:26:17 -0600456
457 switch (m) {
458 case 1000:
459 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
460 break;
461 case 800:
462 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
463 break;
464 case 720:
465 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
466 break;
467 case 600:
468 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
469 break;
470 case 300:
471 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
472 break;
473 default:
474 puts("Unknown MPU clock, not scaling\n");
475 return;
476 }
Felipe Balbi403d70a2014-12-22 16:26:17 -0600477 /* Set VDD_MPU voltage */
478 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
479 printf("%s failure\n", __func__);
480 return;
481 }
482}
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600483void gpi2c_init(void)
484{
485 /* When needed to be invoked prior to BSS initialization */
486 static bool first_time = true;
487
488 if (first_time) {
489 enable_i2c0_pin_mux();
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100490#ifndef CONFIG_DM_I2C
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600491 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
492 CONFIG_SYS_OMAP24_I2C_SLAVE);
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100493#endif
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600494 first_time = false;
495 }
496}
497
Felipe Balbi403d70a2014-12-22 16:26:17 -0600498void scale_vcores(void)
499{
500 const struct dpll_params *mpu_params;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600501
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600502 /* Ensure I2C is initialized for PMIC configuration */
503 gpi2c_init();
504
Felipe Balbi403d70a2014-12-22 16:26:17 -0600505 /* Get the frequency */
506 mpu_params = get_dpll_mpu_params();
507
508 if (board_is_idk())
509 scale_vcores_idk(mpu_params->m);
510 else
511 scale_vcores_generic(mpu_params->m);
512}
513
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530514void set_uart_mux_conf(void)
515{
516 enable_uart0_pin_mux();
517}
518
519void set_mux_conf_regs(void)
520{
521 enable_board_pin_mux();
522}
523
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530524static void enable_vtt_regulator(void)
525{
526 u32 temp;
527
528 /* enable module */
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500529 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530530
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500531 /* enable output for GPIO5_7 */
532 writel(GPIO_SETDATAOUT(7),
533 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
534 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
535 temp = temp & ~(GPIO_OE_ENABLE(7));
536 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530537}
538
Tero Kristo7619bad2018-03-17 13:32:52 +0530539enum {
540 RTC_BOARD_EPOS = 1,
541 RTC_BOARD_EVM14,
542 RTC_BOARD_EVM12,
543 RTC_BOARD_GPEVM,
544 RTC_BOARD_SK,
545};
546
547/*
548 * In the rtc_only+DRR in self-refresh boot path we have the board type info
549 * in the rtc scratch pad register hence we bypass the costly i2c reads to
550 * eeprom and directly programthe board name string
551 */
552void rtc_only_update_board_type(u32 btype)
553{
554 const char *name = "";
555 const char *rev = "1.0";
556
557 switch (btype) {
558 case RTC_BOARD_EPOS:
559 name = "AM43EPOS";
560 break;
561 case RTC_BOARD_EVM14:
562 name = "AM43__GP";
563 rev = "1.4";
564 break;
565 case RTC_BOARD_EVM12:
566 name = "AM43__GP";
567 rev = "1.2";
568 break;
569 case RTC_BOARD_GPEVM:
570 name = "AM43__GP";
571 break;
572 case RTC_BOARD_SK:
573 name = "AM43__SK";
574 break;
575 }
576 ti_i2c_eeprom_am_set(name, rev);
577}
578
579u32 rtc_only_get_board_type(void)
580{
581 if (board_is_eposevm())
582 return RTC_BOARD_EPOS;
583 else if (board_is_evm_14_or_later())
584 return RTC_BOARD_EVM14;
585 else if (board_is_evm_12_or_later())
586 return RTC_BOARD_EVM12;
587 else if (board_is_gpevm())
588 return RTC_BOARD_GPEVM;
589 else if (board_is_sk())
590 return RTC_BOARD_SK;
591
592 return 0;
593}
594
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530595void sdram_init(void)
596{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530597 /*
598 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
599 * GP EMV has 1GB DDR3 connected to EMIF
600 * along with VTT regulator.
601 */
602 if (board_is_eposevm()) {
603 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500604 } else if (board_is_evm_14_or_later()) {
605 enable_vtt_regulator();
606 config_ddr(0, &ioregs_ddr3, NULL, NULL,
607 &ddr3_emif_regs_400Mhz_production, 0);
608 } else if (board_is_evm_12_or_later()) {
609 enable_vtt_regulator();
610 config_ddr(0, &ioregs_ddr3, NULL, NULL,
611 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivasa5051b72016-05-19 19:10:48 -0500612 } else if (board_is_evm()) {
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530613 enable_vtt_regulator();
614 config_ddr(0, &ioregs_ddr3, NULL, NULL,
615 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500616 } else if (board_is_sk()) {
617 config_ddr(400, &ioregs_ddr3, NULL, NULL,
618 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi403d70a2014-12-22 16:26:17 -0600619 } else if (board_is_idk()) {
620 config_ddr(400, &ioregs_ddr3, NULL, NULL,
621 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530622 }
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530623}
624#endif
625
Tom Rini7aa55982014-06-23 16:06:29 -0400626/* setup board specific PMIC */
627int power_init_board(void)
628{
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100629 int rc;
630#ifndef CONFIG_DM_I2C
631 struct pmic *p = NULL;
632#endif
Felipe Balbi403d70a2014-12-22 16:26:17 -0600633 if (board_is_idk()) {
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100634 rc = power_tps62362_init(0);
635 if (rc)
636 goto done;
637#ifndef CONFIG_DM_I2C
Felipe Balbi403d70a2014-12-22 16:26:17 -0600638 p = pmic_get("TPS62362");
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100639 if (!p || pmic_probe(p))
640 goto done;
641#endif
642 puts("PMIC: TPS62362\n");
Felipe Balbi403d70a2014-12-22 16:26:17 -0600643 } else {
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100644 rc = power_tps65218_init(0);
645 if (rc)
646 goto done;
647#ifndef CONFIG_DM_I2C
Felipe Balbi403d70a2014-12-22 16:26:17 -0600648 p = pmic_get("TPS65218_PMIC");
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100649 if (!p || pmic_probe(p))
650 goto done;
651#endif
652 puts("PMIC: TPS65218\n");
Felipe Balbi403d70a2014-12-22 16:26:17 -0600653 }
Jean-Jacques Hiblot15142442018-12-07 14:50:49 +0100654done:
Tom Rini7aa55982014-06-23 16:06:29 -0400655 return 0;
656}
657
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530658int board_init(void)
659{
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500660 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
661 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
662 modena_init0_bw_integer, modena_init0_watermark_0;
663
Lokesh Vutla369cbe12013-12-10 15:02:12 +0530664 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon guptae53ad4b2014-07-22 16:03:22 +0530665 gpmc_init();
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530666
Faiz Abbasa93feb22018-01-19 15:32:48 +0530667 /*
668 * Call this to initialize *ctrl again
669 */
670 hw_data_init();
671
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500672 /* Clear all important bits for DSS errata that may need to be tweaked*/
673 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
674 MREQPRIO_0_SAB_INIT0_MASK;
675
676 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
677
678 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
679 BW_LIMITER_BW_FRAC_MASK;
680
681 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
682 BW_LIMITER_BW_INT_MASK;
683
684 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
685 BW_LIMITER_BW_WATERMARK_MASK;
686
687 /* Setting MReq Priority of the DSS*/
688 mreqprio_0 |= 0x77;
689
690 /*
691 * Set L3 Fast Configuration Register
692 * Limiting bandwith for ARM core to 700 MBPS
693 */
694 modena_init0_bw_fractional |= 0x10;
695 modena_init0_bw_integer |= 0x3;
696
697 writel(mreqprio_0, &cdev->mreqprio_0);
698 writel(mreqprio_1, &cdev->mreqprio_1);
699
700 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
701 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
702 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
703
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530704 return 0;
705}
706
707#ifdef CONFIG_BOARD_LATE_INIT
Jean-Jacques Hiblot347631b2018-12-04 11:30:51 +0100708#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
709static int device_okay(const char *path)
710{
711 int node;
712
713 node = fdt_path_offset(gd->fdt_blob, path);
714 if (node < 0)
715 return 0;
716
717 return fdtdec_get_is_enabled(gd->fdt_blob, node);
718}
719#endif
720
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530721int board_late_init(void)
722{
Tero Kristo9850d4e2019-09-27 19:14:28 +0300723 struct udevice *dev;
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
Tero Kristo9850d4e2019-09-27 19:14:28 +0300741
742 /* Just probe the potentially supported cdce913 device */
743 uclass_get_device(UCLASS_CLK, 0, &dev);
744
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530745 return 0;
746}
747#endif
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500748
Jean-Jacques Hiblot347631b2018-12-04 11:30:51 +0100749#if !CONFIG_IS_ENABLED(DM_USB_GADGET)
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530750#ifdef CONFIG_USB_DWC3
751static struct dwc3_device usb_otg_ss1 = {
752 .maximum_speed = USB_SPEED_HIGH,
753 .base = USB_OTG_SS1_BASE,
754 .tx_fifo_resize = false,
755 .index = 0,
756};
757
758static struct dwc3_omap_device usb_otg_ss1_glue = {
759 .base = (void *)USB_OTG_SS1_GLUE_BASE,
760 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530761 .index = 0,
762};
763
764static struct ti_usb_phy_device usb_phy1_device = {
765 .usb2_phy_power = (void *)USB2_PHY1_POWER,
766 .index = 0,
767};
768
769static struct dwc3_device usb_otg_ss2 = {
770 .maximum_speed = USB_SPEED_HIGH,
771 .base = USB_OTG_SS2_BASE,
772 .tx_fifo_resize = false,
773 .index = 1,
774};
775
776static struct dwc3_omap_device usb_otg_ss2_glue = {
777 .base = (void *)USB_OTG_SS2_GLUE_BASE,
778 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530779 .index = 1,
780};
781
782static struct ti_usb_phy_device usb_phy2_device = {
783 .usb2_phy_power = (void *)USB2_PHY2_POWER,
784 .index = 1,
785};
786
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530787int usb_gadget_handle_interrupts(int index)
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530788{
789 u32 status;
790
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530791 status = dwc3_omap_uboot_interrupt_status(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530792 if (status)
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530793 dwc3_uboot_handle_interrupt(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530794
795 return 0;
796}
Roger Quadros55efadd2016-05-23 17:37:48 +0300797#endif /* CONFIG_USB_DWC3 */
798
799#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Faiz Abbasb16c1292018-02-15 17:12:11 +0530800int board_usb_init(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300801{
802 enable_usb_clocks(index);
803#ifdef CONFIG_USB_DWC3
804 switch (index) {
805 case 0:
806 if (init == USB_INIT_DEVICE) {
807 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
808 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
809 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
810 ti_usb_phy_uboot_init(&usb_phy1_device);
811 dwc3_uboot_init(&usb_otg_ss1);
812 }
813 break;
814 case 1:
815 if (init == USB_INIT_DEVICE) {
816 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
817 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
818 ti_usb_phy_uboot_init(&usb_phy2_device);
819 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
820 dwc3_uboot_init(&usb_otg_ss2);
821 }
822 break;
823 default:
824 printf("Invalid Controller Index\n");
825 }
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530826#endif
827
Roger Quadros55efadd2016-05-23 17:37:48 +0300828 return 0;
829}
830
Faiz Abbasb16c1292018-02-15 17:12:11 +0530831int board_usb_cleanup(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300832{
833#ifdef CONFIG_USB_DWC3
834 switch (index) {
835 case 0:
836 case 1:
837 if (init == USB_INIT_DEVICE) {
838 ti_usb_phy_uboot_exit(index);
839 dwc3_uboot_exit(index);
840 dwc3_omap_uboot_exit(index);
841 }
842 break;
843 default:
844 printf("Invalid Controller Index\n");
845 }
846#endif
847 disable_usb_clocks(index);
848
849 return 0;
850}
851#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
Jean-Jacques Hiblot347631b2018-12-04 11:30:51 +0100852#endif /* !CONFIG_IS_ENABLED(DM_USB_GADGET) */
Roger Quadros55efadd2016-05-23 17:37:48 +0300853
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500854#ifdef CONFIG_DRIVER_TI_CPSW
855
856static void cpsw_control(int enabled)
857{
858 /* Additional controls can be added here */
859 return;
860}
861
862static struct cpsw_slave_data cpsw_slaves[] = {
863 {
864 .slave_reg_ofs = 0x208,
865 .sliver_reg_ofs = 0xd80,
866 .phy_addr = 16,
867 },
868 {
869 .slave_reg_ofs = 0x308,
870 .sliver_reg_ofs = 0xdc0,
871 .phy_addr = 1,
872 },
873};
874
875static struct cpsw_platform_data cpsw_data = {
876 .mdio_base = CPSW_MDIO_BASE,
877 .cpsw_base = CPSW_BASE,
878 .mdio_div = 0xff,
879 .channels = 8,
880 .cpdma_reg_ofs = 0x800,
881 .slaves = 1,
882 .slave_data = cpsw_slaves,
883 .ale_reg_ofs = 0xd00,
884 .ale_entries = 1024,
885 .host_port_reg_ofs = 0x108,
886 .hw_stats_reg_ofs = 0x900,
887 .bd_ram_ofs = 0x2000,
888 .mac_control = (1 << 5),
889 .control = cpsw_control,
890 .host_port_num = 0,
891 .version = CPSW_CTRL_VERSION_2,
892};
893
894int board_eth_init(bd_t *bis)
895{
896 int rv;
897 uint8_t mac_addr[6];
898 uint32_t mac_hi, mac_lo;
899
900 /* try reading mac address from efuse */
901 mac_lo = readl(&cdev->macid0l);
902 mac_hi = readl(&cdev->macid0h);
903 mac_addr[0] = mac_hi & 0xFF;
904 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
905 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
906 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
907 mac_addr[4] = mac_lo & 0xFF;
908 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
909
Simon Glass00caae62017-08-03 12:22:12 -0600910 if (!env_get("ethaddr")) {
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500911 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500912 if (is_valid_ethaddr(mac_addr))
Simon Glassfd1e9592017-08-03 12:22:11 -0600913 eth_env_set_enetaddr("ethaddr", mac_addr);
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500914 }
915
916 mac_lo = readl(&cdev->macid1l);
917 mac_hi = readl(&cdev->macid1h);
918 mac_addr[0] = mac_hi & 0xFF;
919 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
920 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
921 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
922 mac_addr[4] = mac_lo & 0xFF;
923 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
924
Simon Glass00caae62017-08-03 12:22:12 -0600925 if (!env_get("eth1addr")) {
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500926 if (is_valid_ethaddr(mac_addr))
Simon Glassfd1e9592017-08-03 12:22:11 -0600927 eth_env_set_enetaddr("eth1addr", mac_addr);
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500928 }
929
930 if (board_is_eposevm()) {
931 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
932 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
933 cpsw_slaves[0].phy_addr = 16;
Felipe Balbi619ce622014-06-10 15:01:21 -0500934 } else if (board_is_sk()) {
935 writel(RGMII_MODE_ENABLE, &cdev->miisel);
936 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
937 cpsw_slaves[0].phy_addr = 4;
938 cpsw_slaves[1].phy_addr = 5;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600939 } else if (board_is_idk()) {
940 writel(RGMII_MODE_ENABLE, &cdev->miisel);
941 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
942 cpsw_slaves[0].phy_addr = 0;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500943 } else {
944 writel(RGMII_MODE_ENABLE, &cdev->miisel);
945 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
946 cpsw_slaves[0].phy_addr = 0;
947 }
948
949 rv = cpsw_register(&cpsw_data);
950 if (rv < 0)
951 printf("Error %d registering CPSW switch\n", rv);
952
953 return rv;
954}
955#endif
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530956
Andrew F. Davis7fe463f2017-07-10 14:45:54 -0500957#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
958int ft_board_setup(void *blob, bd_t *bd)
959{
960 ft_cpu_setup(blob, bd);
961
962 return 0;
963}
964#endif
965
Vignesh R5375a9b2018-03-26 13:27:01 +0530966#if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530967int board_fit_config_name_match(const char *name)
968{
Vignesh R5375a9b2018-03-26 13:27:01 +0530969 bool eeprom_read = board_ti_was_eeprom_read();
970
971 if (!strcmp(name, "am4372-generic") && !eeprom_read)
972 return 0;
973 else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530974 return 0;
975 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
976 return 0;
Lokesh Vutla7dd12832016-05-16 11:11:17 +0530977 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
978 return 0;
Lokesh Vutla54a92e12016-05-16 11:11:18 +0530979 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
980 return 0;
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530981 else
982 return -1;
983}
984#endif
Madan Srinivase29878f2016-06-27 09:19:23 -0500985
Vignesh R5375a9b2018-03-26 13:27:01 +0530986#ifdef CONFIG_DTB_RESELECT
987int embedded_dtb_select(void)
988{
989 do_board_detect();
990 fdtdec_setup();
991
992 return 0;
993}
994#endif
995
Madan Srinivase29878f2016-06-27 09:19:23 -0500996#ifdef CONFIG_TI_SECURE_DEVICE
997void board_fit_image_post_process(void **p_image, size_t *p_size)
998{
999 secure_boot_verify_image(p_image, p_size);
1000}
Andrew F. Davis36300942017-07-10 14:45:53 -05001001
1002void board_tee_image_process(ulong tee_image, size_t tee_size)
1003{
1004 secure_tee_install((u32)tee_image);
1005}
1006
1007U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Madan Srinivase29878f2016-06-27 09:19:23 -05001008#endif