1fbf2728dSLokesh Vutla /* 2fbf2728dSLokesh Vutla * board.c 3fbf2728dSLokesh Vutla * 4fbf2728dSLokesh Vutla * Board functions for TI AM43XX based boards 5fbf2728dSLokesh Vutla * 6fbf2728dSLokesh Vutla * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/ 7fbf2728dSLokesh Vutla * 8fbf2728dSLokesh Vutla * SPDX-License-Identifier: GPL-2.0+ 9fbf2728dSLokesh Vutla */ 10fbf2728dSLokesh Vutla 11fbf2728dSLokesh Vutla #include <common.h> 129f1a8cd3SSekhar Nori #include <i2c.h> 139f1a8cd3SSekhar Nori #include <asm/errno.h> 14fbf2728dSLokesh Vutla #include <spl.h> 153b34ac13SLokesh Vutla #include <asm/arch/clock.h> 16fbf2728dSLokesh Vutla #include <asm/arch/sys_proto.h> 17fbf2728dSLokesh Vutla #include <asm/arch/mux.h> 18d3daba10SLokesh Vutla #include <asm/arch/ddr_defs.h> 19b5e01eecSLokesh Vutla #include <asm/arch/gpio.h> 20d3daba10SLokesh Vutla #include <asm/emif.h> 21fbf2728dSLokesh Vutla #include "board.h" 227aa5598aSTom Rini #include <power/pmic.h> 2383bad102STom Rini #include <power/tps65218.h> 244cdd7fdaSMugunthan V N #include <miiphy.h> 254cdd7fdaSMugunthan V N #include <cpsw.h> 26fbf2728dSLokesh Vutla 27fbf2728dSLokesh Vutla DECLARE_GLOBAL_DATA_PTR; 28fbf2728dSLokesh Vutla 294cdd7fdaSMugunthan V N static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; 304cdd7fdaSMugunthan V N 319f1a8cd3SSekhar Nori /* 329f1a8cd3SSekhar Nori * Read header information from EEPROM into global structure. 339f1a8cd3SSekhar Nori */ 349f1a8cd3SSekhar Nori static int read_eeprom(struct am43xx_board_id *header) 359f1a8cd3SSekhar Nori { 369f1a8cd3SSekhar Nori /* Check if baseboard eeprom is available */ 379f1a8cd3SSekhar Nori if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) { 389f1a8cd3SSekhar Nori printf("Could not probe the EEPROM at 0x%x\n", 399f1a8cd3SSekhar Nori CONFIG_SYS_I2C_EEPROM_ADDR); 409f1a8cd3SSekhar Nori return -ENODEV; 419f1a8cd3SSekhar Nori } 429f1a8cd3SSekhar Nori 439f1a8cd3SSekhar Nori /* read the eeprom using i2c */ 449f1a8cd3SSekhar Nori if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header, 459f1a8cd3SSekhar Nori sizeof(struct am43xx_board_id))) { 469f1a8cd3SSekhar Nori printf("Could not read the EEPROM\n"); 479f1a8cd3SSekhar Nori return -EIO; 489f1a8cd3SSekhar Nori } 499f1a8cd3SSekhar Nori 509f1a8cd3SSekhar Nori if (header->magic != 0xEE3355AA) { 519f1a8cd3SSekhar Nori /* 529f1a8cd3SSekhar Nori * read the eeprom using i2c again, 539f1a8cd3SSekhar Nori * but use only a 1 byte address 549f1a8cd3SSekhar Nori */ 559f1a8cd3SSekhar Nori if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header, 569f1a8cd3SSekhar Nori sizeof(struct am43xx_board_id))) { 579f1a8cd3SSekhar Nori printf("Could not read the EEPROM at 0x%x\n", 589f1a8cd3SSekhar Nori CONFIG_SYS_I2C_EEPROM_ADDR); 599f1a8cd3SSekhar Nori return -EIO; 609f1a8cd3SSekhar Nori } 619f1a8cd3SSekhar Nori 629f1a8cd3SSekhar Nori if (header->magic != 0xEE3355AA) { 639f1a8cd3SSekhar Nori printf("Incorrect magic number (0x%x) in EEPROM\n", 649f1a8cd3SSekhar Nori header->magic); 659f1a8cd3SSekhar Nori return -EINVAL; 669f1a8cd3SSekhar Nori } 679f1a8cd3SSekhar Nori } 689f1a8cd3SSekhar Nori 699f1a8cd3SSekhar Nori strncpy(am43xx_board_name, (char *)header->name, sizeof(header->name)); 709f1a8cd3SSekhar Nori am43xx_board_name[sizeof(header->name)] = 0; 719f1a8cd3SSekhar Nori 722c952111SFranklin S. Cooper Jr strncpy(am43xx_board_rev, (char *)header->version, sizeof(header->version)); 732c952111SFranklin S. Cooper Jr am43xx_board_rev[sizeof(header->version)] = 0; 742c952111SFranklin S. Cooper Jr 759f1a8cd3SSekhar Nori return 0; 769f1a8cd3SSekhar Nori } 779f1a8cd3SSekhar Nori 787a5f71bcSSourav Poddar #ifndef CONFIG_SKIP_LOWLEVEL_INIT 79fbf2728dSLokesh Vutla 80cf04d032SLokesh Vutla #define NUM_OPPS 6 81cf04d032SLokesh Vutla 82cf04d032SLokesh Vutla const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = { 83cf04d032SLokesh Vutla { /* 19.2 MHz */ 84*e2a6207bSJames Doublesin {125, 3, 2, -1, -1, -1, -1}, /* OPP 50 */ 85cf04d032SLokesh Vutla {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */ 86*e2a6207bSJames Doublesin {125, 3, 1, -1, -1, -1, -1}, /* OPP 100 */ 87*e2a6207bSJames Doublesin {150, 3, 1, -1, -1, -1, -1}, /* OPP 120 */ 88*e2a6207bSJames Doublesin {125, 2, 1, -1, -1, -1, -1}, /* OPP TB */ 89*e2a6207bSJames Doublesin {625, 11, 1, -1, -1, -1, -1} /* OPP NT */ 90cf04d032SLokesh Vutla }, 91cf04d032SLokesh Vutla { /* 24 MHz */ 92cf04d032SLokesh Vutla {300, 23, 1, -1, -1, -1, -1}, /* OPP 50 */ 93cf04d032SLokesh Vutla {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */ 94cf04d032SLokesh Vutla {600, 23, 1, -1, -1, -1, -1}, /* OPP 100 */ 95cf04d032SLokesh Vutla {720, 23, 1, -1, -1, -1, -1}, /* OPP 120 */ 96cf04d032SLokesh Vutla {800, 23, 1, -1, -1, -1, -1}, /* OPP TB */ 97cf04d032SLokesh Vutla {1000, 23, 1, -1, -1, -1, -1} /* OPP NT */ 98cf04d032SLokesh Vutla }, 99cf04d032SLokesh Vutla { /* 25 MHz */ 100cf04d032SLokesh Vutla {300, 24, 1, -1, -1, -1, -1}, /* OPP 50 */ 101cf04d032SLokesh Vutla {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */ 102cf04d032SLokesh Vutla {600, 24, 1, -1, -1, -1, -1}, /* OPP 100 */ 103cf04d032SLokesh Vutla {720, 24, 1, -1, -1, -1, -1}, /* OPP 120 */ 104cf04d032SLokesh Vutla {800, 24, 1, -1, -1, -1, -1}, /* OPP TB */ 105cf04d032SLokesh Vutla {1000, 24, 1, -1, -1, -1, -1} /* OPP NT */ 106cf04d032SLokesh Vutla }, 107cf04d032SLokesh Vutla { /* 26 MHz */ 108cf04d032SLokesh Vutla {300, 25, 1, -1, -1, -1, -1}, /* OPP 50 */ 109cf04d032SLokesh Vutla {-1, -1, -1, -1, -1, -1, -1}, /* OPP RESERVED */ 110cf04d032SLokesh Vutla {600, 25, 1, -1, -1, -1, -1}, /* OPP 100 */ 111cf04d032SLokesh Vutla {720, 25, 1, -1, -1, -1, -1}, /* OPP 120 */ 112cf04d032SLokesh Vutla {800, 25, 1, -1, -1, -1, -1}, /* OPP TB */ 113cf04d032SLokesh Vutla {1000, 25, 1, -1, -1, -1, -1} /* OPP NT */ 114cf04d032SLokesh Vutla }, 115cf04d032SLokesh Vutla }; 116cf04d032SLokesh Vutla 117cf04d032SLokesh Vutla const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = { 118*e2a6207bSJames Doublesin {625, 11, -1, -1, 10, 8, 4}, /* 19.2 MHz */ 119cf04d032SLokesh Vutla {1000, 23, -1, -1, 10, 8, 4}, /* 24 MHz */ 120cf04d032SLokesh Vutla {1000, 24, -1, -1, 10, 8, 4}, /* 25 MHz */ 121cf04d032SLokesh Vutla {1000, 25, -1, -1, 10, 8, 4} /* 26 MHz */ 122cf04d032SLokesh Vutla }; 123cf04d032SLokesh Vutla 124cf04d032SLokesh Vutla const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = { 125*e2a6207bSJames Doublesin {400, 7, 5, -1, -1, -1, -1}, /* 19.2 MHz */ 126*e2a6207bSJames Doublesin {400, 9, 5, -1, -1, -1, -1}, /* 24 MHz */ 127*e2a6207bSJames Doublesin {32, 0, 8, -1, -1, -1, -1}, /* 25 MHz */ 128*e2a6207bSJames Doublesin {480, 12, 5, -1, -1, -1, -1} /* 26 MHz */ 129cf04d032SLokesh Vutla }; 130cf04d032SLokesh Vutla 131*e2a6207bSJames Doublesin const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = { 132*e2a6207bSJames Doublesin {665, 47, 1, -1, 4, -1, -1}, /*19.2*/ 133*e2a6207bSJames Doublesin {133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */ 134*e2a6207bSJames Doublesin {266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */ 135*e2a6207bSJames Doublesin {133, 12, 1, -1, 4, -1, -1} /* 26 MHz */ 136*e2a6207bSJames Doublesin }; 137cf04d032SLokesh Vutla 138cf04d032SLokesh Vutla const struct dpll_params gp_evm_dpll_ddr = { 139*e2a6207bSJames Doublesin 50, 2, 1, -1, 2, -1, -1}; 140fbf2728dSLokesh Vutla 141d3daba10SLokesh Vutla const struct ctrl_ioregs ioregs_lpddr2 = { 142d3daba10SLokesh Vutla .cm0ioctl = LPDDR2_ADDRCTRL_IOCTRL_VALUE, 143d3daba10SLokesh Vutla .cm1ioctl = LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE, 144d3daba10SLokesh Vutla .cm2ioctl = LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE, 145d3daba10SLokesh Vutla .dt0ioctl = LPDDR2_DATA0_IOCTRL_VALUE, 146d3daba10SLokesh Vutla .dt1ioctl = LPDDR2_DATA0_IOCTRL_VALUE, 147d3daba10SLokesh Vutla .dt2ioctrl = LPDDR2_DATA0_IOCTRL_VALUE, 148d3daba10SLokesh Vutla .dt3ioctrl = LPDDR2_DATA0_IOCTRL_VALUE, 149d3daba10SLokesh Vutla .emif_sdram_config_ext = 0x1, 150d3daba10SLokesh Vutla }; 151d3daba10SLokesh Vutla 152d3daba10SLokesh Vutla const struct emif_regs emif_regs_lpddr2 = { 153d3daba10SLokesh Vutla .sdram_config = 0x808012BA, 154d3daba10SLokesh Vutla .ref_ctrl = 0x0000040D, 155d3daba10SLokesh Vutla .sdram_tim1 = 0xEA86B411, 156d3daba10SLokesh Vutla .sdram_tim2 = 0x103A094A, 157d3daba10SLokesh Vutla .sdram_tim3 = 0x0F6BA37F, 158d3daba10SLokesh Vutla .read_idle_ctrl = 0x00050000, 159d3daba10SLokesh Vutla .zq_config = 0x50074BE4, 160d3daba10SLokesh Vutla .temp_alert_config = 0x0, 161d3daba10SLokesh Vutla .emif_rd_wr_lvl_rmp_win = 0x0, 162d3daba10SLokesh Vutla .emif_rd_wr_lvl_rmp_ctl = 0x0, 163d3daba10SLokesh Vutla .emif_rd_wr_lvl_ctl = 0x0, 164*e2a6207bSJames Doublesin .emif_ddr_phy_ctlr_1 = 0x0E284006, 1658038b497SCooper Jr., Franklin .emif_rd_wr_exec_thresh = 0x80000405, 166d3daba10SLokesh Vutla .emif_ddr_ext_phy_ctrl_1 = 0x04010040, 167d3daba10SLokesh Vutla .emif_ddr_ext_phy_ctrl_2 = 0x00500050, 168d3daba10SLokesh Vutla .emif_ddr_ext_phy_ctrl_3 = 0x00500050, 169d3daba10SLokesh Vutla .emif_ddr_ext_phy_ctrl_4 = 0x00500050, 1708038b497SCooper Jr., Franklin .emif_ddr_ext_phy_ctrl_5 = 0x00500050, 1718038b497SCooper Jr., Franklin .emif_prio_class_serv_map = 0x80000001, 1728038b497SCooper Jr., Franklin .emif_connect_id_serv_1_map = 0x80000094, 1738038b497SCooper Jr., Franklin .emif_connect_id_serv_2_map = 0x00000000, 1748038b497SCooper Jr., Franklin .emif_cos_config = 0x000FFFFF 175d3daba10SLokesh Vutla }; 176d3daba10SLokesh Vutla 177d3daba10SLokesh Vutla const u32 ext_phy_ctrl_const_base_lpddr2[] = { 178d3daba10SLokesh Vutla 0x00500050, 179d3daba10SLokesh Vutla 0x00350035, 180d3daba10SLokesh Vutla 0x00350035, 181d3daba10SLokesh Vutla 0x00350035, 182d3daba10SLokesh Vutla 0x00350035, 183d3daba10SLokesh Vutla 0x00350035, 184d3daba10SLokesh Vutla 0x00000000, 185d3daba10SLokesh Vutla 0x00000000, 186d3daba10SLokesh Vutla 0x00000000, 187d3daba10SLokesh Vutla 0x00000000, 188d3daba10SLokesh Vutla 0x00000000, 189d3daba10SLokesh Vutla 0x00000000, 190d3daba10SLokesh Vutla 0x00000000, 191d3daba10SLokesh Vutla 0x00000000, 192d3daba10SLokesh Vutla 0x00000000, 193d3daba10SLokesh Vutla 0x00000000, 194d3daba10SLokesh Vutla 0x00000000, 195d3daba10SLokesh Vutla 0x00000000, 196d3daba10SLokesh Vutla 0x40001000, 197d3daba10SLokesh Vutla 0x08102040 198d3daba10SLokesh Vutla }; 199d3daba10SLokesh Vutla 200b5e01eecSLokesh Vutla const struct ctrl_ioregs ioregs_ddr3 = { 201b5e01eecSLokesh Vutla .cm0ioctl = DDR3_ADDRCTRL_IOCTRL_VALUE, 202b5e01eecSLokesh Vutla .cm1ioctl = DDR3_ADDRCTRL_WD0_IOCTRL_VALUE, 203b5e01eecSLokesh Vutla .cm2ioctl = DDR3_ADDRCTRL_WD1_IOCTRL_VALUE, 204b5e01eecSLokesh Vutla .dt0ioctl = DDR3_DATA0_IOCTRL_VALUE, 205b5e01eecSLokesh Vutla .dt1ioctl = DDR3_DATA0_IOCTRL_VALUE, 206b5e01eecSLokesh Vutla .dt2ioctrl = DDR3_DATA0_IOCTRL_VALUE, 207b5e01eecSLokesh Vutla .dt3ioctrl = DDR3_DATA0_IOCTRL_VALUE, 208*e2a6207bSJames Doublesin .emif_sdram_config_ext = 0xc163, 209b5e01eecSLokesh Vutla }; 210b5e01eecSLokesh Vutla 211b5e01eecSLokesh Vutla const struct emif_regs ddr3_emif_regs_400Mhz = { 212b5e01eecSLokesh Vutla .sdram_config = 0x638413B2, 213b5e01eecSLokesh Vutla .ref_ctrl = 0x00000C30, 214b5e01eecSLokesh Vutla .sdram_tim1 = 0xEAAAD4DB, 215b5e01eecSLokesh Vutla .sdram_tim2 = 0x266B7FDA, 216b5e01eecSLokesh Vutla .sdram_tim3 = 0x107F8678, 217b5e01eecSLokesh Vutla .read_idle_ctrl = 0x00050000, 218b5e01eecSLokesh Vutla .zq_config = 0x50074BE4, 219b5e01eecSLokesh Vutla .temp_alert_config = 0x0, 220e27f2dd7SLokesh Vutla .emif_ddr_phy_ctlr_1 = 0x0E004008, 221b5e01eecSLokesh Vutla .emif_ddr_ext_phy_ctrl_1 = 0x08020080, 222b5e01eecSLokesh Vutla .emif_ddr_ext_phy_ctrl_2 = 0x00400040, 223b5e01eecSLokesh Vutla .emif_ddr_ext_phy_ctrl_3 = 0x00400040, 224b5e01eecSLokesh Vutla .emif_ddr_ext_phy_ctrl_4 = 0x00400040, 225b5e01eecSLokesh Vutla .emif_ddr_ext_phy_ctrl_5 = 0x00400040, 226b5e01eecSLokesh Vutla .emif_rd_wr_lvl_rmp_win = 0x0, 227b5e01eecSLokesh Vutla .emif_rd_wr_lvl_rmp_ctl = 0x0, 228b5e01eecSLokesh Vutla .emif_rd_wr_lvl_ctl = 0x0, 2298038b497SCooper Jr., Franklin .emif_rd_wr_exec_thresh = 0x80000405, 2308038b497SCooper Jr., Franklin .emif_prio_class_serv_map = 0x80000001, 2318038b497SCooper Jr., Franklin .emif_connect_id_serv_1_map = 0x80000094, 2328038b497SCooper Jr., Franklin .emif_connect_id_serv_2_map = 0x00000000, 2338038b497SCooper Jr., Franklin .emif_cos_config = 0x000FFFFF 234b5e01eecSLokesh Vutla }; 235b5e01eecSLokesh Vutla 2362c952111SFranklin S. Cooper Jr /* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */ 2372c952111SFranklin S. Cooper Jr const struct emif_regs ddr3_emif_regs_400Mhz_beta = { 2382c952111SFranklin S. Cooper Jr .sdram_config = 0x638413B2, 2392c952111SFranklin S. Cooper Jr .ref_ctrl = 0x00000C30, 2402c952111SFranklin S. Cooper Jr .sdram_tim1 = 0xEAAAD4DB, 2412c952111SFranklin S. Cooper Jr .sdram_tim2 = 0x266B7FDA, 2422c952111SFranklin S. Cooper Jr .sdram_tim3 = 0x107F8678, 2432c952111SFranklin S. Cooper Jr .read_idle_ctrl = 0x00050000, 2442c952111SFranklin S. Cooper Jr .zq_config = 0x50074BE4, 2452c952111SFranklin S. Cooper Jr .temp_alert_config = 0x0, 2462c952111SFranklin S. Cooper Jr .emif_ddr_phy_ctlr_1 = 0x0E004008, 2472c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_1 = 0x08020080, 2482c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_2 = 0x00000065, 2492c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_3 = 0x00000091, 2502c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_4 = 0x000000B5, 2512c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_5 = 0x000000E5, 2528038b497SCooper Jr., Franklin .emif_rd_wr_exec_thresh = 0x80000405, 2538038b497SCooper Jr., Franklin .emif_prio_class_serv_map = 0x80000001, 2548038b497SCooper Jr., Franklin .emif_connect_id_serv_1_map = 0x80000094, 2558038b497SCooper Jr., Franklin .emif_connect_id_serv_2_map = 0x00000000, 2568038b497SCooper Jr., Franklin .emif_cos_config = 0x000FFFFF 2572c952111SFranklin S. Cooper Jr }; 2582c952111SFranklin S. Cooper Jr 2592c952111SFranklin S. Cooper Jr /* EMIF DDR3 Configurations are different for production AM43X GP EVMs */ 2602c952111SFranklin S. Cooper Jr const struct emif_regs ddr3_emif_regs_400Mhz_production = { 2612c952111SFranklin S. Cooper Jr .sdram_config = 0x638413B2, 2622c952111SFranklin S. Cooper Jr .ref_ctrl = 0x00000C30, 2632c952111SFranklin S. Cooper Jr .sdram_tim1 = 0xEAAAD4DB, 2642c952111SFranklin S. Cooper Jr .sdram_tim2 = 0x266B7FDA, 2652c952111SFranklin S. Cooper Jr .sdram_tim3 = 0x107F8678, 2662c952111SFranklin S. Cooper Jr .read_idle_ctrl = 0x00050000, 2672c952111SFranklin S. Cooper Jr .zq_config = 0x50074BE4, 2682c952111SFranklin S. Cooper Jr .temp_alert_config = 0x0, 2692c952111SFranklin S. Cooper Jr .emif_ddr_phy_ctlr_1 = 0x0E004008, 2702c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_1 = 0x08020080, 2712c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_2 = 0x00000066, 2722c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_3 = 0x00000091, 2732c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_4 = 0x000000B9, 2742c952111SFranklin S. Cooper Jr .emif_ddr_ext_phy_ctrl_5 = 0x000000E6, 2758038b497SCooper Jr., Franklin .emif_rd_wr_exec_thresh = 0x80000405, 2768038b497SCooper Jr., Franklin .emif_prio_class_serv_map = 0x80000001, 2778038b497SCooper Jr., Franklin .emif_connect_id_serv_1_map = 0x80000094, 2788038b497SCooper Jr., Franklin .emif_connect_id_serv_2_map = 0x00000000, 2798038b497SCooper Jr., Franklin .emif_cos_config = 0x000FFFFF 2802c952111SFranklin S. Cooper Jr }; 2812c952111SFranklin S. Cooper Jr 2829cb9f333SFelipe Balbi static const struct emif_regs ddr3_sk_emif_regs_400Mhz = { 2839cb9f333SFelipe Balbi .sdram_config = 0x638413b2, 2849cb9f333SFelipe Balbi .sdram_config2 = 0x00000000, 2859cb9f333SFelipe Balbi .ref_ctrl = 0x00000c30, 2869cb9f333SFelipe Balbi .sdram_tim1 = 0xeaaad4db, 2879cb9f333SFelipe Balbi .sdram_tim2 = 0x266b7fda, 2889cb9f333SFelipe Balbi .sdram_tim3 = 0x107f8678, 2899cb9f333SFelipe Balbi .read_idle_ctrl = 0x00050000, 2909cb9f333SFelipe Balbi .zq_config = 0x50074be4, 2919cb9f333SFelipe Balbi .temp_alert_config = 0x0, 2929cb9f333SFelipe Balbi .emif_ddr_phy_ctlr_1 = 0x0e084008, 2939cb9f333SFelipe Balbi .emif_ddr_ext_phy_ctrl_1 = 0x08020080, 2949cb9f333SFelipe Balbi .emif_ddr_ext_phy_ctrl_2 = 0x89, 2959cb9f333SFelipe Balbi .emif_ddr_ext_phy_ctrl_3 = 0x90, 2969cb9f333SFelipe Balbi .emif_ddr_ext_phy_ctrl_4 = 0x8e, 2979cb9f333SFelipe Balbi .emif_ddr_ext_phy_ctrl_5 = 0x8d, 2989cb9f333SFelipe Balbi .emif_rd_wr_lvl_rmp_win = 0x0, 2999cb9f333SFelipe Balbi .emif_rd_wr_lvl_rmp_ctl = 0x00000000, 3009cb9f333SFelipe Balbi .emif_rd_wr_lvl_ctl = 0x00000000, 3018038b497SCooper Jr., Franklin .emif_rd_wr_exec_thresh = 0x80000000, 3028038b497SCooper Jr., Franklin .emif_prio_class_serv_map = 0x80000001, 3038038b497SCooper Jr., Franklin .emif_connect_id_serv_1_map = 0x80000094, 3048038b497SCooper Jr., Franklin .emif_connect_id_serv_2_map = 0x00000000, 3058038b497SCooper Jr., Franklin .emif_cos_config = 0x000FFFFF 3069cb9f333SFelipe Balbi }; 3079cb9f333SFelipe Balbi 308b5e01eecSLokesh Vutla const u32 ext_phy_ctrl_const_base_ddr3[] = { 309b5e01eecSLokesh Vutla 0x00400040, 310b5e01eecSLokesh Vutla 0x00350035, 311b5e01eecSLokesh Vutla 0x00350035, 312b5e01eecSLokesh Vutla 0x00350035, 313b5e01eecSLokesh Vutla 0x00350035, 314b5e01eecSLokesh Vutla 0x00350035, 315b5e01eecSLokesh Vutla 0x00000000, 316b5e01eecSLokesh Vutla 0x00000000, 317b5e01eecSLokesh Vutla 0x00000000, 318b5e01eecSLokesh Vutla 0x00000000, 319b5e01eecSLokesh Vutla 0x00000000, 320b5e01eecSLokesh Vutla 0x00340034, 321b5e01eecSLokesh Vutla 0x00340034, 322b5e01eecSLokesh Vutla 0x00340034, 323b5e01eecSLokesh Vutla 0x00340034, 324b5e01eecSLokesh Vutla 0x00340034, 325b5e01eecSLokesh Vutla 0x0, 326b5e01eecSLokesh Vutla 0x0, 327b5e01eecSLokesh Vutla 0x40000000, 328b5e01eecSLokesh Vutla 0x08102040 329b5e01eecSLokesh Vutla }; 330b5e01eecSLokesh Vutla 3312c952111SFranklin S. Cooper Jr const u32 ext_phy_ctrl_const_base_ddr3_beta[] = { 3322c952111SFranklin S. Cooper Jr 0x00000000, 3332c952111SFranklin S. Cooper Jr 0x00000045, 3342c952111SFranklin S. Cooper Jr 0x00000046, 3352c952111SFranklin S. Cooper Jr 0x00000048, 3362c952111SFranklin S. Cooper Jr 0x00000047, 3372c952111SFranklin S. Cooper Jr 0x00000000, 3382c952111SFranklin S. Cooper Jr 0x0000004C, 3392c952111SFranklin S. Cooper Jr 0x00000070, 3402c952111SFranklin S. Cooper Jr 0x00000085, 3412c952111SFranklin S. Cooper Jr 0x000000A3, 3422c952111SFranklin S. Cooper Jr 0x00000000, 3432c952111SFranklin S. Cooper Jr 0x0000000C, 3442c952111SFranklin S. Cooper Jr 0x00000030, 3452c952111SFranklin S. Cooper Jr 0x00000045, 3462c952111SFranklin S. Cooper Jr 0x00000063, 3472c952111SFranklin S. Cooper Jr 0x00000000, 3482c952111SFranklin S. Cooper Jr 0x0, 3492c952111SFranklin S. Cooper Jr 0x0, 3502c952111SFranklin S. Cooper Jr 0x40000000, 3512c952111SFranklin S. Cooper Jr 0x08102040 3522c952111SFranklin S. Cooper Jr }; 3532c952111SFranklin S. Cooper Jr 3542c952111SFranklin S. Cooper Jr const u32 ext_phy_ctrl_const_base_ddr3_production[] = { 3552c952111SFranklin S. Cooper Jr 0x00000000, 3562c952111SFranklin S. Cooper Jr 0x00000044, 3572c952111SFranklin S. Cooper Jr 0x00000044, 3582c952111SFranklin S. Cooper Jr 0x00000046, 3592c952111SFranklin S. Cooper Jr 0x00000046, 3602c952111SFranklin S. Cooper Jr 0x00000000, 3612c952111SFranklin S. Cooper Jr 0x00000059, 3622c952111SFranklin S. Cooper Jr 0x00000077, 3632c952111SFranklin S. Cooper Jr 0x00000093, 3642c952111SFranklin S. Cooper Jr 0x000000A8, 3652c952111SFranklin S. Cooper Jr 0x00000000, 3662c952111SFranklin S. Cooper Jr 0x00000019, 3672c952111SFranklin S. Cooper Jr 0x00000037, 3682c952111SFranklin S. Cooper Jr 0x00000053, 3692c952111SFranklin S. Cooper Jr 0x00000068, 3702c952111SFranklin S. Cooper Jr 0x00000000, 3712c952111SFranklin S. Cooper Jr 0x0, 3722c952111SFranklin S. Cooper Jr 0x0, 3732c952111SFranklin S. Cooper Jr 0x40000000, 3742c952111SFranklin S. Cooper Jr 0x08102040 3752c952111SFranklin S. Cooper Jr }; 3762c952111SFranklin S. Cooper Jr 3779cb9f333SFelipe Balbi static const u32 ext_phy_ctrl_const_base_ddr3_sk[] = { 3789cb9f333SFelipe Balbi /* first 5 are taken care by emif_regs */ 3799cb9f333SFelipe Balbi 0x00700070, 3809cb9f333SFelipe Balbi 3819cb9f333SFelipe Balbi 0x00350035, 3829cb9f333SFelipe Balbi 0x00350035, 3839cb9f333SFelipe Balbi 0x00350035, 3849cb9f333SFelipe Balbi 0x00350035, 3859cb9f333SFelipe Balbi 0x00350035, 3869cb9f333SFelipe Balbi 3879cb9f333SFelipe Balbi 0x00000000, 3889cb9f333SFelipe Balbi 0x00000000, 3899cb9f333SFelipe Balbi 0x00000000, 3909cb9f333SFelipe Balbi 0x00000000, 3919cb9f333SFelipe Balbi 0x00000000, 3929cb9f333SFelipe Balbi 3939cb9f333SFelipe Balbi 0x00150015, 3949cb9f333SFelipe Balbi 0x00150015, 3959cb9f333SFelipe Balbi 0x00150015, 3969cb9f333SFelipe Balbi 0x00150015, 3979cb9f333SFelipe Balbi 0x00150015, 3989cb9f333SFelipe Balbi 3999cb9f333SFelipe Balbi 0x00800080, 4009cb9f333SFelipe Balbi 0x00800080, 4019cb9f333SFelipe Balbi 4029cb9f333SFelipe Balbi 0x40000000, 4039cb9f333SFelipe Balbi 4049cb9f333SFelipe Balbi 0x08102040, 4059cb9f333SFelipe Balbi 4069cb9f333SFelipe Balbi 0x00000000, 4079cb9f333SFelipe Balbi 0x00000000, 4089cb9f333SFelipe Balbi 0x00000000, 4099cb9f333SFelipe Balbi 0x00000000, 4109cb9f333SFelipe Balbi 0x00000000, 4119cb9f333SFelipe Balbi 0x00000000, 4129cb9f333SFelipe Balbi 0x00000000, 4139cb9f333SFelipe Balbi 0x00000000, 4149cb9f333SFelipe Balbi 0x00000000, 4159cb9f333SFelipe Balbi 0x00000000, 4169cb9f333SFelipe Balbi 0x00000000, 4179cb9f333SFelipe Balbi }; 4189cb9f333SFelipe Balbi 419d3daba10SLokesh Vutla void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size) 420d3daba10SLokesh Vutla { 421b5e01eecSLokesh Vutla if (board_is_eposevm()) { 422d3daba10SLokesh Vutla *regs = ext_phy_ctrl_const_base_lpddr2; 423d3daba10SLokesh Vutla *size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2); 4242c952111SFranklin S. Cooper Jr } else if (board_is_evm_14_or_later()) { 4252c952111SFranklin S. Cooper Jr *regs = ext_phy_ctrl_const_base_ddr3_production; 4262c952111SFranklin S. Cooper Jr *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_production); 4272c952111SFranklin S. Cooper Jr } else if (board_is_evm_12_or_later()) { 4282c952111SFranklin S. Cooper Jr *regs = ext_phy_ctrl_const_base_ddr3_beta; 4292c952111SFranklin S. Cooper Jr *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_beta); 430b5e01eecSLokesh Vutla } else if (board_is_gpevm()) { 431b5e01eecSLokesh Vutla *regs = ext_phy_ctrl_const_base_ddr3; 432b5e01eecSLokesh Vutla *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3); 4339cb9f333SFelipe Balbi } else if (board_is_sk()) { 4349cb9f333SFelipe Balbi *regs = ext_phy_ctrl_const_base_ddr3_sk; 4359cb9f333SFelipe Balbi *size = ARRAY_SIZE(ext_phy_ctrl_const_base_ddr3_sk); 436b5e01eecSLokesh Vutla } 437d3daba10SLokesh Vutla 438d3daba10SLokesh Vutla return; 439d3daba10SLokesh Vutla } 440d3daba10SLokesh Vutla 441cf04d032SLokesh Vutla /* 442cf04d032SLokesh Vutla * get_sys_clk_index : returns the index of the sys_clk read from 443cf04d032SLokesh Vutla * ctrl status register. This value is either 444cf04d032SLokesh Vutla * read from efuse or sysboot pins. 445cf04d032SLokesh Vutla */ 446cf04d032SLokesh Vutla static u32 get_sys_clk_index(void) 447cf04d032SLokesh Vutla { 448cf04d032SLokesh Vutla struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE; 449cf04d032SLokesh Vutla u32 ind = readl(&ctrl->statusreg), src; 450cf04d032SLokesh Vutla 451cf04d032SLokesh Vutla src = (ind & CTRL_CRYSTAL_FREQ_SRC_MASK) >> CTRL_CRYSTAL_FREQ_SRC_SHIFT; 452cf04d032SLokesh Vutla if (src == CTRL_CRYSTAL_FREQ_SRC_EFUSE) /* Value read from EFUSE */ 453cf04d032SLokesh Vutla return ((ind & CTRL_CRYSTAL_FREQ_SELECTION_MASK) >> 454cf04d032SLokesh Vutla CTRL_CRYSTAL_FREQ_SELECTION_SHIFT); 455cf04d032SLokesh Vutla else /* Value read from SYS BOOT pins */ 456cf04d032SLokesh Vutla return ((ind & CTRL_SYSBOOT_15_14_MASK) >> 457cf04d032SLokesh Vutla CTRL_SYSBOOT_15_14_SHIFT); 458cf04d032SLokesh Vutla } 459cf04d032SLokesh Vutla 460*e2a6207bSJames Doublesin const struct dpll_params *get_dpll_ddr_params(void) 461*e2a6207bSJames Doublesin { 462*e2a6207bSJames Doublesin int ind = get_sys_clk_index(); 463*e2a6207bSJames Doublesin 464*e2a6207bSJames Doublesin if (board_is_eposevm()) 465*e2a6207bSJames Doublesin return &epos_evm_dpll_ddr[ind]; 466*e2a6207bSJames Doublesin else if (board_is_gpevm() || board_is_sk()) 467*e2a6207bSJames Doublesin return &gp_evm_dpll_ddr; 468*e2a6207bSJames Doublesin 469*e2a6207bSJames Doublesin printf(" Board '%s' not supported\n", am43xx_board_name); 470*e2a6207bSJames Doublesin return NULL; 471*e2a6207bSJames Doublesin } 472*e2a6207bSJames Doublesin 473*e2a6207bSJames Doublesin 474cf04d032SLokesh Vutla /* 475cf04d032SLokesh Vutla * get_opp_offset: 476cf04d032SLokesh Vutla * Returns the index for safest OPP of the device to boot. 477cf04d032SLokesh Vutla * max_off: Index of the MAX OPP in DEV ATTRIBUTE register. 478cf04d032SLokesh Vutla * min_off: Index of the MIN OPP in DEV ATTRIBUTE register. 479cf04d032SLokesh Vutla * This data is read from dev_attribute register which is e-fused. 480cf04d032SLokesh Vutla * A'1' in bit indicates OPP disabled and not available, a '0' indicates 481cf04d032SLokesh Vutla * OPP available. Lowest OPP starts with min_off. So returning the 482cf04d032SLokesh Vutla * bit with rightmost '0'. 483cf04d032SLokesh Vutla */ 484cf04d032SLokesh Vutla static int get_opp_offset(int max_off, int min_off) 485cf04d032SLokesh Vutla { 486cf04d032SLokesh Vutla struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE; 487feca6e67STom Rini int opp, offset, i; 488feca6e67STom Rini 489feca6e67STom Rini /* Bits 0:11 are defined to be the MPU_MAX_FREQ */ 490feca6e67STom Rini opp = readl(&ctrl->dev_attr) & ~0xFFFFF000; 491cf04d032SLokesh Vutla 492cf04d032SLokesh Vutla for (i = max_off; i >= min_off; i--) { 493cf04d032SLokesh Vutla offset = opp & (1 << i); 494cf04d032SLokesh Vutla if (!offset) 495cf04d032SLokesh Vutla return i; 496cf04d032SLokesh Vutla } 497cf04d032SLokesh Vutla 498cf04d032SLokesh Vutla return min_off; 499cf04d032SLokesh Vutla } 500cf04d032SLokesh Vutla 501cf04d032SLokesh Vutla const struct dpll_params *get_dpll_mpu_params(void) 502cf04d032SLokesh Vutla { 503cf04d032SLokesh Vutla int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET); 504cf04d032SLokesh Vutla u32 ind = get_sys_clk_index(); 505cf04d032SLokesh Vutla 506cf04d032SLokesh Vutla return &dpll_mpu[ind][opp]; 507cf04d032SLokesh Vutla } 508cf04d032SLokesh Vutla 509cf04d032SLokesh Vutla const struct dpll_params *get_dpll_core_params(void) 510cf04d032SLokesh Vutla { 511cf04d032SLokesh Vutla int ind = get_sys_clk_index(); 512cf04d032SLokesh Vutla 513cf04d032SLokesh Vutla return &dpll_core[ind]; 514cf04d032SLokesh Vutla } 515cf04d032SLokesh Vutla 516cf04d032SLokesh Vutla const struct dpll_params *get_dpll_per_params(void) 517cf04d032SLokesh Vutla { 518cf04d032SLokesh Vutla int ind = get_sys_clk_index(); 519cf04d032SLokesh Vutla 520cf04d032SLokesh Vutla return &dpll_per[ind]; 521fbf2728dSLokesh Vutla } 522fbf2728dSLokesh Vutla 52383bad102STom Rini void scale_vcores(void) 52483bad102STom Rini { 52583bad102STom Rini const struct dpll_params *mpu_params; 52683bad102STom Rini int mpu_vdd; 52783bad102STom Rini struct am43xx_board_id header; 52883bad102STom Rini 52983bad102STom Rini enable_i2c0_pin_mux(); 53083bad102STom Rini i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE); 53183bad102STom Rini if (read_eeprom(&header) < 0) 53283bad102STom Rini puts("Could not get board ID.\n"); 53383bad102STom Rini 53483bad102STom Rini /* Get the frequency */ 53583bad102STom Rini mpu_params = get_dpll_mpu_params(); 53683bad102STom Rini 53783bad102STom Rini if (i2c_probe(TPS65218_CHIP_PM)) 53883bad102STom Rini return; 53983bad102STom Rini 54083bad102STom Rini if (mpu_params->m == 1000) { 54183bad102STom Rini mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV; 54283bad102STom Rini } else if (mpu_params->m == 600) { 54383bad102STom Rini mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV; 54483bad102STom Rini } else { 54583bad102STom Rini puts("Unknown MPU clock, not scaling\n"); 54683bad102STom Rini return; 54783bad102STom Rini } 54883bad102STom Rini 54983bad102STom Rini /* Set DCDC1 (CORE) voltage to 1.1V */ 55083bad102STom Rini if (tps65218_voltage_update(TPS65218_DCDC1, 55183bad102STom Rini TPS65218_DCDC_VOLT_SEL_1100MV)) { 55283bad102STom Rini puts("tps65218_voltage_update failure\n"); 55383bad102STom Rini return; 55483bad102STom Rini } 55583bad102STom Rini 55683bad102STom Rini /* Set DCDC2 (MPU) voltage */ 55783bad102STom Rini if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) { 55883bad102STom Rini puts("tps65218_voltage_update failure\n"); 55983bad102STom Rini return; 56083bad102STom Rini } 56183bad102STom Rini } 56283bad102STom Rini 563fbf2728dSLokesh Vutla void set_uart_mux_conf(void) 564fbf2728dSLokesh Vutla { 565fbf2728dSLokesh Vutla enable_uart0_pin_mux(); 566fbf2728dSLokesh Vutla } 567fbf2728dSLokesh Vutla 568fbf2728dSLokesh Vutla void set_mux_conf_regs(void) 569fbf2728dSLokesh Vutla { 570fbf2728dSLokesh Vutla enable_board_pin_mux(); 571fbf2728dSLokesh Vutla } 572fbf2728dSLokesh Vutla 573b5e01eecSLokesh Vutla static void enable_vtt_regulator(void) 574b5e01eecSLokesh Vutla { 575b5e01eecSLokesh Vutla u32 temp; 576b5e01eecSLokesh Vutla 577b5e01eecSLokesh Vutla /* enable module */ 578cd8341b7SDave Gerlach writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL); 579b5e01eecSLokesh Vutla 580cd8341b7SDave Gerlach /* enable output for GPIO5_7 */ 581cd8341b7SDave Gerlach writel(GPIO_SETDATAOUT(7), 582cd8341b7SDave Gerlach AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT); 583cd8341b7SDave Gerlach temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE); 584cd8341b7SDave Gerlach temp = temp & ~(GPIO_OE_ENABLE(7)); 585cd8341b7SDave Gerlach writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE); 586b5e01eecSLokesh Vutla } 587b5e01eecSLokesh Vutla 588fbf2728dSLokesh Vutla void sdram_init(void) 589fbf2728dSLokesh Vutla { 590b5e01eecSLokesh Vutla /* 591b5e01eecSLokesh Vutla * EPOS EVM has 1GB LPDDR2 connected to EMIF. 592b5e01eecSLokesh Vutla * GP EMV has 1GB DDR3 connected to EMIF 593b5e01eecSLokesh Vutla * along with VTT regulator. 594b5e01eecSLokesh Vutla */ 595b5e01eecSLokesh Vutla if (board_is_eposevm()) { 596d3daba10SLokesh Vutla config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0); 5972c952111SFranklin S. Cooper Jr } else if (board_is_evm_14_or_later()) { 5982c952111SFranklin S. Cooper Jr enable_vtt_regulator(); 5992c952111SFranklin S. Cooper Jr config_ddr(0, &ioregs_ddr3, NULL, NULL, 6002c952111SFranklin S. Cooper Jr &ddr3_emif_regs_400Mhz_production, 0); 6012c952111SFranklin S. Cooper Jr } else if (board_is_evm_12_or_later()) { 6022c952111SFranklin S. Cooper Jr enable_vtt_regulator(); 6032c952111SFranklin S. Cooper Jr config_ddr(0, &ioregs_ddr3, NULL, NULL, 6042c952111SFranklin S. Cooper Jr &ddr3_emif_regs_400Mhz_beta, 0); 605b5e01eecSLokesh Vutla } else if (board_is_gpevm()) { 606b5e01eecSLokesh Vutla enable_vtt_regulator(); 607b5e01eecSLokesh Vutla config_ddr(0, &ioregs_ddr3, NULL, NULL, 608b5e01eecSLokesh Vutla &ddr3_emif_regs_400Mhz, 0); 6099cb9f333SFelipe Balbi } else if (board_is_sk()) { 6109cb9f333SFelipe Balbi config_ddr(400, &ioregs_ddr3, NULL, NULL, 6119cb9f333SFelipe Balbi &ddr3_sk_emif_regs_400Mhz, 0); 612b5e01eecSLokesh Vutla } 613fbf2728dSLokesh Vutla } 614fbf2728dSLokesh Vutla #endif 615fbf2728dSLokesh Vutla 6167aa5598aSTom Rini /* setup board specific PMIC */ 6177aa5598aSTom Rini int power_init_board(void) 6187aa5598aSTom Rini { 6197aa5598aSTom Rini struct pmic *p; 6207aa5598aSTom Rini 6217aa5598aSTom Rini power_tps65218_init(I2C_PMIC); 6227aa5598aSTom Rini p = pmic_get("TPS65218_PMIC"); 6237aa5598aSTom Rini if (p && !pmic_probe(p)) 6247aa5598aSTom Rini puts("PMIC: TPS65218\n"); 6257aa5598aSTom Rini 6267aa5598aSTom Rini return 0; 6277aa5598aSTom Rini } 6287aa5598aSTom Rini 629fbf2728dSLokesh Vutla int board_init(void) 630fbf2728dSLokesh Vutla { 6318038b497SCooper Jr., Franklin struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER; 6328038b497SCooper Jr., Franklin u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional, 6338038b497SCooper Jr., Franklin modena_init0_bw_integer, modena_init0_watermark_0; 6348038b497SCooper Jr., Franklin 635369cbe1eSLokesh Vutla gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 636e53ad4b4Spekon gupta gpmc_init(); 637fbf2728dSLokesh Vutla 6388038b497SCooper Jr., Franklin /* Clear all important bits for DSS errata that may need to be tweaked*/ 6398038b497SCooper Jr., Franklin mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK & 6408038b497SCooper Jr., Franklin MREQPRIO_0_SAB_INIT0_MASK; 6418038b497SCooper Jr., Franklin 6428038b497SCooper Jr., Franklin mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK; 6438038b497SCooper Jr., Franklin 6448038b497SCooper Jr., Franklin modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) & 6458038b497SCooper Jr., Franklin BW_LIMITER_BW_FRAC_MASK; 6468038b497SCooper Jr., Franklin 6478038b497SCooper Jr., Franklin modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) & 6488038b497SCooper Jr., Franklin BW_LIMITER_BW_INT_MASK; 6498038b497SCooper Jr., Franklin 6508038b497SCooper Jr., Franklin modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) & 6518038b497SCooper Jr., Franklin BW_LIMITER_BW_WATERMARK_MASK; 6528038b497SCooper Jr., Franklin 6538038b497SCooper Jr., Franklin /* Setting MReq Priority of the DSS*/ 6548038b497SCooper Jr., Franklin mreqprio_0 |= 0x77; 6558038b497SCooper Jr., Franklin 6568038b497SCooper Jr., Franklin /* 6578038b497SCooper Jr., Franklin * Set L3 Fast Configuration Register 6588038b497SCooper Jr., Franklin * Limiting bandwith for ARM core to 700 MBPS 6598038b497SCooper Jr., Franklin */ 6608038b497SCooper Jr., Franklin modena_init0_bw_fractional |= 0x10; 6618038b497SCooper Jr., Franklin modena_init0_bw_integer |= 0x3; 6628038b497SCooper Jr., Franklin 6638038b497SCooper Jr., Franklin writel(mreqprio_0, &cdev->mreqprio_0); 6648038b497SCooper Jr., Franklin writel(mreqprio_1, &cdev->mreqprio_1); 6658038b497SCooper Jr., Franklin 6668038b497SCooper Jr., Franklin writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional); 6678038b497SCooper Jr., Franklin writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer); 6688038b497SCooper Jr., Franklin writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0); 6698038b497SCooper Jr., Franklin 670fbf2728dSLokesh Vutla return 0; 671fbf2728dSLokesh Vutla } 672fbf2728dSLokesh Vutla 673fbf2728dSLokesh Vutla #ifdef CONFIG_BOARD_LATE_INIT 674fbf2728dSLokesh Vutla int board_late_init(void) 675fbf2728dSLokesh Vutla { 676f4af163eSSekhar Nori #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG 677f4af163eSSekhar Nori char safe_string[HDR_NAME_LEN + 1]; 678f4af163eSSekhar Nori struct am43xx_board_id header; 679f4af163eSSekhar Nori 680f4af163eSSekhar Nori if (read_eeprom(&header) < 0) 681f4af163eSSekhar Nori puts("Could not get board ID.\n"); 682f4af163eSSekhar Nori 683f4af163eSSekhar Nori /* Now set variables based on the header. */ 684f4af163eSSekhar Nori strncpy(safe_string, (char *)header.name, sizeof(header.name)); 685f4af163eSSekhar Nori safe_string[sizeof(header.name)] = 0; 686f4af163eSSekhar Nori setenv("board_name", safe_string); 687f4af163eSSekhar Nori 688f4af163eSSekhar Nori strncpy(safe_string, (char *)header.version, sizeof(header.version)); 689f4af163eSSekhar Nori safe_string[sizeof(header.version)] = 0; 690f4af163eSSekhar Nori setenv("board_rev", safe_string); 691f4af163eSSekhar Nori #endif 692fbf2728dSLokesh Vutla return 0; 693fbf2728dSLokesh Vutla } 694fbf2728dSLokesh Vutla #endif 6954cdd7fdaSMugunthan V N 6964cdd7fdaSMugunthan V N #ifdef CONFIG_DRIVER_TI_CPSW 6974cdd7fdaSMugunthan V N 6984cdd7fdaSMugunthan V N static void cpsw_control(int enabled) 6994cdd7fdaSMugunthan V N { 7004cdd7fdaSMugunthan V N /* Additional controls can be added here */ 7014cdd7fdaSMugunthan V N return; 7024cdd7fdaSMugunthan V N } 7034cdd7fdaSMugunthan V N 7044cdd7fdaSMugunthan V N static struct cpsw_slave_data cpsw_slaves[] = { 7054cdd7fdaSMugunthan V N { 7064cdd7fdaSMugunthan V N .slave_reg_ofs = 0x208, 7074cdd7fdaSMugunthan V N .sliver_reg_ofs = 0xd80, 7084cdd7fdaSMugunthan V N .phy_addr = 16, 7094cdd7fdaSMugunthan V N }, 7104cdd7fdaSMugunthan V N { 7114cdd7fdaSMugunthan V N .slave_reg_ofs = 0x308, 7124cdd7fdaSMugunthan V N .sliver_reg_ofs = 0xdc0, 7134cdd7fdaSMugunthan V N .phy_addr = 1, 7144cdd7fdaSMugunthan V N }, 7154cdd7fdaSMugunthan V N }; 7164cdd7fdaSMugunthan V N 7174cdd7fdaSMugunthan V N static struct cpsw_platform_data cpsw_data = { 7184cdd7fdaSMugunthan V N .mdio_base = CPSW_MDIO_BASE, 7194cdd7fdaSMugunthan V N .cpsw_base = CPSW_BASE, 7204cdd7fdaSMugunthan V N .mdio_div = 0xff, 7214cdd7fdaSMugunthan V N .channels = 8, 7224cdd7fdaSMugunthan V N .cpdma_reg_ofs = 0x800, 7234cdd7fdaSMugunthan V N .slaves = 1, 7244cdd7fdaSMugunthan V N .slave_data = cpsw_slaves, 7254cdd7fdaSMugunthan V N .ale_reg_ofs = 0xd00, 7264cdd7fdaSMugunthan V N .ale_entries = 1024, 7274cdd7fdaSMugunthan V N .host_port_reg_ofs = 0x108, 7284cdd7fdaSMugunthan V N .hw_stats_reg_ofs = 0x900, 7294cdd7fdaSMugunthan V N .bd_ram_ofs = 0x2000, 7304cdd7fdaSMugunthan V N .mac_control = (1 << 5), 7314cdd7fdaSMugunthan V N .control = cpsw_control, 7324cdd7fdaSMugunthan V N .host_port_num = 0, 7334cdd7fdaSMugunthan V N .version = CPSW_CTRL_VERSION_2, 7344cdd7fdaSMugunthan V N }; 7354cdd7fdaSMugunthan V N 7364cdd7fdaSMugunthan V N int board_eth_init(bd_t *bis) 7374cdd7fdaSMugunthan V N { 7384cdd7fdaSMugunthan V N int rv; 7394cdd7fdaSMugunthan V N uint8_t mac_addr[6]; 7404cdd7fdaSMugunthan V N uint32_t mac_hi, mac_lo; 7414cdd7fdaSMugunthan V N 7424cdd7fdaSMugunthan V N /* try reading mac address from efuse */ 7434cdd7fdaSMugunthan V N mac_lo = readl(&cdev->macid0l); 7444cdd7fdaSMugunthan V N mac_hi = readl(&cdev->macid0h); 7454cdd7fdaSMugunthan V N mac_addr[0] = mac_hi & 0xFF; 7464cdd7fdaSMugunthan V N mac_addr[1] = (mac_hi & 0xFF00) >> 8; 7474cdd7fdaSMugunthan V N mac_addr[2] = (mac_hi & 0xFF0000) >> 16; 7484cdd7fdaSMugunthan V N mac_addr[3] = (mac_hi & 0xFF000000) >> 24; 7494cdd7fdaSMugunthan V N mac_addr[4] = mac_lo & 0xFF; 7504cdd7fdaSMugunthan V N mac_addr[5] = (mac_lo & 0xFF00) >> 8; 7514cdd7fdaSMugunthan V N 7524cdd7fdaSMugunthan V N if (!getenv("ethaddr")) { 7534cdd7fdaSMugunthan V N puts("<ethaddr> not set. Validating first E-fuse MAC\n"); 7544cdd7fdaSMugunthan V N if (is_valid_ether_addr(mac_addr)) 7554cdd7fdaSMugunthan V N eth_setenv_enetaddr("ethaddr", mac_addr); 7564cdd7fdaSMugunthan V N } 7574cdd7fdaSMugunthan V N 7584cdd7fdaSMugunthan V N mac_lo = readl(&cdev->macid1l); 7594cdd7fdaSMugunthan V N mac_hi = readl(&cdev->macid1h); 7604cdd7fdaSMugunthan V N mac_addr[0] = mac_hi & 0xFF; 7614cdd7fdaSMugunthan V N mac_addr[1] = (mac_hi & 0xFF00) >> 8; 7624cdd7fdaSMugunthan V N mac_addr[2] = (mac_hi & 0xFF0000) >> 16; 7634cdd7fdaSMugunthan V N mac_addr[3] = (mac_hi & 0xFF000000) >> 24; 7644cdd7fdaSMugunthan V N mac_addr[4] = mac_lo & 0xFF; 7654cdd7fdaSMugunthan V N mac_addr[5] = (mac_lo & 0xFF00) >> 8; 7664cdd7fdaSMugunthan V N 7674cdd7fdaSMugunthan V N if (!getenv("eth1addr")) { 7684cdd7fdaSMugunthan V N if (is_valid_ether_addr(mac_addr)) 7694cdd7fdaSMugunthan V N eth_setenv_enetaddr("eth1addr", mac_addr); 7704cdd7fdaSMugunthan V N } 7714cdd7fdaSMugunthan V N 7724cdd7fdaSMugunthan V N if (board_is_eposevm()) { 7734cdd7fdaSMugunthan V N writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel); 7744cdd7fdaSMugunthan V N cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII; 7754cdd7fdaSMugunthan V N cpsw_slaves[0].phy_addr = 16; 776619ce62dSFelipe Balbi } else if (board_is_sk()) { 777619ce62dSFelipe Balbi writel(RGMII_MODE_ENABLE, &cdev->miisel); 778619ce62dSFelipe Balbi cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII; 779619ce62dSFelipe Balbi cpsw_slaves[0].phy_addr = 4; 780619ce62dSFelipe Balbi cpsw_slaves[1].phy_addr = 5; 7814cdd7fdaSMugunthan V N } else { 7824cdd7fdaSMugunthan V N writel(RGMII_MODE_ENABLE, &cdev->miisel); 7834cdd7fdaSMugunthan V N cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII; 7844cdd7fdaSMugunthan V N cpsw_slaves[0].phy_addr = 0; 7854cdd7fdaSMugunthan V N } 7864cdd7fdaSMugunthan V N 7874cdd7fdaSMugunthan V N rv = cpsw_register(&cpsw_data); 7884cdd7fdaSMugunthan V N if (rv < 0) 7894cdd7fdaSMugunthan V N printf("Error %d registering CPSW switch\n", rv); 7904cdd7fdaSMugunthan V N 7914cdd7fdaSMugunthan V N return rv; 7924cdd7fdaSMugunthan V N } 7934cdd7fdaSMugunthan V N #endif 794