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 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 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 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(); 253ba9a6708STom Rini if (getenv_yesno("boot_os") != 1) 254ba9a6708STom Rini return 1; 255ba9a6708STom Rini #endif 256ba9a6708STom Rini 257ba9a6708STom Rini return 0; 25812d7a474SPeter Korsgaard } 25912d7a474SPeter Korsgaard #endif 26012d7a474SPeter Korsgaard 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 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 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 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 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 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 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 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 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 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)) 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 */ 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 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 748f411b5ccSRoger Quadros if (!getenv("ethaddr")) { 749f411b5ccSRoger Quadros printf("<ethaddr> not set. Validating first E-fuse MAC\n"); 750f411b5ccSRoger Quadros 751f411b5ccSRoger Quadros if (is_valid_ethaddr(mac_addr)) 752*fd1e959eSSimon 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 764f411b5ccSRoger Quadros if (!getenv("eth1addr")) { 765f411b5ccSRoger Quadros if (is_valid_ethaddr(mac_addr)) 766*fd1e959eSSimon 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)) 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 */ 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)) 911*fd1e959eSSimon 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 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 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