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> 12e363426eSPeter Korsgaard #include <errno.h> 13e363426eSPeter Korsgaard #include <spl.h> 143d16389cSLokesh Vutla #include <serial.h> 15e363426eSPeter Korsgaard #include <asm/arch/cpu.h> 16e363426eSPeter Korsgaard #include <asm/arch/hardware.h> 17e363426eSPeter Korsgaard #include <asm/arch/omap.h> 18e363426eSPeter Korsgaard #include <asm/arch/ddr_defs.h> 19e363426eSPeter Korsgaard #include <asm/arch/clock.h> 2097f3a178SLokesh Vutla #include <asm/arch/clk_synthesizer.h> 21e363426eSPeter Korsgaard #include <asm/arch/gpio.h> 22e363426eSPeter Korsgaard #include <asm/arch/mmc_host_def.h> 23e363426eSPeter Korsgaard #include <asm/arch/sys_proto.h> 24cd8845d7SSteve Kipisz #include <asm/arch/mem.h> 25e363426eSPeter Korsgaard #include <asm/io.h> 26e363426eSPeter Korsgaard #include <asm/emif.h> 27e363426eSPeter Korsgaard #include <asm/gpio.h> 28b0a4eea1SAndrew F. Davis #include <asm/omap_sec_common.h> 29e363426eSPeter Korsgaard #include <i2c.h> 30e363426eSPeter Korsgaard #include <miiphy.h> 31e363426eSPeter Korsgaard #include <cpsw.h> 329721027aSTom Rini #include <power/tps65217.h> 339721027aSTom Rini #include <power/tps65910.h> 346843918eSTom Rini #include <environment.h> 356843918eSTom Rini #include <watchdog.h> 36ba9a6708STom Rini #include <environment.h> 37770e68c0SNishanth Menon #include "../common/board_detect.h" 38e363426eSPeter Korsgaard #include "board.h" 39e363426eSPeter Korsgaard 40e363426eSPeter Korsgaard DECLARE_GLOBAL_DATA_PTR; 41e363426eSPeter Korsgaard 42e363426eSPeter Korsgaard /* GPIO that controls power to DDR on EVM-SK */ 4397f3a178SLokesh Vutla #define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio)) 4497f3a178SLokesh Vutla #define GPIO_DDR_VTT_EN GPIO_TO_PIN(0, 7) 4597f3a178SLokesh Vutla #define ICE_GPIO_DDR_VTT_EN GPIO_TO_PIN(0, 18) 4697f3a178SLokesh Vutla #define GPIO_PR1_MII_CTRL GPIO_TO_PIN(3, 4) 4797f3a178SLokesh Vutla #define GPIO_MUX_MII_CTRL GPIO_TO_PIN(3, 10) 4897f3a178SLokesh Vutla #define GPIO_FET_SWITCH_CTRL GPIO_TO_PIN(0, 7) 4997f3a178SLokesh Vutla #define GPIO_PHY_RESET GPIO_TO_PIN(2, 5) 50e607ec99SRoger Quadros #define GPIO_ETH0_MODE GPIO_TO_PIN(0, 11) 51e607ec99SRoger Quadros #define GPIO_ETH1_MODE GPIO_TO_PIN(1, 26) 52e363426eSPeter Korsgaard 53e363426eSPeter Korsgaard static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; 54e363426eSPeter Korsgaard 55e607ec99SRoger Quadros #define GPIO0_RISINGDETECT (AM33XX_GPIO0_BASE + OMAP_GPIO_RISINGDETECT) 56e607ec99SRoger Quadros #define GPIO1_RISINGDETECT (AM33XX_GPIO1_BASE + OMAP_GPIO_RISINGDETECT) 57e607ec99SRoger Quadros 58e607ec99SRoger Quadros #define GPIO0_IRQSTATUS1 (AM33XX_GPIO0_BASE + OMAP_GPIO_IRQSTATUS1) 59e607ec99SRoger Quadros #define GPIO1_IRQSTATUS1 (AM33XX_GPIO1_BASE + OMAP_GPIO_IRQSTATUS1) 60e607ec99SRoger Quadros 61e607ec99SRoger Quadros #define GPIO0_IRQSTATUSRAW (AM33XX_GPIO0_BASE + 0x024) 62e607ec99SRoger Quadros #define GPIO1_IRQSTATUSRAW (AM33XX_GPIO1_BASE + 0x024) 63e607ec99SRoger Quadros 64e363426eSPeter Korsgaard /* 65e363426eSPeter Korsgaard * Read header information from EEPROM into global structure. 66e363426eSPeter Korsgaard */ 67140d76a9SLokesh Vutla #ifdef CONFIG_TI_I2C_BOARD_DETECT 68140d76a9SLokesh Vutla void do_board_detect(void) 69e363426eSPeter Korsgaard { 70140d76a9SLokesh Vutla enable_i2c0_pin_mux(); 71140d76a9SLokesh Vutla i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE); 72140d76a9SLokesh Vutla 73140d76a9SLokesh Vutla if (ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR)) 74140d76a9SLokesh Vutla printf("ti_i2c_eeprom_init failed\n"); 75e363426eSPeter Korsgaard } 76140d76a9SLokesh Vutla #endif 77e363426eSPeter Korsgaard 783d16389cSLokesh Vutla #ifndef CONFIG_DM_SERIAL 793d16389cSLokesh Vutla struct serial_device *default_serial_console(void) 803d16389cSLokesh Vutla { 813d16389cSLokesh Vutla if (board_is_icev2()) 823d16389cSLokesh Vutla return &eserial4_device; 833d16389cSLokesh Vutla else 843d16389cSLokesh Vutla return &eserial1_device; 853d16389cSLokesh Vutla } 863d16389cSLokesh Vutla #endif 873d16389cSLokesh Vutla 88d0e6d34dSTom Rini #ifndef CONFIG_SKIP_LOWLEVEL_INIT 89c00f69dbSPeter Korsgaard static const struct ddr_data ddr2_data = { 90c4f80f50STom Rini .datardsratio0 = MT47H128M16RT25E_RD_DQS, 91c4f80f50STom Rini .datafwsratio0 = MT47H128M16RT25E_PHY_FIFO_WE, 92c4f80f50STom Rini .datawrsratio0 = MT47H128M16RT25E_PHY_WR_DATA, 93c00f69dbSPeter Korsgaard }; 94c00f69dbSPeter Korsgaard 95c00f69dbSPeter Korsgaard static const struct cmd_control ddr2_cmd_ctrl_data = { 96c7d35befSPeter Korsgaard .cmd0csratio = MT47H128M16RT25E_RATIO, 97c00f69dbSPeter Korsgaard 98c7d35befSPeter Korsgaard .cmd1csratio = MT47H128M16RT25E_RATIO, 99c00f69dbSPeter Korsgaard 100c7d35befSPeter Korsgaard .cmd2csratio = MT47H128M16RT25E_RATIO, 101c00f69dbSPeter Korsgaard }; 102c00f69dbSPeter Korsgaard 103c00f69dbSPeter Korsgaard static const struct emif_regs ddr2_emif_reg_data = { 104c7d35befSPeter Korsgaard .sdram_config = MT47H128M16RT25E_EMIF_SDCFG, 105c7d35befSPeter Korsgaard .ref_ctrl = MT47H128M16RT25E_EMIF_SDREF, 106c7d35befSPeter Korsgaard .sdram_tim1 = MT47H128M16RT25E_EMIF_TIM1, 107c7d35befSPeter Korsgaard .sdram_tim2 = MT47H128M16RT25E_EMIF_TIM2, 108c7d35befSPeter Korsgaard .sdram_tim3 = MT47H128M16RT25E_EMIF_TIM3, 109c7d35befSPeter Korsgaard .emif_ddr_phy_ctlr_1 = MT47H128M16RT25E_EMIF_READ_LATENCY, 110c00f69dbSPeter Korsgaard }; 111c00f69dbSPeter Korsgaard 1128c17cbdfSJyri Sarha static const struct emif_regs ddr2_evm_emif_reg_data = { 1138c17cbdfSJyri Sarha .sdram_config = MT47H128M16RT25E_EMIF_SDCFG, 1148c17cbdfSJyri Sarha .ref_ctrl = MT47H128M16RT25E_EMIF_SDREF, 1158c17cbdfSJyri Sarha .sdram_tim1 = MT47H128M16RT25E_EMIF_TIM1, 1168c17cbdfSJyri Sarha .sdram_tim2 = MT47H128M16RT25E_EMIF_TIM2, 1178c17cbdfSJyri Sarha .sdram_tim3 = MT47H128M16RT25E_EMIF_TIM3, 1188c17cbdfSJyri Sarha .ocp_config = EMIF_OCP_CONFIG_AM335X_EVM, 1198c17cbdfSJyri Sarha .emif_ddr_phy_ctlr_1 = MT47H128M16RT25E_EMIF_READ_LATENCY, 1208c17cbdfSJyri Sarha }; 1218c17cbdfSJyri Sarha 122c00f69dbSPeter Korsgaard static const struct ddr_data ddr3_data = { 123c7d35befSPeter Korsgaard .datardsratio0 = MT41J128MJT125_RD_DQS, 124c7d35befSPeter Korsgaard .datawdsratio0 = MT41J128MJT125_WR_DQS, 125c7d35befSPeter Korsgaard .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE, 126c7d35befSPeter Korsgaard .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA, 127c00f69dbSPeter Korsgaard }; 128c00f69dbSPeter Korsgaard 129c7ba18adSTom Rini static const struct ddr_data ddr3_beagleblack_data = { 130c7ba18adSTom Rini .datardsratio0 = MT41K256M16HA125E_RD_DQS, 131c7ba18adSTom Rini .datawdsratio0 = MT41K256M16HA125E_WR_DQS, 132c7ba18adSTom Rini .datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE, 133c7ba18adSTom Rini .datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA, 134c7ba18adSTom Rini }; 135c7ba18adSTom Rini 13613526f71SJeff Lance static const struct ddr_data ddr3_evm_data = { 13713526f71SJeff Lance .datardsratio0 = MT41J512M8RH125_RD_DQS, 13813526f71SJeff Lance .datawdsratio0 = MT41J512M8RH125_WR_DQS, 13913526f71SJeff Lance .datafwsratio0 = MT41J512M8RH125_PHY_FIFO_WE, 14013526f71SJeff Lance .datawrsratio0 = MT41J512M8RH125_PHY_WR_DATA, 14113526f71SJeff Lance }; 14213526f71SJeff Lance 143d8ff4fdbSLokesh Vutla static const struct ddr_data ddr3_icev2_data = { 144d8ff4fdbSLokesh Vutla .datardsratio0 = MT41J128MJT125_RD_DQS_400MHz, 145d8ff4fdbSLokesh Vutla .datawdsratio0 = MT41J128MJT125_WR_DQS_400MHz, 146d8ff4fdbSLokesh Vutla .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE_400MHz, 147d8ff4fdbSLokesh Vutla .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA_400MHz, 148d8ff4fdbSLokesh Vutla }; 149d8ff4fdbSLokesh Vutla 150c00f69dbSPeter Korsgaard static const struct cmd_control ddr3_cmd_ctrl_data = { 151c7d35befSPeter Korsgaard .cmd0csratio = MT41J128MJT125_RATIO, 152c7d35befSPeter Korsgaard .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT, 153c00f69dbSPeter Korsgaard 154c7d35befSPeter Korsgaard .cmd1csratio = MT41J128MJT125_RATIO, 155c7d35befSPeter Korsgaard .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT, 156c00f69dbSPeter Korsgaard 157c7d35befSPeter Korsgaard .cmd2csratio = MT41J128MJT125_RATIO, 158c7d35befSPeter Korsgaard .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT, 159c00f69dbSPeter Korsgaard }; 160c00f69dbSPeter Korsgaard 161c7ba18adSTom Rini static const struct cmd_control ddr3_beagleblack_cmd_ctrl_data = { 162c7ba18adSTom Rini .cmd0csratio = MT41K256M16HA125E_RATIO, 163c7ba18adSTom Rini .cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 164c7ba18adSTom Rini 165c7ba18adSTom Rini .cmd1csratio = MT41K256M16HA125E_RATIO, 166c7ba18adSTom Rini .cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 167c7ba18adSTom Rini 168c7ba18adSTom Rini .cmd2csratio = MT41K256M16HA125E_RATIO, 169c7ba18adSTom Rini .cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT, 170c7ba18adSTom Rini }; 171c7ba18adSTom Rini 17213526f71SJeff Lance static const struct cmd_control ddr3_evm_cmd_ctrl_data = { 17313526f71SJeff Lance .cmd0csratio = MT41J512M8RH125_RATIO, 17413526f71SJeff Lance .cmd0iclkout = MT41J512M8RH125_INVERT_CLKOUT, 17513526f71SJeff Lance 17613526f71SJeff Lance .cmd1csratio = MT41J512M8RH125_RATIO, 17713526f71SJeff Lance .cmd1iclkout = MT41J512M8RH125_INVERT_CLKOUT, 17813526f71SJeff Lance 17913526f71SJeff Lance .cmd2csratio = MT41J512M8RH125_RATIO, 18013526f71SJeff Lance .cmd2iclkout = MT41J512M8RH125_INVERT_CLKOUT, 18113526f71SJeff Lance }; 18213526f71SJeff Lance 183d8ff4fdbSLokesh Vutla static const struct cmd_control ddr3_icev2_cmd_ctrl_data = { 184d8ff4fdbSLokesh Vutla .cmd0csratio = MT41J128MJT125_RATIO_400MHz, 185d8ff4fdbSLokesh Vutla .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz, 186d8ff4fdbSLokesh Vutla 187d8ff4fdbSLokesh Vutla .cmd1csratio = MT41J128MJT125_RATIO_400MHz, 188d8ff4fdbSLokesh Vutla .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz, 189d8ff4fdbSLokesh Vutla 190d8ff4fdbSLokesh Vutla .cmd2csratio = MT41J128MJT125_RATIO_400MHz, 191d8ff4fdbSLokesh Vutla .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT_400MHz, 192d8ff4fdbSLokesh Vutla }; 193d8ff4fdbSLokesh Vutla 194c00f69dbSPeter Korsgaard static struct emif_regs ddr3_emif_reg_data = { 195c7d35befSPeter Korsgaard .sdram_config = MT41J128MJT125_EMIF_SDCFG, 196c7d35befSPeter Korsgaard .ref_ctrl = MT41J128MJT125_EMIF_SDREF, 197c7d35befSPeter Korsgaard .sdram_tim1 = MT41J128MJT125_EMIF_TIM1, 198c7d35befSPeter Korsgaard .sdram_tim2 = MT41J128MJT125_EMIF_TIM2, 199c7d35befSPeter Korsgaard .sdram_tim3 = MT41J128MJT125_EMIF_TIM3, 200c7d35befSPeter Korsgaard .zq_config = MT41J128MJT125_ZQ_CFG, 20159dcf970SVaibhav Hiremath .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY | 20259dcf970SVaibhav Hiremath PHY_EN_DYN_PWRDN, 203c00f69dbSPeter Korsgaard }; 20413526f71SJeff Lance 205c7ba18adSTom Rini static struct emif_regs ddr3_beagleblack_emif_reg_data = { 206c7ba18adSTom Rini .sdram_config = MT41K256M16HA125E_EMIF_SDCFG, 207c7ba18adSTom Rini .ref_ctrl = MT41K256M16HA125E_EMIF_SDREF, 208c7ba18adSTom Rini .sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1, 209c7ba18adSTom Rini .sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2, 210c7ba18adSTom Rini .sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3, 2118c17cbdfSJyri Sarha .ocp_config = EMIF_OCP_CONFIG_BEAGLEBONE_BLACK, 212c7ba18adSTom Rini .zq_config = MT41K256M16HA125E_ZQ_CFG, 213c7ba18adSTom Rini .emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY, 214c7ba18adSTom Rini }; 215c7ba18adSTom Rini 21613526f71SJeff Lance static struct emif_regs ddr3_evm_emif_reg_data = { 21713526f71SJeff Lance .sdram_config = MT41J512M8RH125_EMIF_SDCFG, 21813526f71SJeff Lance .ref_ctrl = MT41J512M8RH125_EMIF_SDREF, 21913526f71SJeff Lance .sdram_tim1 = MT41J512M8RH125_EMIF_TIM1, 22013526f71SJeff Lance .sdram_tim2 = MT41J512M8RH125_EMIF_TIM2, 22113526f71SJeff Lance .sdram_tim3 = MT41J512M8RH125_EMIF_TIM3, 2228c17cbdfSJyri Sarha .ocp_config = EMIF_OCP_CONFIG_AM335X_EVM, 22313526f71SJeff Lance .zq_config = MT41J512M8RH125_ZQ_CFG, 22459dcf970SVaibhav Hiremath .emif_ddr_phy_ctlr_1 = MT41J512M8RH125_EMIF_READ_LATENCY | 22559dcf970SVaibhav Hiremath PHY_EN_DYN_PWRDN, 22613526f71SJeff Lance }; 22712d7a474SPeter Korsgaard 228d8ff4fdbSLokesh Vutla static struct emif_regs ddr3_icev2_emif_reg_data = { 229d8ff4fdbSLokesh Vutla .sdram_config = MT41J128MJT125_EMIF_SDCFG_400MHz, 230d8ff4fdbSLokesh Vutla .ref_ctrl = MT41J128MJT125_EMIF_SDREF_400MHz, 231d8ff4fdbSLokesh Vutla .sdram_tim1 = MT41J128MJT125_EMIF_TIM1_400MHz, 232d8ff4fdbSLokesh Vutla .sdram_tim2 = MT41J128MJT125_EMIF_TIM2_400MHz, 233d8ff4fdbSLokesh Vutla .sdram_tim3 = MT41J128MJT125_EMIF_TIM3_400MHz, 234d8ff4fdbSLokesh Vutla .zq_config = MT41J128MJT125_ZQ_CFG_400MHz, 235d8ff4fdbSLokesh Vutla .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY_400MHz | 236d8ff4fdbSLokesh Vutla PHY_EN_DYN_PWRDN, 237d8ff4fdbSLokesh Vutla }; 238d8ff4fdbSLokesh Vutla 23912d7a474SPeter Korsgaard #ifdef CONFIG_SPL_OS_BOOT 24012d7a474SPeter Korsgaard int spl_start_uboot(void) 24112d7a474SPeter Korsgaard { 24212d7a474SPeter Korsgaard /* break into full u-boot on 'c' */ 243ba9a6708STom Rini if (serial_tstc() && serial_getc() == 'c') 244ba9a6708STom Rini return 1; 245ba9a6708STom Rini 246ba9a6708STom Rini #ifdef CONFIG_SPL_ENV_SUPPORT 247ba9a6708STom Rini env_init(); 248ba9a6708STom Rini env_relocate_spec(); 249ba9a6708STom Rini if (getenv_yesno("boot_os") != 1) 250ba9a6708STom Rini return 1; 251ba9a6708STom Rini #endif 252ba9a6708STom Rini 253ba9a6708STom Rini return 0; 25412d7a474SPeter Korsgaard } 25512d7a474SPeter Korsgaard #endif 25612d7a474SPeter Korsgaard 25794d77fb6SLokesh Vutla #define OSC (V_OSCK/1000000) 25894d77fb6SLokesh Vutla const struct dpll_params dpll_ddr = { 25994d77fb6SLokesh Vutla 266, OSC-1, 1, -1, -1, -1, -1}; 26094d77fb6SLokesh Vutla const struct dpll_params dpll_ddr_evm_sk = { 26194d77fb6SLokesh Vutla 303, OSC-1, 1, -1, -1, -1, -1}; 26294d77fb6SLokesh Vutla const struct dpll_params dpll_ddr_bone_black = { 26394d77fb6SLokesh Vutla 400, OSC-1, 1, -1, -1, -1, -1}; 26494d77fb6SLokesh Vutla 2659721027aSTom Rini void am33xx_spl_board_init(void) 2669721027aSTom Rini { 2679721027aSTom Rini int mpu_vdd; 2689721027aSTom Rini 2699721027aSTom Rini /* Get the frequency */ 27052f7d844SSteve Kipisz dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev); 2719721027aSTom Rini 272770e68c0SNishanth Menon if (board_is_bone() || board_is_bone_lt()) { 2739721027aSTom Rini /* BeagleBone PMIC Code */ 2749721027aSTom Rini int usb_cur_lim; 2759721027aSTom Rini 2769721027aSTom Rini /* 2779721027aSTom Rini * Only perform PMIC configurations if board rev > A1 2789721027aSTom Rini * on Beaglebone White 2799721027aSTom Rini */ 280770e68c0SNishanth Menon if (board_is_bone() && !strncmp(board_ti_get_rev(), "00A1", 4)) 2819721027aSTom Rini return; 2829721027aSTom Rini 2839721027aSTom Rini if (i2c_probe(TPS65217_CHIP_PM)) 2849721027aSTom Rini return; 2859721027aSTom Rini 2869721027aSTom Rini /* 2879721027aSTom Rini * On Beaglebone White we need to ensure we have AC power 2889721027aSTom Rini * before increasing the frequency. 2899721027aSTom Rini */ 290770e68c0SNishanth Menon if (board_is_bone()) { 2919721027aSTom Rini uchar pmic_status_reg; 2929721027aSTom Rini if (tps65217_reg_read(TPS65217_STATUS, 2939721027aSTom Rini &pmic_status_reg)) 2949721027aSTom Rini return; 2959721027aSTom Rini if (!(pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK)) { 2969721027aSTom Rini puts("No AC power, disabling frequency switch\n"); 2979721027aSTom Rini return; 2989721027aSTom Rini } 2999721027aSTom Rini } 3009721027aSTom Rini 3019721027aSTom Rini /* 3029721027aSTom Rini * Override what we have detected since we know if we have 3039721027aSTom Rini * a Beaglebone Black it supports 1GHz. 3049721027aSTom Rini */ 305770e68c0SNishanth Menon if (board_is_bone_lt()) 30652f7d844SSteve Kipisz dpll_mpu_opp100.m = MPUPLL_M_1000; 3079721027aSTom Rini 3089721027aSTom Rini /* 3099721027aSTom Rini * Increase USB current limit to 1300mA or 1800mA and set 3109721027aSTom Rini * the MPU voltage controller as needed. 3119721027aSTom Rini */ 31252f7d844SSteve Kipisz if (dpll_mpu_opp100.m == MPUPLL_M_1000) { 3139721027aSTom Rini usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA; 3149721027aSTom Rini mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV; 3159721027aSTom Rini } else { 3169721027aSTom Rini usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA; 3179721027aSTom Rini mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV; 3189721027aSTom Rini } 3199721027aSTom Rini 3209721027aSTom Rini if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, 3219721027aSTom Rini TPS65217_POWER_PATH, 3229721027aSTom Rini usb_cur_lim, 3239721027aSTom Rini TPS65217_USB_INPUT_CUR_LIMIT_MASK)) 3249721027aSTom Rini puts("tps65217_reg_write failure\n"); 3259721027aSTom Rini 32652f7d844SSteve Kipisz /* Set DCDC3 (CORE) voltage to 1.125V */ 32752f7d844SSteve Kipisz if (tps65217_voltage_update(TPS65217_DEFDCDC3, 32852f7d844SSteve Kipisz TPS65217_DCDC_VOLT_SEL_1125MV)) { 32952f7d844SSteve Kipisz puts("tps65217_voltage_update failure\n"); 33052f7d844SSteve Kipisz return; 33152f7d844SSteve Kipisz } 33252f7d844SSteve Kipisz 33352f7d844SSteve Kipisz /* Set CORE Frequencies to OPP100 */ 33452f7d844SSteve Kipisz do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); 3359721027aSTom Rini 3369721027aSTom Rini /* Set DCDC2 (MPU) voltage */ 3379721027aSTom Rini if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) { 3389721027aSTom Rini puts("tps65217_voltage_update failure\n"); 3399721027aSTom Rini return; 3409721027aSTom Rini } 3419721027aSTom Rini 3429721027aSTom Rini /* 3439721027aSTom Rini * Set LDO3, LDO4 output voltage to 3.3V for Beaglebone. 3449721027aSTom Rini * Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black. 3459721027aSTom Rini */ 346770e68c0SNishanth Menon if (board_is_bone()) { 3479721027aSTom Rini if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, 3489721027aSTom Rini TPS65217_DEFLS1, 3499721027aSTom Rini TPS65217_LDO_VOLTAGE_OUT_3_3, 3509721027aSTom Rini TPS65217_LDO_MASK)) 3519721027aSTom Rini puts("tps65217_reg_write failure\n"); 3529721027aSTom Rini } else { 3539721027aSTom Rini if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, 3549721027aSTom Rini TPS65217_DEFLS1, 3559721027aSTom Rini TPS65217_LDO_VOLTAGE_OUT_1_8, 3569721027aSTom Rini TPS65217_LDO_MASK)) 3579721027aSTom Rini puts("tps65217_reg_write failure\n"); 3589721027aSTom Rini } 3599721027aSTom Rini 3609721027aSTom Rini if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, 3619721027aSTom Rini TPS65217_DEFLS2, 3629721027aSTom Rini TPS65217_LDO_VOLTAGE_OUT_3_3, 3639721027aSTom Rini TPS65217_LDO_MASK)) 3649721027aSTom Rini puts("tps65217_reg_write failure\n"); 3659721027aSTom Rini } else { 3669721027aSTom Rini int sil_rev; 3679721027aSTom Rini 3689721027aSTom Rini /* 3699721027aSTom Rini * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all 3709721027aSTom Rini * MPU frequencies we support we use a CORE voltage of 3719721027aSTom Rini * 1.1375V. For MPU voltage we need to switch based on 3729721027aSTom Rini * the frequency we are running at. 3739721027aSTom Rini */ 3749721027aSTom Rini if (i2c_probe(TPS65910_CTRL_I2C_ADDR)) 3759721027aSTom Rini return; 3769721027aSTom Rini 3779721027aSTom Rini /* 3789721027aSTom Rini * Depending on MPU clock and PG we will need a different 3799721027aSTom Rini * VDD to drive at that speed. 3809721027aSTom Rini */ 3819721027aSTom Rini sil_rev = readl(&cdev->deviceid) >> 28; 38252f7d844SSteve Kipisz mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, 38352f7d844SSteve Kipisz dpll_mpu_opp100.m); 3849721027aSTom Rini 3859721027aSTom Rini /* Tell the TPS65910 to use i2c */ 3869721027aSTom Rini tps65910_set_i2c_control(); 3879721027aSTom Rini 3889721027aSTom Rini /* First update MPU voltage. */ 3899721027aSTom Rini if (tps65910_voltage_update(MPU, mpu_vdd)) 3909721027aSTom Rini return; 3919721027aSTom Rini 3929721027aSTom Rini /* Second, update the CORE voltage. */ 3939721027aSTom Rini if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_3)) 3949721027aSTom Rini return; 39552f7d844SSteve Kipisz 39652f7d844SSteve Kipisz /* Set CORE Frequencies to OPP100 */ 39752f7d844SSteve Kipisz do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); 3989721027aSTom Rini } 3999721027aSTom Rini 4009721027aSTom Rini /* Set MPU Frequency to what we detected now that voltages are set */ 40152f7d844SSteve Kipisz do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100); 4029721027aSTom Rini } 4039721027aSTom Rini 40494d77fb6SLokesh Vutla const struct dpll_params *get_dpll_ddr_params(void) 40594d77fb6SLokesh Vutla { 406770e68c0SNishanth Menon if (board_is_evm_sk()) 40794d77fb6SLokesh Vutla return &dpll_ddr_evm_sk; 408d8ff4fdbSLokesh Vutla else if (board_is_bone_lt() || board_is_icev2()) 40994d77fb6SLokesh Vutla return &dpll_ddr_bone_black; 410770e68c0SNishanth Menon else if (board_is_evm_15_or_later()) 41194d77fb6SLokesh Vutla return &dpll_ddr_evm_sk; 41294d77fb6SLokesh Vutla else 41394d77fb6SLokesh Vutla return &dpll_ddr; 41494d77fb6SLokesh Vutla } 41594d77fb6SLokesh Vutla 4160660481aSHeiko Schocher void set_uart_mux_conf(void) 417e363426eSPeter Korsgaard { 4181286b7f6STom Rini #if CONFIG_CONS_INDEX == 1 419e363426eSPeter Korsgaard enable_uart0_pin_mux(); 4201286b7f6STom Rini #elif CONFIG_CONS_INDEX == 2 4216422b70bSAndrew Bradford enable_uart1_pin_mux(); 4221286b7f6STom Rini #elif CONFIG_CONS_INDEX == 3 4236422b70bSAndrew Bradford enable_uart2_pin_mux(); 4241286b7f6STom Rini #elif CONFIG_CONS_INDEX == 4 4256422b70bSAndrew Bradford enable_uart3_pin_mux(); 4261286b7f6STom Rini #elif CONFIG_CONS_INDEX == 5 4276422b70bSAndrew Bradford enable_uart4_pin_mux(); 4281286b7f6STom Rini #elif CONFIG_CONS_INDEX == 6 4296422b70bSAndrew Bradford enable_uart5_pin_mux(); 4301286b7f6STom Rini #endif 4310660481aSHeiko Schocher } 432e363426eSPeter Korsgaard 4330660481aSHeiko Schocher void set_mux_conf_regs(void) 4340660481aSHeiko Schocher { 435770e68c0SNishanth Menon enable_board_pin_mux(); 4360660481aSHeiko Schocher } 4370660481aSHeiko Schocher 438965de8b9SLokesh Vutla const struct ctrl_ioregs ioregs_evmsk = { 439965de8b9SLokesh Vutla .cm0ioctl = MT41J128MJT125_IOCTRL_VALUE, 440965de8b9SLokesh Vutla .cm1ioctl = MT41J128MJT125_IOCTRL_VALUE, 441965de8b9SLokesh Vutla .cm2ioctl = MT41J128MJT125_IOCTRL_VALUE, 442965de8b9SLokesh Vutla .dt0ioctl = MT41J128MJT125_IOCTRL_VALUE, 443965de8b9SLokesh Vutla .dt1ioctl = MT41J128MJT125_IOCTRL_VALUE, 444965de8b9SLokesh Vutla }; 445965de8b9SLokesh Vutla 446965de8b9SLokesh Vutla const struct ctrl_ioregs ioregs_bonelt = { 447965de8b9SLokesh Vutla .cm0ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 448965de8b9SLokesh Vutla .cm1ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 449965de8b9SLokesh Vutla .cm2ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 450965de8b9SLokesh Vutla .dt0ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 451965de8b9SLokesh Vutla .dt1ioctl = MT41K256M16HA125E_IOCTRL_VALUE, 452965de8b9SLokesh Vutla }; 453965de8b9SLokesh Vutla 454965de8b9SLokesh Vutla const struct ctrl_ioregs ioregs_evm15 = { 455965de8b9SLokesh Vutla .cm0ioctl = MT41J512M8RH125_IOCTRL_VALUE, 456965de8b9SLokesh Vutla .cm1ioctl = MT41J512M8RH125_IOCTRL_VALUE, 457965de8b9SLokesh Vutla .cm2ioctl = MT41J512M8RH125_IOCTRL_VALUE, 458965de8b9SLokesh Vutla .dt0ioctl = MT41J512M8RH125_IOCTRL_VALUE, 459965de8b9SLokesh Vutla .dt1ioctl = MT41J512M8RH125_IOCTRL_VALUE, 460965de8b9SLokesh Vutla }; 461965de8b9SLokesh Vutla 462965de8b9SLokesh Vutla const struct ctrl_ioregs ioregs = { 463965de8b9SLokesh Vutla .cm0ioctl = MT47H128M16RT25E_IOCTRL_VALUE, 464965de8b9SLokesh Vutla .cm1ioctl = MT47H128M16RT25E_IOCTRL_VALUE, 465965de8b9SLokesh Vutla .cm2ioctl = MT47H128M16RT25E_IOCTRL_VALUE, 466965de8b9SLokesh Vutla .dt0ioctl = MT47H128M16RT25E_IOCTRL_VALUE, 467965de8b9SLokesh Vutla .dt1ioctl = MT47H128M16RT25E_IOCTRL_VALUE, 468965de8b9SLokesh Vutla }; 469965de8b9SLokesh Vutla 4700660481aSHeiko Schocher void sdram_init(void) 4710660481aSHeiko Schocher { 472770e68c0SNishanth Menon if (board_is_evm_sk()) { 473e363426eSPeter Korsgaard /* 474e363426eSPeter Korsgaard * EVM SK 1.2A and later use gpio0_7 to enable DDR3. 475e363426eSPeter Korsgaard * This is safe enough to do on older revs. 476e363426eSPeter Korsgaard */ 477e363426eSPeter Korsgaard gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en"); 478e363426eSPeter Korsgaard gpio_direction_output(GPIO_DDR_VTT_EN, 1); 479e363426eSPeter Korsgaard } 480e363426eSPeter Korsgaard 481d8ff4fdbSLokesh Vutla if (board_is_icev2()) { 482d8ff4fdbSLokesh Vutla gpio_request(ICE_GPIO_DDR_VTT_EN, "ddr_vtt_en"); 483d8ff4fdbSLokesh Vutla gpio_direction_output(ICE_GPIO_DDR_VTT_EN, 1); 484d8ff4fdbSLokesh Vutla } 485d8ff4fdbSLokesh Vutla 486770e68c0SNishanth Menon if (board_is_evm_sk()) 487965de8b9SLokesh Vutla config_ddr(303, &ioregs_evmsk, &ddr3_data, 4883ba65f97SMatt Porter &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0); 489770e68c0SNishanth Menon else if (board_is_bone_lt()) 490965de8b9SLokesh Vutla config_ddr(400, &ioregs_bonelt, 491c7ba18adSTom Rini &ddr3_beagleblack_data, 492c7ba18adSTom Rini &ddr3_beagleblack_cmd_ctrl_data, 493c7ba18adSTom Rini &ddr3_beagleblack_emif_reg_data, 0); 494770e68c0SNishanth Menon else if (board_is_evm_15_or_later()) 495965de8b9SLokesh Vutla config_ddr(303, &ioregs_evm15, &ddr3_evm_data, 4963ba65f97SMatt Porter &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0); 497d8ff4fdbSLokesh Vutla else if (board_is_icev2()) 498d8ff4fdbSLokesh Vutla config_ddr(400, &ioregs_evmsk, &ddr3_icev2_data, 499d8ff4fdbSLokesh Vutla &ddr3_icev2_cmd_ctrl_data, &ddr3_icev2_emif_reg_data, 500d8ff4fdbSLokesh Vutla 0); 5018c17cbdfSJyri Sarha else if (board_is_gp_evm()) 5028c17cbdfSJyri Sarha config_ddr(266, &ioregs, &ddr2_data, 5038c17cbdfSJyri Sarha &ddr2_cmd_ctrl_data, &ddr2_evm_emif_reg_data, 0); 504c00f69dbSPeter Korsgaard else 505965de8b9SLokesh Vutla config_ddr(266, &ioregs, &ddr2_data, 5063ba65f97SMatt Porter &ddr2_cmd_ctrl_data, &ddr2_emif_reg_data, 0); 507e363426eSPeter Korsgaard } 5080660481aSHeiko Schocher #endif 509e363426eSPeter Korsgaard 510e607ec99SRoger Quadros #if !defined(CONFIG_SPL_BUILD) || \ 51197f3a178SLokesh Vutla (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 512e607ec99SRoger Quadros static void request_and_set_gpio(int gpio, char *name, int val) 51397f3a178SLokesh Vutla { 51497f3a178SLokesh Vutla int ret; 51597f3a178SLokesh Vutla 51697f3a178SLokesh Vutla ret = gpio_request(gpio, name); 51797f3a178SLokesh Vutla if (ret < 0) { 51897f3a178SLokesh Vutla printf("%s: Unable to request %s\n", __func__, name); 51997f3a178SLokesh Vutla return; 52097f3a178SLokesh Vutla } 52197f3a178SLokesh Vutla 52297f3a178SLokesh Vutla ret = gpio_direction_output(gpio, 0); 52397f3a178SLokesh Vutla if (ret < 0) { 52497f3a178SLokesh Vutla printf("%s: Unable to set %s as output\n", __func__, name); 52597f3a178SLokesh Vutla goto err_free_gpio; 52697f3a178SLokesh Vutla } 52797f3a178SLokesh Vutla 528e607ec99SRoger Quadros gpio_set_value(gpio, val); 52997f3a178SLokesh Vutla 53097f3a178SLokesh Vutla return; 53197f3a178SLokesh Vutla 53297f3a178SLokesh Vutla err_free_gpio: 53397f3a178SLokesh Vutla gpio_free(gpio); 53497f3a178SLokesh Vutla } 53597f3a178SLokesh Vutla 536e607ec99SRoger Quadros #define REQUEST_AND_SET_GPIO(N) request_and_set_gpio(N, #N, 1); 537e607ec99SRoger Quadros #define REQUEST_AND_CLR_GPIO(N) request_and_set_gpio(N, #N, 0); 53897f3a178SLokesh Vutla 53997f3a178SLokesh Vutla /** 54097f3a178SLokesh Vutla * RMII mode on ICEv2 board needs 50MHz clock. Given the clock 54197f3a178SLokesh Vutla * synthesizer With a capacitor of 18pF, and 25MHz input clock cycle 54297f3a178SLokesh Vutla * PLL1 gives an output of 100MHz. So, configuring the div2/3 as 2 to 54397f3a178SLokesh Vutla * give 50MHz output for Eth0 and 1. 54497f3a178SLokesh Vutla */ 54597f3a178SLokesh Vutla static struct clk_synth cdce913_data = { 54697f3a178SLokesh Vutla .id = 0x81, 54797f3a178SLokesh Vutla .capacitor = 0x90, 54897f3a178SLokesh Vutla .mux = 0x6d, 54997f3a178SLokesh Vutla .pdiv2 = 0x2, 55097f3a178SLokesh Vutla .pdiv3 = 0x2, 55197f3a178SLokesh Vutla }; 55297f3a178SLokesh Vutla #endif 55397f3a178SLokesh Vutla 554e363426eSPeter Korsgaard /* 555e363426eSPeter Korsgaard * Basic board specific setup. Pinmux has been handled already. 556e363426eSPeter Korsgaard */ 557e363426eSPeter Korsgaard int board_init(void) 558e363426eSPeter Korsgaard { 5596843918eSTom Rini #if defined(CONFIG_HW_WATCHDOG) 5606843918eSTom Rini hw_watchdog_init(); 5616843918eSTom Rini #endif 5626843918eSTom Rini 56373feefdcSTom Rini gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 5642c17e6d1Spekon gupta #if defined(CONFIG_NOR) || defined(CONFIG_NAND) 56598b5c269SIlya Yanok gpmc_init(); 566cd8845d7SSteve Kipisz #endif 56797f3a178SLokesh Vutla 568e607ec99SRoger Quadros #if !defined(CONFIG_SPL_BUILD) || \ 569e607ec99SRoger Quadros (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 57097f3a178SLokesh Vutla if (board_is_icev2()) { 571e607ec99SRoger Quadros int rv; 572e607ec99SRoger Quadros u32 reg; 573e607ec99SRoger Quadros 57497f3a178SLokesh Vutla REQUEST_AND_SET_GPIO(GPIO_PR1_MII_CTRL); 575e607ec99SRoger Quadros /* Make J19 status available on GPIO1_26 */ 576e607ec99SRoger Quadros REQUEST_AND_CLR_GPIO(GPIO_MUX_MII_CTRL); 577e607ec99SRoger Quadros 57897f3a178SLokesh Vutla REQUEST_AND_SET_GPIO(GPIO_FET_SWITCH_CTRL); 579e607ec99SRoger Quadros /* 580e607ec99SRoger Quadros * Both ports can be set as RMII-CPSW or MII-PRU-ETH using 581e607ec99SRoger Quadros * jumpers near the port. Read the jumper value and set 582e607ec99SRoger Quadros * the pinmux, external mux and PHY clock accordingly. 583e607ec99SRoger Quadros * As jumper line is overridden by PHY RX_DV pin immediately 584e607ec99SRoger Quadros * after bootstrap (power-up/reset), we need to sample 585e607ec99SRoger Quadros * it during PHY reset using GPIO rising edge detection. 586e607ec99SRoger Quadros */ 58797f3a178SLokesh Vutla REQUEST_AND_SET_GPIO(GPIO_PHY_RESET); 588e607ec99SRoger Quadros /* Enable rising edge IRQ on GPIO0_11 and GPIO 1_26 */ 589e607ec99SRoger Quadros reg = readl(GPIO0_RISINGDETECT) | BIT(11); 590e607ec99SRoger Quadros writel(reg, GPIO0_RISINGDETECT); 591e607ec99SRoger Quadros reg = readl(GPIO1_RISINGDETECT) | BIT(26); 592e607ec99SRoger Quadros writel(reg, GPIO1_RISINGDETECT); 593e607ec99SRoger Quadros /* Reset PHYs to capture the Jumper setting */ 594e607ec99SRoger Quadros gpio_set_value(GPIO_PHY_RESET, 0); 595e607ec99SRoger Quadros udelay(2); /* PHY datasheet states 1uS min. */ 596e607ec99SRoger Quadros gpio_set_value(GPIO_PHY_RESET, 1); 597e607ec99SRoger Quadros 598e607ec99SRoger Quadros reg = readl(GPIO0_IRQSTATUSRAW) & BIT(11); 599e607ec99SRoger Quadros if (reg) { 600e607ec99SRoger Quadros writel(reg, GPIO0_IRQSTATUS1); /* clear irq */ 601e607ec99SRoger Quadros /* RMII mode */ 602e607ec99SRoger Quadros printf("ETH0, CPSW\n"); 603e607ec99SRoger Quadros } else { 604e607ec99SRoger Quadros /* MII mode */ 605e607ec99SRoger Quadros printf("ETH0, PRU\n"); 606e607ec99SRoger Quadros cdce913_data.pdiv3 = 4; /* 25MHz PHY clk */ 607e607ec99SRoger Quadros } 608e607ec99SRoger Quadros 609e607ec99SRoger Quadros reg = readl(GPIO1_IRQSTATUSRAW) & BIT(26); 610e607ec99SRoger Quadros if (reg) { 611e607ec99SRoger Quadros writel(reg, GPIO1_IRQSTATUS1); /* clear irq */ 612e607ec99SRoger Quadros /* RMII mode */ 613e607ec99SRoger Quadros printf("ETH1, CPSW\n"); 614e607ec99SRoger Quadros gpio_set_value(GPIO_MUX_MII_CTRL, 1); 615e607ec99SRoger Quadros } else { 616e607ec99SRoger Quadros /* MII mode */ 617e607ec99SRoger Quadros printf("ETH1, PRU\n"); 618e607ec99SRoger Quadros cdce913_data.pdiv2 = 4; /* 25MHz PHY clk */ 619e607ec99SRoger Quadros } 620e607ec99SRoger Quadros 621e607ec99SRoger Quadros /* disable rising edge IRQs */ 622e607ec99SRoger Quadros reg = readl(GPIO0_RISINGDETECT) & ~BIT(11); 623e607ec99SRoger Quadros writel(reg, GPIO0_RISINGDETECT); 624e607ec99SRoger Quadros reg = readl(GPIO1_RISINGDETECT) & ~BIT(26); 625e607ec99SRoger Quadros writel(reg, GPIO1_RISINGDETECT); 62697f3a178SLokesh Vutla 62797f3a178SLokesh Vutla rv = setup_clock_synthesizer(&cdce913_data); 62897f3a178SLokesh Vutla if (rv) { 62997f3a178SLokesh Vutla printf("Clock synthesizer setup failed %d\n", rv); 63097f3a178SLokesh Vutla return rv; 63197f3a178SLokesh Vutla } 632e607ec99SRoger Quadros 633e607ec99SRoger Quadros /* reset PHYs */ 634e607ec99SRoger Quadros gpio_set_value(GPIO_PHY_RESET, 0); 635e607ec99SRoger Quadros udelay(2); /* PHY datasheet states 1uS min. */ 636e607ec99SRoger Quadros gpio_set_value(GPIO_PHY_RESET, 1); 63797f3a178SLokesh Vutla } 63897f3a178SLokesh Vutla #endif 63997f3a178SLokesh Vutla 640e363426eSPeter Korsgaard return 0; 641e363426eSPeter Korsgaard } 642e363426eSPeter Korsgaard 643044fc14bSTom Rini #ifdef CONFIG_BOARD_LATE_INIT 644044fc14bSTom Rini int board_late_init(void) 645044fc14bSTom Rini { 646f411b5ccSRoger Quadros #if !defined(CONFIG_SPL_BUILD) 647f411b5ccSRoger Quadros uint8_t mac_addr[6]; 648f411b5ccSRoger Quadros uint32_t mac_hi, mac_lo; 649f411b5ccSRoger Quadros #endif 650f411b5ccSRoger Quadros 651044fc14bSTom Rini #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 652770e68c0SNishanth Menon char *name = NULL; 653ace4275eSTom Rini 6544015949fSrobertcnelson@gmail.com if (board_is_bone_lt()) { 6554015949fSrobertcnelson@gmail.com /* BeagleBoard.org BeagleBone Black Wireless: */ 6564015949fSrobertcnelson@gmail.com if (!strncmp(board_ti_get_rev(), "BWA", 3)) { 6574015949fSrobertcnelson@gmail.com name = "BBBW"; 6584015949fSrobertcnelson@gmail.com } 659*2b79fba6Srobertcnelson@gmail.com /* SeeedStudio BeagleBone Green Wireless */ 660*2b79fba6Srobertcnelson@gmail.com if (!strncmp(board_ti_get_rev(), "GW1", 3)) { 661*2b79fba6Srobertcnelson@gmail.com name = "BBGW"; 662*2b79fba6Srobertcnelson@gmail.com } 6634015949fSrobertcnelson@gmail.com } 6644015949fSrobertcnelson@gmail.com 665770e68c0SNishanth Menon if (board_is_bbg1()) 666770e68c0SNishanth Menon name = "BBG1"; 667770e68c0SNishanth Menon set_board_info_env(name); 6685d4d436cSLokesh Vutla 6695d4d436cSLokesh Vutla /* 6705d4d436cSLokesh Vutla * Default FIT boot on HS devices. Non FIT images are not allowed 6715d4d436cSLokesh Vutla * on HS devices. 6725d4d436cSLokesh Vutla */ 6735d4d436cSLokesh Vutla if (get_device_type() == HS_DEVICE) 6745d4d436cSLokesh Vutla setenv("boot_fit", "1"); 675044fc14bSTom Rini #endif 676044fc14bSTom Rini 677f411b5ccSRoger Quadros #if !defined(CONFIG_SPL_BUILD) 678f411b5ccSRoger Quadros /* try reading mac address from efuse */ 679f411b5ccSRoger Quadros mac_lo = readl(&cdev->macid0l); 680f411b5ccSRoger Quadros mac_hi = readl(&cdev->macid0h); 681f411b5ccSRoger Quadros mac_addr[0] = mac_hi & 0xFF; 682f411b5ccSRoger Quadros mac_addr[1] = (mac_hi & 0xFF00) >> 8; 683f411b5ccSRoger Quadros mac_addr[2] = (mac_hi & 0xFF0000) >> 16; 684f411b5ccSRoger Quadros mac_addr[3] = (mac_hi & 0xFF000000) >> 24; 685f411b5ccSRoger Quadros mac_addr[4] = mac_lo & 0xFF; 686f411b5ccSRoger Quadros mac_addr[5] = (mac_lo & 0xFF00) >> 8; 687f411b5ccSRoger Quadros 688f411b5ccSRoger Quadros if (!getenv("ethaddr")) { 689f411b5ccSRoger Quadros printf("<ethaddr> not set. Validating first E-fuse MAC\n"); 690f411b5ccSRoger Quadros 691f411b5ccSRoger Quadros if (is_valid_ethaddr(mac_addr)) 692f411b5ccSRoger Quadros eth_setenv_enetaddr("ethaddr", mac_addr); 693f411b5ccSRoger Quadros } 694f411b5ccSRoger Quadros 695f411b5ccSRoger Quadros mac_lo = readl(&cdev->macid1l); 696f411b5ccSRoger Quadros mac_hi = readl(&cdev->macid1h); 697f411b5ccSRoger Quadros mac_addr[0] = mac_hi & 0xFF; 698f411b5ccSRoger Quadros mac_addr[1] = (mac_hi & 0xFF00) >> 8; 699f411b5ccSRoger Quadros mac_addr[2] = (mac_hi & 0xFF0000) >> 16; 700f411b5ccSRoger Quadros mac_addr[3] = (mac_hi & 0xFF000000) >> 24; 701f411b5ccSRoger Quadros mac_addr[4] = mac_lo & 0xFF; 702f411b5ccSRoger Quadros mac_addr[5] = (mac_lo & 0xFF00) >> 8; 703f411b5ccSRoger Quadros 704f411b5ccSRoger Quadros if (!getenv("eth1addr")) { 705f411b5ccSRoger Quadros if (is_valid_ethaddr(mac_addr)) 706f411b5ccSRoger Quadros eth_setenv_enetaddr("eth1addr", mac_addr); 707f411b5ccSRoger Quadros } 708f411b5ccSRoger Quadros #endif 709f411b5ccSRoger Quadros 710044fc14bSTom Rini return 0; 711044fc14bSTom Rini } 712044fc14bSTom Rini #endif 713044fc14bSTom Rini 714bd83e3dfSMugunthan V N #ifndef CONFIG_DM_ETH 715bd83e3dfSMugunthan V N 716c0e66793SIlya Yanok #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ 717c0e66793SIlya Yanok (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 718e363426eSPeter Korsgaard static void cpsw_control(int enabled) 719e363426eSPeter Korsgaard { 720e363426eSPeter Korsgaard /* VTP can be added here */ 721e363426eSPeter Korsgaard 722e363426eSPeter Korsgaard return; 723e363426eSPeter Korsgaard } 724e363426eSPeter Korsgaard 725e363426eSPeter Korsgaard static struct cpsw_slave_data cpsw_slaves[] = { 726e363426eSPeter Korsgaard { 727e363426eSPeter Korsgaard .slave_reg_ofs = 0x208, 728e363426eSPeter Korsgaard .sliver_reg_ofs = 0xd80, 7299c653aadSMugunthan V N .phy_addr = 0, 730e363426eSPeter Korsgaard }, 731e363426eSPeter Korsgaard { 732e363426eSPeter Korsgaard .slave_reg_ofs = 0x308, 733e363426eSPeter Korsgaard .sliver_reg_ofs = 0xdc0, 7349c653aadSMugunthan V N .phy_addr = 1, 735e363426eSPeter Korsgaard }, 736e363426eSPeter Korsgaard }; 737e363426eSPeter Korsgaard 738e363426eSPeter Korsgaard static struct cpsw_platform_data cpsw_data = { 73981df2babSMatt Porter .mdio_base = CPSW_MDIO_BASE, 74081df2babSMatt Porter .cpsw_base = CPSW_BASE, 741e363426eSPeter Korsgaard .mdio_div = 0xff, 742e363426eSPeter Korsgaard .channels = 8, 743e363426eSPeter Korsgaard .cpdma_reg_ofs = 0x800, 744e363426eSPeter Korsgaard .slaves = 1, 745e363426eSPeter Korsgaard .slave_data = cpsw_slaves, 746e363426eSPeter Korsgaard .ale_reg_ofs = 0xd00, 747e363426eSPeter Korsgaard .ale_entries = 1024, 748e363426eSPeter Korsgaard .host_port_reg_ofs = 0x108, 749e363426eSPeter Korsgaard .hw_stats_reg_ofs = 0x900, 7502bf36ac6SMugunthan V N .bd_ram_ofs = 0x2000, 751e363426eSPeter Korsgaard .mac_control = (1 << 5), 752e363426eSPeter Korsgaard .control = cpsw_control, 753e363426eSPeter Korsgaard .host_port_num = 0, 754e363426eSPeter Korsgaard .version = CPSW_CTRL_VERSION_2, 755e363426eSPeter Korsgaard }; 756d2aa1154SIlya Yanok #endif 757e363426eSPeter Korsgaard 75897f3a178SLokesh Vutla #if ((defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)) &&\ 75997f3a178SLokesh Vutla defined(CONFIG_SPL_BUILD)) || \ 76097f3a178SLokesh Vutla ((defined(CONFIG_DRIVER_TI_CPSW) || \ 76197f3a178SLokesh Vutla defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) && \ 76297f3a178SLokesh Vutla !defined(CONFIG_SPL_BUILD)) 76397f3a178SLokesh Vutla 76468996b84STom Rini /* 76568996b84STom Rini * This function will: 76668996b84STom Rini * Read the eFuse for MAC addresses, and set ethaddr/eth1addr/usbnet_devaddr 76768996b84STom Rini * in the environment 76868996b84STom Rini * Perform fixups to the PHY present on certain boards. We only need this 76968996b84STom Rini * function in: 77068996b84STom Rini * - SPL with either CPSW or USB ethernet support 77168996b84STom Rini * - Full U-Boot, with either CPSW or USB ethernet 77268996b84STom Rini * Build in only these cases to avoid warnings about unused variables 77368996b84STom Rini * when we build an SPL that has neither option but full U-Boot will. 77468996b84STom Rini */ 775e363426eSPeter Korsgaard int board_eth_init(bd_t *bis) 776e363426eSPeter Korsgaard { 777d2aa1154SIlya Yanok int rv, n = 0; 778f411b5ccSRoger Quadros #if defined(CONFIG_USB_ETHER) && \ 779f411b5ccSRoger Quadros (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT)) 780e363426eSPeter Korsgaard uint8_t mac_addr[6]; 781e363426eSPeter Korsgaard uint32_t mac_hi, mac_lo; 782e363426eSPeter Korsgaard 783f411b5ccSRoger Quadros /* 784f411b5ccSRoger Quadros * use efuse mac address for USB ethernet as we know that 785f411b5ccSRoger Quadros * both CPSW and USB ethernet will never be active at the same time 786f411b5ccSRoger Quadros */ 787e363426eSPeter Korsgaard mac_lo = readl(&cdev->macid0l); 788e363426eSPeter Korsgaard mac_hi = readl(&cdev->macid0h); 789e363426eSPeter Korsgaard mac_addr[0] = mac_hi & 0xFF; 790e363426eSPeter Korsgaard mac_addr[1] = (mac_hi & 0xFF00) >> 8; 791e363426eSPeter Korsgaard mac_addr[2] = (mac_hi & 0xFF0000) >> 16; 792e363426eSPeter Korsgaard mac_addr[3] = (mac_hi & 0xFF000000) >> 24; 793e363426eSPeter Korsgaard mac_addr[4] = mac_lo & 0xFF; 794e363426eSPeter Korsgaard mac_addr[5] = (mac_lo & 0xFF00) >> 8; 795f411b5ccSRoger Quadros #endif 796f411b5ccSRoger Quadros 797e363426eSPeter Korsgaard 798c0e66793SIlya Yanok #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ 799c0e66793SIlya Yanok (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 800e363426eSPeter Korsgaard 801a662e0c3SJoel A Fernandes #ifdef CONFIG_DRIVER_TI_CPSW 802770e68c0SNishanth Menon if (board_is_bone() || board_is_bone_lt() || 803770e68c0SNishanth Menon board_is_idk()) { 804e363426eSPeter Korsgaard writel(MII_MODE_ENABLE, &cdev->miisel); 805e363426eSPeter Korsgaard cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if = 806e363426eSPeter Korsgaard PHY_INTERFACE_MODE_MII; 80797f3a178SLokesh Vutla } else if (board_is_icev2()) { 80897f3a178SLokesh Vutla writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel); 80997f3a178SLokesh Vutla cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII; 81097f3a178SLokesh Vutla cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_RMII; 81197f3a178SLokesh Vutla cpsw_slaves[0].phy_addr = 1; 81297f3a178SLokesh Vutla cpsw_slaves[1].phy_addr = 3; 813e363426eSPeter Korsgaard } else { 814dafd4db3SHeiko Schocher writel((RGMII_MODE_ENABLE | RGMII_INT_DELAY), &cdev->miisel); 815e363426eSPeter Korsgaard cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if = 816e363426eSPeter Korsgaard PHY_INTERFACE_MODE_RGMII; 817e363426eSPeter Korsgaard } 818e363426eSPeter Korsgaard 819d2aa1154SIlya Yanok rv = cpsw_register(&cpsw_data); 820d2aa1154SIlya Yanok if (rv < 0) 821d2aa1154SIlya Yanok printf("Error %d registering CPSW switch\n", rv); 822d2aa1154SIlya Yanok else 823d2aa1154SIlya Yanok n += rv; 824a662e0c3SJoel A Fernandes #endif 8251634e969STom Rini 8261634e969STom Rini /* 8271634e969STom Rini * 8281634e969STom Rini * CPSW RGMII Internal Delay Mode is not supported in all PVT 8291634e969STom Rini * operating points. So we must set the TX clock delay feature 8301634e969STom Rini * in the AR8051 PHY. Since we only support a single ethernet 8311634e969STom Rini * device in U-Boot, we only do this for the first instance. 8321634e969STom Rini */ 8331634e969STom Rini #define AR8051_PHY_DEBUG_ADDR_REG 0x1d 8341634e969STom Rini #define AR8051_PHY_DEBUG_DATA_REG 0x1e 8351634e969STom Rini #define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5 8361634e969STom Rini #define AR8051_RGMII_TX_CLK_DLY 0x100 8371634e969STom Rini 838770e68c0SNishanth Menon if (board_is_evm_sk() || board_is_gp_evm()) { 8391634e969STom Rini const char *devname; 8401634e969STom Rini devname = miiphy_get_current_dev(); 8411634e969STom Rini 8421634e969STom Rini miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_ADDR_REG, 8431634e969STom Rini AR8051_DEBUG_RGMII_CLK_DLY_REG); 8441634e969STom Rini miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_DATA_REG, 8451634e969STom Rini AR8051_RGMII_TX_CLK_DLY); 8461634e969STom Rini } 847d2aa1154SIlya Yanok #endif 848c0e66793SIlya Yanok #if defined(CONFIG_USB_ETHER) && \ 849c0e66793SIlya Yanok (!defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_USBETH_SUPPORT)) 8500adb5b76SJoe Hershberger if (is_valid_ethaddr(mac_addr)) 851c0e66793SIlya Yanok eth_setenv_enetaddr("usbnet_devaddr", mac_addr); 852c0e66793SIlya Yanok 853d2aa1154SIlya Yanok rv = usb_eth_initialize(bis); 854d2aa1154SIlya Yanok if (rv < 0) 855d2aa1154SIlya Yanok printf("Error %d registering USB_ETHER\n", rv); 856d2aa1154SIlya Yanok else 857d2aa1154SIlya Yanok n += rv; 858d2aa1154SIlya Yanok #endif 859d2aa1154SIlya Yanok return n; 860e363426eSPeter Korsgaard } 861e363426eSPeter Korsgaard #endif 862bd83e3dfSMugunthan V N 863bd83e3dfSMugunthan V N #endif /* CONFIG_DM_ETH */ 864505ea6e8SLokesh Vutla 865505ea6e8SLokesh Vutla #ifdef CONFIG_SPL_LOAD_FIT 866505ea6e8SLokesh Vutla int board_fit_config_name_match(const char *name) 867505ea6e8SLokesh Vutla { 868505ea6e8SLokesh Vutla if (board_is_gp_evm() && !strcmp(name, "am335x-evm")) 869505ea6e8SLokesh Vutla return 0; 870505ea6e8SLokesh Vutla else if (board_is_bone() && !strcmp(name, "am335x-bone")) 871505ea6e8SLokesh Vutla return 0; 872505ea6e8SLokesh Vutla else if (board_is_bone_lt() && !strcmp(name, "am335x-boneblack")) 873505ea6e8SLokesh Vutla return 0; 8743819ea70SLokesh Vutla else if (board_is_evm_sk() && !strcmp(name, "am335x-evmsk")) 8753819ea70SLokesh Vutla return 0; 876da9d9599SLokesh Vutla else if (board_is_bbg1() && !strcmp(name, "am335x-bonegreen")) 877da9d9599SLokesh Vutla return 0; 87873ec6960SLokesh Vutla else if (board_is_icev2() && !strcmp(name, "am335x-icev2")) 87973ec6960SLokesh Vutla return 0; 880505ea6e8SLokesh Vutla else 881505ea6e8SLokesh Vutla return -1; 882505ea6e8SLokesh Vutla } 883505ea6e8SLokesh Vutla #endif 884b0a4eea1SAndrew F. Davis 885b0a4eea1SAndrew F. Davis #ifdef CONFIG_TI_SECURE_DEVICE 886b0a4eea1SAndrew F. Davis void board_fit_image_post_process(void **p_image, size_t *p_size) 887b0a4eea1SAndrew F. Davis { 888b0a4eea1SAndrew F. Davis secure_boot_verify_image(p_image, p_size); 889b0a4eea1SAndrew F. Davis } 890b0a4eea1SAndrew F. Davis #endif 891