blob: a25902813eda311e7327e95495a2ca208fc7cad5 [file] [log] [blame]
Lokesh Vutlafbf27282013-07-30 11:36:27 +05301/*
2 * board.c
3 *
4 * Board functions for TI AM43XX based boards
5 *
6 * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
7 *
8 * SPDX-License-Identifier: GPL-2.0+
9 */
10
11#include <common.h>
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>
Nishanth Menon5f8bb932016-02-24 12:30:56 -060023#include "../common/board_detect.h"
Lokesh Vutlafbf27282013-07-30 11:36:27 +053024#include "board.h"
Tom Rini7aa55982014-06-23 16:06:29 -040025#include <power/pmic.h>
Tom Rini83bad102014-06-05 11:15:30 -040026#include <power/tps65218.h>
Felipe Balbi403d70a2014-12-22 16:26:17 -060027#include <power/tps62362.h>
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050028#include <miiphy.h>
29#include <cpsw.h>
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +053030#include <linux/usb/gadget.h>
31#include <dwc3-uboot.h>
32#include <dwc3-omap-uboot.h>
33#include <ti-usb-phy-uboot.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053034
35DECLARE_GLOBAL_DATA_PTR;
36
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050037static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050038
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053039/*
40 * Read header information from EEPROM into global structure.
41 */
Lokesh Vutla140d76a2016-10-14 10:35:25 +053042#ifdef CONFIG_TI_I2C_BOARD_DETECT
43void do_board_detect(void)
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053044{
Simon Glass64a144d2017-05-12 21:09:55 -060045 if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
46 CONFIG_EEPROM_CHIP_ADDRESS))
Lokesh Vutla140d76a2016-10-14 10:35:25 +053047 printf("ti_i2c_eeprom_init failed\n");
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053048}
Lokesh Vutla140d76a2016-10-14 10:35:25 +053049#endif
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053050
Sourav Poddar7a5f71b2014-05-19 16:53:37 -040051#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafbf27282013-07-30 11:36:27 +053052
Lokesh Vutlacf04d032013-12-10 15:02:20 +053053const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
54 { /* 19.2 MHz */
James Doublesine2a62072014-12-22 16:26:10 -060055 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053056 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesine2a62072014-12-22 16:26:10 -060057 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
58 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
59 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
60 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053061 },
62 { /* 24 MHz */
63 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
64 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
65 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
66 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
67 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
68 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
69 },
70 { /* 25 MHz */
71 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
72 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
73 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
74 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
75 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
76 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
77 },
78 { /* 26 MHz */
79 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
80 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
81 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
82 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
83 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
84 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
85 },
86};
87
88const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -060089 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053090 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
91 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
92 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
93};
94
95const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -060096 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
97 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesinc87b6a92014-12-22 16:26:12 -060098 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesine2a62072014-12-22 16:26:10 -060099 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530100};
101
James Doublesine2a62072014-12-22 16:26:10 -0600102const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
103 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
104 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
105 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
106 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
107};
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530108
109const struct dpll_params gp_evm_dpll_ddr = {
James Doublesine2a62072014-12-22 16:26:10 -0600110 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530111
Felipe Balbi403d70a2014-12-22 16:26:17 -0600112static const struct dpll_params idk_dpll_ddr = {
113 400, 23, 1, -1, 2, -1, -1
114};
115
Tom Rini7c352cd2015-06-05 15:51:11 +0530116static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
117 0x00500050,
118 0x00350035,
119 0x00350035,
120 0x00350035,
121 0x00350035,
122 0x00350035,
123 0x00000000,
124 0x00000000,
125 0x00000000,
126 0x00000000,
127 0x00000000,
128 0x00000000,
129 0x00000000,
130 0x00000000,
131 0x00000000,
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x40001000,
136 0x08102040
137};
138
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530139const struct ctrl_ioregs ioregs_lpddr2 = {
140 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
141 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
142 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
143 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
144 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
145 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
146 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
147 .emif_sdram_config_ext = 0x1,
148};
149
150const struct emif_regs emif_regs_lpddr2 = {
151 .sdram_config = 0x808012BA,
152 .ref_ctrl = 0x0000040D,
153 .sdram_tim1 = 0xEA86B411,
154 .sdram_tim2 = 0x103A094A,
155 .sdram_tim3 = 0x0F6BA37F,
156 .read_idle_ctrl = 0x00050000,
157 .zq_config = 0x50074BE4,
158 .temp_alert_config = 0x0,
159 .emif_rd_wr_lvl_rmp_win = 0x0,
160 .emif_rd_wr_lvl_rmp_ctl = 0x0,
161 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesine2a62072014-12-22 16:26:10 -0600162 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500163 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530164 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
165 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
166 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
167 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500168 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
169 .emif_prio_class_serv_map = 0x80000001,
170 .emif_connect_id_serv_1_map = 0x80000094,
171 .emif_connect_id_serv_2_map = 0x00000000,
172 .emif_cos_config = 0x000FFFFF
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530173};
174
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530175const struct ctrl_ioregs ioregs_ddr3 = {
176 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
177 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
178 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
179 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
180 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
181 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
182 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesine2a62072014-12-22 16:26:10 -0600183 .emif_sdram_config_ext = 0xc163,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530184};
185
186const struct emif_regs ddr3_emif_regs_400Mhz = {
187 .sdram_config = 0x638413B2,
188 .ref_ctrl = 0x00000C30,
189 .sdram_tim1 = 0xEAAAD4DB,
190 .sdram_tim2 = 0x266B7FDA,
191 .sdram_tim3 = 0x107F8678,
192 .read_idle_ctrl = 0x00050000,
193 .zq_config = 0x50074BE4,
194 .temp_alert_config = 0x0,
Lokesh Vutlae27f2dd2014-02-18 07:31:57 -0500195 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530196 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
197 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
198 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
199 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
200 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
201 .emif_rd_wr_lvl_rmp_win = 0x0,
202 .emif_rd_wr_lvl_rmp_ctl = 0x0,
203 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500204 .emif_rd_wr_exec_thresh = 0x80000405,
205 .emif_prio_class_serv_map = 0x80000001,
206 .emif_connect_id_serv_1_map = 0x80000094,
207 .emif_connect_id_serv_2_map = 0x00000000,
208 .emif_cos_config = 0x000FFFFF
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530209};
210
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500211/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
212const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
213 .sdram_config = 0x638413B2,
214 .ref_ctrl = 0x00000C30,
215 .sdram_tim1 = 0xEAAAD4DB,
216 .sdram_tim2 = 0x266B7FDA,
217 .sdram_tim3 = 0x107F8678,
218 .read_idle_ctrl = 0x00050000,
219 .zq_config = 0x50074BE4,
220 .temp_alert_config = 0x0,
221 .emif_ddr_phy_ctlr_1 = 0x0E004008,
222 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
223 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
224 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
225 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
226 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500227 .emif_rd_wr_exec_thresh = 0x80000405,
228 .emif_prio_class_serv_map = 0x80000001,
229 .emif_connect_id_serv_1_map = 0x80000094,
230 .emif_connect_id_serv_2_map = 0x00000000,
231 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500232};
233
234/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
235const struct emif_regs ddr3_emif_regs_400Mhz_production = {
236 .sdram_config = 0x638413B2,
237 .ref_ctrl = 0x00000C30,
238 .sdram_tim1 = 0xEAAAD4DB,
239 .sdram_tim2 = 0x266B7FDA,
240 .sdram_tim3 = 0x107F8678,
241 .read_idle_ctrl = 0x00050000,
242 .zq_config = 0x50074BE4,
243 .temp_alert_config = 0x0,
244 .emif_ddr_phy_ctlr_1 = 0x0E004008,
245 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
246 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
247 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
248 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
249 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500250 .emif_rd_wr_exec_thresh = 0x80000405,
251 .emif_prio_class_serv_map = 0x80000001,
252 .emif_connect_id_serv_1_map = 0x80000094,
253 .emif_connect_id_serv_2_map = 0x00000000,
254 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500255};
256
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500257static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
258 .sdram_config = 0x638413b2,
259 .sdram_config2 = 0x00000000,
260 .ref_ctrl = 0x00000c30,
261 .sdram_tim1 = 0xeaaad4db,
262 .sdram_tim2 = 0x266b7fda,
263 .sdram_tim3 = 0x107f8678,
264 .read_idle_ctrl = 0x00050000,
265 .zq_config = 0x50074be4,
266 .temp_alert_config = 0x0,
267 .emif_ddr_phy_ctlr_1 = 0x0e084008,
268 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
269 .emif_ddr_ext_phy_ctrl_2 = 0x89,
270 .emif_ddr_ext_phy_ctrl_3 = 0x90,
271 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
272 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
273 .emif_rd_wr_lvl_rmp_win = 0x0,
274 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
275 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500276 .emif_rd_wr_exec_thresh = 0x80000000,
277 .emif_prio_class_serv_map = 0x80000001,
278 .emif_connect_id_serv_1_map = 0x80000094,
279 .emif_connect_id_serv_2_map = 0x00000000,
280 .emif_cos_config = 0x000FFFFF
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500281};
282
Felipe Balbi403d70a2014-12-22 16:26:17 -0600283static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
284 .sdram_config = 0x61a11b32,
285 .sdram_config2 = 0x00000000,
286 .ref_ctrl = 0x00000c30,
287 .sdram_tim1 = 0xeaaad4db,
288 .sdram_tim2 = 0x266b7fda,
289 .sdram_tim3 = 0x107f8678,
290 .read_idle_ctrl = 0x00050000,
291 .zq_config = 0x50074be4,
292 .temp_alert_config = 0x00000000,
293 .emif_ddr_phy_ctlr_1 = 0x00008009,
294 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
295 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
296 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
297 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
298 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
299 .emif_rd_wr_lvl_rmp_win = 0x00000000,
300 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
301 .emif_rd_wr_lvl_ctl = 0x00000000,
302 .emif_rd_wr_exec_thresh = 0x00000405,
303 .emif_prio_class_serv_map = 0x00000000,
304 .emif_connect_id_serv_1_map = 0x00000000,
305 .emif_connect_id_serv_2_map = 0x00000000,
306 .emif_cos_config = 0x00ffffff
307};
308
Tom Rini7c352cd2015-06-05 15:51:11 +0530309void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
310{
311 if (board_is_eposevm()) {
312 *regs = ext_phy_ctrl_const_base_lpddr2;
313 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
314 }
315
316 return;
317}
318
James Doublesine2a62072014-12-22 16:26:10 -0600319const struct dpll_params *get_dpll_ddr_params(void)
320{
321 int ind = get_sys_clk_index();
322
323 if (board_is_eposevm())
324 return &epos_evm_dpll_ddr[ind];
Madan Srinivasa5051b72016-05-19 19:10:48 -0500325 else if (board_is_evm() || board_is_sk())
James Doublesine2a62072014-12-22 16:26:10 -0600326 return &gp_evm_dpll_ddr;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600327 else if (board_is_idk())
328 return &idk_dpll_ddr;
James Doublesine2a62072014-12-22 16:26:10 -0600329
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600330 printf(" Board '%s' not supported\n", board_ti_get_name());
James Doublesine2a62072014-12-22 16:26:10 -0600331 return NULL;
332}
333
334
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530335/*
336 * get_opp_offset:
337 * Returns the index for safest OPP of the device to boot.
338 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
339 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
340 * This data is read from dev_attribute register which is e-fused.
341 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
342 * OPP available. Lowest OPP starts with min_off. So returning the
343 * bit with rightmost '0'.
344 */
345static int get_opp_offset(int max_off, int min_off)
346{
347 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rinifeca6e62014-06-05 11:15:27 -0400348 int opp, offset, i;
349
350 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
351 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530352
353 for (i = max_off; i >= min_off; i--) {
354 offset = opp & (1 << i);
355 if (!offset)
356 return i;
357 }
358
359 return min_off;
360}
361
362const struct dpll_params *get_dpll_mpu_params(void)
363{
364 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
365 u32 ind = get_sys_clk_index();
366
367 return &dpll_mpu[ind][opp];
368}
369
370const struct dpll_params *get_dpll_core_params(void)
371{
372 int ind = get_sys_clk_index();
373
374 return &dpll_core[ind];
375}
376
377const struct dpll_params *get_dpll_per_params(void)
378{
379 int ind = get_sys_clk_index();
380
381 return &dpll_per[ind];
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530382}
383
Felipe Balbi403d70a2014-12-22 16:26:17 -0600384void scale_vcores_generic(u32 m)
Tom Rini83bad102014-06-05 11:15:30 -0400385{
Tom Rini83bad102014-06-05 11:15:30 -0400386 int mpu_vdd;
Tom Rini83bad102014-06-05 11:15:30 -0400387
388 if (i2c_probe(TPS65218_CHIP_PM))
389 return;
390
Felipe Balbi403d70a2014-12-22 16:26:17 -0600391 switch (m) {
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600392 case 1000:
Tom Rini83bad102014-06-05 11:15:30 -0400393 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600394 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600395 case 800:
396 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
397 break;
398 case 720:
399 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
400 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600401 case 600:
Tom Rini83bad102014-06-05 11:15:30 -0400402 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600403 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600404 case 300:
405 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
406 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600407 default:
Tom Rini83bad102014-06-05 11:15:30 -0400408 puts("Unknown MPU clock, not scaling\n");
409 return;
410 }
411
412 /* Set DCDC1 (CORE) voltage to 1.1V */
413 if (tps65218_voltage_update(TPS65218_DCDC1,
414 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600415 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400416 return;
417 }
418
419 /* Set DCDC2 (MPU) voltage */
420 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600421 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400422 return;
423 }
Keerthyfc69d472017-06-02 15:00:31 +0530424
425 /* Set DCDC3 (DDR) voltage */
426 if (tps65218_voltage_update(TPS65218_DCDC3,
427 TPS65218_DCDC3_VOLT_SEL_1350MV)) {
428 printf("%s failure\n", __func__);
429 return;
430 }
Tom Rini83bad102014-06-05 11:15:30 -0400431}
432
Felipe Balbi403d70a2014-12-22 16:26:17 -0600433void scale_vcores_idk(u32 m)
434{
435 int mpu_vdd;
436
437 if (i2c_probe(TPS62362_I2C_ADDR))
438 return;
439
440 switch (m) {
441 case 1000:
442 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
443 break;
444 case 800:
445 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
446 break;
447 case 720:
448 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
449 break;
450 case 600:
451 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
452 break;
453 case 300:
454 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
455 break;
456 default:
457 puts("Unknown MPU clock, not scaling\n");
458 return;
459 }
460
461 /* Set VDD_MPU voltage */
462 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
463 printf("%s failure\n", __func__);
464 return;
465 }
466}
467
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600468void gpi2c_init(void)
469{
470 /* When needed to be invoked prior to BSS initialization */
471 static bool first_time = true;
472
473 if (first_time) {
474 enable_i2c0_pin_mux();
475 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
476 CONFIG_SYS_OMAP24_I2C_SLAVE);
477 first_time = false;
478 }
479}
480
Felipe Balbi403d70a2014-12-22 16:26:17 -0600481void scale_vcores(void)
482{
483 const struct dpll_params *mpu_params;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600484
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600485 /* Ensure I2C is initialized for PMIC configuration */
486 gpi2c_init();
487
Felipe Balbi403d70a2014-12-22 16:26:17 -0600488 /* Get the frequency */
489 mpu_params = get_dpll_mpu_params();
490
491 if (board_is_idk())
492 scale_vcores_idk(mpu_params->m);
493 else
494 scale_vcores_generic(mpu_params->m);
495}
496
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530497void set_uart_mux_conf(void)
498{
499 enable_uart0_pin_mux();
500}
501
502void set_mux_conf_regs(void)
503{
504 enable_board_pin_mux();
505}
506
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530507static void enable_vtt_regulator(void)
508{
509 u32 temp;
510
511 /* enable module */
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500512 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530513
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500514 /* enable output for GPIO5_7 */
515 writel(GPIO_SETDATAOUT(7),
516 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
517 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
518 temp = temp & ~(GPIO_OE_ENABLE(7));
519 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530520}
521
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530522void sdram_init(void)
523{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530524 /*
525 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
526 * GP EMV has 1GB DDR3 connected to EMIF
527 * along with VTT regulator.
528 */
529 if (board_is_eposevm()) {
530 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500531 } else if (board_is_evm_14_or_later()) {
532 enable_vtt_regulator();
533 config_ddr(0, &ioregs_ddr3, NULL, NULL,
534 &ddr3_emif_regs_400Mhz_production, 0);
535 } else if (board_is_evm_12_or_later()) {
536 enable_vtt_regulator();
537 config_ddr(0, &ioregs_ddr3, NULL, NULL,
538 &ddr3_emif_regs_400Mhz_beta, 0);
Madan Srinivasa5051b72016-05-19 19:10:48 -0500539 } else if (board_is_evm()) {
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530540 enable_vtt_regulator();
541 config_ddr(0, &ioregs_ddr3, NULL, NULL,
542 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500543 } else if (board_is_sk()) {
544 config_ddr(400, &ioregs_ddr3, NULL, NULL,
545 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi403d70a2014-12-22 16:26:17 -0600546 } else if (board_is_idk()) {
547 config_ddr(400, &ioregs_ddr3, NULL, NULL,
548 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530549 }
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530550}
551#endif
552
Tom Rini7aa55982014-06-23 16:06:29 -0400553/* setup board specific PMIC */
554int power_init_board(void)
555{
556 struct pmic *p;
557
Felipe Balbi403d70a2014-12-22 16:26:17 -0600558 if (board_is_idk()) {
559 power_tps62362_init(I2C_PMIC);
560 p = pmic_get("TPS62362");
561 if (p && !pmic_probe(p))
562 puts("PMIC: TPS62362\n");
563 } else {
564 power_tps65218_init(I2C_PMIC);
565 p = pmic_get("TPS65218_PMIC");
566 if (p && !pmic_probe(p))
567 puts("PMIC: TPS65218\n");
568 }
Tom Rini7aa55982014-06-23 16:06:29 -0400569
570 return 0;
571}
572
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530573int board_init(void)
574{
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500575 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
576 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
577 modena_init0_bw_integer, modena_init0_watermark_0;
578
Lokesh Vutla369cbe12013-12-10 15:02:12 +0530579 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon guptae53ad4b2014-07-22 16:03:22 +0530580 gpmc_init();
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530581
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500582 /* Clear all important bits for DSS errata that may need to be tweaked*/
583 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
584 MREQPRIO_0_SAB_INIT0_MASK;
585
586 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
587
588 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
589 BW_LIMITER_BW_FRAC_MASK;
590
591 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
592 BW_LIMITER_BW_INT_MASK;
593
594 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
595 BW_LIMITER_BW_WATERMARK_MASK;
596
597 /* Setting MReq Priority of the DSS*/
598 mreqprio_0 |= 0x77;
599
600 /*
601 * Set L3 Fast Configuration Register
602 * Limiting bandwith for ARM core to 700 MBPS
603 */
604 modena_init0_bw_fractional |= 0x10;
605 modena_init0_bw_integer |= 0x3;
606
607 writel(mreqprio_0, &cdev->mreqprio_0);
608 writel(mreqprio_1, &cdev->mreqprio_1);
609
610 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
611 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
612 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
613
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530614 return 0;
615}
616
617#ifdef CONFIG_BOARD_LATE_INIT
618int board_late_init(void)
619{
Sekhar Norif4af1632013-12-10 15:02:16 +0530620#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon5f8bb932016-02-24 12:30:56 -0600621 set_board_info_env(NULL);
Lokesh Vutla5d4d4362016-11-29 11:58:03 +0530622
623 /*
624 * Default FIT boot on HS devices. Non FIT images are not allowed
625 * on HS devices.
626 */
627 if (get_device_type() == HS_DEVICE)
628 setenv("boot_fit", "1");
Sekhar Norif4af1632013-12-10 15:02:16 +0530629#endif
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530630 return 0;
631}
632#endif
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500633
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530634#ifdef CONFIG_USB_DWC3
635static struct dwc3_device usb_otg_ss1 = {
636 .maximum_speed = USB_SPEED_HIGH,
637 .base = USB_OTG_SS1_BASE,
638 .tx_fifo_resize = false,
639 .index = 0,
640};
641
642static struct dwc3_omap_device usb_otg_ss1_glue = {
643 .base = (void *)USB_OTG_SS1_GLUE_BASE,
644 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530645 .index = 0,
646};
647
648static struct ti_usb_phy_device usb_phy1_device = {
649 .usb2_phy_power = (void *)USB2_PHY1_POWER,
650 .index = 0,
651};
652
653static struct dwc3_device usb_otg_ss2 = {
654 .maximum_speed = USB_SPEED_HIGH,
655 .base = USB_OTG_SS2_BASE,
656 .tx_fifo_resize = false,
657 .index = 1,
658};
659
660static struct dwc3_omap_device usb_otg_ss2_glue = {
661 .base = (void *)USB_OTG_SS2_GLUE_BASE,
662 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530663 .index = 1,
664};
665
666static struct ti_usb_phy_device usb_phy2_device = {
667 .usb2_phy_power = (void *)USB2_PHY2_POWER,
668 .index = 1,
669};
670
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530671int usb_gadget_handle_interrupts(int index)
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530672{
673 u32 status;
674
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530675 status = dwc3_omap_uboot_interrupt_status(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530676 if (status)
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530677 dwc3_uboot_handle_interrupt(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530678
679 return 0;
680}
Roger Quadros55efadd2016-05-23 17:37:48 +0300681#endif /* CONFIG_USB_DWC3 */
682
683#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
Uri Mashiach1a9a5f72017-02-23 15:39:37 +0200684int omap_xhci_board_usb_init(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300685{
686 enable_usb_clocks(index);
687#ifdef CONFIG_USB_DWC3
688 switch (index) {
689 case 0:
690 if (init == USB_INIT_DEVICE) {
691 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
692 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
693 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
694 ti_usb_phy_uboot_init(&usb_phy1_device);
695 dwc3_uboot_init(&usb_otg_ss1);
696 }
697 break;
698 case 1:
699 if (init == USB_INIT_DEVICE) {
700 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
701 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
702 ti_usb_phy_uboot_init(&usb_phy2_device);
703 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
704 dwc3_uboot_init(&usb_otg_ss2);
705 }
706 break;
707 default:
708 printf("Invalid Controller Index\n");
709 }
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530710#endif
711
Roger Quadros55efadd2016-05-23 17:37:48 +0300712 return 0;
713}
714
Uri Mashiach1a9a5f72017-02-23 15:39:37 +0200715int omap_xhci_board_usb_cleanup(int index, enum usb_init_type init)
Roger Quadros55efadd2016-05-23 17:37:48 +0300716{
717#ifdef CONFIG_USB_DWC3
718 switch (index) {
719 case 0:
720 case 1:
721 if (init == USB_INIT_DEVICE) {
722 ti_usb_phy_uboot_exit(index);
723 dwc3_uboot_exit(index);
724 dwc3_omap_uboot_exit(index);
725 }
726 break;
727 default:
728 printf("Invalid Controller Index\n");
729 }
730#endif
731 disable_usb_clocks(index);
732
733 return 0;
734}
735#endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
736
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500737#ifdef CONFIG_DRIVER_TI_CPSW
738
739static void cpsw_control(int enabled)
740{
741 /* Additional controls can be added here */
742 return;
743}
744
745static struct cpsw_slave_data cpsw_slaves[] = {
746 {
747 .slave_reg_ofs = 0x208,
748 .sliver_reg_ofs = 0xd80,
749 .phy_addr = 16,
750 },
751 {
752 .slave_reg_ofs = 0x308,
753 .sliver_reg_ofs = 0xdc0,
754 .phy_addr = 1,
755 },
756};
757
758static struct cpsw_platform_data cpsw_data = {
759 .mdio_base = CPSW_MDIO_BASE,
760 .cpsw_base = CPSW_BASE,
761 .mdio_div = 0xff,
762 .channels = 8,
763 .cpdma_reg_ofs = 0x800,
764 .slaves = 1,
765 .slave_data = cpsw_slaves,
766 .ale_reg_ofs = 0xd00,
767 .ale_entries = 1024,
768 .host_port_reg_ofs = 0x108,
769 .hw_stats_reg_ofs = 0x900,
770 .bd_ram_ofs = 0x2000,
771 .mac_control = (1 << 5),
772 .control = cpsw_control,
773 .host_port_num = 0,
774 .version = CPSW_CTRL_VERSION_2,
775};
776
777int board_eth_init(bd_t *bis)
778{
779 int rv;
780 uint8_t mac_addr[6];
781 uint32_t mac_hi, mac_lo;
782
783 /* try reading mac address from efuse */
784 mac_lo = readl(&cdev->macid0l);
785 mac_hi = readl(&cdev->macid0h);
786 mac_addr[0] = mac_hi & 0xFF;
787 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
788 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
789 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
790 mac_addr[4] = mac_lo & 0xFF;
791 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
792
793 if (!getenv("ethaddr")) {
794 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500795 if (is_valid_ethaddr(mac_addr))
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500796 eth_setenv_enetaddr("ethaddr", mac_addr);
797 }
798
799 mac_lo = readl(&cdev->macid1l);
800 mac_hi = readl(&cdev->macid1h);
801 mac_addr[0] = mac_hi & 0xFF;
802 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
803 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
804 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
805 mac_addr[4] = mac_lo & 0xFF;
806 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
807
808 if (!getenv("eth1addr")) {
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500809 if (is_valid_ethaddr(mac_addr))
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500810 eth_setenv_enetaddr("eth1addr", mac_addr);
811 }
812
813 if (board_is_eposevm()) {
814 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
815 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
816 cpsw_slaves[0].phy_addr = 16;
Felipe Balbi619ce622014-06-10 15:01:21 -0500817 } else if (board_is_sk()) {
818 writel(RGMII_MODE_ENABLE, &cdev->miisel);
819 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
820 cpsw_slaves[0].phy_addr = 4;
821 cpsw_slaves[1].phy_addr = 5;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600822 } else if (board_is_idk()) {
823 writel(RGMII_MODE_ENABLE, &cdev->miisel);
824 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
825 cpsw_slaves[0].phy_addr = 0;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500826 } else {
827 writel(RGMII_MODE_ENABLE, &cdev->miisel);
828 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
829 cpsw_slaves[0].phy_addr = 0;
830 }
831
832 rv = cpsw_register(&cpsw_data);
833 if (rv < 0)
834 printf("Error %d registering CPSW switch\n", rv);
835
836 return rv;
837}
838#endif
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530839
840#ifdef CONFIG_SPL_LOAD_FIT
841int board_fit_config_name_match(const char *name)
842{
Lokesh Vutla17361212016-06-10 10:44:47 +0530843 if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530844 return 0;
845 else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
846 return 0;
Lokesh Vutla7dd12832016-05-16 11:11:17 +0530847 else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
848 return 0;
Lokesh Vutla54a92e12016-05-16 11:11:18 +0530849 else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
850 return 0;
Lokesh Vutla5a3775a2016-05-16 11:11:15 +0530851 else
852 return -1;
853}
854#endif
Madan Srinivase29878f2016-06-27 09:19:23 -0500855
856#ifdef CONFIG_TI_SECURE_DEVICE
857void board_fit_image_post_process(void **p_image, size_t *p_size)
858{
859 secure_boot_verify_image(p_image, p_size);
860}
861#endif