blob: ca1976e16a5f088315af98c9b8ebe3149023c2a4 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Lokesh Vutla40700ad2013-02-12 21:29:08 +00002/*
3 * (C) Copyright 2013
4 * Texas Instruments Incorporated, <www.ti.com>
5 *
6 * Lokesh Vutla <lokeshvutla@ti.com>
7 *
8 * Based on previous work by:
9 * Aneesh V <aneesh@ti.com>
10 * Steve Sakoman <steve@sakoman.com>
Lokesh Vutla40700ad2013-02-12 21:29:08 +000011 */
12#include <common.h>
Simon Glass79fd2142019-08-01 09:46:43 -060013#include <env.h>
Simon Glass3bbe70c2019-12-28 10:44:54 -070014#include <fdt_support.h>
Roman Kovalivskyi1bb13422020-07-28 23:35:32 +030015#include <fastboot.h>
Simon Glass2dc9c342020-05-10 11:40:01 -060016#include <image.h>
Simon Glassa7b51302019-11-14 12:57:46 -070017#include <init.h>
Grygorii Strashko52168f82019-11-22 19:26:17 +020018#include <spl.h>
Simon Glass274e0b02020-05-10 11:39:56 -060019#include <net.h>
Nishanth Menon627612c2013-03-26 05:20:54 +000020#include <palmas.h>
Dan Murphy57f29ab2014-02-03 06:59:02 -060021#include <sata.h>
Simon Glass36736182019-11-14 12:57:24 -070022#include <serial.h>
Lokesh Vutla3c7dc012016-03-08 09:18:05 +053023#include <linux/string.h>
Lokesh Vutlabe86f0e2014-08-04 19:42:24 +053024#include <asm/gpio.h>
Kishon Vijay Abraham Ice61fd72015-02-23 18:40:19 +053025#include <usb.h>
26#include <linux/usb/gadget.h>
Andreas Dannenberg5cf344b2016-06-27 09:19:22 -050027#include <asm/omap_common.h>
28#include <asm/omap_sec_common.h>
Lokesh Vutlabe86f0e2014-08-04 19:42:24 +053029#include <asm/arch/gpio.h>
Lokesh Vutla1fd80222015-06-04 16:42:38 +053030#include <asm/arch/dra7xx_iodelay.h>
Lokesh Vutla41963ee2016-03-08 09:18:06 +053031#include <asm/emif.h>
Lokesh Vutla40700ad2013-02-12 21:29:08 +000032#include <asm/arch/sys_proto.h>
33#include <asm/arch/mmc_host_def.h>
Roger Quadrosf019ee82013-11-11 16:56:44 +020034#include <asm/arch/sata.h>
Kishon Vijay Abraham Ice61fd72015-02-23 18:40:19 +053035#include <dwc3-uboot.h>
36#include <dwc3-omap-uboot.h>
Franklin S Cooper Jr236fca82019-02-27 13:29:36 +053037#include <i2c.h>
Kishon Vijay Abraham Ice61fd72015-02-23 18:40:19 +053038#include <ti-usb-phy-uboot.h>
Lokesh Vutla40700ad2013-02-12 21:29:08 +000039
40#include "mux_data.h"
Lokesh Vutla3c7dc012016-03-08 09:18:05 +053041#include "../common/board_detect.h"
42
Lokesh Vutla13376132017-08-21 12:50:53 +053043#define board_is_dra76x_evm() board_ti_is("DRA76/7x")
Lokesh Vutla3c7dc012016-03-08 09:18:05 +053044#define board_is_dra74x_evm() board_ti_is("5777xCPU")
Ravi Babue1031082016-03-15 18:09:14 -050045#define board_is_dra72x_evm() board_ti_is("DRA72x-T")
Lokesh Vutlab9d8f8e2016-11-23 13:25:24 +053046#define board_is_dra71x_evm() board_ti_is("DRA79x,D")
Mugunthan V N3a7f10c2016-09-27 13:01:42 +053047#define board_is_dra74x_revh_or_later() (board_is_dra74x_evm() && \
48 (strncmp("H", board_ti_get_rev(), 1) <= 0))
49#define board_is_dra72x_revc_or_later() (board_is_dra72x_evm() && \
50 (strncmp("C", board_ti_get_rev(), 1) <= 0))
Lokesh Vutlab85fbcd2016-03-08 09:18:08 +053051#define board_ti_get_emif_size() board_ti_get_emif1_size() + \
52 board_ti_get_emif2_size()
Lokesh Vutla40700ad2013-02-12 21:29:08 +000053
Lokesh Vutla40700ad2013-02-12 21:29:08 +000054DECLARE_GLOBAL_DATA_PTR;
55
Lokesh Vutlabe86f0e2014-08-04 19:42:24 +053056/* GPIO 7_11 */
57#define GPIO_DDR_VTT_EN 203
58
Lokesh Vutla3c7dc012016-03-08 09:18:05 +053059#define SYSINFO_BOARD_NAME_MAX_LEN 37
60
Franklin S Cooper Jr236fca82019-02-27 13:29:36 +053061/* I2C I/O Expander */
62#define NAND_PCF8575_ADDR 0x21
63#define NAND_PCF8575_I2C_BUS_NUM 0
64
Lokesh Vutla40700ad2013-02-12 21:29:08 +000065const struct omap_sysinfo sysinfo = {
Lokesh Vutla3c7dc012016-03-08 09:18:05 +053066 "Board: UNKNOWN(DRA7 EVM) REV UNKNOWN\n"
Lokesh Vutla40700ad2013-02-12 21:29:08 +000067};
68
Lokesh Vutla41963ee2016-03-08 09:18:06 +053069static const struct emif_regs emif1_ddr3_532_mhz_1cs = {
70 .sdram_config_init = 0x61851ab2,
71 .sdram_config = 0x61851ab2,
72 .sdram_config2 = 0x08000000,
73 .ref_ctrl = 0x000040F1,
74 .ref_ctrl_final = 0x00001035,
75 .sdram_tim1 = 0xCCCF36B3,
76 .sdram_tim2 = 0x308F7FDA,
77 .sdram_tim3 = 0x427F88A8,
78 .read_idle_ctrl = 0x00050000,
79 .zq_config = 0x0007190B,
80 .temp_alert_config = 0x00000000,
81 .emif_ddr_phy_ctlr_1_init = 0x0024400B,
82 .emif_ddr_phy_ctlr_1 = 0x0E24400B,
83 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
84 .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
85 .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
86 .emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
87 .emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
88 .emif_rd_wr_lvl_rmp_win = 0x00000000,
89 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
90 .emif_rd_wr_lvl_ctl = 0x00000000,
91 .emif_rd_wr_exec_thresh = 0x00000305
92};
93
94static const struct emif_regs emif2_ddr3_532_mhz_1cs = {
95 .sdram_config_init = 0x61851B32,
96 .sdram_config = 0x61851B32,
97 .sdram_config2 = 0x08000000,
98 .ref_ctrl = 0x000040F1,
99 .ref_ctrl_final = 0x00001035,
100 .sdram_tim1 = 0xCCCF36B3,
101 .sdram_tim2 = 0x308F7FDA,
102 .sdram_tim3 = 0x427F88A8,
103 .read_idle_ctrl = 0x00050000,
104 .zq_config = 0x0007190B,
105 .temp_alert_config = 0x00000000,
106 .emif_ddr_phy_ctlr_1_init = 0x0024400B,
107 .emif_ddr_phy_ctlr_1 = 0x0E24400B,
108 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
109 .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
110 .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
111 .emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
112 .emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
113 .emif_rd_wr_lvl_rmp_win = 0x00000000,
114 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
115 .emif_rd_wr_lvl_ctl = 0x00000000,
116 .emif_rd_wr_exec_thresh = 0x00000305
117};
118
119static const struct emif_regs emif_1_regs_ddr3_666_mhz_1cs_dra_es1 = {
120 .sdram_config_init = 0x61862B32,
121 .sdram_config = 0x61862B32,
122 .sdram_config2 = 0x08000000,
123 .ref_ctrl = 0x0000514C,
124 .ref_ctrl_final = 0x0000144A,
125 .sdram_tim1 = 0xD113781C,
126 .sdram_tim2 = 0x30717FE3,
127 .sdram_tim3 = 0x409F86A8,
128 .read_idle_ctrl = 0x00050000,
129 .zq_config = 0x5007190B,
130 .temp_alert_config = 0x00000000,
131 .emif_ddr_phy_ctlr_1_init = 0x0024400D,
132 .emif_ddr_phy_ctlr_1 = 0x0E24400D,
133 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
134 .emif_ddr_ext_phy_ctrl_2 = 0x00A400A4,
135 .emif_ddr_ext_phy_ctrl_3 = 0x00A900A9,
136 .emif_ddr_ext_phy_ctrl_4 = 0x00B000B0,
137 .emif_ddr_ext_phy_ctrl_5 = 0x00B000B0,
138 .emif_rd_wr_lvl_rmp_win = 0x00000000,
139 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
140 .emif_rd_wr_lvl_ctl = 0x00000000,
141 .emif_rd_wr_exec_thresh = 0x00000305
142};
143
Ravi Babue1031082016-03-15 18:09:14 -0500144const struct emif_regs emif_1_regs_ddr3_666_mhz_1cs_dra_es2 = {
145 .sdram_config_init = 0x61862BB2,
146 .sdram_config = 0x61862BB2,
147 .sdram_config2 = 0x00000000,
148 .ref_ctrl = 0x0000514D,
149 .ref_ctrl_final = 0x0000144A,
150 .sdram_tim1 = 0xD1137824,
151 .sdram_tim2 = 0x30B37FE3,
152 .sdram_tim3 = 0x409F8AD8,
153 .read_idle_ctrl = 0x00050000,
154 .zq_config = 0x5007190B,
155 .temp_alert_config = 0x00000000,
156 .emif_ddr_phy_ctlr_1_init = 0x0824400E,
157 .emif_ddr_phy_ctlr_1 = 0x0E24400E,
158 .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
159 .emif_ddr_ext_phy_ctrl_2 = 0x006B009F,
160 .emif_ddr_ext_phy_ctrl_3 = 0x006B00A2,
161 .emif_ddr_ext_phy_ctrl_4 = 0x006B00A8,
162 .emif_ddr_ext_phy_ctrl_5 = 0x006B00A8,
163 .emif_rd_wr_lvl_rmp_win = 0x00000000,
164 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
165 .emif_rd_wr_lvl_ctl = 0x00000000,
166 .emif_rd_wr_exec_thresh = 0x00000305
167};
168
Lokesh Vutlab85fbcd2016-03-08 09:18:08 +0530169const struct emif_regs emif1_ddr3_532_mhz_1cs_2G = {
170 .sdram_config_init = 0x61851ab2,
171 .sdram_config = 0x61851ab2,
172 .sdram_config2 = 0x08000000,
173 .ref_ctrl = 0x000040F1,
174 .ref_ctrl_final = 0x00001035,
175 .sdram_tim1 = 0xCCCF36B3,
176 .sdram_tim2 = 0x30BF7FDA,
177 .sdram_tim3 = 0x427F8BA8,
178 .read_idle_ctrl = 0x00050000,
179 .zq_config = 0x0007190B,
180 .temp_alert_config = 0x00000000,
181 .emif_ddr_phy_ctlr_1_init = 0x0024400B,
182 .emif_ddr_phy_ctlr_1 = 0x0E24400B,
183 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
184 .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
185 .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
186 .emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
187 .emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
188 .emif_rd_wr_lvl_rmp_win = 0x00000000,
189 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
190 .emif_rd_wr_lvl_ctl = 0x00000000,
191 .emif_rd_wr_exec_thresh = 0x00000305
192};
193
194const struct emif_regs emif2_ddr3_532_mhz_1cs_2G = {
195 .sdram_config_init = 0x61851B32,
196 .sdram_config = 0x61851B32,
197 .sdram_config2 = 0x08000000,
198 .ref_ctrl = 0x000040F1,
199 .ref_ctrl_final = 0x00001035,
200 .sdram_tim1 = 0xCCCF36B3,
201 .sdram_tim2 = 0x308F7FDA,
202 .sdram_tim3 = 0x427F88A8,
203 .read_idle_ctrl = 0x00050000,
204 .zq_config = 0x0007190B,
205 .temp_alert_config = 0x00000000,
206 .emif_ddr_phy_ctlr_1_init = 0x0024400B,
207 .emif_ddr_phy_ctlr_1 = 0x0E24400B,
208 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
209 .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
210 .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
211 .emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
212 .emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
213 .emif_rd_wr_lvl_rmp_win = 0x00000000,
214 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
215 .emif_rd_wr_lvl_ctl = 0x00000000,
216 .emif_rd_wr_exec_thresh = 0x00000305
217};
218
Lokesh Vutla6f1038f2017-08-21 12:50:55 +0530219const struct emif_regs emif_1_regs_ddr3_666_mhz_1cs_dra76 = {
220 .sdram_config_init = 0x61862B32,
221 .sdram_config = 0x61862B32,
222 .sdram_config2 = 0x00000000,
223 .ref_ctrl = 0x0000514C,
224 .ref_ctrl_final = 0x0000144A,
225 .sdram_tim1 = 0xD113783C,
226 .sdram_tim2 = 0x30B47FE3,
227 .sdram_tim3 = 0x409F8AD8,
228 .read_idle_ctrl = 0x00050000,
229 .zq_config = 0x5007190B,
230 .temp_alert_config = 0x00000000,
231 .emif_ddr_phy_ctlr_1_init = 0x0824400D,
232 .emif_ddr_phy_ctlr_1 = 0x0E24400D,
233 .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
234 .emif_ddr_ext_phy_ctrl_2 = 0x006B009F,
235 .emif_ddr_ext_phy_ctrl_3 = 0x006B00A2,
236 .emif_ddr_ext_phy_ctrl_4 = 0x006B00A8,
237 .emif_ddr_ext_phy_ctrl_5 = 0x006B00A8,
238 .emif_rd_wr_lvl_rmp_win = 0x00000000,
239 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
240 .emif_rd_wr_lvl_ctl = 0x00000000,
241 .emif_rd_wr_exec_thresh = 0x00000305
242};
243
244const struct emif_regs emif_2_regs_ddr3_666_mhz_1cs_dra76 = {
245 .sdram_config_init = 0x61862B32,
246 .sdram_config = 0x61862B32,
247 .sdram_config2 = 0x00000000,
248 .ref_ctrl = 0x0000514C,
249 .ref_ctrl_final = 0x0000144A,
250 .sdram_tim1 = 0xD113781C,
251 .sdram_tim2 = 0x30B47FE3,
252 .sdram_tim3 = 0x409F8AD8,
253 .read_idle_ctrl = 0x00050000,
254 .zq_config = 0x5007190B,
255 .temp_alert_config = 0x00000000,
256 .emif_ddr_phy_ctlr_1_init = 0x0824400D,
257 .emif_ddr_phy_ctlr_1 = 0x0E24400D,
258 .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
259 .emif_ddr_ext_phy_ctrl_2 = 0x006B009F,
260 .emif_ddr_ext_phy_ctrl_3 = 0x006B00A2,
261 .emif_ddr_ext_phy_ctrl_4 = 0x006B00A8,
262 .emif_ddr_ext_phy_ctrl_5 = 0x006B00A8,
263 .emif_rd_wr_lvl_rmp_win = 0x00000000,
264 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
265 .emif_rd_wr_lvl_ctl = 0x00000000,
266 .emif_rd_wr_exec_thresh = 0x00000305
267};
268
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530269void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
270{
Lokesh Vutlab85fbcd2016-03-08 09:18:08 +0530271 u64 ram_size;
272
273 ram_size = board_ti_get_emif_size();
274
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530275 switch (omap_revision()) {
276 case DRA752_ES1_0:
277 case DRA752_ES1_1:
278 case DRA752_ES2_0:
279 switch (emif_nr) {
280 case 1:
Lokesh Vutlab85fbcd2016-03-08 09:18:08 +0530281 if (ram_size > CONFIG_MAX_MEM_MAPPED)
282 *regs = &emif1_ddr3_532_mhz_1cs_2G;
283 else
284 *regs = &emif1_ddr3_532_mhz_1cs;
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530285 break;
286 case 2:
Lokesh Vutlab85fbcd2016-03-08 09:18:08 +0530287 if (ram_size > CONFIG_MAX_MEM_MAPPED)
288 *regs = &emif2_ddr3_532_mhz_1cs_2G;
289 else
290 *regs = &emif2_ddr3_532_mhz_1cs;
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530291 break;
292 }
293 break;
Lokesh Vutla69483e62017-12-29 11:47:51 +0530294 case DRA762_ABZ_ES1_0:
295 case DRA762_ACD_ES1_0:
Lokesh Vutla6f1038f2017-08-21 12:50:55 +0530296 case DRA762_ES1_0:
297 if (emif_nr == 1)
298 *regs = &emif_1_regs_ddr3_666_mhz_1cs_dra76;
299 else
300 *regs = &emif_2_regs_ddr3_666_mhz_1cs_dra76;
301 break;
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530302 case DRA722_ES1_0:
Ravi Babue1031082016-03-15 18:09:14 -0500303 case DRA722_ES2_0:
Vishal Mahaveer42d25eb2017-08-26 16:51:22 -0500304 case DRA722_ES2_1:
Ravi Babue1031082016-03-15 18:09:14 -0500305 if (ram_size < CONFIG_MAX_MEM_MAPPED)
306 *regs = &emif_1_regs_ddr3_666_mhz_1cs_dra_es1;
307 else
308 *regs = &emif_1_regs_ddr3_666_mhz_1cs_dra_es2;
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530309 break;
310 default:
311 *regs = &emif1_ddr3_532_mhz_1cs;
312 }
313}
314
315static const struct dmm_lisa_map_regs lisa_map_dra7_1536MB = {
316 .dmm_lisa_map_0 = 0x0,
317 .dmm_lisa_map_1 = 0x80640300,
318 .dmm_lisa_map_2 = 0xC0500220,
319 .dmm_lisa_map_3 = 0xFF020100,
320 .is_ma_present = 0x1
321};
322
323static const struct dmm_lisa_map_regs lisa_map_2G_x_2 = {
324 .dmm_lisa_map_0 = 0x0,
325 .dmm_lisa_map_1 = 0x0,
326 .dmm_lisa_map_2 = 0x80600100,
327 .dmm_lisa_map_3 = 0xFF020100,
328 .is_ma_present = 0x1
329};
330
Lokesh Vutlab85fbcd2016-03-08 09:18:08 +0530331const struct dmm_lisa_map_regs lisa_map_dra7_2GB = {
332 .dmm_lisa_map_0 = 0x0,
333 .dmm_lisa_map_1 = 0x0,
334 .dmm_lisa_map_2 = 0x80740300,
335 .dmm_lisa_map_3 = 0xFF020100,
336 .is_ma_present = 0x1
337};
338
Ravi Babue1031082016-03-15 18:09:14 -0500339/*
340 * DRA722 EVM EMIF1 2GB CONFIGURATION
341 * EMIF1 4 devices of 512Mb x 8 Micron
342 */
343const struct dmm_lisa_map_regs lisa_map_2G_x_4 = {
344 .dmm_lisa_map_0 = 0x0,
345 .dmm_lisa_map_1 = 0x0,
346 .dmm_lisa_map_2 = 0x80700100,
347 .dmm_lisa_map_3 = 0xFF020100,
348 .is_ma_present = 0x1
349};
350
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530351void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
352{
Lokesh Vutlab85fbcd2016-03-08 09:18:08 +0530353 u64 ram_size;
354
355 ram_size = board_ti_get_emif_size();
356
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530357 switch (omap_revision()) {
Lokesh Vutla69483e62017-12-29 11:47:51 +0530358 case DRA762_ABZ_ES1_0:
359 case DRA762_ACD_ES1_0:
Lokesh Vutla6f1038f2017-08-21 12:50:55 +0530360 case DRA762_ES1_0:
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530361 case DRA752_ES1_0:
362 case DRA752_ES1_1:
363 case DRA752_ES2_0:
Lokesh Vutlab85fbcd2016-03-08 09:18:08 +0530364 if (ram_size > CONFIG_MAX_MEM_MAPPED)
365 *dmm_lisa_regs = &lisa_map_dra7_2GB;
366 else
367 *dmm_lisa_regs = &lisa_map_dra7_1536MB;
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530368 break;
369 case DRA722_ES1_0:
Ravi Babue1031082016-03-15 18:09:14 -0500370 case DRA722_ES2_0:
Vishal Mahaveer42d25eb2017-08-26 16:51:22 -0500371 case DRA722_ES2_1:
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530372 default:
Ravi Babue1031082016-03-15 18:09:14 -0500373 if (ram_size < CONFIG_MAX_MEM_MAPPED)
374 *dmm_lisa_regs = &lisa_map_2G_x_2;
375 else
376 *dmm_lisa_regs = &lisa_map_2G_x_4;
377 break;
Lokesh Vutla41963ee2016-03-08 09:18:06 +0530378 }
379}
380
Keerthyc8056232016-06-07 16:05:25 +0530381struct vcores_data dra752_volts = {
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530382 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM,
383 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
Keerthyc8056232016-06-07 16:05:25 +0530384 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
385 .mpu.addr = TPS659038_REG_ADDR_SMPS12,
386 .mpu.pmic = &tps659038,
387 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK,
388
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530389 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM,
390 .eve.value[OPP_OD] = VDD_EVE_DRA7_OD,
391 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH,
392 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
393 .eve.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_DSPEVE_OD,
394 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
Keerthyc8056232016-06-07 16:05:25 +0530395 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS,
396 .eve.addr = TPS659038_REG_ADDR_SMPS45,
397 .eve.pmic = &tps659038,
398 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK,
399
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530400 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM,
401 .gpu.value[OPP_OD] = VDD_GPU_DRA7_OD,
402 .gpu.value[OPP_HIGH] = VDD_GPU_DRA7_HIGH,
403 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM,
404 .gpu.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_GPU_OD,
405 .gpu.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_GPU_HIGH,
Keerthyc8056232016-06-07 16:05:25 +0530406 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
407 .gpu.addr = TPS659038_REG_ADDR_SMPS6,
408 .gpu.pmic = &tps659038,
409 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK,
410
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530411 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM,
412 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM,
Keerthyc8056232016-06-07 16:05:25 +0530413 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS,
414 .core.addr = TPS659038_REG_ADDR_SMPS7,
415 .core.pmic = &tps659038,
416
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530417 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM,
418 .iva.value[OPP_OD] = VDD_IVA_DRA7_OD,
419 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH,
420 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM,
421 .iva.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_IVA_OD,
422 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH,
Keerthyc8056232016-06-07 16:05:25 +0530423 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS,
424 .iva.addr = TPS659038_REG_ADDR_SMPS8,
425 .iva.pmic = &tps659038,
426 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK,
427};
428
Keerthy1b21f552017-08-21 12:50:54 +0530429struct vcores_data dra76x_volts = {
430 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM,
431 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
432 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
433 .mpu.addr = LP87565_REG_ADDR_BUCK01,
434 .mpu.pmic = &lp87565,
435 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK,
436
437 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM,
438 .eve.value[OPP_OD] = VDD_EVE_DRA7_OD,
439 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH,
440 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
441 .eve.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_DSPEVE_OD,
442 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
443 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS,
444 .eve.addr = TPS65917_REG_ADDR_SMPS1,
445 .eve.pmic = &tps659038,
446 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK,
447
448 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM,
449 .gpu.value[OPP_OD] = VDD_GPU_DRA7_OD,
450 .gpu.value[OPP_HIGH] = VDD_GPU_DRA7_HIGH,
451 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM,
452 .gpu.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_GPU_OD,
453 .gpu.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_GPU_HIGH,
454 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
455 .gpu.addr = LP87565_REG_ADDR_BUCK23,
456 .gpu.pmic = &lp87565,
457 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK,
458
459 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM,
460 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM,
461 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS,
462 .core.addr = TPS65917_REG_ADDR_SMPS3,
463 .core.pmic = &tps659038,
464
465 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM,
466 .iva.value[OPP_OD] = VDD_IVA_DRA7_OD,
467 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH,
468 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM,
469 .iva.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_IVA_OD,
470 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH,
471 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS,
472 .iva.addr = TPS65917_REG_ADDR_SMPS4,
473 .iva.pmic = &tps659038,
474 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK,
475};
476
Keerthyc8056232016-06-07 16:05:25 +0530477struct vcores_data dra722_volts = {
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530478 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM,
479 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
Keerthyc8056232016-06-07 16:05:25 +0530480 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
481 .mpu.addr = TPS65917_REG_ADDR_SMPS1,
482 .mpu.pmic = &tps659038,
483 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK,
484
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530485 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM,
486 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM,
Keerthyc8056232016-06-07 16:05:25 +0530487 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS,
488 .core.addr = TPS65917_REG_ADDR_SMPS2,
489 .core.pmic = &tps659038,
490
491 /*
492 * The DSPEVE, GPU and IVA rails are usually grouped on DRA72x
493 * designs and powered by TPS65917 SMPS3, as on the J6Eco EVM.
494 */
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530495 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM,
496 .gpu.value[OPP_OD] = VDD_GPU_DRA7_OD,
497 .gpu.value[OPP_HIGH] = VDD_GPU_DRA7_HIGH,
498 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM,
499 .gpu.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_GPU_OD,
500 .gpu.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_GPU_HIGH,
Keerthyc8056232016-06-07 16:05:25 +0530501 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
502 .gpu.addr = TPS65917_REG_ADDR_SMPS3,
503 .gpu.pmic = &tps659038,
504 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK,
505
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530506 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM,
507 .eve.value[OPP_OD] = VDD_EVE_DRA7_OD,
508 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH,
509 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
510 .eve.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_DSPEVE_OD,
511 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
Keerthyc8056232016-06-07 16:05:25 +0530512 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS,
513 .eve.addr = TPS65917_REG_ADDR_SMPS3,
514 .eve.pmic = &tps659038,
515 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK,
516
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530517 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM,
518 .iva.value[OPP_OD] = VDD_IVA_DRA7_OD,
519 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH,
520 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM,
521 .iva.efuse.reg[OPP_OD] = STD_FUSE_OPP_VMIN_IVA_OD,
522 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH,
Keerthyc8056232016-06-07 16:05:25 +0530523 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS,
524 .iva.addr = TPS65917_REG_ADDR_SMPS3,
525 .iva.pmic = &tps659038,
526 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK,
527};
528
Keerthy4d4e34b2016-11-23 13:25:27 +0530529struct vcores_data dra718_volts = {
530 /*
531 * In the case of dra71x GPU MPU and CORE
532 * are all powered up by BUCK0 of LP873X PMIC
533 */
534 .mpu.value[OPP_NOM] = VDD_MPU_DRA7_NOM,
535 .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
536 .mpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
537 .mpu.addr = LP873X_REG_ADDR_BUCK0,
538 .mpu.pmic = &lp8733,
539 .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK,
540
541 .core.value[OPP_NOM] = VDD_CORE_DRA7_NOM,
542 .core.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_CORE_NOM,
543 .core.efuse.reg_bits = DRA752_EFUSE_REGBITS,
544 .core.addr = LP873X_REG_ADDR_BUCK0,
545 .core.pmic = &lp8733,
546
547 .gpu.value[OPP_NOM] = VDD_GPU_DRA7_NOM,
548 .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM,
549 .gpu.efuse.reg_bits = DRA752_EFUSE_REGBITS,
550 .gpu.addr = LP873X_REG_ADDR_BUCK0,
551 .gpu.pmic = &lp8733,
552 .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK,
553
554 /*
555 * The DSPEVE and IVA rails are grouped on DRA71x-evm
556 * and are powered by BUCK1 of LP873X PMIC
557 */
558 .eve.value[OPP_NOM] = VDD_EVE_DRA7_NOM,
Lokesh Vutlacae84282017-04-20 14:07:52 +0530559 .eve.value[OPP_HIGH] = VDD_EVE_DRA7_HIGH,
Keerthy4d4e34b2016-11-23 13:25:27 +0530560 .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
Lokesh Vutlacae84282017-04-20 14:07:52 +0530561 .eve.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
Keerthy4d4e34b2016-11-23 13:25:27 +0530562 .eve.efuse.reg_bits = DRA752_EFUSE_REGBITS,
563 .eve.addr = LP873X_REG_ADDR_BUCK1,
564 .eve.pmic = &lp8733,
565 .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK,
566
567 .iva.value[OPP_NOM] = VDD_IVA_DRA7_NOM,
Lokesh Vutlacae84282017-04-20 14:07:52 +0530568 .iva.value[OPP_HIGH] = VDD_IVA_DRA7_HIGH,
Keerthy4d4e34b2016-11-23 13:25:27 +0530569 .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM,
Lokesh Vutlacae84282017-04-20 14:07:52 +0530570 .iva.efuse.reg[OPP_HIGH] = STD_FUSE_OPP_VMIN_IVA_HIGH,
Keerthy4d4e34b2016-11-23 13:25:27 +0530571 .iva.efuse.reg_bits = DRA752_EFUSE_REGBITS,
572 .iva.addr = LP873X_REG_ADDR_BUCK1,
573 .iva.pmic = &lp8733,
574 .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK,
575};
576
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530577int get_voltrail_opp(int rail_offset)
578{
579 int opp;
580
581 switch (rail_offset) {
582 case VOLT_MPU:
583 opp = DRA7_MPU_OPP;
Lokesh Vutlacae84282017-04-20 14:07:52 +0530584 /* DRA71x supports only OPP_NOM for MPU */
585 if (board_is_dra71x_evm())
586 opp = OPP_NOM;
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530587 break;
588 case VOLT_CORE:
589 opp = DRA7_CORE_OPP;
Lokesh Vutlacae84282017-04-20 14:07:52 +0530590 /* DRA71x supports only OPP_NOM for CORE */
591 if (board_is_dra71x_evm())
592 opp = OPP_NOM;
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530593 break;
594 case VOLT_GPU:
595 opp = DRA7_GPU_OPP;
Lokesh Vutlacae84282017-04-20 14:07:52 +0530596 /* DRA71x supports only OPP_NOM for GPU */
597 if (board_is_dra71x_evm())
598 opp = OPP_NOM;
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530599 break;
600 case VOLT_EVE:
601 opp = DRA7_DSPEVE_OPP;
Lokesh Vutlacae84282017-04-20 14:07:52 +0530602 /*
603 * DRA71x does not support OPP_OD for EVE.
604 * If OPP_OD is selected by menuconfig, fallback
605 * to OPP_NOM.
606 */
607 if (board_is_dra71x_evm() && opp == OPP_OD)
608 opp = OPP_NOM;
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530609 break;
610 case VOLT_IVA:
611 opp = DRA7_IVA_OPP;
Lokesh Vutlacae84282017-04-20 14:07:52 +0530612 /*
613 * DRA71x does not support OPP_OD for IVA.
614 * If OPP_OD is selected by menuconfig, fallback
615 * to OPP_NOM.
616 */
617 if (board_is_dra71x_evm() && opp == OPP_OD)
618 opp = OPP_NOM;
Lokesh Vutla6ede0fd2016-11-23 12:54:39 +0530619 break;
620 default:
621 opp = OPP_NOM;
622 }
623
624 return opp;
625}
626
Lokesh Vutla40700ad2013-02-12 21:29:08 +0000627/**
628 * @brief board_init
629 *
630 * @return 0
631 */
632int board_init(void)
633{
634 gpmc_init();
635 gd->bd->bi_boot_params = (0x80000000 + 0x100); /* boot param addr */
636
637 return 0;
638}
639
Simon Glass2f949c32017-03-31 08:40:32 -0600640int dram_init_banksize(void)
Lokesh Vutla0deb3332016-03-08 09:18:09 +0530641{
642 u64 ram_size;
643
644 ram_size = board_ti_get_emif_size();
645
646 gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
647 gd->bd->bi_dram[0].size = get_effective_memsize();
648 if (ram_size > CONFIG_MAX_MEM_MAPPED) {
649 gd->bd->bi_dram[1].start = 0x200000000;
650 gd->bd->bi_dram[1].size = ram_size - CONFIG_MAX_MEM_MAPPED;
651 }
Simon Glass2f949c32017-03-31 08:40:32 -0600652
653 return 0;
Lokesh Vutla0deb3332016-03-08 09:18:09 +0530654}
655
Jean-Jacques Hiblota58fe0a2018-11-29 10:57:41 +0100656#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
657static int device_okay(const char *path)
658{
659 int node;
660
661 node = fdt_path_offset(gd->fdt_blob, path);
662 if (node < 0)
663 return 0;
664
665 return fdtdec_get_is_enabled(gd->fdt_blob, node);
666}
667#endif
668
Roger Quadrosf019ee82013-11-11 16:56:44 +0200669int board_late_init(void)
670{
Lokesh Vutla6d576a72014-07-14 19:57:58 +0530671#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Lokesh Vutla3c7dc012016-03-08 09:18:05 +0530672 char *name = "unknown";
673
Lokesh Vutla9e23ab52016-06-29 14:50:41 +0530674 if (is_dra72x()) {
675 if (board_is_dra72x_revc_or_later())
676 name = "dra72x-revc";
Lokesh Vutlab9d8f8e2016-11-23 13:25:24 +0530677 else if (board_is_dra71x_evm())
678 name = "dra71x";
Lokesh Vutla9e23ab52016-06-29 14:50:41 +0530679 else
680 name = "dra72x";
Lokesh Vutla69483e62017-12-29 11:47:51 +0530681 } else if (is_dra76x_abz()) {
682 name = "dra76x_abz";
683 } else if (is_dra76x_acd()) {
684 name = "dra76x_acd";
Lokesh Vutla9e23ab52016-06-29 14:50:41 +0530685 } else {
Lokesh Vutla3c7dc012016-03-08 09:18:05 +0530686 name = "dra7xx";
Lokesh Vutla9e23ab52016-06-29 14:50:41 +0530687 }
Lokesh Vutla3c7dc012016-03-08 09:18:05 +0530688
689 set_board_info_env(name);
Dileep Katta7354dfc2015-03-25 04:04:51 +0530690
Lokesh Vutla73368b72016-11-29 11:58:01 +0530691 /*
692 * Default FIT boot on HS devices. Non FIT images are not allowed
693 * on HS devices.
694 */
695 if (get_device_type() == HS_DEVICE)
Simon Glass6a38e412017-08-03 12:22:09 -0600696 env_set("boot_fit", "1");
Lokesh Vutla73368b72016-11-29 11:58:01 +0530697
Paul Kocialkowski2edadee2015-08-27 19:37:12 +0200698 omap_die_id_serial();
Semen Protsenko4a845322017-05-22 19:16:42 +0300699 omap_set_fastboot_vars();
Keerthybe0c1f12017-10-12 10:18:45 +0530700
701 /*
702 * Hook the LDO1 regulator to EN pin. This applies only to LP8733
703 * Rest all regulators are hooked to EN Pin at reset.
704 */
705 if (board_is_dra71x_evm())
706 palmas_i2c_write_u8(LP873X_I2C_SLAVE_ADDR, 0x9, 0x7);
Lokesh Vutla6d576a72014-07-14 19:57:58 +0530707#endif
Jean-Jacques Hiblota58fe0a2018-11-29 10:57:41 +0100708#if CONFIG_IS_ENABLED(DM_USB) && CONFIG_IS_ENABLED(OF_CONTROL)
709 if (device_okay("/ocp/omap_dwc3_1@48880000"))
710 enable_usb_clocks(0);
711 if (device_okay("/ocp/omap_dwc3_2@488c0000"))
712 enable_usb_clocks(1);
713#endif
Roger Quadrosf019ee82013-11-11 16:56:44 +0200714 return 0;
715}
Lokesh Vutla3c7dc012016-03-08 09:18:05 +0530716
717#ifdef CONFIG_SPL_BUILD
718void do_board_detect(void)
719{
720 int rc;
721
722 rc = ti_i2c_eeprom_dra7_get(CONFIG_EEPROM_BUS_ADDRESS,
723 CONFIG_EEPROM_CHIP_ADDRESS);
724 if (rc)
725 printf("ti_i2c_eeprom_init failed %d\n", rc);
726}
727
728#else
729
730void do_board_detect(void)
731{
732 char *bname = NULL;
733 int rc;
734
735 rc = ti_i2c_eeprom_dra7_get(CONFIG_EEPROM_BUS_ADDRESS,
736 CONFIG_EEPROM_CHIP_ADDRESS);
737 if (rc)
738 printf("ti_i2c_eeprom_init failed %d\n", rc);
739
740 if (board_is_dra74x_evm()) {
741 bname = "DRA74x EVM";
Ravi Babue1031082016-03-15 18:09:14 -0500742 } else if (board_is_dra72x_evm()) {
743 bname = "DRA72x EVM";
Lokesh Vutlab9d8f8e2016-11-23 13:25:24 +0530744 } else if (board_is_dra71x_evm()) {
745 bname = "DRA71x EVM";
Lokesh Vutla13376132017-08-21 12:50:53 +0530746 } else if (board_is_dra76x_evm()) {
747 bname = "DRA76x EVM";
Lokesh Vutla3c7dc012016-03-08 09:18:05 +0530748 } else {
Ravi Babue1031082016-03-15 18:09:14 -0500749 /* If EEPROM is not populated */
Lokesh Vutla3c7dc012016-03-08 09:18:05 +0530750 if (is_dra72x())
751 bname = "DRA72x EVM";
752 else
753 bname = "DRA74x EVM";
754 }
755
756 if (bname)
757 snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
758 "Board: %s REV %s\n", bname, board_ti_get_rev());
759}
760#endif /* CONFIG_SPL_BUILD */
Roger Quadrosf019ee82013-11-11 16:56:44 +0200761
Keerthyc8056232016-06-07 16:05:25 +0530762void vcores_init(void)
763{
764 if (board_is_dra74x_evm()) {
765 *omap_vcores = &dra752_volts;
766 } else if (board_is_dra72x_evm()) {
767 *omap_vcores = &dra722_volts;
Keerthy4d4e34b2016-11-23 13:25:27 +0530768 } else if (board_is_dra71x_evm()) {
769 *omap_vcores = &dra718_volts;
Keerthy1b21f552017-08-21 12:50:54 +0530770 } else if (board_is_dra76x_evm()) {
771 *omap_vcores = &dra76x_volts;
Keerthyc8056232016-06-07 16:05:25 +0530772 } else {
773 /* If EEPROM is not populated */
774 if (is_dra72x())
775 *omap_vcores = &dra722_volts;
776 else
777 *omap_vcores = &dra752_volts;
778 }
779}
780
Paul Kocialkowskia00b1e52016-02-27 19:18:56 +0100781void set_muxconf_regs(void)
Lokesh Vutla40700ad2013-02-12 21:29:08 +0000782{
783 do_set_mux32((*ctrl)->control_padconf_core_base,
Lokesh Vutla1fd80222015-06-04 16:42:38 +0530784 early_padconf, ARRAY_SIZE(early_padconf));
Lokesh Vutla40700ad2013-02-12 21:29:08 +0000785}
Franklin S Cooper Jr236fca82019-02-27 13:29:36 +0530786
Miquel Raynald0935362019-10-03 19:50:03 +0200787#if defined(CONFIG_MTD_RAW_NAND)
Franklin S Cooper Jr236fca82019-02-27 13:29:36 +0530788static int nand_sw_detect(void)
789{
790 int rc;
791 uchar data[2];
792 struct udevice *dev;
793
794 rc = i2c_get_chip_for_busnum(NAND_PCF8575_I2C_BUS_NUM,
795 NAND_PCF8575_ADDR, 0, &dev);
796 if (rc)
797 return -1;
798
799 rc = dm_i2c_read(dev, 0, (uint8_t *)&data, sizeof(data));
800 if (rc)
801 return -1;
802
803 /* We are only interested in P10 and P11 on PCF8575 which is equal to
804 * bits 8 and 9.
805 */
806 data[1] = data[1] & 0x3;
807
808 /* Ensure only P11 is set and P10 is cleared. This ensures only
809 * NAND (P10) is configured and not NOR (P11) which are both low
810 * true signals. NAND and NOR settings should not be enabled at
811 * the same time.
812 */
813 if (data[1] == 0x2)
814 return 0;
815
816 return -1;
817}
818#else
819int nand_sw_detect(void)
820{
821 return -1;
822}
823#endif
Lokesh Vutla40700ad2013-02-12 21:29:08 +0000824
Lokesh Vutla1fd80222015-06-04 16:42:38 +0530825#ifdef CONFIG_IODELAY_RECALIBRATION
826void recalibrate_iodelay(void)
827{
Nishanth Menond3b7d852016-03-15 18:09:17 -0500828 struct pad_conf_entry const *pads, *delta_pads = NULL;
Nishanth Menon6759e7f2015-08-13 09:50:59 -0500829 struct iodelay_cfg_entry const *iodelay;
Nishanth Menond3b7d852016-03-15 18:09:17 -0500830 int npads, niodelays, delta_npads = 0;
831 int ret;
Nishanth Menon6759e7f2015-08-13 09:50:59 -0500832
833 switch (omap_revision()) {
834 case DRA722_ES1_0:
Nishanth Menond3b7d852016-03-15 18:09:17 -0500835 case DRA722_ES2_0:
Vishal Mahaveer42d25eb2017-08-26 16:51:22 -0500836 case DRA722_ES2_1:
Nishanth Menond3b7d852016-03-15 18:09:17 -0500837 pads = dra72x_core_padconf_array_common;
838 npads = ARRAY_SIZE(dra72x_core_padconf_array_common);
Lokesh Vutla52ac1fe2016-11-23 13:25:25 +0530839 if (board_is_dra71x_evm()) {
840 pads = dra71x_core_padconf_array;
841 npads = ARRAY_SIZE(dra71x_core_padconf_array);
842 iodelay = dra71_iodelay_cfg_array;
843 niodelays = ARRAY_SIZE(dra71_iodelay_cfg_array);
Franklin S Cooper Jr236fca82019-02-27 13:29:36 +0530844 /* If SW8 on the EVM is set to enable NAND then
845 * overwrite the pins used by VOUT3 with NAND.
846 */
847 if (!nand_sw_detect()) {
848 delta_pads = dra71x_nand_padconf_array;
849 delta_npads =
850 ARRAY_SIZE(dra71x_nand_padconf_array);
851 } else {
852 delta_pads = dra71x_vout3_padconf_array;
853 delta_npads =
854 ARRAY_SIZE(dra71x_vout3_padconf_array);
855 }
856
Lokesh Vutla52ac1fe2016-11-23 13:25:25 +0530857 } else if (board_is_dra72x_revc_or_later()) {
Nishanth Menond3b7d852016-03-15 18:09:17 -0500858 delta_pads = dra72x_rgmii_padconf_array_revc;
859 delta_npads =
860 ARRAY_SIZE(dra72x_rgmii_padconf_array_revc);
861 iodelay = dra72_iodelay_cfg_array_revc;
862 niodelays = ARRAY_SIZE(dra72_iodelay_cfg_array_revc);
863 } else {
864 delta_pads = dra72x_rgmii_padconf_array_revb;
865 delta_npads =
866 ARRAY_SIZE(dra72x_rgmii_padconf_array_revb);
867 iodelay = dra72_iodelay_cfg_array_revb;
868 niodelays = ARRAY_SIZE(dra72_iodelay_cfg_array_revb);
869 }
Nishanth Menon6759e7f2015-08-13 09:50:59 -0500870 break;
871 case DRA752_ES1_0:
872 case DRA752_ES1_1:
873 pads = dra74x_core_padconf_array;
874 npads = ARRAY_SIZE(dra74x_core_padconf_array);
875 iodelay = dra742_es1_1_iodelay_cfg_array;
876 niodelays = ARRAY_SIZE(dra742_es1_1_iodelay_cfg_array);
877 break;
Lokesh Vutla69483e62017-12-29 11:47:51 +0530878 case DRA762_ACD_ES1_0:
Lokesh Vutla7e7d4762017-08-21 12:50:56 +0530879 case DRA762_ES1_0:
880 pads = dra76x_core_padconf_array;
881 npads = ARRAY_SIZE(dra76x_core_padconf_array);
882 iodelay = dra76x_es1_0_iodelay_cfg_array;
883 niodelays = ARRAY_SIZE(dra76x_es1_0_iodelay_cfg_array);
884 break;
Nishanth Menon6759e7f2015-08-13 09:50:59 -0500885 default:
886 case DRA752_ES2_0:
Lokesh Vutla69483e62017-12-29 11:47:51 +0530887 case DRA762_ABZ_ES1_0:
Nishanth Menon6759e7f2015-08-13 09:50:59 -0500888 pads = dra74x_core_padconf_array;
889 npads = ARRAY_SIZE(dra74x_core_padconf_array);
890 iodelay = dra742_es2_0_iodelay_cfg_array;
891 niodelays = ARRAY_SIZE(dra742_es2_0_iodelay_cfg_array);
Nishanth Menonbe3a5532015-08-13 09:51:00 -0500892 /* Setup port1 and port2 for rgmii with 'no-id' mode */
893 clrset_spare_register(1, 0, RGMII2_ID_MODE_N_MASK |
894 RGMII1_ID_MODE_N_MASK);
Nishanth Menon6759e7f2015-08-13 09:50:59 -0500895 break;
Nishanth Menon97313b52015-06-04 16:42:39 +0530896 }
Nishanth Menond3b7d852016-03-15 18:09:17 -0500897 /* Setup I/O isolation */
898 ret = __recalibrate_iodelay_start();
899 if (ret)
900 goto err;
901
902 /* Do the muxing here */
903 do_set_mux32((*ctrl)->control_padconf_core_base, pads, npads);
904
905 /* Now do the weird minor deltas that should be safe */
906 if (delta_npads)
907 do_set_mux32((*ctrl)->control_padconf_core_base,
908 delta_pads, delta_npads);
909
Vignesh R0e0835e2017-12-12 17:14:27 +0530910 if (is_dra76x())
911 /* Set mux for MCAN instead of DCAN1 */
912 clrsetbits_le32((*ctrl)->control_core_control_spare_rw,
913 MCAN_SEL_ALT_MASK, MCAN_SEL);
914
Nishanth Menond3b7d852016-03-15 18:09:17 -0500915 /* Setup IOdelay configuration */
916 ret = do_set_iodelay((*ctrl)->iodelay_config_base, iodelay, niodelays);
917err:
918 /* Closeup.. remove isolation */
919 __recalibrate_iodelay_end(ret);
Lokesh Vutla1fd80222015-06-04 16:42:38 +0530920}
921#endif
922
Masahiro Yamada0a780172017-05-09 20:31:39 +0900923#if defined(CONFIG_MMC)
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +0900924int board_mmc_init(struct bd_info *bis)
Lokesh Vutla40700ad2013-02-12 21:29:08 +0000925{
926 omap_mmc_init(0, 0, 0, -1, -1);
927 omap_mmc_init(1, 0, 0, -1, -1);
928 return 0;
929}
Lokesh Vutla8352d272017-08-21 12:50:49 +0530930
931void board_mmc_poweron_ldo(uint voltage)
932{
933 if (board_is_dra71x_evm()) {
934 if (voltage == LDO_VOLT_3V0)
935 voltage = 0x19;
936 else if (voltage == LDO_VOLT_1V8)
937 voltage = 0xa;
938 lp873x_mmc1_poweron_ldo(voltage);
Lokesh Vutla4712cc42017-08-21 12:50:57 +0530939 } else if (board_is_dra76x_evm()) {
940 palmas_mmc1_poweron_ldo(LDO4_VOLTAGE, LDO4_CTRL, voltage);
Lokesh Vutla8352d272017-08-21 12:50:49 +0530941 } else {
Lokesh Vutla22fa8192017-08-21 12:50:50 +0530942 palmas_mmc1_poweron_ldo(LDO1_VOLTAGE, LDO1_CTRL, voltage);
Lokesh Vutla8352d272017-08-21 12:50:49 +0530943 }
944}
Kishon Vijay Abraham I110ed012018-01-30 16:01:52 +0100945
946static const struct mmc_platform_fixups dra7x_es1_1_mmc1_fixups = {
947 .hw_rev = "rev11",
948 .unsupported_caps = MMC_CAP(MMC_HS_200) |
949 MMC_CAP(UHS_SDR104),
950 .max_freq = 96000000,
951};
952
953static const struct mmc_platform_fixups dra7x_es1_1_mmc23_fixups = {
954 .hw_rev = "rev11",
955 .unsupported_caps = MMC_CAP(MMC_HS_200) |
956 MMC_CAP(UHS_SDR104) |
957 MMC_CAP(UHS_SDR50),
958 .max_freq = 48000000,
959};
960
961const struct mmc_platform_fixups *platform_fixups_mmc(uint32_t addr)
962{
963 switch (omap_revision()) {
964 case DRA752_ES1_0:
965 case DRA752_ES1_1:
966 if (addr == OMAP_HSMMC1_BASE)
967 return &dra7x_es1_1_mmc1_fixups;
968 else
969 return &dra7x_es1_1_mmc23_fixups;
970 default:
971 return NULL;
972 }
973}
Lokesh Vutla40700ad2013-02-12 21:29:08 +0000974#endif
Mugunthan V Nab48f782013-07-08 16:04:41 +0530975
Tom Rini560ef452014-04-03 07:52:56 -0400976#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
977int spl_start_uboot(void)
978{
979 /* break into full u-boot on 'c' */
980 if (serial_tstc() && serial_getc() == 'c')
981 return 1;
982
983#ifdef CONFIG_SPL_ENV_SUPPORT
984 env_init();
Simon Glass17539572017-08-03 12:22:07 -0600985 env_load();
Simon Glass22c34c22017-08-03 12:22:13 -0600986 if (env_get_yesno("boot_os") != 1)
Tom Rini560ef452014-04-03 07:52:56 -0400987 return 1;
988#endif
989
990 return 0;
991}
992#endif
993
Lokesh Vutlabe86f0e2014-08-04 19:42:24 +0530994#ifdef CONFIG_BOARD_EARLY_INIT_F
995/* VTT regulator enable */
996static inline void vtt_regulator_enable(void)
997{
998 if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
999 return;
1000
Lokesh Vutla6f1038f2017-08-21 12:50:55 +05301001 /* Do not enable VTT for DRA722 or DRA76x */
1002 if (is_dra72x() || is_dra76x())
Lokesh Vutlabe86f0e2014-08-04 19:42:24 +05301003 return;
1004
1005 /*
1006 * EVM Rev G and later use gpio7_11 for DDR3 termination.
1007 * This is safe enough to do on older revs.
1008 */
1009 gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
1010 gpio_direction_output(GPIO_DDR_VTT_EN, 1);
1011}
1012
1013int board_early_init_f(void)
1014{
1015 vtt_regulator_enable();
1016 return 0;
1017}
1018#endif
Daniel Allred7ceffb22016-05-19 19:10:54 -05001019
1020#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
Masahiro Yamadaf7ed78b2020-06-26 15:13:33 +09001021int ft_board_setup(void *blob, struct bd_info *bd)
Daniel Allred7ceffb22016-05-19 19:10:54 -05001022{
1023 ft_cpu_setup(blob, bd);
1024
1025 return 0;
1026}
1027#endif
Lokesh Vutlaf4de4722016-05-16 10:51:23 +05301028
1029#ifdef CONFIG_SPL_LOAD_FIT
1030int board_fit_config_name_match(const char *name)
1031{
Mugunthan V Nb8c6b022016-09-27 13:01:41 +05301032 if (is_dra72x()) {
Lokesh Vutlaf0d55172016-11-23 13:25:30 +05301033 if (board_is_dra71x_evm()) {
1034 if (!strcmp(name, "dra71-evm"))
1035 return 0;
1036 }else if(board_is_dra72x_revc_or_later()) {
Mugunthan V Nb8c6b022016-09-27 13:01:41 +05301037 if (!strcmp(name, "dra72-evm-revc"))
1038 return 0;
1039 } else if (!strcmp(name, "dra72-evm")) {
1040 return 0;
1041 }
Lokesh Vutla69483e62017-12-29 11:47:51 +05301042 } else if (is_dra76x_acd() && !strcmp(name, "dra76-evm")) {
Lokesh Vutla635848f2017-08-21 12:51:01 +05301043 return 0;
Lokesh Vutla69483e62017-12-29 11:47:51 +05301044 } else if (!is_dra72x() && !is_dra76x_acd() &&
1045 !strcmp(name, "dra7-evm")) {
Lokesh Vutlaf4de4722016-05-16 10:51:23 +05301046 return 0;
Mugunthan V Nb8c6b022016-09-27 13:01:41 +05301047 }
1048
1049 return -1;
Lokesh Vutlaf4de4722016-05-16 10:51:23 +05301050}
1051#endif
Andreas Dannenberg5cf344b2016-06-27 09:19:22 -05001052
Andrew F. Davisd3555832019-02-11 08:00:08 -06001053#if CONFIG_IS_ENABLED(FASTBOOT) && !CONFIG_IS_ENABLED(ENV_IS_NOWHERE)
Roman Kovalivskyi1bb13422020-07-28 23:35:32 +03001054int fastboot_set_reboot_flag(enum fastboot_reboot_reason reason)
Andrew F. Davisd3555832019-02-11 08:00:08 -06001055{
Roman Kovalivskyi1bb13422020-07-28 23:35:32 +03001056 if (reason != FASTBOOT_REBOOT_REASON_BOOTLOADER)
1057 return -ENOTSUPP;
1058
Andrew F. Davisd3555832019-02-11 08:00:08 -06001059 printf("Setting reboot to fastboot flag ...\n");
1060 env_set("dofastboot", "1");
1061 env_save();
1062 return 0;
1063}
1064#endif
1065
Andreas Dannenberg5cf344b2016-06-27 09:19:22 -05001066#ifdef CONFIG_TI_SECURE_DEVICE
1067void board_fit_image_post_process(void **p_image, size_t *p_size)
1068{
1069 secure_boot_verify_image(p_image, p_size);
1070}
Andrew F. Davisd216a4c2016-11-29 16:33:25 -06001071
1072void board_tee_image_process(ulong tee_image, size_t tee_size)
1073{
1074 secure_tee_install((u32)tee_image);
1075}
1076
1077U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Andreas Dannenberg5cf344b2016-06-27 09:19:22 -05001078#endif