1e363426eSPeter Korsgaard /*
2e363426eSPeter Korsgaard * board.c
3e363426eSPeter Korsgaard *
4e363426eSPeter Korsgaard * Board functions for TI AM335X based boards
5e363426eSPeter Korsgaard *
6e363426eSPeter Korsgaard * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
7e363426eSPeter Korsgaard *
81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
9e363426eSPeter Korsgaard */
10e363426eSPeter Korsgaard
11e363426eSPeter Korsgaard #include <common.h>
124548bc8dSLokesh Vutla #include <dm.h>
13e363426eSPeter Korsgaard #include <errno.h>
14e363426eSPeter Korsgaard #include <spl.h>
153d16389cSLokesh Vutla #include <serial.h>
16e363426eSPeter Korsgaard #include <asm/arch/cpu.h>
17e363426eSPeter Korsgaard #include <asm/arch/hardware.h>
18e363426eSPeter Korsgaard #include <asm/arch/omap.h>
19e363426eSPeter Korsgaard #include <asm/arch/ddr_defs.h>
20e363426eSPeter Korsgaard #include <asm/arch/clock.h>
2197f3a178SLokesh Vutla #include <asm/arch/clk_synthesizer.h>
22e363426eSPeter Korsgaard #include <asm/arch/gpio.h>
23e363426eSPeter Korsgaard #include <asm/arch/mmc_host_def.h>
24e363426eSPeter Korsgaard #include <asm/arch/sys_proto.h>
25cd8845d7SSteve Kipisz #include <asm/arch/mem.h>
26e363426eSPeter Korsgaard #include <asm/io.h>
27e363426eSPeter Korsgaard #include <asm/emif.h>
28e363426eSPeter Korsgaard #include <asm/gpio.h>
2900bbe96eSSemen Protsenko #include <asm/omap_common.h>
30b0a4eea1SAndrew F. Davis #include <asm/omap_sec_common.h>
314548bc8dSLokesh Vutla #include <asm/omap_mmc.h>
32e363426eSPeter Korsgaard #include <i2c.h>
33e363426eSPeter Korsgaard #include <miiphy.h>
34e363426eSPeter Korsgaard #include <cpsw.h>
359721027aSTom Rini #include <power/tps65217.h>
369721027aSTom Rini #include <power/tps65910.h>
376843918eSTom Rini #include <environment.h>
386843918eSTom Rini #include <watchdog.h>
39ba9a6708STom Rini #include <environment.h>
40770e68c0SNishanth Menon #include "../common/board_detect.h"
41e363426eSPeter Korsgaard #include "board.h"
42e363426eSPeter Korsgaard
43e363426eSPeter Korsgaard DECLARE_GLOBAL_DATA_PTR;
44e363426eSPeter Korsgaard
45e363426eSPeter Korsgaard /* GPIO that controls power to DDR on EVM-SK */
4697f3a178SLokesh Vutla #define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
4797f3a178SLokesh Vutla #define GPIO_DDR_VTT_EN GPIO_TO_PIN(0, 7)
4897f3a178SLokesh Vutla #define ICE_GPIO_DDR_VTT_EN GPIO_TO_PIN(0, 18)
4997f3a178SLokesh Vutla #define GPIO_PR1_MII_CTRL GPIO_TO_PIN(3, 4)
5097f3a178SLokesh Vutla #define GPIO_MUX_MII_CTRL GPIO_TO_PIN(3, 10)
5197f3a178SLokesh Vutla #define GPIO_FET_SWITCH_CTRL GPIO_TO_PIN(0, 7)
5297f3a178SLokesh Vutla #define GPIO_PHY_RESET GPIO_TO_PIN(2, 5)
53e607ec99SRoger Quadros #define GPIO_ETH0_MODE GPIO_TO_PIN(0, 11)
54e607ec99SRoger Quadros #define GPIO_ETH1_MODE GPIO_TO_PIN(1, 26)
55e363426eSPeter Korsgaard
56e363426eSPeter Korsgaard static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
57e363426eSPeter Korsgaard
58e607ec99SRoger Quadros #define GPIO0_RISINGDETECT (AM33XX_GPIO0_BASE + OMAP_GPIO_RISINGDETECT)
59e607ec99SRoger Quadros #define GPIO1_RISINGDETECT (AM33XX_GPIO1_BASE + OMAP_GPIO_RISINGDETECT)
60e607ec99SRoger Quadros
61e607ec99SRoger Quadros #define GPIO0_IRQSTATUS1 (AM33XX_GPIO0_BASE + OMAP_GPIO_IRQSTATUS1)
62e607ec99SRoger Quadros #define GPIO1_IRQSTATUS1 (AM33XX_GPIO1_BASE + OMAP_GPIO_IRQSTATUS1)
63e607ec99SRoger Quadros
64e607ec99SRoger Quadros #define GPIO0_IRQSTATUSRAW (AM33XX_GPIO0_BASE + 0x024)
65e607ec99SRoger Quadros #define GPIO1_IRQSTATUSRAW (AM33XX_GPIO1_BASE + 0x024)
66e607ec99SRoger Quadros
67e363426eSPeter Korsgaard /*
68e363426eSPeter Korsgaard * Read header information from EEPROM into global structure.
69e363426eSPeter Korsgaard */
70140d76a9SLokesh Vutla #ifdef CONFIG_TI_I2C_BOARD_DETECT
do_board_detect(void)71140d76a9SLokesh Vutla void do_board_detect(void)
72e363426eSPeter Korsgaard {
73140d76a9SLokesh Vutla enable_i2c0_pin_mux();
74140d76a9SLokesh Vutla i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
75140d76a9SLokesh Vutla
7664a144dcSSimon Glass if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
7764a144dcSSimon Glass CONFIG_EEPROM_CHIP_ADDRESS))
78140d76a9SLokesh Vutla printf("ti_i2c_eeprom_init failed\n");
79e363426eSPeter Korsgaard }
80140d76a9SLokesh Vutla #endif
81e363426eSPeter Korsgaard
823d16389cSLokesh Vutla #ifndef CONFIG_DM_SERIAL
default_serial_console(void)833d16389cSLokesh Vutla struct serial_device *default_serial_console(void)
843d16389cSLokesh Vutla {
853d16389cSLokesh Vutla if (board_is_icev2())
863d16389cSLokesh Vutla return &eserial4_device;
873d16389cSLokesh Vutla else
883d16389cSLokesh Vutla return &eserial1_device;
893d16389cSLokesh Vutla }
903d16389cSLokesh Vutla #endif
913d16389cSLokesh Vutla
92d0e6d34dSTom Rini #ifndef CONFIG_SKIP_LOWLEVEL_INIT
93c00f69dbSPeter Korsgaard static const struct ddr_data ddr2_data = {
94c4f80f50STom Rini .datardsratio0 = MT47H128M16RT25E_RD_DQS,
95c4f80f50STom Rini .datafwsratio0 = MT47H128M16RT25E_PHY_FIFO_WE,
96c4f80f50STom Rini .datawrsratio0 = MT47H128M16RT25E_PHY_WR_DATA,
97c00f69dbSPeter Korsgaard };
98c00f69dbSPeter Korsgaard
99c00f69dbSPeter Korsgaard static const struct cmd_control ddr2_cmd_ctrl_data = {
100c7d35befSPeter Korsgaard .cmd0csratio = MT47H128M16RT25E_RATIO,
101c00f69dbSPeter Korsgaard
102c7d35befSPeter Korsgaard .cmd1csratio = MT47H128M16RT25E_RATIO,
103c00f69dbSPeter Korsgaard
104c7d35befSPeter Korsgaard .cmd2csratio = MT47H128M16RT25E_RATIO,
105c00f69dbSPeter Korsgaard };
106c00f69dbSPeter Korsgaard
107c00f69dbSPeter Korsgaard static const struct emif_regs ddr2_emif_reg_data = {
108c7d35befSPeter Korsgaard .sdram_config = MT47H128M16RT25E_EMIF_SDCFG,
109c7d35befSPeter Korsgaard .ref_ctrl = MT47H128M16RT25E_EMIF_SDREF,
110c7d35befSPeter Korsgaard .sdram_tim1 = MT47H128M16RT25E_EMIF_TIM1,
111c7d35befSPeter Korsgaard .sdram_tim2 = MT47H128M16RT25E_EMIF_TIM2,
112c7d35befSPeter Korsgaard .sdram_tim3 = MT47H128M16RT25E_EMIF_TIM3,
113c7d35befSPeter Korsgaard .emif_ddr_phy_ctlr_1 = MT47H128M16RT25E_EMIF_READ_LATENCY,
114c00f69dbSPeter Korsgaard };
115c00f69dbSPeter Korsgaard
1168c17cbdfSJyri Sarha static const struct emif_regs ddr2_evm_emif_reg_data = {
1178c17cbdfSJyri Sarha .sdram_config = MT47H128M16RT25E_EMIF_SDCFG,
1188c17cbdfSJyri Sarha .ref_ctrl = MT47H128M16RT25E_EMIF_SDREF,
1198c17cbdfSJyri Sarha .sdram_tim1 = MT47H128M16RT25E_EMIF_TIM1,
1208c17cbdfSJyri Sarha .sdram_tim2 = MT47H128M16RT25E_EMIF_TIM2,
1218c17cbdfSJyri Sarha .sdram_tim3 = MT47H128M16RT25E_EMIF_TIM3,
1228c17cbdfSJyri Sarha .ocp_config = EMIF_OCP_CONFIG_AM335X_EVM,
1238c17cbdfSJyri Sarha .emif_ddr_phy_ctlr_1 = MT47H128M16RT25E_EMIF_READ_LATENCY,
1248c17cbdfSJyri Sarha };
1258c17cbdfSJyri Sarha
126c00f69dbSPeter Korsgaard static const struct ddr_data ddr3_data = {
127c7d35befSPeter Korsgaard .datardsratio0 = MT41J128MJT125_RD_DQS,
128c7d35befSPeter Korsgaard .datawdsratio0 = MT41J128MJT125_WR_DQS,
129c7d35befSPeter Korsgaard .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE,
130c7d35befSPeter Korsgaard .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA,
131c00f69dbSPeter Korsgaard };
132c00f69dbSPeter Korsgaard
133c7ba18adSTom Rini static const struct ddr_data ddr3_beagleblack_data = {
134c7ba18adSTom Rini .datardsratio0 = MT41K256M16HA125E_RD_DQS,
135c7ba18adSTom Rini .datawdsratio0 = MT41K256M16HA125E_WR_DQS,
136c7ba18adSTom Rini .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
137c7ba18adSTom Rini .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
138c7ba18adSTom Rini };
139c7ba18adSTom Rini
14013526f71SJeff Lance static const struct ddr_data ddr3_evm_data = {
14113526f71SJeff Lance .datardsratio0 = MT41J512M8RH125_RD_DQS,
14213526f71SJeff Lance .datawdsratio0 = MT41J512M8RH125_WR_DQS,
14313526f71SJeff Lance .datafwsratio0 = MT41J512M8RH125_PHY_FIFO_WE,
14413526f71SJeff Lance .datawrsratio0 = MT41J512M8RH125_PHY_WR_DATA,
14513526f71SJeff Lance };
14613526f71SJeff Lance
147d8ff4fdbSLokesh Vutla static const struct ddr_data ddr3_icev2_data = {
148d8ff4fdbSLokesh Vutla .datardsratio0 = MT41J128MJT125_RD_DQS_400MHz,
149d8ff4fdbSLokesh Vutla .datawdsratio0 = MT41J128MJT125_WR_DQS_400MHz,
150d8ff4fdbSLokesh Vutla .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE_400MHz,
151d8ff4fdbSLokesh Vutla .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA_400MHz,
152d8ff4fdbSLokesh Vutla };
153d8ff4fdbSLokesh Vutla
154c00f69dbSPeter Korsgaard static const struct cmd_control ddr3_cmd_ctrl_data = {
155c7d35befSPeter Korsgaard .cmd0csratio = MT41J128MJT125_RATIO,
156c7d35befSPeter Korsgaard .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT,
157c00f69dbSPeter Korsgaard
158c7d35befSPeter Korsgaard .cmd1csratio = MT41J128MJT125_RATIO,
159c7d35befSPeter Korsgaard .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT,
160c00f69dbSPeter Korsgaard
161c7d35befSPeter Korsgaard .cmd2csratio = MT41J128MJT125_RATIO,
162c7d35befSPeter Korsgaard .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT,
163c00f69dbSPeter Korsgaard };
164c00f69dbSPeter Korsgaard
165c7ba18adSTom Rini static const struct cmd_control ddr3_beagleblack_cmd_ctrl_data = {
166c7ba18adSTom Rini .cmd0csratio = MT41K256M16HA125E_RATIO,
167c7ba18adSTom Rini .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
168c7ba18adSTom Rini
169c7ba18adSTom Rini .cmd1csratio = MT41K256M16HA125E_RATIO,
170c7ba18adSTom Rini .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
171c7ba18adSTom Rini
172c7ba18adSTom Rini .cmd2csratio = MT41K256M16HA125E_RATIO,
173c7ba18adSTom Rini .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
174c7ba18adSTom Rini };
175c7ba18adSTom Rini
17613526f71SJeff Lance static const struct cmd_control ddr3_evm_cmd_ctrl_data = {
17713526f71SJeff Lance .cmd0csratio = MT41J512M8RH125_RATIO,
17813526f71SJeff Lance .cmd0iclkout = MT41J512M8RH125_INVERT_CLKOUT,
17913526f71SJeff Lance
18013526f71SJeff Lance .cmd1csratio = MT41J512M8RH125_RATIO,
18113526f71SJeff Lance .cmd1iclkout = MT41J512M8RH125_INVERT_CLKOUT,
18213526f71SJeff Lance
18313526f71SJeff Lance .cmd2csratio = MT41J512M8RH125_RATIO,
18413526f71SJeff Lance .cmd2iclkout = MT41J512M8RH125_INVERT_CLKOUT,
18513526f71SJeff Lance };
18613526f71SJeff Lance
187d8ff4fdbSLokesh Vutla static const struct cmd_control ddr3_icev2_cmd_ctrl_data = {
188d8ff4fdbSLokesh Vutla .cmd0csratio = MT41J128MJT125_RATIO_400MHz,
189d8ff4fdbSLokesh Vutla .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
190d8ff4fdbSLokesh Vutla
191d8ff4fdbSLokesh Vutla .cmd1csratio = MT41J128MJT125_RATIO_400MHz,
192d8ff4fdbSLokesh Vutla .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
193d8ff4fdbSLokesh Vutla
194d8ff4fdbSLokesh Vutla .cmd2csratio = MT41J128MJT125_RATIO_400MHz,
195d8ff4fdbSLokesh Vutla .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz,
196d8ff4fdbSLokesh Vutla };
197d8ff4fdbSLokesh Vutla
198c00f69dbSPeter Korsgaard static struct emif_regs ddr3_emif_reg_data = {
199c7d35befSPeter Korsgaard .sdram_config = MT41J128MJT125_EMIF_SDCFG,
200c7d35befSPeter Korsgaard .ref_ctrl = MT41J128MJT125_EMIF_SDREF,
201c7d35befSPeter Korsgaard .sdram_tim1 = MT41J128MJT125_EMIF_TIM1,
202c7d35befSPeter Korsgaard .sdram_tim2 = MT41J128MJT125_EMIF_TIM2,
203c7d35befSPeter Korsgaard .sdram_tim3 = MT41J128MJT125_EMIF_TIM3,
204c7d35befSPeter Korsgaard .zq_config = MT41J128MJT125_ZQ_CFG,
20559dcf970SVaibhav Hiremath .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY |
20659dcf970SVaibhav Hiremath PHY_EN_DYN_PWRDN,
207c00f69dbSPeter Korsgaard };
20813526f71SJeff Lance
209c7ba18adSTom Rini static struct emif_regs ddr3_beagleblack_emif_reg_data = {
210c7ba18adSTom Rini .sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
211c7ba18adSTom Rini .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
212c7ba18adSTom Rini .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
213c7ba18adSTom Rini .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
214c7ba18adSTom Rini .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
2158c17cbdfSJyri Sarha .ocp_config = EMIF_OCP_CONFIG_BEAGLEBONE_BLACK,
216c7ba18adSTom Rini .zq_config = MT41K256M16HA125E_ZQ_CFG,
217c7ba18adSTom Rini .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
218c7ba18adSTom Rini };
219c7ba18adSTom Rini
22013526f71SJeff Lance static struct emif_regs ddr3_evm_emif_reg_data = {
22113526f71SJeff Lance .sdram_config = MT41J512M8RH125_EMIF_SDCFG,
22213526f71SJeff Lance .ref_ctrl = MT41J512M8RH125_EMIF_SDREF,
22313526f71SJeff Lance .sdram_tim1 = MT41J512M8RH125_EMIF_TIM1,
22413526f71SJeff Lance .sdram_tim2 = MT41J512M8RH125_EMIF_TIM2,
22513526f71SJeff Lance .sdram_tim3 = MT41J512M8RH125_EMIF_TIM3,
2268c17cbdfSJyri Sarha .ocp_config = EMIF_OCP_CONFIG_AM335X_EVM,
22713526f71SJeff Lance .zq_config = MT41J512M8RH125_ZQ_CFG,
22859dcf970SVaibhav Hiremath .emif_ddr_phy_ctlr_1 = MT41J512M8RH125_EMIF_READ_LATENCY |
22959dcf970SVaibhav Hiremath PHY_EN_DYN_PWRDN,
23013526f71SJeff Lance };
23112d7a474SPeter Korsgaard
232d8ff4fdbSLokesh Vutla static struct emif_regs ddr3_icev2_emif_reg_data = {
233d8ff4fdbSLokesh Vutla .sdram_config = MT41J128MJT125_EMIF_SDCFG_400MHz,
234d8ff4fdbSLokesh Vutla .ref_ctrl = MT41J128MJT125_EMIF_SDREF_400MHz,
235d8ff4fdbSLokesh Vutla .sdram_tim1 = MT41J128MJT125_EMIF_TIM1_400MHz,
236d8ff4fdbSLokesh Vutla .sdram_tim2 = MT41J128MJT125_EMIF_TIM2_400MHz,
237d8ff4fdbSLokesh Vutla .sdram_tim3 = MT41J128MJT125_EMIF_TIM3_400MHz,
238d8ff4fdbSLokesh Vutla .zq_config = MT41J128MJT125_ZQ_CFG_400MHz,
239d8ff4fdbSLokesh Vutla .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY_400MHz |
240d8ff4fdbSLokesh Vutla PHY_EN_DYN_PWRDN,
241d8ff4fdbSLokesh Vutla };
242d8ff4fdbSLokesh Vutla
24312d7a474SPeter Korsgaard #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)24412d7a474SPeter Korsgaard int spl_start_uboot(void)
24512d7a474SPeter Korsgaard {
24612d7a474SPeter Korsgaard /* break into full u-boot on 'c' */
247ba9a6708STom Rini if (serial_tstc() && serial_getc() == 'c')
248ba9a6708STom Rini return 1;
249ba9a6708STom Rini
250ba9a6708STom Rini #ifdef CONFIG_SPL_ENV_SUPPORT
251ba9a6708STom Rini env_init();
252310fb14bSSimon Glass env_load();
253*bfebc8c9SSimon Glass if (env_get_yesno("boot_os") != 1)
254ba9a6708STom Rini return 1;
255ba9a6708STom Rini #endif
256ba9a6708STom Rini
257ba9a6708STom Rini return 0;
25812d7a474SPeter Korsgaard }
25912d7a474SPeter Korsgaard #endif
26012d7a474SPeter Korsgaard
get_dpll_ddr_params(void)26106507988SLokesh Vutla const struct dpll_params *get_dpll_ddr_params(void)
2629721027aSTom Rini {
263fbd6295dSLokesh Vutla int ind = get_sys_clk_index();
264fbd6295dSLokesh Vutla
26506507988SLokesh Vutla if (board_is_evm_sk())
266fbd6295dSLokesh Vutla return &dpll_ddr3_303MHz[ind];
26706507988SLokesh Vutla else if (board_is_bone_lt() || board_is_icev2())
268fbd6295dSLokesh Vutla return &dpll_ddr3_400MHz[ind];
26906507988SLokesh Vutla else if (board_is_evm_15_or_later())
270fbd6295dSLokesh Vutla return &dpll_ddr3_303MHz[ind];
27106507988SLokesh Vutla else
272fbd6295dSLokesh Vutla return &dpll_ddr2_266MHz[ind];
273fbd6295dSLokesh Vutla }
274fbd6295dSLokesh Vutla
bone_not_connected_to_ac_power(void)275fbd6295dSLokesh Vutla static u8 bone_not_connected_to_ac_power(void)
276fbd6295dSLokesh Vutla {
277fbd6295dSLokesh Vutla if (board_is_bone()) {
278fbd6295dSLokesh Vutla uchar pmic_status_reg;
279fbd6295dSLokesh Vutla if (tps65217_reg_read(TPS65217_STATUS,
280fbd6295dSLokesh Vutla &pmic_status_reg))
281fbd6295dSLokesh Vutla return 1;
282fbd6295dSLokesh Vutla if (!(pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK)) {
283fbd6295dSLokesh Vutla puts("No AC power, switching to default OPP\n");
284fbd6295dSLokesh Vutla return 1;
285fbd6295dSLokesh Vutla }
286fbd6295dSLokesh Vutla }
287fbd6295dSLokesh Vutla return 0;
288fbd6295dSLokesh Vutla }
289fbd6295dSLokesh Vutla
get_dpll_mpu_params(void)290fbd6295dSLokesh Vutla const struct dpll_params *get_dpll_mpu_params(void)
291fbd6295dSLokesh Vutla {
292fbd6295dSLokesh Vutla int ind = get_sys_clk_index();
293fbd6295dSLokesh Vutla int freq = am335x_get_efuse_mpu_max_freq(cdev);
294fbd6295dSLokesh Vutla
295fbd6295dSLokesh Vutla if (bone_not_connected_to_ac_power())
296fbd6295dSLokesh Vutla freq = MPUPLL_M_600;
297fbd6295dSLokesh Vutla
298fbd6295dSLokesh Vutla if (board_is_bone_lt())
299fbd6295dSLokesh Vutla freq = MPUPLL_M_1000;
300fbd6295dSLokesh Vutla
301fbd6295dSLokesh Vutla switch (freq) {
302fbd6295dSLokesh Vutla case MPUPLL_M_1000:
303fbd6295dSLokesh Vutla return &dpll_mpu_opp[ind][5];
304fbd6295dSLokesh Vutla case MPUPLL_M_800:
305fbd6295dSLokesh Vutla return &dpll_mpu_opp[ind][4];
306fbd6295dSLokesh Vutla case MPUPLL_M_720:
307fbd6295dSLokesh Vutla return &dpll_mpu_opp[ind][3];
308fbd6295dSLokesh Vutla case MPUPLL_M_600:
309fbd6295dSLokesh Vutla return &dpll_mpu_opp[ind][2];
310fbd6295dSLokesh Vutla case MPUPLL_M_500:
311fbd6295dSLokesh Vutla return &dpll_mpu_opp100;
312fbd6295dSLokesh Vutla case MPUPLL_M_300:
313fbd6295dSLokesh Vutla return &dpll_mpu_opp[ind][0];
314fbd6295dSLokesh Vutla }
315fbd6295dSLokesh Vutla
316fbd6295dSLokesh Vutla return &dpll_mpu_opp[ind][0];
31706507988SLokesh Vutla }
3189721027aSTom Rini
scale_vcores_bone(int freq)31906507988SLokesh Vutla static void scale_vcores_bone(int freq)
32006507988SLokesh Vutla {
32106507988SLokesh Vutla int usb_cur_lim, mpu_vdd;
3229721027aSTom Rini
3239721027aSTom Rini /*
3249721027aSTom Rini * Only perform PMIC configurations if board rev > A1
3259721027aSTom Rini * on Beaglebone White
3269721027aSTom Rini */
327770e68c0SNishanth Menon if (board_is_bone() && !strncmp(board_ti_get_rev(), "00A1", 4))
3289721027aSTom Rini return;
3299721027aSTom Rini
3309721027aSTom Rini if (i2c_probe(TPS65217_CHIP_PM))
3319721027aSTom Rini return;
3329721027aSTom Rini
3339721027aSTom Rini /*
3349721027aSTom Rini * On Beaglebone White we need to ensure we have AC power
3359721027aSTom Rini * before increasing the frequency.
3369721027aSTom Rini */
337fbd6295dSLokesh Vutla if (bone_not_connected_to_ac_power())
33806507988SLokesh Vutla freq = MPUPLL_M_600;
3399721027aSTom Rini
3409721027aSTom Rini /*
3419721027aSTom Rini * Override what we have detected since we know if we have
3429721027aSTom Rini * a Beaglebone Black it supports 1GHz.
3439721027aSTom Rini */
344770e68c0SNishanth Menon if (board_is_bone_lt())
34506507988SLokesh Vutla freq = MPUPLL_M_1000;
3469721027aSTom Rini
34706507988SLokesh Vutla switch (freq) {
34806507988SLokesh Vutla case MPUPLL_M_1000:
34906507988SLokesh Vutla mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
35006507988SLokesh Vutla usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
35106507988SLokesh Vutla break;
35206507988SLokesh Vutla case MPUPLL_M_800:
35306507988SLokesh Vutla mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
3549f7923c7SLokesh Vutla usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
35506507988SLokesh Vutla break;
35606507988SLokesh Vutla case MPUPLL_M_720:
35706507988SLokesh Vutla mpu_vdd = TPS65217_DCDC_VOLT_SEL_1200MV;
3589f7923c7SLokesh Vutla usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
35906507988SLokesh Vutla break;
36006507988SLokesh Vutla case MPUPLL_M_600:
36106507988SLokesh Vutla case MPUPLL_M_500:
36206507988SLokesh Vutla case MPUPLL_M_300:
3639f7923c7SLokesh Vutla default:
36406507988SLokesh Vutla mpu_vdd = TPS65217_DCDC_VOLT_SEL_1100MV;
36506507988SLokesh Vutla usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
36606507988SLokesh Vutla break;
36706507988SLokesh Vutla }
36806507988SLokesh Vutla
3699721027aSTom Rini if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE,
3709721027aSTom Rini TPS65217_POWER_PATH,
3719721027aSTom Rini usb_cur_lim,
3729721027aSTom Rini TPS65217_USB_INPUT_CUR_LIMIT_MASK))
3739721027aSTom Rini puts("tps65217_reg_write failure\n");
3749721027aSTom Rini
37506507988SLokesh Vutla /* Set DCDC3 (CORE) voltage to 1.10V */
37652f7d844SSteve Kipisz if (tps65217_voltage_update(TPS65217_DEFDCDC3,
37706507988SLokesh Vutla TPS65217_DCDC_VOLT_SEL_1100MV)) {
37852f7d844SSteve Kipisz puts("tps65217_voltage_update failure\n");
37952f7d844SSteve Kipisz return;
38052f7d844SSteve Kipisz }
38152f7d844SSteve Kipisz
3829721027aSTom Rini /* Set DCDC2 (MPU) voltage */
3839721027aSTom Rini if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
3849721027aSTom Rini puts("tps65217_voltage_update failure\n");
3859721027aSTom Rini return;
3869721027aSTom Rini }
3879721027aSTom Rini
3889721027aSTom Rini /*
3899721027aSTom Rini * Set LDO3, LDO4 output voltage to 3.3V for Beaglebone.
3909721027aSTom Rini * Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black.
3919721027aSTom Rini */
392770e68c0SNishanth Menon if (board_is_bone()) {
3939721027aSTom Rini if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
3949721027aSTom Rini TPS65217_DEFLS1,
3959721027aSTom Rini TPS65217_LDO_VOLTAGE_OUT_3_3,
3969721027aSTom Rini TPS65217_LDO_MASK))
3979721027aSTom Rini puts("tps65217_reg_write failure\n");
3989721027aSTom Rini } else {
3999721027aSTom Rini if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
4009721027aSTom Rini TPS65217_DEFLS1,
4019721027aSTom Rini TPS65217_LDO_VOLTAGE_OUT_1_8,
4029721027aSTom Rini TPS65217_LDO_MASK))
4039721027aSTom Rini puts("tps65217_reg_write failure\n");
4049721027aSTom Rini }
4059721027aSTom Rini
4069721027aSTom Rini if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
4079721027aSTom Rini TPS65217_DEFLS2,
4089721027aSTom Rini TPS65217_LDO_VOLTAGE_OUT_3_3,
4099721027aSTom Rini TPS65217_LDO_MASK))
4109721027aSTom Rini puts("tps65217_reg_write failure\n");
41106507988SLokesh Vutla }
41206507988SLokesh Vutla
scale_vcores_generic(int freq)41306507988SLokesh Vutla void scale_vcores_generic(int freq)
41406507988SLokesh Vutla {
41506507988SLokesh Vutla int sil_rev, mpu_vdd;
4169721027aSTom Rini
4179721027aSTom Rini /*
4189721027aSTom Rini * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
4199721027aSTom Rini * MPU frequencies we support we use a CORE voltage of
42006507988SLokesh Vutla * 1.10V. For MPU voltage we need to switch based on
4219721027aSTom Rini * the frequency we are running at.
4229721027aSTom Rini */
4239721027aSTom Rini if (i2c_probe(TPS65910_CTRL_I2C_ADDR))
4249721027aSTom Rini return;
4259721027aSTom Rini
4269721027aSTom Rini /*
4279721027aSTom Rini * Depending on MPU clock and PG we will need a different
4289721027aSTom Rini * VDD to drive at that speed.
4299721027aSTom Rini */
4309721027aSTom Rini sil_rev = readl(&cdev->deviceid) >> 28;
43106507988SLokesh Vutla mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, freq);
4329721027aSTom Rini
4339721027aSTom Rini /* Tell the TPS65910 to use i2c */
4349721027aSTom Rini tps65910_set_i2c_control();
4359721027aSTom Rini
4369721027aSTom Rini /* First update MPU voltage. */
4379721027aSTom Rini if (tps65910_voltage_update(MPU, mpu_vdd))
4389721027aSTom Rini return;
4399721027aSTom Rini
4409721027aSTom Rini /* Second, update the CORE voltage. */
44106507988SLokesh Vutla if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_0))
4429721027aSTom Rini return;
44352f7d844SSteve Kipisz
4449721027aSTom Rini }
4459721027aSTom Rini
gpi2c_init(void)44606507988SLokesh Vutla void gpi2c_init(void)
44794d77fb6SLokesh Vutla {
44806507988SLokesh Vutla /* When needed to be invoked prior to BSS initialization */
44906507988SLokesh Vutla static bool first_time = true;
45006507988SLokesh Vutla
45106507988SLokesh Vutla if (first_time) {
45206507988SLokesh Vutla enable_i2c0_pin_mux();
45306507988SLokesh Vutla i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
45406507988SLokesh Vutla CONFIG_SYS_OMAP24_I2C_SLAVE);
45506507988SLokesh Vutla first_time = false;
45606507988SLokesh Vutla }
45706507988SLokesh Vutla }
45806507988SLokesh Vutla
scale_vcores(void)45906507988SLokesh Vutla void scale_vcores(void)
46006507988SLokesh Vutla {
46106507988SLokesh Vutla int freq;
46206507988SLokesh Vutla
46306507988SLokesh Vutla gpi2c_init();
46406507988SLokesh Vutla freq = am335x_get_efuse_mpu_max_freq(cdev);
46506507988SLokesh Vutla
4669f7923c7SLokesh Vutla if (board_is_beaglebonex())
46706507988SLokesh Vutla scale_vcores_bone(freq);
46894d77fb6SLokesh Vutla else
46906507988SLokesh Vutla scale_vcores_generic(freq);
47094d77fb6SLokesh Vutla }
47194d77fb6SLokesh Vutla
set_uart_mux_conf(void)4720660481aSHeiko Schocher void set_uart_mux_conf(void)
473e363426eSPeter Korsgaard {
4741286b7f6STom Rini #if CONFIG_CONS_INDEX == 1
475e363426eSPeter Korsgaard enable_uart0_pin_mux();
4761286b7f6STom Rini #elif CONFIG_CONS_INDEX == 2
4776422b70bSAndrew Bradford enable_uart1_pin_mux();
4781286b7f6STom Rini #elif CONFIG_CONS_INDEX == 3
4796422b70bSAndrew Bradford enable_uart2_pin_mux();
4801286b7f6STom Rini #elif CONFIG_CONS_INDEX == 4
4816422b70bSAndrew Bradford enable_uart3_pin_mux();
4821286b7f6STom Rini #elif CONFIG_CONS_INDEX == 5
4836422b70bSAndrew Bradford enable_uart4_pin_mux();
4841286b7f6STom Rini #elif CONFIG_CONS_INDEX == 6
4856422b70bSAndrew Bradford enable_uart5_pin_mux();
4861286b7f6STom Rini #endif
4870660481aSHeiko Schocher }
488e363426eSPeter Korsgaard
set_mux_conf_regs(void)4890660481aSHeiko Schocher void set_mux_conf_regs(void)
4900660481aSHeiko Schocher {
491770e68c0SNishanth Menon enable_board_pin_mux();
4920660481aSHeiko Schocher }
4930660481aSHeiko Schocher
494965de8b9SLokesh Vutla const struct ctrl_ioregs ioregs_evmsk = {
495965de8b9SLokesh Vutla .cm0ioctl = MT41J128MJT125_IOCTRL_VALUE,
496965de8b9SLokesh Vutla .cm1ioctl = MT41J128MJT125_IOCTRL_VALUE,
497965de8b9SLokesh Vutla .cm2ioctl = MT41J128MJT125_IOCTRL_VALUE,
498965de8b9SLokesh Vutla .dt0ioctl = MT41J128MJT125_IOCTRL_VALUE,
499965de8b9SLokesh Vutla .dt1ioctl = MT41J128MJT125_IOCTRL_VALUE,
500965de8b9SLokesh Vutla };
501965de8b9SLokesh Vutla
502965de8b9SLokesh Vutla const struct ctrl_ioregs ioregs_bonelt = {
503965de8b9SLokesh Vutla .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
504965de8b9SLokesh Vutla .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
505965de8b9SLokesh Vutla .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
506965de8b9SLokesh Vutla .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
507965de8b9SLokesh Vutla .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE,
508965de8b9SLokesh Vutla };
509965de8b9SLokesh Vutla
510965de8b9SLokesh Vutla const struct ctrl_ioregs ioregs_evm15 = {
511965de8b9SLokesh Vutla .cm0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
512965de8b9SLokesh Vutla .cm1ioctl = MT41J512M8RH125_IOCTRL_VALUE,
513965de8b9SLokesh Vutla .cm2ioctl = MT41J512M8RH125_IOCTRL_VALUE,
514965de8b9SLokesh Vutla .dt0ioctl = MT41J512M8RH125_IOCTRL_VALUE,
515965de8b9SLokesh Vutla .dt1ioctl = MT41J512M8RH125_IOCTRL_VALUE,
516965de8b9SLokesh Vutla };
517965de8b9SLokesh Vutla
518965de8b9SLokesh Vutla const struct ctrl_ioregs ioregs = {
519965de8b9SLokesh Vutla .cm0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
520965de8b9SLokesh Vutla .cm1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
521965de8b9SLokesh Vutla .cm2ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
522965de8b9SLokesh Vutla .dt0ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
523965de8b9SLokesh Vutla .dt1ioctl = MT47H128M16RT25E_IOCTRL_VALUE,
524965de8b9SLokesh Vutla };
525965de8b9SLokesh Vutla
sdram_init(void)5260660481aSHeiko Schocher void sdram_init(void)
5270660481aSHeiko Schocher {
528770e68c0SNishanth Menon if (board_is_evm_sk()) {
529e363426eSPeter Korsgaard /*
530e363426eSPeter Korsgaard * EVM SK 1.2A and later use gpio0_7 to enable DDR3.
531e363426eSPeter Korsgaard * This is safe enough to do on older revs.
532e363426eSPeter Korsgaard */
533e363426eSPeter Korsgaard gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
534e363426eSPeter Korsgaard gpio_direction_output(GPIO_DDR_VTT_EN, 1);
535e363426eSPeter Korsgaard }
536e363426eSPeter Korsgaard
537d8ff4fdbSLokesh Vutla if (board_is_icev2()) {
538d8ff4fdbSLokesh Vutla gpio_request(ICE_GPIO_DDR_VTT_EN, "ddr_vtt_en");
539d8ff4fdbSLokesh Vutla gpio_direction_output(ICE_GPIO_DDR_VTT_EN, 1);
540d8ff4fdbSLokesh Vutla }
541d8ff4fdbSLokesh Vutla
542770e68c0SNishanth Menon if (board_is_evm_sk())
543965de8b9SLokesh Vutla config_ddr(303, &ioregs_evmsk, &ddr3_data,
5443ba65f97SMatt Porter &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
545770e68c0SNishanth Menon else if (board_is_bone_lt())
546965de8b9SLokesh Vutla config_ddr(400, &ioregs_bonelt,
547c7ba18adSTom Rini &ddr3_beagleblack_data,
548c7ba18adSTom Rini &ddr3_beagleblack_cmd_ctrl_data,
549c7ba18adSTom Rini &ddr3_beagleblack_emif_reg_data, 0);
550770e68c0SNishanth Menon else if (board_is_evm_15_or_later())
551965de8b9SLokesh Vutla config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
5523ba65f97SMatt Porter &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
553d8ff4fdbSLokesh Vutla else if (board_is_icev2())
554d8ff4fdbSLokesh Vutla config_ddr(400, &ioregs_evmsk, &ddr3_icev2_data,
555d8ff4fdbSLokesh Vutla &ddr3_icev2_cmd_ctrl_data, &ddr3_icev2_emif_reg_data,
556d8ff4fdbSLokesh Vutla 0);
5578c17cbdfSJyri Sarha else if (board_is_gp_evm())
5588c17cbdfSJyri Sarha config_ddr(266, &ioregs, &ddr2_data,
5598c17cbdfSJyri Sarha &ddr2_cmd_ctrl_data, &ddr2_evm_emif_reg_data, 0);
560c00f69dbSPeter Korsgaard else
561965de8b9SLokesh Vutla config_ddr(266, &ioregs, &ddr2_data,
5623ba65f97SMatt Porter &ddr2_cmd_ctrl_data, &ddr2_emif_reg_data, 0);
563e363426eSPeter Korsgaard }
5640660481aSHeiko Schocher #endif
565e363426eSPeter Korsgaard
566e607ec99SRoger Quadros #if !defined(CONFIG_SPL_BUILD) || \
56797f3a178SLokesh Vutla (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
request_and_set_gpio(int gpio,char * name,int val)568e607ec99SRoger Quadros static void request_and_set_gpio(int gpio, char *name, int val)
56997f3a178SLokesh Vutla {
57097f3a178SLokesh Vutla int ret;
57197f3a178SLokesh Vutla
57297f3a178SLokesh Vutla ret = gpio_request(gpio, name);
57397f3a178SLokesh Vutla if (ret < 0) {
57497f3a178SLokesh Vutla printf("%s: Unable to request %s\n", __func__, name);
57597f3a178SLokesh Vutla return;
57697f3a178SLokesh Vutla }
57797f3a178SLokesh Vutla
57897f3a178SLokesh Vutla ret = gpio_direction_output(gpio, 0);
57997f3a178SLokesh Vutla if (ret < 0) {
58097f3a178SLokesh Vutla printf("%s: Unable to set %s as output\n", __func__, name);
58197f3a178SLokesh Vutla goto err_free_gpio;
58297f3a178SLokesh Vutla }
58397f3a178SLokesh Vutla
584e607ec99SRoger Quadros gpio_set_value(gpio, val);
58597f3a178SLokesh Vutla
58697f3a178SLokesh Vutla return;
58797f3a178SLokesh Vutla
58897f3a178SLokesh Vutla err_free_gpio:
58997f3a178SLokesh Vutla gpio_free(gpio);
59097f3a178SLokesh Vutla }
59197f3a178SLokesh Vutla
592e607ec99SRoger Quadros #define REQUEST_AND_SET_GPIO(N) request_and_set_gpio(N, #N, 1);
593e607ec99SRoger Quadros #define REQUEST_AND_CLR_GPIO(N) request_and_set_gpio(N, #N, 0);
59497f3a178SLokesh Vutla
59597f3a178SLokesh Vutla /**
59697f3a178SLokesh Vutla * RMII mode on ICEv2 board needs 50MHz clock. Given the clock
59797f3a178SLokesh Vutla * synthesizer With a capacitor of 18pF, and 25MHz input clock cycle
59897f3a178SLokesh Vutla * PLL1 gives an output of 100MHz. So, configuring the div2/3 as 2 to
59997f3a178SLokesh Vutla * give 50MHz output for Eth0 and 1.
60097f3a178SLokesh Vutla */
60197f3a178SLokesh Vutla static struct clk_synth cdce913_data = {
60297f3a178SLokesh Vutla .id = 0x81,
60397f3a178SLokesh Vutla .capacitor = 0x90,
60497f3a178SLokesh Vutla .mux = 0x6d,
60597f3a178SLokesh Vutla .pdiv2 = 0x2,
60697f3a178SLokesh Vutla .pdiv3 = 0x2,
60797f3a178SLokesh Vutla };
60897f3a178SLokesh Vutla #endif
60997f3a178SLokesh Vutla
610e363426eSPeter Korsgaard /*
611e363426eSPeter Korsgaard * Basic board specific setup. Pinmux has been handled already.
612e363426eSPeter Korsgaard */
board_init(void)613e363426eSPeter Korsgaard int board_init(void)
614e363426eSPeter Korsgaard {
6156843918eSTom Rini #if defined(CONFIG_HW_WATCHDOG)
6166843918eSTom Rini hw_watchdog_init();
6176843918eSTom Rini #endif
6186843918eSTom Rini
61973feefdcSTom Rini gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
6202c17e6d1Spekon gupta #if defined(CONFIG_NOR) || defined(CONFIG_NAND)
62198b5c269SIlya Yanok gpmc_init();
622cd8845d7SSteve Kipisz #endif
62397f3a178SLokesh Vutla
624e607ec99SRoger Quadros #if !defined(CONFIG_SPL_BUILD) || \
625e607ec99SRoger Quadros (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
62697f3a178SLokesh Vutla if (board_is_icev2()) {
627e607ec99SRoger Quadros int rv;
628e607ec99SRoger Quadros u32 reg;
629e607ec99SRoger Quadros
63097f3a178SLokesh Vutla REQUEST_AND_SET_GPIO(GPIO_PR1_MII_CTRL);
631e607ec99SRoger Quadros /* Make J19 status available on GPIO1_26 */
632e607ec99SRoger Quadros REQUEST_AND_CLR_GPIO(GPIO_MUX_MII_CTRL);
633e607ec99SRoger Quadros
63497f3a178SLokesh Vutla REQUEST_AND_SET_GPIO(GPIO_FET_SWITCH_CTRL);
635e607ec99SRoger Quadros /*
636e607ec99SRoger Quadros * Both ports can be set as RMII-CPSW or MII-PRU-ETH using
637e607ec99SRoger Quadros * jumpers near the port. Read the jumper value and set
638e607ec99SRoger Quadros * the pinmux, external mux and PHY clock accordingly.
639e607ec99SRoger Quadros * As jumper line is overridden by PHY RX_DV pin immediately
640e607ec99SRoger Quadros * after bootstrap (power-up/reset), we need to sample
641e607ec99SRoger Quadros * it during PHY reset using GPIO rising edge detection.
642e607ec99SRoger Quadros */
64397f3a178SLokesh Vutla REQUEST_AND_SET_GPIO(GPIO_PHY_RESET);
644e607ec99SRoger Quadros /* Enable rising edge IRQ on GPIO0_11 and GPIO 1_26 */
645e607ec99SRoger Quadros reg = readl(GPIO0_RISINGDETECT) | BIT(11);
646e607ec99SRoger Quadros writel(reg, GPIO0_RISINGDETECT);
647e607ec99SRoger Quadros reg = readl(GPIO1_RISINGDETECT) | BIT(26);
648e607ec99SRoger Quadros writel(reg, GPIO1_RISINGDETECT);
649e607ec99SRoger Quadros /* Reset PHYs to capture the Jumper setting */
650e607ec99SRoger Quadros gpio_set_value(GPIO_PHY_RESET, 0);
651e607ec99SRoger Quadros udelay(2); /* PHY datasheet states 1uS min. */
652e607ec99SRoger Quadros gpio_set_value(GPIO_PHY_RESET, 1);
653e607ec99SRoger Quadros
654e607ec99SRoger Quadros reg = readl(GPIO0_IRQSTATUSRAW) & BIT(11);
655e607ec99SRoger Quadros if (reg) {
656e607ec99SRoger Quadros writel(reg, GPIO0_IRQSTATUS1); /* clear irq */
657e607ec99SRoger Quadros /* RMII mode */
658e607ec99SRoger Quadros printf("ETH0, CPSW\n");
659e607ec99SRoger Quadros } else {
660e607ec99SRoger Quadros /* MII mode */
661e607ec99SRoger Quadros printf("ETH0, PRU\n");
662e607ec99SRoger Quadros cdce913_data.pdiv3 = 4; /* 25MHz PHY clk */
663e607ec99SRoger Quadros }
664e607ec99SRoger Quadros
665e607ec99SRoger Quadros reg = readl(GPIO1_IRQSTATUSRAW) & BIT(26);
666e607ec99SRoger Quadros if (reg) {
667e607ec99SRoger Quadros writel(reg, GPIO1_IRQSTATUS1); /* clear irq */
668e607ec99SRoger Quadros /* RMII mode */
669e607ec99SRoger Quadros printf("ETH1, CPSW\n");
670e607ec99SRoger Quadros gpio_set_value(GPIO_MUX_MII_CTRL, 1);
671e607ec99SRoger Quadros } else {
672e607ec99SRoger Quadros /* MII mode */
673e607ec99SRoger Quadros printf("ETH1, PRU\n");
674e607ec99SRoger Quadros cdce913_data.pdiv2 = 4; /* 25MHz PHY clk */
675e607ec99SRoger Quadros }
676e607ec99SRoger Quadros
677e607ec99SRoger Quadros /* disable rising edge IRQs */
678e607ec99SRoger Quadros reg = readl(GPIO0_RISINGDETECT) & ~BIT(11);
679e607ec99SRoger Quadros writel(reg, GPIO0_RISINGDETECT);
680e607ec99SRoger Quadros reg = readl(GPIO1_RISINGDETECT) & ~BIT(26);
681e607ec99SRoger Quadros writel(reg, GPIO1_RISINGDETECT);
68297f3a178SLokesh Vutla
68397f3a178SLokesh Vutla rv = setup_clock_synthesizer(&cdce913_data);
68497f3a178SLokesh Vutla if (rv) {
68597f3a178SLokesh Vutla printf("Clock synthesizer setup failed %d\n", rv);
68697f3a178SLokesh Vutla return rv;
68797f3a178SLokesh Vutla }
688e607ec99SRoger Quadros
689e607ec99SRoger Quadros /* reset PHYs */
690e607ec99SRoger Quadros gpio_set_value(GPIO_PHY_RESET, 0);
691e607ec99SRoger Quadros udelay(2); /* PHY datasheet states 1uS min. */
692e607ec99SRoger Quadros gpio_set_value(GPIO_PHY_RESET, 1);
69397f3a178SLokesh Vutla }
69497f3a178SLokesh Vutla #endif
69597f3a178SLokesh Vutla
696e363426eSPeter Korsgaard return 0;
697e363426eSPeter Korsgaard }
698e363426eSPeter Korsgaard
699044fc14bSTom Rini #ifdef CONFIG_BOARD_LATE_INIT
board_late_init(void)700044fc14bSTom Rini int board_late_init(void)
701044fc14bSTom Rini {
702f411b5ccSRoger Quadros #if !defined(CONFIG_SPL_BUILD)
703f411b5ccSRoger Quadros uint8_t mac_addr[6];
704f411b5ccSRoger Quadros uint32_t mac_hi, mac_lo;
705f411b5ccSRoger Quadros #endif
706f411b5ccSRoger Quadros
707044fc14bSTom Rini #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
708770e68c0SNishanth Menon char *name = NULL;
709ace4275eSTom Rini
7104015949fSrobertcnelson@gmail.com if (board_is_bone_lt()) {
7114015949fSrobertcnelson@gmail.com /* BeagleBoard.org BeagleBone Black Wireless: */
7124015949fSrobertcnelson@gmail.com if (!strncmp(board_ti_get_rev(), "BWA", 3)) {
7134015949fSrobertcnelson@gmail.com name = "BBBW";
7144015949fSrobertcnelson@gmail.com }
7152b79fba6Srobertcnelson@gmail.com /* SeeedStudio BeagleBone Green Wireless */
7162b79fba6Srobertcnelson@gmail.com if (!strncmp(board_ti_get_rev(), "GW1", 3)) {
7172b79fba6Srobertcnelson@gmail.com name = "BBGW";
7182b79fba6Srobertcnelson@gmail.com }
71952609d75Srobertcnelson@gmail.com /* BeagleBoard.org BeagleBone Blue */
72052609d75Srobertcnelson@gmail.com if (!strncmp(board_ti_get_rev(), "BLA", 3)) {
72152609d75Srobertcnelson@gmail.com name = "BBBL";
72252609d75Srobertcnelson@gmail.com }
7234015949fSrobertcnelson@gmail.com }
7244015949fSrobertcnelson@gmail.com
725770e68c0SNishanth Menon if (board_is_bbg1())
726770e68c0SNishanth Menon name = "BBG1";
727770e68c0SNishanth Menon set_board_info_env(name);
7285d4d436cSLokesh Vutla
7295d4d436cSLokesh Vutla /*
7305d4d436cSLokesh Vutla * Default FIT boot on HS devices. Non FIT images are not allowed
7315d4d436cSLokesh Vutla * on HS devices.
7325d4d436cSLokesh Vutla */
7335d4d436cSLokesh Vutla if (get_device_type() == HS_DEVICE)
734382bee57SSimon Glass env_set("boot_fit", "1");
735044fc14bSTom Rini #endif
736044fc14bSTom Rini
737f411b5ccSRoger Quadros #if !defined(CONFIG_SPL_BUILD)
738f411b5ccSRoger Quadros /* try reading mac address from efuse */
739f411b5ccSRoger Quadros mac_lo = readl(&cdev->macid0l);
740f411b5ccSRoger Quadros mac_hi = readl(&cdev->macid0h);
741f411b5ccSRoger Quadros mac_addr[0] = mac_hi & 0xFF;
742f411b5ccSRoger Quadros mac_addr[1] = (mac_hi & 0xFF00) >> 8;
743f411b5ccSRoger Quadros mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
744f411b5ccSRoger Quadros mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
745f411b5ccSRoger Quadros mac_addr[4] = mac_lo & 0xFF;
746f411b5ccSRoger Quadros mac_addr[5] = (mac_lo & 0xFF00) >> 8;
747f411b5ccSRoger Quadros
74800caae6dSSimon Glass if (!env_get("ethaddr")) {
749f411b5ccSRoger Quadros printf("<ethaddr> not set. Validating first E-fuse MAC\n");
750f411b5ccSRoger Quadros
751f411b5ccSRoger Quadros if (is_valid_ethaddr(mac_addr))
752fd1e959eSSimon Glass eth_env_set_enetaddr("ethaddr", mac_addr);
753f411b5ccSRoger Quadros }
754f411b5ccSRoger Quadros
755f411b5ccSRoger Quadros mac_lo = readl(&cdev->macid1l);
756f411b5ccSRoger Quadros mac_hi = readl(&cdev->macid1h);
757f411b5ccSRoger Quadros mac_addr[0] = mac_hi & 0xFF;
758f411b5ccSRoger Quadros mac_addr[1] = (mac_hi & 0xFF00) >> 8;
759f411b5ccSRoger Quadros mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
760f411b5ccSRoger Quadros mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
761f411b5ccSRoger Quadros mac_addr[4] = mac_lo & 0xFF;
762f411b5ccSRoger Quadros mac_addr[5] = (mac_lo & 0xFF00) >> 8;
763f411b5ccSRoger Quadros
76400caae6dSSimon Glass if (!env_get("eth1addr")) {
765f411b5ccSRoger Quadros if (is_valid_ethaddr(mac_addr))
766fd1e959eSSimon Glass eth_env_set_enetaddr("eth1addr", mac_addr);
767f411b5ccSRoger Quadros }
768f411b5ccSRoger Quadros #endif
769f411b5ccSRoger Quadros
770044fc14bSTom Rini return 0;
771044fc14bSTom Rini }
772044fc14bSTom Rini #endif
773044fc14bSTom Rini
774bd83e3dfSMugunthan V N #ifndef CONFIG_DM_ETH
775bd83e3dfSMugunthan V N
776c0e66793SIlya Yanok #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
777c0e66793SIlya Yanok (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
cpsw_control(int enabled)778e363426eSPeter Korsgaard static void cpsw_control(int enabled)
779e363426eSPeter Korsgaard {
780e363426eSPeter Korsgaard /* VTP can be added here */
781e363426eSPeter Korsgaard
782e363426eSPeter Korsgaard return;
783e363426eSPeter Korsgaard }
784e363426eSPeter Korsgaard
785e363426eSPeter Korsgaard static struct cpsw_slave_data cpsw_slaves[] = {
786e363426eSPeter Korsgaard {
787e363426eSPeter Korsgaard .slave_reg_ofs = 0x208,
788e363426eSPeter Korsgaard .sliver_reg_ofs = 0xd80,
7899c653aadSMugunthan V N .phy_addr = 0,
790e363426eSPeter Korsgaard },
791e363426eSPeter Korsgaard {
792e363426eSPeter Korsgaard .slave_reg_ofs = 0x308,
793e363426eSPeter Korsgaard .sliver_reg_ofs = 0xdc0,
7949c653aadSMugunthan V N .phy_addr = 1,
795e363426eSPeter Korsgaard },
796e363426eSPeter Korsgaard };
797e363426eSPeter Korsgaard
798e363426eSPeter Korsgaard static struct cpsw_platform_data cpsw_data = {
79981df2babSMatt Porter .mdio_base = CPSW_MDIO_BASE,
80081df2babSMatt Porter .cpsw_base = CPSW_BASE,
801e363426eSPeter Korsgaard .mdio_div = 0xff,
802e363426eSPeter Korsgaard .channels = 8,
803e363426eSPeter Korsgaard .cpdma_reg_ofs = 0x800,
804e363426eSPeter Korsgaard .slaves = 1,
805e363426eSPeter Korsgaard .slave_data = cpsw_slaves,
806e363426eSPeter Korsgaard .ale_reg_ofs = 0xd00,
807e363426eSPeter Korsgaard .ale_entries = 1024,
808e363426eSPeter Korsgaard .host_port_reg_ofs = 0x108,
809e363426eSPeter Korsgaard .hw_stats_reg_ofs = 0x900,
8102bf36ac6SMugunthan V N .bd_ram_ofs = 0x2000,
811e363426eSPeter Korsgaard .mac_control = (1 << 5),
812e363426eSPeter Korsgaard .control = cpsw_control,
813e363426eSPeter Korsgaard .host_port_num = 0,
814e363426eSPeter Korsgaard .version = CPSW_CTRL_VERSION_2,
815e363426eSPeter Korsgaard };
816d2aa1154SIlya Yanok #endif
817e363426eSPeter Korsgaard
81897f3a178SLokesh Vutla #if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) &&\
81997f3a178SLokesh Vutla defined(CONFIG_SPL_BUILD)) || \
82097f3a178SLokesh Vutla ((defined(CONFIG_DRIVER_TI_CPSW) || \
82197f3a178SLokesh Vutla defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \
82297f3a178SLokesh Vutla !defined(CONFIG_SPL_BUILD))
82397f3a178SLokesh Vutla
82468996b84STom Rini /*
82568996b84STom Rini * This function will:
82668996b84STom Rini * Read the eFuse for MAC addresses, and set ethaddr/eth1addr/usbnet_devaddr
82768996b84STom Rini * in the environment
82868996b84STom Rini * Perform fixups to the PHY present on certain boards. We only need this
82968996b84STom Rini * function in:
83068996b84STom Rini * - SPL with either CPSW or USB ethernet support
83168996b84STom Rini * - Full U-Boot, with either CPSW or USB ethernet
83268996b84STom Rini * Build in only these cases to avoid warnings about unused variables
83368996b84STom Rini * when we build an SPL that has neither option but full U-Boot will.
83468996b84STom Rini */
board_eth_init(bd_t * bis)835e363426eSPeter Korsgaard int board_eth_init(bd_t *bis)
836e363426eSPeter Korsgaard {
837d2aa1154SIlya Yanok int rv, n = 0;
838f411b5ccSRoger Quadros #if defined(CONFIG_USB_ETHER) && \
839f411b5ccSRoger Quadros (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT))
840e363426eSPeter Korsgaard uint8_t mac_addr[6];
841e363426eSPeter Korsgaard uint32_t mac_hi, mac_lo;
842e363426eSPeter Korsgaard
843f411b5ccSRoger Quadros /*
844f411b5ccSRoger Quadros * use efuse mac address for USB ethernet as we know that
845f411b5ccSRoger Quadros * both CPSW and USB ethernet will never be active at the same time
846f411b5ccSRoger Quadros */
847e363426eSPeter Korsgaard mac_lo = readl(&cdev->macid0l);
848e363426eSPeter Korsgaard mac_hi = readl(&cdev->macid0h);
849e363426eSPeter Korsgaard mac_addr[0] = mac_hi & 0xFF;
850e363426eSPeter Korsgaard mac_addr[1] = (mac_hi & 0xFF00) >> 8;
851e363426eSPeter Korsgaard mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
852e363426eSPeter Korsgaard mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
853e363426eSPeter Korsgaard mac_addr[4] = mac_lo & 0xFF;
854e363426eSPeter Korsgaard mac_addr[5] = (mac_lo & 0xFF00) >> 8;
855f411b5ccSRoger Quadros #endif
856f411b5ccSRoger Quadros
857e363426eSPeter Korsgaard
858c0e66793SIlya Yanok #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \
859c0e66793SIlya Yanok (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD))
860e363426eSPeter Korsgaard
861a662e0c3SJoel A Fernandes #ifdef CONFIG_DRIVER_TI_CPSW
862770e68c0SNishanth Menon if (board_is_bone() || board_is_bone_lt() ||
863770e68c0SNishanth Menon board_is_idk()) {
864e363426eSPeter Korsgaard writel(MII_MODE_ENABLE, &cdev->miisel);
865e363426eSPeter Korsgaard cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
866e363426eSPeter Korsgaard PHY_INTERFACE_MODE_MII;
86797f3a178SLokesh Vutla } else if (board_is_icev2()) {
86897f3a178SLokesh Vutla writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
86997f3a178SLokesh Vutla cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
87097f3a178SLokesh Vutla cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_RMII;
87197f3a178SLokesh Vutla cpsw_slaves[0].phy_addr = 1;
87297f3a178SLokesh Vutla cpsw_slaves[1].phy_addr = 3;
873e363426eSPeter Korsgaard } else {
874dafd4db3SHeiko Schocher writel((RGMII_MODE_ENABLE | RGMII_INT_DELAY), &cdev->miisel);
875e363426eSPeter Korsgaard cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
876e363426eSPeter Korsgaard PHY_INTERFACE_MODE_RGMII;
877e363426eSPeter Korsgaard }
878e363426eSPeter Korsgaard
879d2aa1154SIlya Yanok rv = cpsw_register(&cpsw_data);
880d2aa1154SIlya Yanok if (rv < 0)
881d2aa1154SIlya Yanok printf("Error %d registering CPSW switch\n", rv);
882d2aa1154SIlya Yanok else
883d2aa1154SIlya Yanok n += rv;
884a662e0c3SJoel A Fernandes #endif
8851634e969STom Rini
8861634e969STom Rini /*
8871634e969STom Rini *
8881634e969STom Rini * CPSW RGMII Internal Delay Mode is not supported in all PVT
8891634e969STom Rini * operating points. So we must set the TX clock delay feature
8901634e969STom Rini * in the AR8051 PHY. Since we only support a single ethernet
8911634e969STom Rini * device in U-Boot, we only do this for the first instance.
8921634e969STom Rini */
8931634e969STom Rini #define AR8051_PHY_DEBUG_ADDR_REG 0x1d
8941634e969STom Rini #define AR8051_PHY_DEBUG_DATA_REG 0x1e
8951634e969STom Rini #define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
8961634e969STom Rini #define AR8051_RGMII_TX_CLK_DLY 0x100
8971634e969STom Rini
898770e68c0SNishanth Menon if (board_is_evm_sk() || board_is_gp_evm()) {
8991634e969STom Rini const char *devname;
9001634e969STom Rini devname = miiphy_get_current_dev();
9011634e969STom Rini
9021634e969STom Rini miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_ADDR_REG,
9031634e969STom Rini AR8051_DEBUG_RGMII_CLK_DLY_REG);
9041634e969STom Rini miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_DATA_REG,
9051634e969STom Rini AR8051_RGMII_TX_CLK_DLY);
9061634e969STom Rini }
907d2aa1154SIlya Yanok #endif
908c0e66793SIlya Yanok #if defined(CONFIG_USB_ETHER) && \
909c0e66793SIlya Yanok (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT))
9100adb5b76SJoe Hershberger if (is_valid_ethaddr(mac_addr))
911fd1e959eSSimon Glass eth_env_set_enetaddr("usbnet_devaddr", mac_addr);
912c0e66793SIlya Yanok
913d2aa1154SIlya Yanok rv = usb_eth_initialize(bis);
914d2aa1154SIlya Yanok if (rv < 0)
915d2aa1154SIlya Yanok printf("Error %d registering USB_ETHER\n", rv);
916d2aa1154SIlya Yanok else
917d2aa1154SIlya Yanok n += rv;
918d2aa1154SIlya Yanok #endif
919d2aa1154SIlya Yanok return n;
920e363426eSPeter Korsgaard }
921e363426eSPeter Korsgaard #endif
922bd83e3dfSMugunthan V N
923bd83e3dfSMugunthan V N #endif /* CONFIG_DM_ETH */
924505ea6e8SLokesh Vutla
925505ea6e8SLokesh Vutla #ifdef CONFIG_SPL_LOAD_FIT
board_fit_config_name_match(const char * name)926505ea6e8SLokesh Vutla int board_fit_config_name_match(const char *name)
927505ea6e8SLokesh Vutla {
928505ea6e8SLokesh Vutla if (board_is_gp_evm() && !strcmp(name, "am335x-evm"))
929505ea6e8SLokesh Vutla return 0;
930505ea6e8SLokesh Vutla else if (board_is_bone() && !strcmp(name, "am335x-bone"))
931505ea6e8SLokesh Vutla return 0;
932505ea6e8SLokesh Vutla else if (board_is_bone_lt() && !strcmp(name, "am335x-boneblack"))
933505ea6e8SLokesh Vutla return 0;
9343819ea70SLokesh Vutla else if (board_is_evm_sk() && !strcmp(name, "am335x-evmsk"))
9353819ea70SLokesh Vutla return 0;
936da9d9599SLokesh Vutla else if (board_is_bbg1() && !strcmp(name, "am335x-bonegreen"))
937da9d9599SLokesh Vutla return 0;
93873ec6960SLokesh Vutla else if (board_is_icev2() && !strcmp(name, "am335x-icev2"))
93973ec6960SLokesh Vutla return 0;
940505ea6e8SLokesh Vutla else
941505ea6e8SLokesh Vutla return -1;
942505ea6e8SLokesh Vutla }
943505ea6e8SLokesh Vutla #endif
944b0a4eea1SAndrew F. Davis
945b0a4eea1SAndrew F. Davis #ifdef CONFIG_TI_SECURE_DEVICE
board_fit_image_post_process(void ** p_image,size_t * p_size)946b0a4eea1SAndrew F. Davis void board_fit_image_post_process(void **p_image, size_t *p_size)
947b0a4eea1SAndrew F. Davis {
948b0a4eea1SAndrew F. Davis secure_boot_verify_image(p_image, p_size);
949b0a4eea1SAndrew F. Davis }
950b0a4eea1SAndrew F. Davis #endif
9514548bc8dSLokesh Vutla
9524548bc8dSLokesh Vutla #if !CONFIG_IS_ENABLED(OF_CONTROL)
9534548bc8dSLokesh Vutla static const struct omap_hsmmc_plat am335x_mmc0_platdata = {
9544548bc8dSLokesh Vutla .base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE,
9554548bc8dSLokesh Vutla .cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_4BIT,
9564548bc8dSLokesh Vutla .cfg.f_min = 400000,
9574548bc8dSLokesh Vutla .cfg.f_max = 52000000,
9584548bc8dSLokesh Vutla .cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195,
9594548bc8dSLokesh Vutla .cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT,
9604548bc8dSLokesh Vutla };
9614548bc8dSLokesh Vutla
9624548bc8dSLokesh Vutla U_BOOT_DEVICE(am335x_mmc0) = {
9634548bc8dSLokesh Vutla .name = "omap_hsmmc",
9644548bc8dSLokesh Vutla .platdata = &am335x_mmc0_platdata,
9654548bc8dSLokesh Vutla };
9664548bc8dSLokesh Vutla
9674548bc8dSLokesh Vutla static const struct omap_hsmmc_plat am335x_mmc1_platdata = {
9684548bc8dSLokesh Vutla .base_addr = (struct hsmmc *)OMAP_HSMMC2_BASE,
9694548bc8dSLokesh Vutla .cfg.host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_8BIT,
9704548bc8dSLokesh Vutla .cfg.f_min = 400000,
9714548bc8dSLokesh Vutla .cfg.f_max = 52000000,
9724548bc8dSLokesh Vutla .cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195,
9734548bc8dSLokesh Vutla .cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT,
9744548bc8dSLokesh Vutla };
9754548bc8dSLokesh Vutla
9764548bc8dSLokesh Vutla U_BOOT_DEVICE(am335x_mmc1) = {
9774548bc8dSLokesh Vutla .name = "omap_hsmmc",
9784548bc8dSLokesh Vutla .platdata = &am335x_mmc1_platdata,
9794548bc8dSLokesh Vutla };
9804548bc8dSLokesh Vutla #endif
981