blob: d7b9e5af88fc8ed6bf3a2f1a1d8d4a48cf12db87 [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>
13#include <asm/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>
Lokesh Vutla3b34ac12013-07-30 11:36:29 +053016#include <asm/arch/clock.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053017#include <asm/arch/sys_proto.h>
18#include <asm/arch/mux.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053019#include <asm/arch/ddr_defs.h>
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +053020#include <asm/arch/gpio.h>
Lokesh Vutlad3daba12013-12-10 15:02:22 +053021#include <asm/emif.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053022#include "board.h"
Tom Rini7aa55982014-06-23 16:06:29 -040023#include <power/pmic.h>
Tom Rini83bad102014-06-05 11:15:30 -040024#include <power/tps65218.h>
Felipe Balbi403d70a2014-12-22 16:26:17 -060025#include <power/tps62362.h>
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050026#include <miiphy.h>
27#include <cpsw.h>
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +053028#include <linux/usb/gadget.h>
29#include <dwc3-uboot.h>
30#include <dwc3-omap-uboot.h>
31#include <ti-usb-phy-uboot.h>
Lokesh Vutlafbf27282013-07-30 11:36:27 +053032
33DECLARE_GLOBAL_DATA_PTR;
34
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050035static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -050036
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053037/*
38 * Read header information from EEPROM into global structure.
39 */
40static int read_eeprom(struct am43xx_board_id *header)
41{
42 /* Check if baseboard eeprom is available */
43 if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
44 printf("Could not probe the EEPROM at 0x%x\n",
45 CONFIG_SYS_I2C_EEPROM_ADDR);
46 return -ENODEV;
47 }
48
49 /* read the eeprom using i2c */
50 if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header,
51 sizeof(struct am43xx_board_id))) {
52 printf("Could not read the EEPROM\n");
53 return -EIO;
54 }
55
56 if (header->magic != 0xEE3355AA) {
57 /*
58 * read the eeprom using i2c again,
59 * but use only a 1 byte address
60 */
61 if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header,
62 sizeof(struct am43xx_board_id))) {
63 printf("Could not read the EEPROM at 0x%x\n",
64 CONFIG_SYS_I2C_EEPROM_ADDR);
65 return -EIO;
66 }
67
68 if (header->magic != 0xEE3355AA) {
69 printf("Incorrect magic number (0x%x) in EEPROM\n",
70 header->magic);
71 return -EINVAL;
72 }
73 }
74
75 strncpy(am43xx_board_name, (char *)header->name, sizeof(header->name));
76 am43xx_board_name[sizeof(header->name)] = 0;
77
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -050078 strncpy(am43xx_board_rev, (char *)header->version, sizeof(header->version));
79 am43xx_board_rev[sizeof(header->version)] = 0;
80
Sekhar Nori9f1a8cd2013-12-10 15:02:15 +053081 return 0;
82}
83
Sourav Poddar7a5f71b2014-05-19 16:53:37 -040084#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Lokesh Vutlafbf27282013-07-30 11:36:27 +053085
Lokesh Vutlacf04d032013-12-10 15:02:20 +053086#define NUM_OPPS 6
87
88const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
89 { /* 19.2 MHz */
James Doublesine2a62072014-12-22 16:26:10 -060090 {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053091 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
James Doublesine2a62072014-12-22 16:26:10 -060092 {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */
93 {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */
94 {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */
95 {625, 11, 1, -1, -1, -1, -1} /* OPP NT */
Lokesh Vutlacf04d032013-12-10 15:02:20 +053096 },
97 { /* 24 MHz */
98 {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */
99 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
100 {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */
101 {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */
102 {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */
103 {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */
104 },
105 { /* 25 MHz */
106 {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */
107 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
108 {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */
109 {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */
110 {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */
111 {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */
112 },
113 { /* 26 MHz */
114 {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */
115 {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */
116 {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */
117 {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */
118 {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */
119 {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */
120 },
121};
122
123const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -0600124 {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530125 {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */
126 {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */
127 {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */
128};
129
130const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
James Doublesine2a62072014-12-22 16:26:10 -0600131 {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */
132 {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */
James Doublesinc87b6a92014-12-22 16:26:12 -0600133 {384, 9, 5, -1, -1, -1, -1}, /* 25 MHz */
James Doublesine2a62072014-12-22 16:26:10 -0600134 {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530135};
136
James Doublesine2a62072014-12-22 16:26:10 -0600137const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
138 {665, 47, 1, -1, 4, -1, -1}, /*19.2*/
139 {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
140 {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
141 {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */
142};
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530143
144const struct dpll_params gp_evm_dpll_ddr = {
James Doublesine2a62072014-12-22 16:26:10 -0600145 50, 2, 1, -1, 2, -1, -1};
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530146
Felipe Balbi403d70a2014-12-22 16:26:17 -0600147static const struct dpll_params idk_dpll_ddr = {
148 400, 23, 1, -1, 2, -1, -1
149};
150
Tom Rini7c352cd2015-06-05 15:51:11 +0530151static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
152 0x00500050,
153 0x00350035,
154 0x00350035,
155 0x00350035,
156 0x00350035,
157 0x00350035,
158 0x00000000,
159 0x00000000,
160 0x00000000,
161 0x00000000,
162 0x00000000,
163 0x00000000,
164 0x00000000,
165 0x00000000,
166 0x00000000,
167 0x00000000,
168 0x00000000,
169 0x00000000,
170 0x40001000,
171 0x08102040
172};
173
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530174const struct ctrl_ioregs ioregs_lpddr2 = {
175 .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE,
176 .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
177 .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
178 .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
179 .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE,
180 .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
181 .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE,
182 .emif_sdram_config_ext = 0x1,
183};
184
185const struct emif_regs emif_regs_lpddr2 = {
186 .sdram_config = 0x808012BA,
187 .ref_ctrl = 0x0000040D,
188 .sdram_tim1 = 0xEA86B411,
189 .sdram_tim2 = 0x103A094A,
190 .sdram_tim3 = 0x0F6BA37F,
191 .read_idle_ctrl = 0x00050000,
192 .zq_config = 0x50074BE4,
193 .temp_alert_config = 0x0,
194 .emif_rd_wr_lvl_rmp_win = 0x0,
195 .emif_rd_wr_lvl_rmp_ctl = 0x0,
196 .emif_rd_wr_lvl_ctl = 0x0,
James Doublesine2a62072014-12-22 16:26:10 -0600197 .emif_ddr_phy_ctlr_1 = 0x0E284006,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500198 .emif_rd_wr_exec_thresh = 0x80000405,
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530199 .emif_ddr_ext_phy_ctrl_1 = 0x04010040,
200 .emif_ddr_ext_phy_ctrl_2 = 0x00500050,
201 .emif_ddr_ext_phy_ctrl_3 = 0x00500050,
202 .emif_ddr_ext_phy_ctrl_4 = 0x00500050,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500203 .emif_ddr_ext_phy_ctrl_5 = 0x00500050,
204 .emif_prio_class_serv_map = 0x80000001,
205 .emif_connect_id_serv_1_map = 0x80000094,
206 .emif_connect_id_serv_2_map = 0x00000000,
207 .emif_cos_config = 0x000FFFFF
Lokesh Vutlad3daba12013-12-10 15:02:22 +0530208};
209
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530210const struct ctrl_ioregs ioregs_ddr3 = {
211 .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE,
212 .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
213 .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
214 .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE,
215 .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE,
216 .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE,
217 .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE,
James Doublesine2a62072014-12-22 16:26:10 -0600218 .emif_sdram_config_ext = 0xc163,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530219};
220
221const struct emif_regs ddr3_emif_regs_400Mhz = {
222 .sdram_config = 0x638413B2,
223 .ref_ctrl = 0x00000C30,
224 .sdram_tim1 = 0xEAAAD4DB,
225 .sdram_tim2 = 0x266B7FDA,
226 .sdram_tim3 = 0x107F8678,
227 .read_idle_ctrl = 0x00050000,
228 .zq_config = 0x50074BE4,
229 .temp_alert_config = 0x0,
Lokesh Vutlae27f2dd2014-02-18 07:31:57 -0500230 .emif_ddr_phy_ctlr_1 = 0x0E004008,
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530231 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
232 .emif_ddr_ext_phy_ctrl_2 = 0x00400040,
233 .emif_ddr_ext_phy_ctrl_3 = 0x00400040,
234 .emif_ddr_ext_phy_ctrl_4 = 0x00400040,
235 .emif_ddr_ext_phy_ctrl_5 = 0x00400040,
236 .emif_rd_wr_lvl_rmp_win = 0x0,
237 .emif_rd_wr_lvl_rmp_ctl = 0x0,
238 .emif_rd_wr_lvl_ctl = 0x0,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500239 .emif_rd_wr_exec_thresh = 0x80000405,
240 .emif_prio_class_serv_map = 0x80000001,
241 .emif_connect_id_serv_1_map = 0x80000094,
242 .emif_connect_id_serv_2_map = 0x00000000,
243 .emif_cos_config = 0x000FFFFF
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530244};
245
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500246/* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
247const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
248 .sdram_config = 0x638413B2,
249 .ref_ctrl = 0x00000C30,
250 .sdram_tim1 = 0xEAAAD4DB,
251 .sdram_tim2 = 0x266B7FDA,
252 .sdram_tim3 = 0x107F8678,
253 .read_idle_ctrl = 0x00050000,
254 .zq_config = 0x50074BE4,
255 .temp_alert_config = 0x0,
256 .emif_ddr_phy_ctlr_1 = 0x0E004008,
257 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
258 .emif_ddr_ext_phy_ctrl_2 = 0x00000065,
259 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
260 .emif_ddr_ext_phy_ctrl_4 = 0x000000B5,
261 .emif_ddr_ext_phy_ctrl_5 = 0x000000E5,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500262 .emif_rd_wr_exec_thresh = 0x80000405,
263 .emif_prio_class_serv_map = 0x80000001,
264 .emif_connect_id_serv_1_map = 0x80000094,
265 .emif_connect_id_serv_2_map = 0x00000000,
266 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500267};
268
269/* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
270const struct emif_regs ddr3_emif_regs_400Mhz_production = {
271 .sdram_config = 0x638413B2,
272 .ref_ctrl = 0x00000C30,
273 .sdram_tim1 = 0xEAAAD4DB,
274 .sdram_tim2 = 0x266B7FDA,
275 .sdram_tim3 = 0x107F8678,
276 .read_idle_ctrl = 0x00050000,
277 .zq_config = 0x50074BE4,
278 .temp_alert_config = 0x0,
279 .emif_ddr_phy_ctlr_1 = 0x0E004008,
280 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
281 .emif_ddr_ext_phy_ctrl_2 = 0x00000066,
282 .emif_ddr_ext_phy_ctrl_3 = 0x00000091,
283 .emif_ddr_ext_phy_ctrl_4 = 0x000000B9,
284 .emif_ddr_ext_phy_ctrl_5 = 0x000000E6,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500285 .emif_rd_wr_exec_thresh = 0x80000405,
286 .emif_prio_class_serv_map = 0x80000001,
287 .emif_connect_id_serv_1_map = 0x80000094,
288 .emif_connect_id_serv_2_map = 0x00000000,
289 .emif_cos_config = 0x000FFFFF
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500290};
291
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500292static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
293 .sdram_config = 0x638413b2,
294 .sdram_config2 = 0x00000000,
295 .ref_ctrl = 0x00000c30,
296 .sdram_tim1 = 0xeaaad4db,
297 .sdram_tim2 = 0x266b7fda,
298 .sdram_tim3 = 0x107f8678,
299 .read_idle_ctrl = 0x00050000,
300 .zq_config = 0x50074be4,
301 .temp_alert_config = 0x0,
302 .emif_ddr_phy_ctlr_1 = 0x0e084008,
303 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
304 .emif_ddr_ext_phy_ctrl_2 = 0x89,
305 .emif_ddr_ext_phy_ctrl_3 = 0x90,
306 .emif_ddr_ext_phy_ctrl_4 = 0x8e,
307 .emif_ddr_ext_phy_ctrl_5 = 0x8d,
308 .emif_rd_wr_lvl_rmp_win = 0x0,
309 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
310 .emif_rd_wr_lvl_ctl = 0x00000000,
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500311 .emif_rd_wr_exec_thresh = 0x80000000,
312 .emif_prio_class_serv_map = 0x80000001,
313 .emif_connect_id_serv_1_map = 0x80000094,
314 .emif_connect_id_serv_2_map = 0x00000000,
315 .emif_cos_config = 0x000FFFFF
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500316};
317
Felipe Balbi403d70a2014-12-22 16:26:17 -0600318static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
319 .sdram_config = 0x61a11b32,
320 .sdram_config2 = 0x00000000,
321 .ref_ctrl = 0x00000c30,
322 .sdram_tim1 = 0xeaaad4db,
323 .sdram_tim2 = 0x266b7fda,
324 .sdram_tim3 = 0x107f8678,
325 .read_idle_ctrl = 0x00050000,
326 .zq_config = 0x50074be4,
327 .temp_alert_config = 0x00000000,
328 .emif_ddr_phy_ctlr_1 = 0x00008009,
329 .emif_ddr_ext_phy_ctrl_1 = 0x08020080,
330 .emif_ddr_ext_phy_ctrl_2 = 0x00000040,
331 .emif_ddr_ext_phy_ctrl_3 = 0x0000003e,
332 .emif_ddr_ext_phy_ctrl_4 = 0x00000051,
333 .emif_ddr_ext_phy_ctrl_5 = 0x00000051,
334 .emif_rd_wr_lvl_rmp_win = 0x00000000,
335 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
336 .emif_rd_wr_lvl_ctl = 0x00000000,
337 .emif_rd_wr_exec_thresh = 0x00000405,
338 .emif_prio_class_serv_map = 0x00000000,
339 .emif_connect_id_serv_1_map = 0x00000000,
340 .emif_connect_id_serv_2_map = 0x00000000,
341 .emif_cos_config = 0x00ffffff
342};
343
Tom Rini7c352cd2015-06-05 15:51:11 +0530344void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
345{
346 if (board_is_eposevm()) {
347 *regs = ext_phy_ctrl_const_base_lpddr2;
348 *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
349 }
350
351 return;
352}
353
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530354/*
355 * get_sys_clk_index : returns the index of the sys_clk read from
356 * ctrl status register. This value is either
357 * read from efuse or sysboot pins.
358 */
359static u32 get_sys_clk_index(void)
360{
361 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
362 u32 ind = readl(&ctrl->statusreg), src;
363
364 src = (ind & CTRL_CRYSTAL_FREQ_SRC_MASK) >> CTRL_CRYSTAL_FREQ_SRC_SHIFT;
365 if (src == CTRL_CRYSTAL_FREQ_SRC_EFUSE) /* Value read from EFUSE */
366 return ((ind & CTRL_CRYSTAL_FREQ_SELECTION_MASK) >>
367 CTRL_CRYSTAL_FREQ_SELECTION_SHIFT);
368 else /* Value read from SYS BOOT pins */
369 return ((ind & CTRL_SYSBOOT_15_14_MASK) >>
370 CTRL_SYSBOOT_15_14_SHIFT);
371}
372
James Doublesine2a62072014-12-22 16:26:10 -0600373const struct dpll_params *get_dpll_ddr_params(void)
374{
375 int ind = get_sys_clk_index();
376
377 if (board_is_eposevm())
378 return &epos_evm_dpll_ddr[ind];
379 else if (board_is_gpevm() || board_is_sk())
380 return &gp_evm_dpll_ddr;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600381 else if (board_is_idk())
382 return &idk_dpll_ddr;
James Doublesine2a62072014-12-22 16:26:10 -0600383
384 printf(" Board '%s' not supported\n", am43xx_board_name);
385 return NULL;
386}
387
388
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530389/*
390 * get_opp_offset:
391 * Returns the index for safest OPP of the device to boot.
392 * max_off: Index of the MAX OPP in DEV ATTRIBUTE register.
393 * min_off: Index of the MIN OPP in DEV ATTRIBUTE register.
394 * This data is read from dev_attribute register which is e-fused.
395 * A'1' in bit indicates OPP disabled and not available, a '0' indicates
396 * OPP available. Lowest OPP starts with min_off. So returning the
397 * bit with rightmost '0'.
398 */
399static int get_opp_offset(int max_off, int min_off)
400{
401 struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
Tom Rinifeca6e62014-06-05 11:15:27 -0400402 int opp, offset, i;
403
404 /* Bits 0:11 are defined to be the MPU_MAX_FREQ */
405 opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
Lokesh Vutlacf04d032013-12-10 15:02:20 +0530406
407 for (i = max_off; i >= min_off; i--) {
408 offset = opp & (1 << i);
409 if (!offset)
410 return i;
411 }
412
413 return min_off;
414}
415
416const struct dpll_params *get_dpll_mpu_params(void)
417{
418 int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
419 u32 ind = get_sys_clk_index();
420
421 return &dpll_mpu[ind][opp];
422}
423
424const struct dpll_params *get_dpll_core_params(void)
425{
426 int ind = get_sys_clk_index();
427
428 return &dpll_core[ind];
429}
430
431const struct dpll_params *get_dpll_per_params(void)
432{
433 int ind = get_sys_clk_index();
434
435 return &dpll_per[ind];
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530436}
437
Felipe Balbi403d70a2014-12-22 16:26:17 -0600438void scale_vcores_generic(u32 m)
Tom Rini83bad102014-06-05 11:15:30 -0400439{
Tom Rini83bad102014-06-05 11:15:30 -0400440 int mpu_vdd;
Tom Rini83bad102014-06-05 11:15:30 -0400441
442 if (i2c_probe(TPS65218_CHIP_PM))
443 return;
444
Felipe Balbi403d70a2014-12-22 16:26:17 -0600445 switch (m) {
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600446 case 1000:
Tom Rini83bad102014-06-05 11:15:30 -0400447 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600448 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600449 case 800:
450 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
451 break;
452 case 720:
453 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
454 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600455 case 600:
Tom Rini83bad102014-06-05 11:15:30 -0400456 mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600457 break;
Felipe Balbid5c082a2014-12-22 16:26:15 -0600458 case 300:
459 mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
460 break;
Felipe Balbi068ea0a2014-12-22 16:26:13 -0600461 default:
Tom Rini83bad102014-06-05 11:15:30 -0400462 puts("Unknown MPU clock, not scaling\n");
463 return;
464 }
465
466 /* Set DCDC1 (CORE) voltage to 1.1V */
467 if (tps65218_voltage_update(TPS65218_DCDC1,
468 TPS65218_DCDC_VOLT_SEL_1100MV)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600469 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400470 return;
471 }
472
473 /* Set DCDC2 (MPU) voltage */
474 if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
Felipe Balbi403d70a2014-12-22 16:26:17 -0600475 printf("%s failure\n", __func__);
Tom Rini83bad102014-06-05 11:15:30 -0400476 return;
477 }
478}
479
Felipe Balbi403d70a2014-12-22 16:26:17 -0600480void scale_vcores_idk(u32 m)
481{
482 int mpu_vdd;
483
484 if (i2c_probe(TPS62362_I2C_ADDR))
485 return;
486
487 switch (m) {
488 case 1000:
489 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
490 break;
491 case 800:
492 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
493 break;
494 case 720:
495 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
496 break;
497 case 600:
498 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
499 break;
500 case 300:
501 mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
502 break;
503 default:
504 puts("Unknown MPU clock, not scaling\n");
505 return;
506 }
507
508 /* Set VDD_MPU voltage */
509 if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
510 printf("%s failure\n", __func__);
511 return;
512 }
513}
514
515void scale_vcores(void)
516{
517 const struct dpll_params *mpu_params;
518 struct am43xx_board_id header;
519
520 enable_i2c0_pin_mux();
521 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
522 if (read_eeprom(&header) < 0)
523 puts("Could not get board ID.\n");
524
525 /* Get the frequency */
526 mpu_params = get_dpll_mpu_params();
527
528 if (board_is_idk())
529 scale_vcores_idk(mpu_params->m);
530 else
531 scale_vcores_generic(mpu_params->m);
532}
533
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530534void set_uart_mux_conf(void)
535{
536 enable_uart0_pin_mux();
537}
538
539void set_mux_conf_regs(void)
540{
541 enable_board_pin_mux();
542}
543
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530544static void enable_vtt_regulator(void)
545{
546 u32 temp;
547
548 /* enable module */
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500549 writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530550
Dave Gerlachcd8341b2014-02-10 11:41:49 -0500551 /* enable output for GPIO5_7 */
552 writel(GPIO_SETDATAOUT(7),
553 AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
554 temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
555 temp = temp & ~(GPIO_OE_ENABLE(7));
556 writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530557}
558
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530559void sdram_init(void)
560{
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530561 /*
562 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
563 * GP EMV has 1GB DDR3 connected to EMIF
564 * along with VTT regulator.
565 */
566 if (board_is_eposevm()) {
567 config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
Franklin S. Cooper Jr2c952112014-06-27 13:31:14 -0500568 } else if (board_is_evm_14_or_later()) {
569 enable_vtt_regulator();
570 config_ddr(0, &ioregs_ddr3, NULL, NULL,
571 &ddr3_emif_regs_400Mhz_production, 0);
572 } else if (board_is_evm_12_or_later()) {
573 enable_vtt_regulator();
574 config_ddr(0, &ioregs_ddr3, NULL, NULL,
575 &ddr3_emif_regs_400Mhz_beta, 0);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530576 } else if (board_is_gpevm()) {
577 enable_vtt_regulator();
578 config_ddr(0, &ioregs_ddr3, NULL, NULL,
579 &ddr3_emif_regs_400Mhz, 0);
Felipe Balbi9cb9f332014-06-10 15:01:20 -0500580 } else if (board_is_sk()) {
581 config_ddr(400, &ioregs_ddr3, NULL, NULL,
582 &ddr3_sk_emif_regs_400Mhz, 0);
Felipe Balbi403d70a2014-12-22 16:26:17 -0600583 } else if (board_is_idk()) {
584 config_ddr(400, &ioregs_ddr3, NULL, NULL,
585 &ddr3_idk_emif_regs_400Mhz, 0);
Lokesh Vutlab5e01ee2013-12-10 15:02:23 +0530586 }
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530587}
588#endif
589
Tom Rini7aa55982014-06-23 16:06:29 -0400590/* setup board specific PMIC */
591int power_init_board(void)
592{
593 struct pmic *p;
594
Felipe Balbi403d70a2014-12-22 16:26:17 -0600595 if (board_is_idk()) {
596 power_tps62362_init(I2C_PMIC);
597 p = pmic_get("TPS62362");
598 if (p && !pmic_probe(p))
599 puts("PMIC: TPS62362\n");
600 } else {
601 power_tps65218_init(I2C_PMIC);
602 p = pmic_get("TPS65218_PMIC");
603 if (p && !pmic_probe(p))
604 puts("PMIC: TPS65218\n");
605 }
Tom Rini7aa55982014-06-23 16:06:29 -0400606
607 return 0;
608}
609
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530610int board_init(void)
611{
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500612 struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
613 u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
614 modena_init0_bw_integer, modena_init0_watermark_0;
615
Lokesh Vutla369cbe12013-12-10 15:02:12 +0530616 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon guptae53ad4b2014-07-22 16:03:22 +0530617 gpmc_init();
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530618
Cooper Jr., Franklin8038b492014-06-27 13:31:15 -0500619 /* Clear all important bits for DSS errata that may need to be tweaked*/
620 mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
621 MREQPRIO_0_SAB_INIT0_MASK;
622
623 mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
624
625 modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
626 BW_LIMITER_BW_FRAC_MASK;
627
628 modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
629 BW_LIMITER_BW_INT_MASK;
630
631 modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
632 BW_LIMITER_BW_WATERMARK_MASK;
633
634 /* Setting MReq Priority of the DSS*/
635 mreqprio_0 |= 0x77;
636
637 /*
638 * Set L3 Fast Configuration Register
639 * Limiting bandwith for ARM core to 700 MBPS
640 */
641 modena_init0_bw_fractional |= 0x10;
642 modena_init0_bw_integer |= 0x3;
643
644 writel(mreqprio_0, &cdev->mreqprio_0);
645 writel(mreqprio_1, &cdev->mreqprio_1);
646
647 writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
648 writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
649 writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
650
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530651 return 0;
652}
653
654#ifdef CONFIG_BOARD_LATE_INIT
655int board_late_init(void)
656{
Sekhar Norif4af1632013-12-10 15:02:16 +0530657#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
658 char safe_string[HDR_NAME_LEN + 1];
659 struct am43xx_board_id header;
660
661 if (read_eeprom(&header) < 0)
662 puts("Could not get board ID.\n");
663
664 /* Now set variables based on the header. */
665 strncpy(safe_string, (char *)header.name, sizeof(header.name));
666 safe_string[sizeof(header.name)] = 0;
667 setenv("board_name", safe_string);
668
669 strncpy(safe_string, (char *)header.version, sizeof(header.version));
670 safe_string[sizeof(header.version)] = 0;
671 setenv("board_rev", safe_string);
672#endif
Lokesh Vutlafbf27282013-07-30 11:36:27 +0530673 return 0;
674}
675#endif
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500676
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530677#ifdef CONFIG_USB_DWC3
678static struct dwc3_device usb_otg_ss1 = {
679 .maximum_speed = USB_SPEED_HIGH,
680 .base = USB_OTG_SS1_BASE,
681 .tx_fifo_resize = false,
682 .index = 0,
683};
684
685static struct dwc3_omap_device usb_otg_ss1_glue = {
686 .base = (void *)USB_OTG_SS1_GLUE_BASE,
687 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
688 .vbus_id_status = OMAP_DWC3_VBUS_VALID,
689 .index = 0,
690};
691
692static struct ti_usb_phy_device usb_phy1_device = {
693 .usb2_phy_power = (void *)USB2_PHY1_POWER,
694 .index = 0,
695};
696
697static struct dwc3_device usb_otg_ss2 = {
698 .maximum_speed = USB_SPEED_HIGH,
699 .base = USB_OTG_SS2_BASE,
700 .tx_fifo_resize = false,
701 .index = 1,
702};
703
704static struct dwc3_omap_device usb_otg_ss2_glue = {
705 .base = (void *)USB_OTG_SS2_GLUE_BASE,
706 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
707 .vbus_id_status = OMAP_DWC3_VBUS_VALID,
708 .index = 1,
709};
710
711static struct ti_usb_phy_device usb_phy2_device = {
712 .usb2_phy_power = (void *)USB2_PHY2_POWER,
713 .index = 1,
714};
715
716int board_usb_init(int index, enum usb_init_type init)
717{
718 switch (index) {
719 case 0:
720 if (init == USB_INIT_DEVICE) {
721 usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
722 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
723 } else {
724 usb_otg_ss1.dr_mode = USB_DR_MODE_HOST;
725 usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
726 }
727
728 dwc3_omap_uboot_init(&usb_otg_ss1_glue);
729 ti_usb_phy_uboot_init(&usb_phy1_device);
730 dwc3_uboot_init(&usb_otg_ss1);
731 break;
732 case 1:
733 if (init == USB_INIT_DEVICE) {
734 usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
735 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
736 } else {
737 usb_otg_ss2.dr_mode = USB_DR_MODE_HOST;
738 usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
739 }
740
741 ti_usb_phy_uboot_init(&usb_phy2_device);
742 dwc3_omap_uboot_init(&usb_otg_ss2_glue);
743 dwc3_uboot_init(&usb_otg_ss2);
744 break;
745 default:
746 printf("Invalid Controller Index\n");
747 }
748
749 return 0;
750}
751
752int board_usb_cleanup(int index, enum usb_init_type init)
753{
754 switch (index) {
755 case 0:
756 case 1:
757 ti_usb_phy_uboot_exit(index);
758 dwc3_uboot_exit(index);
759 dwc3_omap_uboot_exit(index);
760 break;
761 default:
762 printf("Invalid Controller Index\n");
763 }
764
765 return 0;
766}
767
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530768int usb_gadget_handle_interrupts(int index)
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530769{
770 u32 status;
771
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530772 status = dwc3_omap_uboot_interrupt_status(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530773 if (status)
Kishon Vijay Abraham I2d48aa62015-02-23 18:40:23 +0530774 dwc3_uboot_handle_interrupt(index);
Kishon Vijay Abraham I9f81eb72015-02-23 18:40:21 +0530775
776 return 0;
777}
778#endif
779
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500780#ifdef CONFIG_DRIVER_TI_CPSW
781
782static void cpsw_control(int enabled)
783{
784 /* Additional controls can be added here */
785 return;
786}
787
788static struct cpsw_slave_data cpsw_slaves[] = {
789 {
790 .slave_reg_ofs = 0x208,
791 .sliver_reg_ofs = 0xd80,
792 .phy_addr = 16,
793 },
794 {
795 .slave_reg_ofs = 0x308,
796 .sliver_reg_ofs = 0xdc0,
797 .phy_addr = 1,
798 },
799};
800
801static struct cpsw_platform_data cpsw_data = {
802 .mdio_base = CPSW_MDIO_BASE,
803 .cpsw_base = CPSW_BASE,
804 .mdio_div = 0xff,
805 .channels = 8,
806 .cpdma_reg_ofs = 0x800,
807 .slaves = 1,
808 .slave_data = cpsw_slaves,
809 .ale_reg_ofs = 0xd00,
810 .ale_entries = 1024,
811 .host_port_reg_ofs = 0x108,
812 .hw_stats_reg_ofs = 0x900,
813 .bd_ram_ofs = 0x2000,
814 .mac_control = (1 << 5),
815 .control = cpsw_control,
816 .host_port_num = 0,
817 .version = CPSW_CTRL_VERSION_2,
818};
819
820int board_eth_init(bd_t *bis)
821{
822 int rv;
823 uint8_t mac_addr[6];
824 uint32_t mac_hi, mac_lo;
825
826 /* try reading mac address from efuse */
827 mac_lo = readl(&cdev->macid0l);
828 mac_hi = readl(&cdev->macid0h);
829 mac_addr[0] = mac_hi & 0xFF;
830 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
831 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
832 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
833 mac_addr[4] = mac_lo & 0xFF;
834 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
835
836 if (!getenv("ethaddr")) {
837 puts("<ethaddr> not set. Validating first E-fuse MAC\n");
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500838 if (is_valid_ethaddr(mac_addr))
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500839 eth_setenv_enetaddr("ethaddr", mac_addr);
840 }
841
842 mac_lo = readl(&cdev->macid1l);
843 mac_hi = readl(&cdev->macid1h);
844 mac_addr[0] = mac_hi & 0xFF;
845 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
846 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
847 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
848 mac_addr[4] = mac_lo & 0xFF;
849 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
850
851 if (!getenv("eth1addr")) {
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500852 if (is_valid_ethaddr(mac_addr))
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500853 eth_setenv_enetaddr("eth1addr", mac_addr);
854 }
855
856 if (board_is_eposevm()) {
857 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
858 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
859 cpsw_slaves[0].phy_addr = 16;
Felipe Balbi619ce622014-06-10 15:01:21 -0500860 } else if (board_is_sk()) {
861 writel(RGMII_MODE_ENABLE, &cdev->miisel);
862 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
863 cpsw_slaves[0].phy_addr = 4;
864 cpsw_slaves[1].phy_addr = 5;
Felipe Balbi403d70a2014-12-22 16:26:17 -0600865 } else if (board_is_idk()) {
866 writel(RGMII_MODE_ENABLE, &cdev->miisel);
867 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
868 cpsw_slaves[0].phy_addr = 0;
Mugunthan V N4cdd7fd2014-02-18 07:31:54 -0500869 } else {
870 writel(RGMII_MODE_ENABLE, &cdev->miisel);
871 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
872 cpsw_slaves[0].phy_addr = 0;
873 }
874
875 rv = cpsw_register(&cpsw_data);
876 if (rv < 0)
877 printf("Error %d registering CPSW switch\n", rv);
878
879 return rv;
880}
881#endif