Home | History | Annotate | Download | only in am43xx
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * board.c
      4  *
      5  * Board functions for TI AM43XX based boards
      6  *
      7  * Copyright (C) 2013, Texas Instruments, Incorporated - http://www.ti.com/
      8  */
      9 
     10 #include <common.h>
     11 #include <environment.h>
     12 #include <i2c.h>
     13 #include <linux/errno.h>
     14 #include <spl.h>
     15 #include <usb.h>
     16 #include <asm/omap_sec_common.h>
     17 #include <asm/arch/clock.h>
     18 #include <asm/arch/sys_proto.h>
     19 #include <asm/arch/mux.h>
     20 #include <asm/arch/ddr_defs.h>
     21 #include <asm/arch/gpio.h>
     22 #include <asm/emif.h>
     23 #include <asm/omap_common.h>
     24 #include "../common/board_detect.h"
     25 #include "board.h"
     26 #include <power/pmic.h>
     27 #include <power/tps65218.h>
     28 #include <power/tps62362.h>
     29 #include <miiphy.h>
     30 #include <cpsw.h>
     31 #include <linux/usb/gadget.h>
     32 #include <dwc3-uboot.h>
     33 #include <dwc3-omap-uboot.h>
     34 #include <ti-usb-phy-uboot.h>
     35 
     36 DECLARE_GLOBAL_DATA_PTR;
     37 
     38 static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
     39 
     40 /*
     41  * Read header information from EEPROM into global structure.
     42  */
     43 #ifdef CONFIG_TI_I2C_BOARD_DETECT
     44 void do_board_detect(void)
     45 {
     46 	if (ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
     47 				 CONFIG_EEPROM_CHIP_ADDRESS))
     48 		printf("ti_i2c_eeprom_init failed\n");
     49 }
     50 #endif
     51 
     52 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
     53 
     54 const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
     55 	{	/* 19.2 MHz */
     56 		{125, 3, 2, -1, -1, -1, -1},	/* OPP 50 */
     57 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
     58 		{125, 3, 1, -1, -1, -1, -1},	/* OPP 100 */
     59 		{150, 3, 1, -1, -1, -1, -1},	/* OPP 120 */
     60 		{125, 2, 1, -1, -1, -1, -1},	/* OPP TB */
     61 		{625, 11, 1, -1, -1, -1, -1}	/* OPP NT */
     62 	},
     63 	{	/* 24 MHz */
     64 		{300, 23, 1, -1, -1, -1, -1},	/* OPP 50 */
     65 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
     66 		{600, 23, 1, -1, -1, -1, -1},	/* OPP 100 */
     67 		{720, 23, 1, -1, -1, -1, -1},	/* OPP 120 */
     68 		{800, 23, 1, -1, -1, -1, -1},	/* OPP TB */
     69 		{1000, 23, 1, -1, -1, -1, -1}	/* OPP NT */
     70 	},
     71 	{	/* 25 MHz */
     72 		{300, 24, 1, -1, -1, -1, -1},	/* OPP 50 */
     73 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
     74 		{600, 24, 1, -1, -1, -1, -1},	/* OPP 100 */
     75 		{720, 24, 1, -1, -1, -1, -1},	/* OPP 120 */
     76 		{800, 24, 1, -1, -1, -1, -1},	/* OPP TB */
     77 		{1000, 24, 1, -1, -1, -1, -1}	/* OPP NT */
     78 	},
     79 	{	/* 26 MHz */
     80 		{300, 25, 1, -1, -1, -1, -1},	/* OPP 50 */
     81 		{-1, -1, -1, -1, -1, -1, -1},	/* OPP RESERVED	*/
     82 		{600, 25, 1, -1, -1, -1, -1},	/* OPP 100 */
     83 		{720, 25, 1, -1, -1, -1, -1},	/* OPP 120 */
     84 		{800, 25, 1, -1, -1, -1, -1},	/* OPP TB */
     85 		{1000, 25, 1, -1, -1, -1, -1}	/* OPP NT */
     86 	},
     87 };
     88 
     89 const struct dpll_params dpll_core[NUM_CRYSTAL_FREQ] = {
     90 		{625, 11, -1, -1, 10, 8, 4},	/* 19.2 MHz */
     91 		{1000, 23, -1, -1, 10, 8, 4},	/* 24 MHz */
     92 		{1000, 24, -1, -1, 10, 8, 4},	/* 25 MHz */
     93 		{1000, 25, -1, -1, 10, 8, 4}	/* 26 MHz */
     94 };
     95 
     96 const struct dpll_params dpll_per[NUM_CRYSTAL_FREQ] = {
     97 		{400, 7, 5, -1, -1, -1, -1},	/* 19.2 MHz */
     98 		{400, 9, 5, -1, -1, -1, -1},	/* 24 MHz */
     99 		{384, 9, 5, -1, -1, -1, -1},	/* 25 MHz */
    100 		{480, 12, 5, -1, -1, -1, -1}	/* 26 MHz */
    101 };
    102 
    103 const struct dpll_params epos_evm_dpll_ddr[NUM_CRYSTAL_FREQ] = {
    104 		{665, 47, 1, -1, 4, -1, -1}, /*19.2*/
    105 		{133, 11, 1, -1, 4, -1, -1}, /* 24 MHz */
    106 		{266, 24, 1, -1, 4, -1, -1}, /* 25 MHz */
    107 		{133, 12, 1, -1, 4, -1, -1}  /* 26 MHz */
    108 };
    109 
    110 const struct dpll_params gp_evm_dpll_ddr = {
    111 		50, 2, 1, -1, 2, -1, -1};
    112 
    113 static const struct dpll_params idk_dpll_ddr = {
    114 	400, 23, 1, -1, 2, -1, -1
    115 };
    116 
    117 static const u32 ext_phy_ctrl_const_base_lpddr2[] = {
    118 	0x00500050,
    119 	0x00350035,
    120 	0x00350035,
    121 	0x00350035,
    122 	0x00350035,
    123 	0x00350035,
    124 	0x00000000,
    125 	0x00000000,
    126 	0x00000000,
    127 	0x00000000,
    128 	0x00000000,
    129 	0x00000000,
    130 	0x00000000,
    131 	0x00000000,
    132 	0x00000000,
    133 	0x00000000,
    134 	0x00000000,
    135 	0x00000000,
    136 	0x40001000,
    137 	0x08102040
    138 };
    139 
    140 const struct ctrl_ioregs ioregs_lpddr2 = {
    141 	.cm0ioctl		= LPDDR2_ADDRCTRL_IOCTRL_VALUE,
    142 	.cm1ioctl		= LPDDR2_ADDRCTRL_WD0_IOCTRL_VALUE,
    143 	.cm2ioctl		= LPDDR2_ADDRCTRL_WD1_IOCTRL_VALUE,
    144 	.dt0ioctl		= LPDDR2_DATA0_IOCTRL_VALUE,
    145 	.dt1ioctl		= LPDDR2_DATA0_IOCTRL_VALUE,
    146 	.dt2ioctrl		= LPDDR2_DATA0_IOCTRL_VALUE,
    147 	.dt3ioctrl		= LPDDR2_DATA0_IOCTRL_VALUE,
    148 	.emif_sdram_config_ext	= 0x1,
    149 };
    150 
    151 const struct emif_regs emif_regs_lpddr2 = {
    152 	.sdram_config			= 0x808012BA,
    153 	.ref_ctrl			= 0x0000040D,
    154 	.sdram_tim1			= 0xEA86B411,
    155 	.sdram_tim2			= 0x103A094A,
    156 	.sdram_tim3			= 0x0F6BA37F,
    157 	.read_idle_ctrl			= 0x00050000,
    158 	.zq_config			= 0x50074BE4,
    159 	.temp_alert_config		= 0x0,
    160 	.emif_rd_wr_lvl_rmp_win		= 0x0,
    161 	.emif_rd_wr_lvl_rmp_ctl		= 0x0,
    162 	.emif_rd_wr_lvl_ctl		= 0x0,
    163 	.emif_ddr_phy_ctlr_1		= 0x0E284006,
    164 	.emif_rd_wr_exec_thresh		= 0x80000405,
    165 	.emif_ddr_ext_phy_ctrl_1	= 0x04010040,
    166 	.emif_ddr_ext_phy_ctrl_2	= 0x00500050,
    167 	.emif_ddr_ext_phy_ctrl_3	= 0x00500050,
    168 	.emif_ddr_ext_phy_ctrl_4	= 0x00500050,
    169 	.emif_ddr_ext_phy_ctrl_5	= 0x00500050,
    170 	.emif_prio_class_serv_map	= 0x80000001,
    171 	.emif_connect_id_serv_1_map	= 0x80000094,
    172 	.emif_connect_id_serv_2_map	= 0x00000000,
    173 	.emif_cos_config			= 0x000FFFFF
    174 };
    175 
    176 const struct ctrl_ioregs ioregs_ddr3 = {
    177 	.cm0ioctl		= DDR3_ADDRCTRL_IOCTRL_VALUE,
    178 	.cm1ioctl		= DDR3_ADDRCTRL_WD0_IOCTRL_VALUE,
    179 	.cm2ioctl		= DDR3_ADDRCTRL_WD1_IOCTRL_VALUE,
    180 	.dt0ioctl		= DDR3_DATA0_IOCTRL_VALUE,
    181 	.dt1ioctl		= DDR3_DATA0_IOCTRL_VALUE,
    182 	.dt2ioctrl		= DDR3_DATA0_IOCTRL_VALUE,
    183 	.dt3ioctrl		= DDR3_DATA0_IOCTRL_VALUE,
    184 	.emif_sdram_config_ext	= 0xc163,
    185 };
    186 
    187 const struct emif_regs ddr3_emif_regs_400Mhz = {
    188 	.sdram_config			= 0x638413B2,
    189 	.ref_ctrl			= 0x00000C30,
    190 	.sdram_tim1			= 0xEAAAD4DB,
    191 	.sdram_tim2			= 0x266B7FDA,
    192 	.sdram_tim3			= 0x107F8678,
    193 	.read_idle_ctrl			= 0x00050000,
    194 	.zq_config			= 0x50074BE4,
    195 	.temp_alert_config		= 0x0,
    196 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
    197 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
    198 	.emif_ddr_ext_phy_ctrl_2	= 0x00400040,
    199 	.emif_ddr_ext_phy_ctrl_3	= 0x00400040,
    200 	.emif_ddr_ext_phy_ctrl_4	= 0x00400040,
    201 	.emif_ddr_ext_phy_ctrl_5	= 0x00400040,
    202 	.emif_rd_wr_lvl_rmp_win		= 0x0,
    203 	.emif_rd_wr_lvl_rmp_ctl		= 0x0,
    204 	.emif_rd_wr_lvl_ctl		= 0x0,
    205 	.emif_rd_wr_exec_thresh		= 0x80000405,
    206 	.emif_prio_class_serv_map	= 0x80000001,
    207 	.emif_connect_id_serv_1_map	= 0x80000094,
    208 	.emif_connect_id_serv_2_map	= 0x00000000,
    209 	.emif_cos_config		= 0x000FFFFF
    210 };
    211 
    212 /* EMIF DDR3 Configurations are different for beta AM43X GP EVMs */
    213 const struct emif_regs ddr3_emif_regs_400Mhz_beta = {
    214 	.sdram_config			= 0x638413B2,
    215 	.ref_ctrl			= 0x00000C30,
    216 	.sdram_tim1			= 0xEAAAD4DB,
    217 	.sdram_tim2			= 0x266B7FDA,
    218 	.sdram_tim3			= 0x107F8678,
    219 	.read_idle_ctrl			= 0x00050000,
    220 	.zq_config			= 0x50074BE4,
    221 	.temp_alert_config		= 0x0,
    222 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
    223 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
    224 	.emif_ddr_ext_phy_ctrl_2	= 0x00000065,
    225 	.emif_ddr_ext_phy_ctrl_3	= 0x00000091,
    226 	.emif_ddr_ext_phy_ctrl_4	= 0x000000B5,
    227 	.emif_ddr_ext_phy_ctrl_5	= 0x000000E5,
    228 	.emif_rd_wr_exec_thresh		= 0x80000405,
    229 	.emif_prio_class_serv_map	= 0x80000001,
    230 	.emif_connect_id_serv_1_map	= 0x80000094,
    231 	.emif_connect_id_serv_2_map	= 0x00000000,
    232 	.emif_cos_config		= 0x000FFFFF
    233 };
    234 
    235 /* EMIF DDR3 Configurations are different for production AM43X GP EVMs */
    236 const struct emif_regs ddr3_emif_regs_400Mhz_production = {
    237 	.sdram_config			= 0x638413B2,
    238 	.ref_ctrl			= 0x00000C30,
    239 	.sdram_tim1			= 0xEAAAD4DB,
    240 	.sdram_tim2			= 0x266B7FDA,
    241 	.sdram_tim3			= 0x107F8678,
    242 	.read_idle_ctrl			= 0x00050000,
    243 	.zq_config			= 0x50074BE4,
    244 	.temp_alert_config		= 0x0,
    245 	.emif_ddr_phy_ctlr_1		= 0x0E004008,
    246 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
    247 	.emif_ddr_ext_phy_ctrl_2	= 0x00000066,
    248 	.emif_ddr_ext_phy_ctrl_3	= 0x00000091,
    249 	.emif_ddr_ext_phy_ctrl_4	= 0x000000B9,
    250 	.emif_ddr_ext_phy_ctrl_5	= 0x000000E6,
    251 	.emif_rd_wr_exec_thresh		= 0x80000405,
    252 	.emif_prio_class_serv_map	= 0x80000001,
    253 	.emif_connect_id_serv_1_map	= 0x80000094,
    254 	.emif_connect_id_serv_2_map	= 0x00000000,
    255 	.emif_cos_config		= 0x000FFFFF
    256 };
    257 
    258 static const struct emif_regs ddr3_sk_emif_regs_400Mhz = {
    259 	.sdram_config			= 0x638413b2,
    260 	.sdram_config2			= 0x00000000,
    261 	.ref_ctrl			= 0x00000c30,
    262 	.sdram_tim1			= 0xeaaad4db,
    263 	.sdram_tim2			= 0x266b7fda,
    264 	.sdram_tim3			= 0x107f8678,
    265 	.read_idle_ctrl			= 0x00050000,
    266 	.zq_config			= 0x50074be4,
    267 	.temp_alert_config		= 0x0,
    268 	.emif_ddr_phy_ctlr_1		= 0x0e084008,
    269 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
    270 	.emif_ddr_ext_phy_ctrl_2	= 0x89,
    271 	.emif_ddr_ext_phy_ctrl_3	= 0x90,
    272 	.emif_ddr_ext_phy_ctrl_4	= 0x8e,
    273 	.emif_ddr_ext_phy_ctrl_5	= 0x8d,
    274 	.emif_rd_wr_lvl_rmp_win		= 0x0,
    275 	.emif_rd_wr_lvl_rmp_ctl		= 0x00000000,
    276 	.emif_rd_wr_lvl_ctl		= 0x00000000,
    277 	.emif_rd_wr_exec_thresh		= 0x80000000,
    278 	.emif_prio_class_serv_map	= 0x80000001,
    279 	.emif_connect_id_serv_1_map	= 0x80000094,
    280 	.emif_connect_id_serv_2_map	= 0x00000000,
    281 	.emif_cos_config		= 0x000FFFFF
    282 };
    283 
    284 static const struct emif_regs ddr3_idk_emif_regs_400Mhz = {
    285 	.sdram_config			= 0x61a11b32,
    286 	.sdram_config2			= 0x00000000,
    287 	.ref_ctrl			= 0x00000c30,
    288 	.sdram_tim1			= 0xeaaad4db,
    289 	.sdram_tim2			= 0x266b7fda,
    290 	.sdram_tim3			= 0x107f8678,
    291 	.read_idle_ctrl			= 0x00050000,
    292 	.zq_config			= 0x50074be4,
    293 	.temp_alert_config		= 0x00000000,
    294 	.emif_ddr_phy_ctlr_1		= 0x00008009,
    295 	.emif_ddr_ext_phy_ctrl_1	= 0x08020080,
    296 	.emif_ddr_ext_phy_ctrl_2	= 0x00000040,
    297 	.emif_ddr_ext_phy_ctrl_3	= 0x0000003e,
    298 	.emif_ddr_ext_phy_ctrl_4	= 0x00000051,
    299 	.emif_ddr_ext_phy_ctrl_5	= 0x00000051,
    300 	.emif_rd_wr_lvl_rmp_win		= 0x00000000,
    301 	.emif_rd_wr_lvl_rmp_ctl		= 0x00000000,
    302 	.emif_rd_wr_lvl_ctl		= 0x00000000,
    303 	.emif_rd_wr_exec_thresh		= 0x00000405,
    304 	.emif_prio_class_serv_map	= 0x00000000,
    305 	.emif_connect_id_serv_1_map	= 0x00000000,
    306 	.emif_connect_id_serv_2_map	= 0x00000000,
    307 	.emif_cos_config		= 0x00ffffff
    308 };
    309 
    310 void emif_get_ext_phy_ctrl_const_regs(const u32 **regs, u32 *size)
    311 {
    312 	if (board_is_eposevm()) {
    313 		*regs = ext_phy_ctrl_const_base_lpddr2;
    314 		*size = ARRAY_SIZE(ext_phy_ctrl_const_base_lpddr2);
    315 	}
    316 
    317 	return;
    318 }
    319 
    320 const struct dpll_params *get_dpll_ddr_params(void)
    321 {
    322 	int ind = get_sys_clk_index();
    323 
    324 	if (board_is_eposevm())
    325 		return &epos_evm_dpll_ddr[ind];
    326 	else if (board_is_evm() || board_is_sk())
    327 		return &gp_evm_dpll_ddr;
    328 	else if (board_is_idk())
    329 		return &idk_dpll_ddr;
    330 
    331 	printf(" Board '%s' not supported\n", board_ti_get_name());
    332 	return NULL;
    333 }
    334 
    335 
    336 /*
    337  * get_opp_offset:
    338  * Returns the index for safest OPP of the device to boot.
    339  * max_off:	Index of the MAX OPP in DEV ATTRIBUTE register.
    340  * min_off:	Index of the MIN OPP in DEV ATTRIBUTE register.
    341  * This data is read from dev_attribute register which is e-fused.
    342  * A'1' in bit indicates OPP disabled and not available, a '0' indicates
    343  * OPP available. Lowest OPP starts with min_off. So returning the
    344  * bit with rightmost '0'.
    345  */
    346 static int get_opp_offset(int max_off, int min_off)
    347 {
    348 	struct ctrl_stat *ctrl = (struct ctrl_stat *)CTRL_BASE;
    349 	int opp, offset, i;
    350 
    351 	/* Bits 0:11 are defined to be the MPU_MAX_FREQ */
    352 	opp = readl(&ctrl->dev_attr) & ~0xFFFFF000;
    353 
    354 	for (i = max_off; i >= min_off; i--) {
    355 		offset = opp & (1 << i);
    356 		if (!offset)
    357 			return i;
    358 	}
    359 
    360 	return min_off;
    361 }
    362 
    363 const struct dpll_params *get_dpll_mpu_params(void)
    364 {
    365 	int opp = get_opp_offset(DEV_ATTR_MAX_OFFSET, DEV_ATTR_MIN_OFFSET);
    366 	u32 ind = get_sys_clk_index();
    367 
    368 	return &dpll_mpu[ind][opp];
    369 }
    370 
    371 const struct dpll_params *get_dpll_core_params(void)
    372 {
    373 	int ind = get_sys_clk_index();
    374 
    375 	return &dpll_core[ind];
    376 }
    377 
    378 const struct dpll_params *get_dpll_per_params(void)
    379 {
    380 	int ind = get_sys_clk_index();
    381 
    382 	return &dpll_per[ind];
    383 }
    384 
    385 void scale_vcores_generic(u32 m)
    386 {
    387 	int mpu_vdd, ddr_volt;
    388 
    389 	if (i2c_probe(TPS65218_CHIP_PM))
    390 		return;
    391 
    392 	switch (m) {
    393 	case 1000:
    394 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1330MV;
    395 		break;
    396 	case 800:
    397 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1260MV;
    398 		break;
    399 	case 720:
    400 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1200MV;
    401 		break;
    402 	case 600:
    403 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_1100MV;
    404 		break;
    405 	case 300:
    406 		mpu_vdd = TPS65218_DCDC_VOLT_SEL_0950MV;
    407 		break;
    408 	default:
    409 		puts("Unknown MPU clock, not scaling\n");
    410 		return;
    411 	}
    412 
    413 	/* Set DCDC1 (CORE) voltage to 1.1V */
    414 	if (tps65218_voltage_update(TPS65218_DCDC1,
    415 				    TPS65218_DCDC_VOLT_SEL_1100MV)) {
    416 		printf("%s failure\n", __func__);
    417 		return;
    418 	}
    419 
    420 	/* Set DCDC2 (MPU) voltage */
    421 	if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
    422 		printf("%s failure\n", __func__);
    423 		return;
    424 	}
    425 
    426 	if (board_is_eposevm())
    427 		ddr_volt = TPS65218_DCDC3_VOLT_SEL_1200MV;
    428 	else
    429 		ddr_volt = TPS65218_DCDC3_VOLT_SEL_1350MV;
    430 
    431 	/* Set DCDC3 (DDR) voltage */
    432 	if (tps65218_voltage_update(TPS65218_DCDC3, ddr_volt)) {
    433 		printf("%s failure\n", __func__);
    434 		return;
    435 	}
    436 }
    437 
    438 void scale_vcores_idk(u32 m)
    439 {
    440 	int mpu_vdd;
    441 
    442 	if (i2c_probe(TPS62362_I2C_ADDR))
    443 		return;
    444 
    445 	switch (m) {
    446 	case 1000:
    447 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
    448 		break;
    449 	case 800:
    450 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1260MV;
    451 		break;
    452 	case 720:
    453 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1200MV;
    454 		break;
    455 	case 600:
    456 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1100MV;
    457 		break;
    458 	case 300:
    459 		mpu_vdd = TPS62362_DCDC_VOLT_SEL_1330MV;
    460 		break;
    461 	default:
    462 		puts("Unknown MPU clock, not scaling\n");
    463 		return;
    464 	}
    465 
    466 	/* Set VDD_MPU voltage */
    467 	if (tps62362_voltage_update(TPS62362_SET3, mpu_vdd)) {
    468 		printf("%s failure\n", __func__);
    469 		return;
    470 	}
    471 }
    472 
    473 void gpi2c_init(void)
    474 {
    475 	/* When needed to be invoked prior to BSS initialization */
    476 	static bool first_time = true;
    477 
    478 	if (first_time) {
    479 		enable_i2c0_pin_mux();
    480 		i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
    481 			 CONFIG_SYS_OMAP24_I2C_SLAVE);
    482 		first_time = false;
    483 	}
    484 }
    485 
    486 void scale_vcores(void)
    487 {
    488 	const struct dpll_params *mpu_params;
    489 
    490 	/* Ensure I2C is initialized for PMIC configuration */
    491 	gpi2c_init();
    492 
    493 	/* Get the frequency */
    494 	mpu_params = get_dpll_mpu_params();
    495 
    496 	if (board_is_idk())
    497 		scale_vcores_idk(mpu_params->m);
    498 	else
    499 		scale_vcores_generic(mpu_params->m);
    500 }
    501 
    502 void set_uart_mux_conf(void)
    503 {
    504 	enable_uart0_pin_mux();
    505 }
    506 
    507 void set_mux_conf_regs(void)
    508 {
    509 	enable_board_pin_mux();
    510 }
    511 
    512 static void enable_vtt_regulator(void)
    513 {
    514 	u32 temp;
    515 
    516 	/* enable module */
    517 	writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);
    518 
    519 	/* enable output for GPIO5_7 */
    520 	writel(GPIO_SETDATAOUT(7),
    521 	       AM33XX_GPIO5_BASE + OMAP_GPIO_SETDATAOUT);
    522 	temp = readl(AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
    523 	temp = temp & ~(GPIO_OE_ENABLE(7));
    524 	writel(temp, AM33XX_GPIO5_BASE + OMAP_GPIO_OE);
    525 }
    526 
    527 enum {
    528 	RTC_BOARD_EPOS = 1,
    529 	RTC_BOARD_EVM14,
    530 	RTC_BOARD_EVM12,
    531 	RTC_BOARD_GPEVM,
    532 	RTC_BOARD_SK,
    533 };
    534 
    535 /*
    536  * In the rtc_only+DRR in self-refresh boot path we have the board type info
    537  * in the rtc scratch pad register hence we bypass the costly i2c reads to
    538  * eeprom and directly programthe board name string
    539  */
    540 void rtc_only_update_board_type(u32 btype)
    541 {
    542 	const char *name = "";
    543 	const char *rev = "1.0";
    544 
    545 	switch (btype) {
    546 	case RTC_BOARD_EPOS:
    547 		name = "AM43EPOS";
    548 		break;
    549 	case RTC_BOARD_EVM14:
    550 		name = "AM43__GP";
    551 		rev = "1.4";
    552 		break;
    553 	case RTC_BOARD_EVM12:
    554 		name = "AM43__GP";
    555 		rev = "1.2";
    556 		break;
    557 	case RTC_BOARD_GPEVM:
    558 		name = "AM43__GP";
    559 		break;
    560 	case RTC_BOARD_SK:
    561 		name = "AM43__SK";
    562 		break;
    563 	}
    564 	ti_i2c_eeprom_am_set(name, rev);
    565 }
    566 
    567 u32 rtc_only_get_board_type(void)
    568 {
    569 	if (board_is_eposevm())
    570 		return RTC_BOARD_EPOS;
    571 	else if (board_is_evm_14_or_later())
    572 		return RTC_BOARD_EVM14;
    573 	else if (board_is_evm_12_or_later())
    574 		return RTC_BOARD_EVM12;
    575 	else if (board_is_gpevm())
    576 		return RTC_BOARD_GPEVM;
    577 	else if (board_is_sk())
    578 		return RTC_BOARD_SK;
    579 
    580 	return 0;
    581 }
    582 
    583 void sdram_init(void)
    584 {
    585 	/*
    586 	 * EPOS EVM has 1GB LPDDR2 connected to EMIF.
    587 	 * GP EMV has 1GB DDR3 connected to EMIF
    588 	 * along with VTT regulator.
    589 	 */
    590 	if (board_is_eposevm()) {
    591 		config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
    592 	} else if (board_is_evm_14_or_later()) {
    593 		enable_vtt_regulator();
    594 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
    595 			   &ddr3_emif_regs_400Mhz_production, 0);
    596 	} else if (board_is_evm_12_or_later()) {
    597 		enable_vtt_regulator();
    598 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
    599 			   &ddr3_emif_regs_400Mhz_beta, 0);
    600 	} else if (board_is_evm()) {
    601 		enable_vtt_regulator();
    602 		config_ddr(0, &ioregs_ddr3, NULL, NULL,
    603 			   &ddr3_emif_regs_400Mhz, 0);
    604 	} else if (board_is_sk()) {
    605 		config_ddr(400, &ioregs_ddr3, NULL, NULL,
    606 			   &ddr3_sk_emif_regs_400Mhz, 0);
    607 	} else if (board_is_idk()) {
    608 		config_ddr(400, &ioregs_ddr3, NULL, NULL,
    609 			   &ddr3_idk_emif_regs_400Mhz, 0);
    610 	}
    611 }
    612 #endif
    613 
    614 /* setup board specific PMIC */
    615 int power_init_board(void)
    616 {
    617 	struct pmic *p;
    618 
    619 	if (board_is_idk()) {
    620 		power_tps62362_init(I2C_PMIC);
    621 		p = pmic_get("TPS62362");
    622 		if (p && !pmic_probe(p))
    623 			puts("PMIC:  TPS62362\n");
    624 	} else {
    625 		power_tps65218_init(I2C_PMIC);
    626 		p = pmic_get("TPS65218_PMIC");
    627 		if (p && !pmic_probe(p))
    628 			puts("PMIC:  TPS65218\n");
    629 	}
    630 
    631 	return 0;
    632 }
    633 
    634 int board_init(void)
    635 {
    636 	struct l3f_cfg_bwlimiter *bwlimiter = (struct l3f_cfg_bwlimiter *)L3F_CFG_BWLIMITER;
    637 	u32 mreqprio_0, mreqprio_1, modena_init0_bw_fractional,
    638 	    modena_init0_bw_integer, modena_init0_watermark_0;
    639 
    640 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
    641 	gpmc_init();
    642 
    643 	/*
    644 	 * Call this to initialize *ctrl again
    645 	 */
    646 	hw_data_init();
    647 
    648 	/* Clear all important bits for DSS errata that may need to be tweaked*/
    649 	mreqprio_0 = readl(&cdev->mreqprio_0) & MREQPRIO_0_SAB_INIT1_MASK &
    650 	                   MREQPRIO_0_SAB_INIT0_MASK;
    651 
    652 	mreqprio_1 = readl(&cdev->mreqprio_1) & MREQPRIO_1_DSS_MASK;
    653 
    654 	modena_init0_bw_fractional = readl(&bwlimiter->modena_init0_bw_fractional) &
    655 	                                   BW_LIMITER_BW_FRAC_MASK;
    656 
    657 	modena_init0_bw_integer = readl(&bwlimiter->modena_init0_bw_integer) &
    658 	                                BW_LIMITER_BW_INT_MASK;
    659 
    660 	modena_init0_watermark_0 = readl(&bwlimiter->modena_init0_watermark_0) &
    661 	                                 BW_LIMITER_BW_WATERMARK_MASK;
    662 
    663 	/* Setting MReq Priority of the DSS*/
    664 	mreqprio_0 |= 0x77;
    665 
    666 	/*
    667 	 * Set L3 Fast Configuration Register
    668 	 * Limiting bandwith for ARM core to 700 MBPS
    669 	 */
    670 	modena_init0_bw_fractional |= 0x10;
    671 	modena_init0_bw_integer |= 0x3;
    672 
    673 	writel(mreqprio_0, &cdev->mreqprio_0);
    674 	writel(mreqprio_1, &cdev->mreqprio_1);
    675 
    676 	writel(modena_init0_bw_fractional, &bwlimiter->modena_init0_bw_fractional);
    677 	writel(modena_init0_bw_integer, &bwlimiter->modena_init0_bw_integer);
    678 	writel(modena_init0_watermark_0, &bwlimiter->modena_init0_watermark_0);
    679 
    680 	return 0;
    681 }
    682 
    683 #ifdef CONFIG_BOARD_LATE_INIT
    684 int board_late_init(void)
    685 {
    686 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
    687 	set_board_info_env(NULL);
    688 
    689 	/*
    690 	 * Default FIT boot on HS devices. Non FIT images are not allowed
    691 	 * on HS devices.
    692 	 */
    693 	if (get_device_type() == HS_DEVICE)
    694 		env_set("boot_fit", "1");
    695 #endif
    696 	return 0;
    697 }
    698 #endif
    699 
    700 #ifdef CONFIG_USB_DWC3
    701 static struct dwc3_device usb_otg_ss1 = {
    702 	.maximum_speed = USB_SPEED_HIGH,
    703 	.base = USB_OTG_SS1_BASE,
    704 	.tx_fifo_resize = false,
    705 	.index = 0,
    706 };
    707 
    708 static struct dwc3_omap_device usb_otg_ss1_glue = {
    709 	.base = (void *)USB_OTG_SS1_GLUE_BASE,
    710 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
    711 	.index = 0,
    712 };
    713 
    714 static struct ti_usb_phy_device usb_phy1_device = {
    715 	.usb2_phy_power = (void *)USB2_PHY1_POWER,
    716 	.index = 0,
    717 };
    718 
    719 static struct dwc3_device usb_otg_ss2 = {
    720 	.maximum_speed = USB_SPEED_HIGH,
    721 	.base = USB_OTG_SS2_BASE,
    722 	.tx_fifo_resize = false,
    723 	.index = 1,
    724 };
    725 
    726 static struct dwc3_omap_device usb_otg_ss2_glue = {
    727 	.base = (void *)USB_OTG_SS2_GLUE_BASE,
    728 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
    729 	.index = 1,
    730 };
    731 
    732 static struct ti_usb_phy_device usb_phy2_device = {
    733 	.usb2_phy_power = (void *)USB2_PHY2_POWER,
    734 	.index = 1,
    735 };
    736 
    737 int usb_gadget_handle_interrupts(int index)
    738 {
    739 	u32 status;
    740 
    741 	status = dwc3_omap_uboot_interrupt_status(index);
    742 	if (status)
    743 		dwc3_uboot_handle_interrupt(index);
    744 
    745 	return 0;
    746 }
    747 #endif /* CONFIG_USB_DWC3 */
    748 
    749 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
    750 int board_usb_init(int index, enum usb_init_type init)
    751 {
    752 	enable_usb_clocks(index);
    753 #ifdef CONFIG_USB_DWC3
    754 	switch (index) {
    755 	case 0:
    756 		if (init == USB_INIT_DEVICE) {
    757 			usb_otg_ss1.dr_mode = USB_DR_MODE_PERIPHERAL;
    758 			usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
    759 			dwc3_omap_uboot_init(&usb_otg_ss1_glue);
    760 			ti_usb_phy_uboot_init(&usb_phy1_device);
    761 			dwc3_uboot_init(&usb_otg_ss1);
    762 		}
    763 		break;
    764 	case 1:
    765 		if (init == USB_INIT_DEVICE) {
    766 			usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
    767 			usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
    768 			ti_usb_phy_uboot_init(&usb_phy2_device);
    769 			dwc3_omap_uboot_init(&usb_otg_ss2_glue);
    770 			dwc3_uboot_init(&usb_otg_ss2);
    771 		}
    772 		break;
    773 	default:
    774 		printf("Invalid Controller Index\n");
    775 	}
    776 #endif
    777 
    778 	return 0;
    779 }
    780 
    781 int board_usb_cleanup(int index, enum usb_init_type init)
    782 {
    783 #ifdef CONFIG_USB_DWC3
    784 	switch (index) {
    785 	case 0:
    786 	case 1:
    787 		if (init == USB_INIT_DEVICE) {
    788 			ti_usb_phy_uboot_exit(index);
    789 			dwc3_uboot_exit(index);
    790 			dwc3_omap_uboot_exit(index);
    791 		}
    792 		break;
    793 	default:
    794 		printf("Invalid Controller Index\n");
    795 	}
    796 #endif
    797 	disable_usb_clocks(index);
    798 
    799 	return 0;
    800 }
    801 #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
    802 
    803 #ifdef CONFIG_DRIVER_TI_CPSW
    804 
    805 static void cpsw_control(int enabled)
    806 {
    807 	/* Additional controls can be added here */
    808 	return;
    809 }
    810 
    811 static struct cpsw_slave_data cpsw_slaves[] = {
    812 	{
    813 		.slave_reg_ofs	= 0x208,
    814 		.sliver_reg_ofs	= 0xd80,
    815 		.phy_addr	= 16,
    816 	},
    817 	{
    818 		.slave_reg_ofs	= 0x308,
    819 		.sliver_reg_ofs	= 0xdc0,
    820 		.phy_addr	= 1,
    821 	},
    822 };
    823 
    824 static struct cpsw_platform_data cpsw_data = {
    825 	.mdio_base		= CPSW_MDIO_BASE,
    826 	.cpsw_base		= CPSW_BASE,
    827 	.mdio_div		= 0xff,
    828 	.channels		= 8,
    829 	.cpdma_reg_ofs		= 0x800,
    830 	.slaves			= 1,
    831 	.slave_data		= cpsw_slaves,
    832 	.ale_reg_ofs		= 0xd00,
    833 	.ale_entries		= 1024,
    834 	.host_port_reg_ofs	= 0x108,
    835 	.hw_stats_reg_ofs	= 0x900,
    836 	.bd_ram_ofs		= 0x2000,
    837 	.mac_control		= (1 << 5),
    838 	.control		= cpsw_control,
    839 	.host_port_num		= 0,
    840 	.version		= CPSW_CTRL_VERSION_2,
    841 };
    842 
    843 int board_eth_init(bd_t *bis)
    844 {
    845 	int rv;
    846 	uint8_t mac_addr[6];
    847 	uint32_t mac_hi, mac_lo;
    848 
    849 	/* try reading mac address from efuse */
    850 	mac_lo = readl(&cdev->macid0l);
    851 	mac_hi = readl(&cdev->macid0h);
    852 	mac_addr[0] = mac_hi & 0xFF;
    853 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
    854 	mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
    855 	mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
    856 	mac_addr[4] = mac_lo & 0xFF;
    857 	mac_addr[5] = (mac_lo & 0xFF00) >> 8;
    858 
    859 	if (!env_get("ethaddr")) {
    860 		puts("<ethaddr> not set. Validating first E-fuse MAC\n");
    861 		if (is_valid_ethaddr(mac_addr))
    862 			eth_env_set_enetaddr("ethaddr", mac_addr);
    863 	}
    864 
    865 	mac_lo = readl(&cdev->macid1l);
    866 	mac_hi = readl(&cdev->macid1h);
    867 	mac_addr[0] = mac_hi & 0xFF;
    868 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
    869 	mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
    870 	mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
    871 	mac_addr[4] = mac_lo & 0xFF;
    872 	mac_addr[5] = (mac_lo & 0xFF00) >> 8;
    873 
    874 	if (!env_get("eth1addr")) {
    875 		if (is_valid_ethaddr(mac_addr))
    876 			eth_env_set_enetaddr("eth1addr", mac_addr);
    877 	}
    878 
    879 	if (board_is_eposevm()) {
    880 		writel(RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE, &cdev->miisel);
    881 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RMII;
    882 		cpsw_slaves[0].phy_addr = 16;
    883 	} else if (board_is_sk()) {
    884 		writel(RGMII_MODE_ENABLE, &cdev->miisel);
    885 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
    886 		cpsw_slaves[0].phy_addr = 4;
    887 		cpsw_slaves[1].phy_addr = 5;
    888 	} else if (board_is_idk()) {
    889 		writel(RGMII_MODE_ENABLE, &cdev->miisel);
    890 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
    891 		cpsw_slaves[0].phy_addr = 0;
    892 	} else {
    893 		writel(RGMII_MODE_ENABLE, &cdev->miisel);
    894 		cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;
    895 		cpsw_slaves[0].phy_addr = 0;
    896 	}
    897 
    898 	rv = cpsw_register(&cpsw_data);
    899 	if (rv < 0)
    900 		printf("Error %d registering CPSW switch\n", rv);
    901 
    902 	return rv;
    903 }
    904 #endif
    905 
    906 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
    907 int ft_board_setup(void *blob, bd_t *bd)
    908 {
    909 	ft_cpu_setup(blob, bd);
    910 
    911 	return 0;
    912 }
    913 #endif
    914 
    915 #if defined(CONFIG_SPL_LOAD_FIT) || defined(CONFIG_DTB_RESELECT)
    916 int board_fit_config_name_match(const char *name)
    917 {
    918 	bool eeprom_read = board_ti_was_eeprom_read();
    919 
    920 	if (!strcmp(name, "am4372-generic") && !eeprom_read)
    921 		return 0;
    922 	else if (board_is_evm() && !strcmp(name, "am437x-gp-evm"))
    923 		return 0;
    924 	else if (board_is_sk() && !strcmp(name, "am437x-sk-evm"))
    925 		return 0;
    926 	else if (board_is_eposevm() && !strcmp(name, "am43x-epos-evm"))
    927 		return 0;
    928 	else if (board_is_idk() && !strcmp(name, "am437x-idk-evm"))
    929 		return 0;
    930 	else
    931 		return -1;
    932 }
    933 #endif
    934 
    935 #ifdef CONFIG_DTB_RESELECT
    936 int embedded_dtb_select(void)
    937 {
    938 	do_board_detect();
    939 	fdtdec_setup();
    940 
    941 	return 0;
    942 }
    943 #endif
    944 
    945 #ifdef CONFIG_TI_SECURE_DEVICE
    946 void board_fit_image_post_process(void **p_image, size_t *p_size)
    947 {
    948 	secure_boot_verify_image(p_image, p_size);
    949 }
    950 
    951 void board_tee_image_process(ulong tee_image, size_t tee_size)
    952 {
    953 	secure_tee_install((u32)tee_image);
    954 }
    955 
    956 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
    957 #endif
    958