blob: 56f4984f479cafb90deeb74eb11ca540a5bc4b2d [file] [log] [blame]
Peter Korsgaarde3634262012-10-18 01:21:09 +00001/*
2 * board.c
3 *
4 * Board functions for TI AM335X based boards
5 *
6 * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
7 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02008 * SPDX-License-Identifier: GPL-2.0+
Peter Korsgaarde3634262012-10-18 01:21:09 +00009 */
10
11#include <common.h>
12#include <errno.h>
13#include <spl.h>
Lokesh Vutla3d163892016-05-16 11:47:29 +053014#include <serial.h>
Peter Korsgaarde3634262012-10-18 01:21:09 +000015#include <asm/arch/cpu.h>
16#include <asm/arch/hardware.h>
17#include <asm/arch/omap.h>
18#include <asm/arch/ddr_defs.h>
19#include <asm/arch/clock.h>
Lokesh Vutla97f3a172016-05-16 11:47:26 +053020#include <asm/arch/clk_synthesizer.h>
Peter Korsgaarde3634262012-10-18 01:21:09 +000021#include <asm/arch/gpio.h>
22#include <asm/arch/mmc_host_def.h>
23#include <asm/arch/sys_proto.h>
Steve Kipiszcd8845d2013-07-18 15:13:03 -040024#include <asm/arch/mem.h>
Peter Korsgaarde3634262012-10-18 01:21:09 +000025#include <asm/io.h>
26#include <asm/emif.h>
27#include <asm/gpio.h>
28#include <i2c.h>
29#include <miiphy.h>
30#include <cpsw.h>
Tom Rini97210272013-08-30 16:28:46 -040031#include <power/tps65217.h>
32#include <power/tps65910.h>
Tom Rini68439182013-10-01 12:32:04 -040033#include <environment.h>
34#include <watchdog.h>
Tom Riniba9a6702014-03-28 12:03:38 -040035#include <environment.h>
Nishanth Menon770e68c2016-02-24 12:30:55 -060036#include "../common/board_detect.h"
Peter Korsgaarde3634262012-10-18 01:21:09 +000037#include "board.h"
38
39DECLARE_GLOBAL_DATA_PTR;
40
Peter Korsgaarde3634262012-10-18 01:21:09 +000041/* GPIO that controls power to DDR on EVM-SK */
Lokesh Vutla97f3a172016-05-16 11:47:26 +053042#define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
43#define GPIO_DDR_VTT_EN GPIO_TO_PIN(0, 7)
44#define ICE_GPIO_DDR_VTT_EN GPIO_TO_PIN(0, 18)
45#define GPIO_PR1_MII_CTRL GPIO_TO_PIN(3, 4)
46#define GPIO_MUX_MII_CTRL GPIO_TO_PIN(3, 10)
47#define GPIO_FET_SWITCH_CTRL GPIO_TO_PIN(0, 7)
48#define GPIO_PHY_RESET GPIO_TO_PIN(2, 5)
Peter Korsgaarde3634262012-10-18 01:21:09 +000049
Mugunthan V Nbd83e3d2015-09-07 14:22:18 +053050#if defined(CONFIG_SPL_BUILD) || \
51 (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_DM_ETH))
Peter Korsgaarde3634262012-10-18 01:21:09 +000052static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
Mugunthan V Nbd83e3d2015-09-07 14:22:18 +053053#endif
Peter Korsgaarde3634262012-10-18 01:21:09 +000054
Peter Korsgaarde3634262012-10-18 01:21:09 +000055/*
56 * Read header information from EEPROM into global structure.
57 */
Nishanth Menon770e68c2016-02-24 12:30:55 -060058static inline int __maybe_unused read_eeprom(void)
Peter Korsgaarde3634262012-10-18 01:21:09 +000059{
Nishanth Menon770e68c2016-02-24 12:30:55 -060060 return ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR);
Peter Korsgaarde3634262012-10-18 01:21:09 +000061}
62
Lokesh Vutla3d163892016-05-16 11:47:29 +053063#ifndef CONFIG_DM_SERIAL
64struct serial_device *default_serial_console(void)
65{
66 if (board_is_icev2())
67 return &eserial4_device;
68 else
69 return &eserial1_device;
70}
71#endif
72
Tom Rinid0e6d342014-04-09 08:25:57 -040073#ifndef CONFIG_SKIP_LOWLEVEL_INIT
Peter Korsgaardc00f69d2012-10-18 01:21:12 +000074static const struct ddr_data ddr2_data = {
Tom Rinic4f80f52014-07-07 21:40:16 -040075 .datardsratio0 = MT47H128M16RT25E_RD_DQS,
76 .datafwsratio0 = MT47H128M16RT25E_PHY_FIFO_WE,
77 .datawrsratio0 = MT47H128M16RT25E_PHY_WR_DATA,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +000078};
79
80static const struct cmd_control ddr2_cmd_ctrl_data = {
Peter Korsgaardc7d35be2012-10-18 01:21:13 +000081 .cmd0csratio = MT47H128M16RT25E_RATIO,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +000082
Peter Korsgaardc7d35be2012-10-18 01:21:13 +000083 .cmd1csratio = MT47H128M16RT25E_RATIO,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +000084
Peter Korsgaardc7d35be2012-10-18 01:21:13 +000085 .cmd2csratio = MT47H128M16RT25E_RATIO,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +000086};
87
88static const struct emif_regs ddr2_emif_reg_data = {
Peter Korsgaardc7d35be2012-10-18 01:21:13 +000089 .sdram_config = MT47H128M16RT25E_EMIF_SDCFG,
90 .ref_ctrl = MT47H128M16RT25E_EMIF_SDREF,
91 .sdram_tim1 = MT47H128M16RT25E_EMIF_TIM1,
92 .sdram_tim2 = MT47H128M16RT25E_EMIF_TIM2,
93 .sdram_tim3 = MT47H128M16RT25E_EMIF_TIM3,
94 .emif_ddr_phy_ctlr_1 = MT47H128M16RT25E_EMIF_READ_LATENCY,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +000095};
96
97static const struct ddr_data ddr3_data = {
Peter Korsgaardc7d35be2012-10-18 01:21:13 +000098 .datardsratio0 = MT41J128MJT125_RD_DQS,
99 .datawdsratio0 = MT41J128MJT125_WR_DQS,
100 .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE,
101 .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +0000102};
103
Tom Rinic7ba18a2013-03-21 04:30:02 +0000104static const struct ddr_data ddr3_beagleblack_data = {
105 .datardsratio0 = MT41K256M16HA125E_RD_DQS,
106 .datawdsratio0 = MT41K256M16HA125E_WR_DQS,
107 .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
108 .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
Tom Rinic7ba18a2013-03-21 04:30:02 +0000109};
110
Jeff Lance13526f72013-01-14 05:32:20 +0000111static const struct ddr_data ddr3_evm_data = {
112 .datardsratio0 = MT41J512M8RH125_RD_DQS,
113 .datawdsratio0 = MT41J512M8RH125_WR_DQS,
114 .datafwsratio0 = MT41J512M8RH125_PHY_FIFO_WE,
115 .datawrsratio0 = MT41J512M8RH125_PHY_WR_DATA,
Jeff Lance13526f72013-01-14 05:32:20 +0000116};
117
Lokesh Vutlad8ff4fd2016-05-16 11:47:24 +0530118static const struct ddr_data ddr3_icev2_data = {
119 .datardsratio0 = MT41J128MJT125_RD_DQS_400MHz,
120 .datawdsratio0 = MT41J128MJT125_WR_DQS_400MHz,
121 .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE_400MHz,
122 .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA_400MHz,
123};
124
Peter Korsgaardc00f69d2012-10-18 01:21:12 +0000125static const struct cmd_control ddr3_cmd_ctrl_data = {
Peter Korsgaardc7d35be2012-10-18 01:21:13 +0000126 .cmd0csratio = MT41J128MJT125_RATIO,
Peter Korsgaardc7d35be2012-10-18 01:21:13 +0000127 .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +0000128
Peter Korsgaardc7d35be2012-10-18 01:21:13 +0000129 .cmd1csratio = MT41J128MJT125_RATIO,
Peter Korsgaardc7d35be2012-10-18 01:21:13 +0000130 .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +0000131
Peter Korsgaardc7d35be2012-10-18 01:21:13 +0000132 .cmd2csratio = MT41J128MJT125_RATIO,
Peter Korsgaardc7d35be2012-10-18 01:21:13 +0000133 .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +0000134};
135
Tom Rinic7ba18a2013-03-21 04:30:02 +0000136static const struct cmd_control ddr3_beagleblack_cmd_ctrl_data = {
137 .cmd0csratio = MT41K256M16HA125E_RATIO,
Tom Rinic7ba18a2013-03-21 04:30:02 +0000138 .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
139
140 .cmd1csratio = MT41K256M16HA125E_RATIO,
Tom Rinic7ba18a2013-03-21 04:30:02 +0000141 .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
142
143 .cmd2csratio = MT41K256M16HA125E_RATIO,
Tom Rinic7ba18a2013-03-21 04:30:02 +0000144 .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
145};
146
Jeff Lance13526f72013-01-14 05:32:20 +0000147static const struct cmd_control ddr3_evm_cmd_ctrl_data = {
148 .cmd0csratio = MT41J512M8RH125_RATIO,
Jeff Lance13526f72013-01-14 05:32:20 +0000149 .cmd0iclkout = MT41J512M8RH125_INVERT_CLKOUT,
150
151 .cmd1csratio = MT41J512M8RH125_RATIO,
Jeff Lance13526f72013-01-14 05:32:20 +0000152 .cmd1iclkout = MT41J512M8RH125_INVERT_CLKOUT,
153
154 .cmd2csratio = MT41J512M8RH125_RATIO,
Jeff Lance13526f72013-01-14 05:32:20 +0000155 .cmd2iclkout = MT41J512M8RH125_INVERT_CLKOUT,
156};
157
Lokesh Vutlad8ff4fd2016-05-16 11:47:24 +0530158static const struct cmd_control ddr3_icev2_cmd_ctrl_data = {
159 .cmd0csratio = MT41J128MJT125_RATIO_400MHz,
160 .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
161
162 .cmd1csratio = MT41J128MJT125_RATIO_400MHz,
163 .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
164
165 .cmd2csratio = MT41J128MJT125_RATIO_400MHz,
166 .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
167};
168
Peter Korsgaardc00f69d2012-10-18 01:21:12 +0000169static struct emif_regs ddr3_emif_reg_data = {
Peter Korsgaardc7d35be2012-10-18 01:21:13 +0000170 .sdram_config = MT41J128MJT125_EMIF_SDCFG,
171 .ref_ctrl = MT41J128MJT125_EMIF_SDREF,
172 .sdram_tim1 = MT41J128MJT125_EMIF_TIM1,
173 .sdram_tim2 = MT41J128MJT125_EMIF_TIM2,
174 .sdram_tim3 = MT41J128MJT125_EMIF_TIM3,
175 .zq_config = MT41J128MJT125_ZQ_CFG,
Vaibhav Hiremath59dcf972013-03-14 21:11:16 +0000176 .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY |
177 PHY_EN_DYN_PWRDN,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +0000178};
Jeff Lance13526f72013-01-14 05:32:20 +0000179
Tom Rinic7ba18a2013-03-21 04:30:02 +0000180static struct emif_regs ddr3_beagleblack_emif_reg_data = {
181 .sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
182 .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
183 .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
184 .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
185 .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
186 .zq_config = MT41K256M16HA125E_ZQ_CFG,
187 .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
188};
189
Jeff Lance13526f72013-01-14 05:32:20 +0000190static struct emif_regs ddr3_evm_emif_reg_data = {
191 .sdram_config = MT41J512M8RH125_EMIF_SDCFG,
192 .ref_ctrl = MT41J512M8RH125_EMIF_SDREF,
193 .sdram_tim1 = MT41J512M8RH125_EMIF_TIM1,
194 .sdram_tim2 = MT41J512M8RH125_EMIF_TIM2,
195 .sdram_tim3 = MT41J512M8RH125_EMIF_TIM3,
196 .zq_config = MT41J512M8RH125_ZQ_CFG,
Vaibhav Hiremath59dcf972013-03-14 21:11:16 +0000197 .emif_ddr_phy_ctlr_1 = MT41J512M8RH125_EMIF_READ_LATENCY |
198 PHY_EN_DYN_PWRDN,
Jeff Lance13526f72013-01-14 05:32:20 +0000199};
Peter Korsgaard12d7a472013-05-13 08:36:30 +0000200
Lokesh Vutlad8ff4fd2016-05-16 11:47:24 +0530201static struct emif_regs ddr3_icev2_emif_reg_data = {
202 .sdram_config = MT41J128MJT125_EMIF_SDCFG_400MHz,
203 .ref_ctrl = MT41J128MJT125_EMIF_SDREF_400MHz,
204 .sdram_tim1 = MT41J128MJT125_EMIF_TIM1_400MHz,
205 .sdram_tim2 = MT41J128MJT125_EMIF_TIM2_400MHz,
206 .sdram_tim3 = MT41J128MJT125_EMIF_TIM3_400MHz,
207 .zq_config = MT41J128MJT125_ZQ_CFG_400MHz,
208 .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY_400MHz |
209 PHY_EN_DYN_PWRDN,
210};
211
Peter Korsgaard12d7a472013-05-13 08:36:30 +0000212#ifdef CONFIG_SPL_OS_BOOT
213int spl_start_uboot(void)
214{
215 /* break into full u-boot on 'c' */
Tom Riniba9a6702014-03-28 12:03:38 -0400216 if (serial_tstc() && serial_getc() == 'c')
217 return 1;
218
219#ifdef CONFIG_SPL_ENV_SUPPORT
220 env_init();
221 env_relocate_spec();
222 if (getenv_yesno("boot_os") != 1)
223 return 1;
224#endif
225
226 return 0;
Peter Korsgaard12d7a472013-05-13 08:36:30 +0000227}
228#endif
229
Lokesh Vutla94d77fb2013-07-30 10:48:52 +0530230#define OSC (V_OSCK/1000000)
231const struct dpll_params dpll_ddr = {
232 266, OSC-1, 1, -1, -1, -1, -1};
233const struct dpll_params dpll_ddr_evm_sk = {
234 303, OSC-1, 1, -1, -1, -1, -1};
235const struct dpll_params dpll_ddr_bone_black = {
236 400, OSC-1, 1, -1, -1, -1, -1};
237
Tom Rini97210272013-08-30 16:28:46 -0400238void am33xx_spl_board_init(void)
239{
Tom Rini97210272013-08-30 16:28:46 -0400240 int mpu_vdd;
241
Nishanth Menon770e68c2016-02-24 12:30:55 -0600242 if (read_eeprom() < 0)
Tom Rini97210272013-08-30 16:28:46 -0400243 puts("Could not get board ID.\n");
244
245 /* Get the frequency */
Steve Kipisz52f7d842013-08-14 10:51:31 -0400246 dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
Tom Rini97210272013-08-30 16:28:46 -0400247
Nishanth Menon770e68c2016-02-24 12:30:55 -0600248 if (board_is_bone() || board_is_bone_lt()) {
Tom Rini97210272013-08-30 16:28:46 -0400249 /* BeagleBone PMIC Code */
250 int usb_cur_lim;
251
252 /*
253 * Only perform PMIC configurations if board rev > A1
254 * on Beaglebone White
255 */
Nishanth Menon770e68c2016-02-24 12:30:55 -0600256 if (board_is_bone() && !strncmp(board_ti_get_rev(), "00A1", 4))
Tom Rini97210272013-08-30 16:28:46 -0400257 return;
258
259 if (i2c_probe(TPS65217_CHIP_PM))
260 return;
261
262 /*
263 * On Beaglebone White we need to ensure we have AC power
264 * before increasing the frequency.
265 */
Nishanth Menon770e68c2016-02-24 12:30:55 -0600266 if (board_is_bone()) {
Tom Rini97210272013-08-30 16:28:46 -0400267 uchar pmic_status_reg;
268 if (tps65217_reg_read(TPS65217_STATUS,
269 &pmic_status_reg))
270 return;
271 if (!(pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK)) {
272 puts("No AC power, disabling frequency switch\n");
273 return;
274 }
275 }
276
277 /*
278 * Override what we have detected since we know if we have
279 * a Beaglebone Black it supports 1GHz.
280 */
Nishanth Menon770e68c2016-02-24 12:30:55 -0600281 if (board_is_bone_lt())
Steve Kipisz52f7d842013-08-14 10:51:31 -0400282 dpll_mpu_opp100.m = MPUPLL_M_1000;
Tom Rini97210272013-08-30 16:28:46 -0400283
284 /*
285 * Increase USB current limit to 1300mA or 1800mA and set
286 * the MPU voltage controller as needed.
287 */
Steve Kipisz52f7d842013-08-14 10:51:31 -0400288 if (dpll_mpu_opp100.m == MPUPLL_M_1000) {
Tom Rini97210272013-08-30 16:28:46 -0400289 usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
290 mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
291 } else {
292 usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
293 mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
294 }
295
296 if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE,
297 TPS65217_POWER_PATH,
298 usb_cur_lim,
299 TPS65217_USB_INPUT_CUR_LIMIT_MASK))
300 puts("tps65217_reg_write failure\n");
301
Steve Kipisz52f7d842013-08-14 10:51:31 -0400302 /* Set DCDC3 (CORE) voltage to 1.125V */
303 if (tps65217_voltage_update(TPS65217_DEFDCDC3,
304 TPS65217_DCDC_VOLT_SEL_1125MV)) {
305 puts("tps65217_voltage_update failure\n");
306 return;
307 }
308
309 /* Set CORE Frequencies to OPP100 */
310 do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
Tom Rini97210272013-08-30 16:28:46 -0400311
312 /* Set DCDC2 (MPU) voltage */
313 if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
314 puts("tps65217_voltage_update failure\n");
315 return;
316 }
317
318 /*
319 * Set LDO3, LDO4 output voltage to 3.3V for Beaglebone.
320 * Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black.
321 */
Nishanth Menon770e68c2016-02-24 12:30:55 -0600322 if (board_is_bone()) {
Tom Rini97210272013-08-30 16:28:46 -0400323 if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
324 TPS65217_DEFLS1,
325 TPS65217_LDO_VOLTAGE_OUT_3_3,
326 TPS65217_LDO_MASK))
327 puts("tps65217_reg_write failure\n");
328 } else {
329 if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
330 TPS65217_DEFLS1,
331 TPS65217_LDO_VOLTAGE_OUT_1_8,
332 TPS65217_LDO_MASK))
333 puts("tps65217_reg_write failure\n");
334 }
335
336 if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
337 TPS65217_DEFLS2,
338 TPS65217_LDO_VOLTAGE_OUT_3_3,
339 TPS65217_LDO_MASK))
340 puts("tps65217_reg_write failure\n");
341 } else {
342 int sil_rev;
343
344 /*
345 * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
346 * MPU frequencies we support we use a CORE voltage of
347 * 1.1375V. For MPU voltage we need to switch based on
348 * the frequency we are running at.
349 */
350 if (i2c_probe(TPS65910_CTRL_I2C_ADDR))
351 return;
352
353 /*
354 * Depending on MPU clock and PG we will need a different
355 * VDD to drive at that speed.
356 */
357 sil_rev = readl(&cdev->deviceid) >> 28;
Steve Kipisz52f7d842013-08-14 10:51:31 -0400358 mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev,
359 dpll_mpu_opp100.m);
Tom Rini97210272013-08-30 16:28:46 -0400360
361 /* Tell the TPS65910 to use i2c */
362 tps65910_set_i2c_control();
363
364 /* First update MPU voltage. */
365 if (tps65910_voltage_update(MPU, mpu_vdd))
366 return;
367
368 /* Second, update the CORE voltage. */
369 if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_3))
370 return;
Steve Kipisz52f7d842013-08-14 10:51:31 -0400371
372 /* Set CORE Frequencies to OPP100 */
373 do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
Tom Rini97210272013-08-30 16:28:46 -0400374 }
375
376 /* Set MPU Frequency to what we detected now that voltages are set */
Steve Kipisz52f7d842013-08-14 10:51:31 -0400377 do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
Tom Rini97210272013-08-30 16:28:46 -0400378}
379
Lokesh Vutla94d77fb2013-07-30 10:48:52 +0530380const struct dpll_params *get_dpll_ddr_params(void)
381{
Lokesh Vutla94d77fb2013-07-30 10:48:52 +0530382 enable_i2c0_pin_mux();
Heiko Schocher6789e842013-10-22 11:03:18 +0200383 i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
Nishanth Menon770e68c2016-02-24 12:30:55 -0600384 if (read_eeprom() < 0)
Lokesh Vutla94d77fb2013-07-30 10:48:52 +0530385 puts("Could not get board ID.\n");
386
Nishanth Menon770e68c2016-02-24 12:30:55 -0600387 if (board_is_evm_sk())
Lokesh Vutla94d77fb2013-07-30 10:48:52 +0530388 return &dpll_ddr_evm_sk;
Lokesh Vutlad8ff4fd2016-05-16 11:47:24 +0530389 else if (board_is_bone_lt() || board_is_icev2())
Lokesh Vutla94d77fb2013-07-30 10:48:52 +0530390 return &dpll_ddr_bone_black;
Nishanth Menon770e68c2016-02-24 12:30:55 -0600391 else if (board_is_evm_15_or_later())
Lokesh Vutla94d77fb2013-07-30 10:48:52 +0530392 return &dpll_ddr_evm_sk;
393 else
394 return &dpll_ddr;
395}
396
Heiko Schocher06604812013-07-30 10:48:54 +0530397void set_uart_mux_conf(void)
Peter Korsgaarde3634262012-10-18 01:21:09 +0000398{
Tom Rini1286b7f2014-08-01 09:53:24 -0400399#if CONFIG_CONS_INDEX == 1
Peter Korsgaarde3634262012-10-18 01:21:09 +0000400 enable_uart0_pin_mux();
Tom Rini1286b7f2014-08-01 09:53:24 -0400401#elif CONFIG_CONS_INDEX == 2
Andrew Bradford6422b702012-10-25 08:21:30 -0400402 enable_uart1_pin_mux();
Tom Rini1286b7f2014-08-01 09:53:24 -0400403#elif CONFIG_CONS_INDEX == 3
Andrew Bradford6422b702012-10-25 08:21:30 -0400404 enable_uart2_pin_mux();
Tom Rini1286b7f2014-08-01 09:53:24 -0400405#elif CONFIG_CONS_INDEX == 4
Andrew Bradford6422b702012-10-25 08:21:30 -0400406 enable_uart3_pin_mux();
Tom Rini1286b7f2014-08-01 09:53:24 -0400407#elif CONFIG_CONS_INDEX == 5
Andrew Bradford6422b702012-10-25 08:21:30 -0400408 enable_uart4_pin_mux();
Tom Rini1286b7f2014-08-01 09:53:24 -0400409#elif CONFIG_CONS_INDEX == 6
Andrew Bradford6422b702012-10-25 08:21:30 -0400410 enable_uart5_pin_mux();
Tom Rini1286b7f2014-08-01 09:53:24 -0400411#endif
Heiko Schocher06604812013-07-30 10:48:54 +0530412}
Peter Korsgaarde3634262012-10-18 01:21:09 +0000413
Heiko Schocher06604812013-07-30 10:48:54 +0530414void set_mux_conf_regs(void)
415{
Nishanth Menon770e68c2016-02-24 12:30:55 -0600416 if (read_eeprom() < 0)
Peter Korsgaarde3634262012-10-18 01:21:09 +0000417 puts("Could not get board ID.\n");
418
Nishanth Menon770e68c2016-02-24 12:30:55 -0600419 enable_board_pin_mux();
Heiko Schocher06604812013-07-30 10:48:54 +0530420}
421
Lokesh Vutla965de8b2013-12-10 15:02:21 +0530422const struct ctrl_ioregs ioregs_evmsk = {
423 .cm0ioctl = MT41J128MJT125_IOCTRL_VALUE,
424 .cm1ioctl = MT41J128MJT125_IOCTRL_VALUE,
425 .cm2ioctl = MT41J128MJT125_IOCTRL_VALUE,
426 .dt0ioctl = MT41J128MJT125_IOCTRL_VALUE,
427 .dt1ioctl = MT41J128MJT125_IOCTRL_VALUE,
428};
429
430const struct ctrl_ioregs ioregs_bonelt = {
431 .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
432 .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
433 .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
434 .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
435 .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
436};
437
438const struct ctrl_ioregs ioregs_evm15 = {
439 .cm0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
440 .cm1ioctl = MT41J512M8RH125_IOCTRL_VALUE,
441 .cm2ioctl = MT41J512M8RH125_IOCTRL_VALUE,
442 .dt0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
443 .dt1ioctl = MT41J512M8RH125_IOCTRL_VALUE,
444};
445
446const struct ctrl_ioregs ioregs = {
447 .cm0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
448 .cm1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
449 .cm2ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
450 .dt0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
451 .dt1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
452};
453
Heiko Schocher06604812013-07-30 10:48:54 +0530454void sdram_init(void)
455{
Nishanth Menon770e68c2016-02-24 12:30:55 -0600456 if (read_eeprom() < 0)
Heiko Schocher06604812013-07-30 10:48:54 +0530457 puts("Could not get board ID.\n");
458
Nishanth Menon770e68c2016-02-24 12:30:55 -0600459 if (board_is_evm_sk()) {
Peter Korsgaarde3634262012-10-18 01:21:09 +0000460 /*
461 * EVM SK 1.2A and later use gpio0_7 to enable DDR3.
462 * This is safe enough to do on older revs.
463 */
464 gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
465 gpio_direction_output(GPIO_DDR_VTT_EN, 1);
466 }
467
Lokesh Vutlad8ff4fd2016-05-16 11:47:24 +0530468 if (board_is_icev2()) {
469 gpio_request(ICE_GPIO_DDR_VTT_EN, "ddr_vtt_en");
470 gpio_direction_output(ICE_GPIO_DDR_VTT_EN, 1);
471 }
472
Nishanth Menon770e68c2016-02-24 12:30:55 -0600473 if (board_is_evm_sk())
Lokesh Vutla965de8b2013-12-10 15:02:21 +0530474 config_ddr(303, &ioregs_evmsk, &ddr3_data,
Matt Porter3ba65f92013-03-15 10:07:03 +0000475 &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
Nishanth Menon770e68c2016-02-24 12:30:55 -0600476 else if (board_is_bone_lt())
Lokesh Vutla965de8b2013-12-10 15:02:21 +0530477 config_ddr(400, &ioregs_bonelt,
Tom Rinic7ba18a2013-03-21 04:30:02 +0000478 &ddr3_beagleblack_data,
479 &ddr3_beagleblack_cmd_ctrl_data,
480 &ddr3_beagleblack_emif_reg_data, 0);
Nishanth Menon770e68c2016-02-24 12:30:55 -0600481 else if (board_is_evm_15_or_later())
Lokesh Vutla965de8b2013-12-10 15:02:21 +0530482 config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
Matt Porter3ba65f92013-03-15 10:07:03 +0000483 &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
Lokesh Vutlad8ff4fd2016-05-16 11:47:24 +0530484 else if (board_is_icev2())
485 config_ddr(400, &ioregs_evmsk, &ddr3_icev2_data,
486 &ddr3_icev2_cmd_ctrl_data, &ddr3_icev2_emif_reg_data,
487 0);
Peter Korsgaardc00f69d2012-10-18 01:21:12 +0000488 else
Lokesh Vutla965de8b2013-12-10 15:02:21 +0530489 config_ddr(266, &ioregs, &ddr2_data,
Matt Porter3ba65f92013-03-15 10:07:03 +0000490 &ddr2_cmd_ctrl_data, &ddr2_emif_reg_data, 0);
Peter Korsgaarde3634262012-10-18 01:21:09 +0000491}
Heiko Schocher06604812013-07-30 10:48:54 +0530492#endif
Peter Korsgaarde3634262012-10-18 01:21:09 +0000493
Lokesh Vutla97f3a172016-05-16 11:47:26 +0530494#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
495 (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
496static void request_and_set_gpio(int gpio, char *name)
497{
498 int ret;
499
500 ret = gpio_request(gpio, name);
501 if (ret < 0) {
502 printf("%s: Unable to request %s\n", __func__, name);
503 return;
504 }
505
506 ret = gpio_direction_output(gpio, 0);
507 if (ret < 0) {
508 printf("%s: Unable to set %s as output\n", __func__, name);
509 goto err_free_gpio;
510 }
511
512 gpio_set_value(gpio, 1);
513
514 return;
515
516err_free_gpio:
517 gpio_free(gpio);
518}
519
520#define REQUEST_AND_SET_GPIO(N) request_and_set_gpio(N, #N);
521
522/**
523 * RMII mode on ICEv2 board needs 50MHz clock. Given the clock
524 * synthesizer With a capacitor of 18pF, and 25MHz input clock cycle
525 * PLL1 gives an output of 100MHz. So, configuring the div2/3 as 2 to
526 * give 50MHz output for Eth0 and 1.
527 */
528static struct clk_synth cdce913_data = {
529 .id = 0x81,
530 .capacitor = 0x90,
531 .mux = 0x6d,
532 .pdiv2 = 0x2,
533 .pdiv3 = 0x2,
534};
535#endif
536
Peter Korsgaarde3634262012-10-18 01:21:09 +0000537/*
538 * Basic board specific setup. Pinmux has been handled already.
539 */
540int board_init(void)
541{
Tom Rini68439182013-10-01 12:32:04 -0400542#if defined(CONFIG_HW_WATCHDOG)
543 hw_watchdog_init();
544#endif
545
Tom Rini73feefd2013-08-09 11:22:13 -0400546 gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
pekon gupta2c17e6d2013-11-18 19:03:02 +0530547#if defined(CONFIG_NOR) || defined(CONFIG_NAND)
Ilya Yanok98b5c262012-11-06 13:06:31 +0000548 gpmc_init();
Steve Kipiszcd8845d2013-07-18 15:13:03 -0400549#endif
Lokesh Vutla97f3a172016-05-16 11:47:26 +0530550#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD))
551 int rv;
552
553 if (board_is_icev2()) {
554 REQUEST_AND_SET_GPIO(GPIO_PR1_MII_CTRL);
555 REQUEST_AND_SET_GPIO(GPIO_MUX_MII_CTRL);
556 REQUEST_AND_SET_GPIO(GPIO_FET_SWITCH_CTRL);
557 REQUEST_AND_SET_GPIO(GPIO_PHY_RESET);
558
559 rv = setup_clock_synthesizer(&cdce913_data);
560 if (rv) {
561 printf("Clock synthesizer setup failed %d\n", rv);
562 return rv;
563 }
564 }
565#endif
566
Peter Korsgaarde3634262012-10-18 01:21:09 +0000567 return 0;
568}
569
Tom Rini044fc142012-10-24 07:28:17 +0000570#ifdef CONFIG_BOARD_LATE_INIT
571int board_late_init(void)
572{
573#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
Nishanth Menon770e68c2016-02-24 12:30:55 -0600574 int rc;
575 char *name = NULL;
Tom Riniace42752013-07-18 15:13:01 -0400576
Nishanth Menon770e68c2016-02-24 12:30:55 -0600577 rc = read_eeprom();
578 if (rc)
Tom Riniace42752013-07-18 15:13:01 -0400579 puts("Could not get board ID.\n");
Tom Rini044fc142012-10-24 07:28:17 +0000580
Nishanth Menon770e68c2016-02-24 12:30:55 -0600581 if (board_is_bbg1())
582 name = "BBG1";
583 set_board_info_env(name);
Tom Rini044fc142012-10-24 07:28:17 +0000584#endif
585
586 return 0;
587}
588#endif
589
Mugunthan V Nbd83e3d2015-09-07 14:22:18 +0530590#ifndef CONFIG_DM_ETH
591
Ilya Yanokc0e66792013-02-05 11:36:26 +0000592#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
593 (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
Peter Korsgaarde3634262012-10-18 01:21:09 +0000594static void cpsw_control(int enabled)
595{
596 /* VTP can be added here */
597
598 return;
599}
600
601static struct cpsw_slave_data cpsw_slaves[] = {
602 {
603 .slave_reg_ofs = 0x208,
604 .sliver_reg_ofs = 0xd80,
Mugunthan V N9c653aa2014-02-18 07:31:52 -0500605 .phy_addr = 0,
Peter Korsgaarde3634262012-10-18 01:21:09 +0000606 },
607 {
608 .slave_reg_ofs = 0x308,
609 .sliver_reg_ofs = 0xdc0,
Mugunthan V N9c653aa2014-02-18 07:31:52 -0500610 .phy_addr = 1,
Peter Korsgaarde3634262012-10-18 01:21:09 +0000611 },
612};
613
614static struct cpsw_platform_data cpsw_data = {
Matt Porter81df2ba2013-03-15 10:07:02 +0000615 .mdio_base = CPSW_MDIO_BASE,
616 .cpsw_base = CPSW_BASE,
Peter Korsgaarde3634262012-10-18 01:21:09 +0000617 .mdio_div = 0xff,
618 .channels = 8,
619 .cpdma_reg_ofs = 0x800,
620 .slaves = 1,
621 .slave_data = cpsw_slaves,
622 .ale_reg_ofs = 0xd00,
623 .ale_entries = 1024,
624 .host_port_reg_ofs = 0x108,
625 .hw_stats_reg_ofs = 0x900,
Mugunthan V N2bf36ac2013-07-08 16:04:37 +0530626 .bd_ram_ofs = 0x2000,
Peter Korsgaarde3634262012-10-18 01:21:09 +0000627 .mac_control = (1 << 5),
628 .control = cpsw_control,
629 .host_port_num = 0,
630 .version = CPSW_CTRL_VERSION_2,
631};
Ilya Yanokd2aa1152012-11-06 13:48:24 +0000632#endif
Peter Korsgaarde3634262012-10-18 01:21:09 +0000633
Lokesh Vutla97f3a172016-05-16 11:47:26 +0530634#if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) &&\
635 defined(CONFIG_SPL_BUILD)) || \
636 ((defined(CONFIG_DRIVER_TI_CPSW) || \
637 defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \
638 !defined(CONFIG_SPL_BUILD))
639
Tom Rini68996b82014-03-26 15:53:12 -0400640/*
641 * This function will:
642 * Read the eFuse for MAC addresses, and set ethaddr/eth1addr/usbnet_devaddr
643 * in the environment
644 * Perform fixups to the PHY present on certain boards. We only need this
645 * function in:
646 * - SPL with either CPSW or USB ethernet support
647 * - Full U-Boot, with either CPSW or USB ethernet
648 * Build in only these cases to avoid warnings about unused variables
649 * when we build an SPL that has neither option but full U-Boot will.
650 */
Peter Korsgaarde3634262012-10-18 01:21:09 +0000651int board_eth_init(bd_t *bis)
652{
Ilya Yanokd2aa1152012-11-06 13:48:24 +0000653 int rv, n = 0;
Peter Korsgaarde3634262012-10-18 01:21:09 +0000654 uint8_t mac_addr[6];
655 uint32_t mac_hi, mac_lo;
Nishanth Menon770e68c2016-02-24 12:30:55 -0600656 __maybe_unused struct ti_am_eeprom *header;
Peter Korsgaarde3634262012-10-18 01:21:09 +0000657
Ilya Yanokc0e66792013-02-05 11:36:26 +0000658 /* try reading mac address from efuse */
659 mac_lo = readl(&cdev->macid0l);
660 mac_hi = readl(&cdev->macid0h);
661 mac_addr[0] = mac_hi & 0xFF;
662 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
663 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
664 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
665 mac_addr[4] = mac_lo & 0xFF;
666 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
667
668#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
669 (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
670 if (!getenv("ethaddr")) {
671 printf("<ethaddr> not set. Validating first E-fuse MAC\n");
Peter Korsgaarde3634262012-10-18 01:21:09 +0000672
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500673 if (is_valid_ethaddr(mac_addr))
Peter Korsgaarde3634262012-10-18 01:21:09 +0000674 eth_setenv_enetaddr("ethaddr", mac_addr);
Peter Korsgaarde3634262012-10-18 01:21:09 +0000675 }
676
Joel A Fernandesa662e0c2013-05-07 05:52:55 +0000677#ifdef CONFIG_DRIVER_TI_CPSW
Mugunthan V Na35ad512014-02-18 07:31:55 -0500678
679 mac_lo = readl(&cdev->macid1l);
680 mac_hi = readl(&cdev->macid1h);
681 mac_addr[0] = mac_hi & 0xFF;
682 mac_addr[1] = (mac_hi & 0xFF00) >> 8;
683 mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
684 mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
685 mac_addr[4] = mac_lo & 0xFF;
686 mac_addr[5] = (mac_lo & 0xFF00) >> 8;
687
688 if (!getenv("eth1addr")) {
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500689 if (is_valid_ethaddr(mac_addr))
Mugunthan V Na35ad512014-02-18 07:31:55 -0500690 eth_setenv_enetaddr("eth1addr", mac_addr);
691 }
692
Nishanth Menon770e68c2016-02-24 12:30:55 -0600693 if (read_eeprom() < 0)
Tom Riniace42752013-07-18 15:13:01 -0400694 puts("Could not get board ID.\n");
695
Nishanth Menon770e68c2016-02-24 12:30:55 -0600696 if (board_is_bone() || board_is_bone_lt() ||
697 board_is_idk()) {
Peter Korsgaarde3634262012-10-18 01:21:09 +0000698 writel(MII_MODE_ENABLE, &cdev->miisel);
699 cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
700 PHY_INTERFACE_MODE_MII;
Lokesh Vutla97f3a172016-05-16 11:47:26 +0530701 } else if (board_is_icev2()) {
702 writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
703 cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
704 cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_RMII;
705 cpsw_slaves[0].phy_addr = 1;
706 cpsw_slaves[1].phy_addr = 3;
Peter Korsgaarde3634262012-10-18 01:21:09 +0000707 } else {
Heiko Schocherdafd4db2013-08-19 16:38:56 +0200708 writel((RGMII_MODE_ENABLE | RGMII_INT_DELAY), &cdev->miisel);
Peter Korsgaarde3634262012-10-18 01:21:09 +0000709 cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
710 PHY_INTERFACE_MODE_RGMII;
711 }
712
Ilya Yanokd2aa1152012-11-06 13:48:24 +0000713 rv = cpsw_register(&cpsw_data);
714 if (rv < 0)
715 printf("Error %d registering CPSW switch\n", rv);
716 else
717 n += rv;
Joel A Fernandesa662e0c2013-05-07 05:52:55 +0000718#endif
Tom Rini1634e962013-02-12 14:59:23 -0500719
720 /*
721 *
722 * CPSW RGMII Internal Delay Mode is not supported in all PVT
723 * operating points. So we must set the TX clock delay feature
724 * in the AR8051 PHY. Since we only support a single ethernet
725 * device in U-Boot, we only do this for the first instance.
726 */
727#define AR8051_PHY_DEBUG_ADDR_REG 0x1d
728#define AR8051_PHY_DEBUG_DATA_REG 0x1e
729#define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
730#define AR8051_RGMII_TX_CLK_DLY 0x100
731
Nishanth Menon770e68c2016-02-24 12:30:55 -0600732 if (board_is_evm_sk() || board_is_gp_evm()) {
Tom Rini1634e962013-02-12 14:59:23 -0500733 const char *devname;
734 devname = miiphy_get_current_dev();
735
736 miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_ADDR_REG,
737 AR8051_DEBUG_RGMII_CLK_DLY_REG);
738 miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_DATA_REG,
739 AR8051_RGMII_TX_CLK_DLY);
740 }
Ilya Yanokd2aa1152012-11-06 13:48:24 +0000741#endif
Ilya Yanokc0e66792013-02-05 11:36:26 +0000742#if defined(CONFIG_USB_ETHER) && \
743 (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT))
Joe Hershberger0adb5b72015-04-08 01:41:04 -0500744 if (is_valid_ethaddr(mac_addr))
Ilya Yanokc0e66792013-02-05 11:36:26 +0000745 eth_setenv_enetaddr("usbnet_devaddr", mac_addr);
746
Ilya Yanokd2aa1152012-11-06 13:48:24 +0000747 rv = usb_eth_initialize(bis);
748 if (rv < 0)
749 printf("Error %d registering USB_ETHER\n", rv);
750 else
751 n += rv;
752#endif
753 return n;
Peter Korsgaarde3634262012-10-18 01:21:09 +0000754}
755#endif
Mugunthan V Nbd83e3d2015-09-07 14:22:18 +0530756
757#endif /* CONFIG_DM_ETH */
Lokesh Vutla505ea6e2016-05-16 11:24:24 +0530758
759#ifdef CONFIG_SPL_LOAD_FIT
760int board_fit_config_name_match(const char *name)
761{
762 if (board_is_gp_evm() && !strcmp(name, "am335x-evm"))
763 return 0;
764 else if (board_is_bone() && !strcmp(name, "am335x-bone"))
765 return 0;
766 else if (board_is_bone_lt() && !strcmp(name, "am335x-boneblack"))
767 return 0;
Lokesh Vutla3819ea72016-05-16 11:24:28 +0530768 else if (board_is_evm_sk() && !strcmp(name, "am335x-evmsk"))
769 return 0;
Lokesh Vutlada9d9592016-05-16 11:24:29 +0530770 else if (board_is_bbg1() && !strcmp(name, "am335x-bonegreen"))
771 return 0;
Lokesh Vutla73ec6962016-05-16 11:47:28 +0530772 else if (board_is_icev2() && !strcmp(name, "am335x-icev2"))
773 return 0;
Lokesh Vutla505ea6e2016-05-16 11:24:24 +0530774 else
775 return -1;
776}
777#endif