xref: /rk3399_rockchip-uboot/board/ti/am57xx/board.c (revision 3ef56e61c8cbfdfdca155f5b1e2cd4d5cb5e048a)
174cc8b09SKipisz, Steven /*
274cc8b09SKipisz, Steven  * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
374cc8b09SKipisz, Steven  *
474cc8b09SKipisz, Steven  * Author: Felipe Balbi <balbi@ti.com>
574cc8b09SKipisz, Steven  *
674cc8b09SKipisz, Steven  * Based on board/ti/dra7xx/evm.c
774cc8b09SKipisz, Steven  *
874cc8b09SKipisz, Steven  * SPDX-License-Identifier:	GPL-2.0+
974cc8b09SKipisz, Steven  */
1074cc8b09SKipisz, Steven 
1174cc8b09SKipisz, Steven #include <common.h>
1274cc8b09SKipisz, Steven #include <palmas.h>
1374cc8b09SKipisz, Steven #include <sata.h>
1474cc8b09SKipisz, Steven #include <usb.h>
1574cc8b09SKipisz, Steven #include <asm/omap_common.h>
1674cc8b09SKipisz, Steven #include <asm/emif.h>
1774cc8b09SKipisz, Steven #include <asm/gpio.h>
1874cc8b09SKipisz, Steven #include <asm/arch/gpio.h>
1974cc8b09SKipisz, Steven #include <asm/arch/clock.h>
2074cc8b09SKipisz, Steven #include <asm/arch/dra7xx_iodelay.h>
2174cc8b09SKipisz, Steven #include <asm/arch/sys_proto.h>
2274cc8b09SKipisz, Steven #include <asm/arch/mmc_host_def.h>
2374cc8b09SKipisz, Steven #include <asm/arch/sata.h>
2474cc8b09SKipisz, Steven #include <asm/arch/gpio.h>
2574cc8b09SKipisz, Steven #include <asm/arch/omap.h>
2674cc8b09SKipisz, Steven #include <environment.h>
2774cc8b09SKipisz, Steven #include <usb.h>
2874cc8b09SKipisz, Steven #include <linux/usb/gadget.h>
2974cc8b09SKipisz, Steven #include <dwc3-uboot.h>
3074cc8b09SKipisz, Steven #include <dwc3-omap-uboot.h>
3174cc8b09SKipisz, Steven #include <ti-usb-phy-uboot.h>
3274cc8b09SKipisz, Steven 
33212f96f6SKipisz, Steven #include "../common/board_detect.h"
3474cc8b09SKipisz, Steven #include "mux_data.h"
3574cc8b09SKipisz, Steven 
36212f96f6SKipisz, Steven #define board_is_x15()		board_ti_is("BBRDX15_")
37212f96f6SKipisz, Steven #define board_is_am572x_evm()	board_ti_is("AM572PM_")
38212f96f6SKipisz, Steven 
3974cc8b09SKipisz, Steven #ifdef CONFIG_DRIVER_TI_CPSW
4074cc8b09SKipisz, Steven #include <cpsw.h>
4174cc8b09SKipisz, Steven #endif
4274cc8b09SKipisz, Steven 
4374cc8b09SKipisz, Steven DECLARE_GLOBAL_DATA_PTR;
4474cc8b09SKipisz, Steven 
4574cc8b09SKipisz, Steven /* GPIO 7_11 */
4674cc8b09SKipisz, Steven #define GPIO_DDR_VTT_EN 203
4774cc8b09SKipisz, Steven 
48212f96f6SKipisz, Steven #define SYSINFO_BOARD_NAME_MAX_LEN	45
49212f96f6SKipisz, Steven 
5074cc8b09SKipisz, Steven const struct omap_sysinfo sysinfo = {
51212f96f6SKipisz, Steven 	"Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n"
5274cc8b09SKipisz, Steven };
5374cc8b09SKipisz, Steven 
5474cc8b09SKipisz, Steven static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = {
5574cc8b09SKipisz, Steven 	.dmm_lisa_map_3 = 0x80740300,
5674cc8b09SKipisz, Steven 	.is_ma_present  = 0x1
5774cc8b09SKipisz, Steven };
5874cc8b09SKipisz, Steven 
5974cc8b09SKipisz, Steven void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
6074cc8b09SKipisz, Steven {
6174cc8b09SKipisz, Steven 	*dmm_lisa_regs = &beagle_x15_lisa_regs;
6274cc8b09SKipisz, Steven }
6374cc8b09SKipisz, Steven 
6474cc8b09SKipisz, Steven static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
6574cc8b09SKipisz, Steven 	.sdram_config_init	= 0x61851b32,
6674cc8b09SKipisz, Steven 	.sdram_config		= 0x61851b32,
6711e2b043SLokesh Vutla 	.sdram_config2		= 0x08000000,
6874cc8b09SKipisz, Steven 	.ref_ctrl		= 0x000040F1,
6974cc8b09SKipisz, Steven 	.ref_ctrl_final		= 0x00001035,
7011e2b043SLokesh Vutla 	.sdram_tim1		= 0xcccf36ab,
7111e2b043SLokesh Vutla 	.sdram_tim2		= 0x308f7fda,
7211e2b043SLokesh Vutla 	.sdram_tim3		= 0x409f88a8,
7374cc8b09SKipisz, Steven 	.read_idle_ctrl		= 0x00050000,
7411e2b043SLokesh Vutla 	.zq_config		= 0x5007190b,
7574cc8b09SKipisz, Steven 	.temp_alert_config	= 0x00000000,
7674cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1_init = 0x0024400b,
7774cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1	= 0x0e24400b,
7874cc8b09SKipisz, Steven 	.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
7911e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_2 = 0x00910091,
8011e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_3 = 0x00950095,
8111e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_4 = 0x009b009b,
8211e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_5 = 0x009e009e,
8374cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_win	= 0x00000000,
8474cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_ctl	= 0x80000000,
8574cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_ctl	= 0x00000000,
8674cc8b09SKipisz, Steven 	.emif_rd_wr_exec_thresh	= 0x00000305
8774cc8b09SKipisz, Steven };
8874cc8b09SKipisz, Steven 
8974cc8b09SKipisz, Steven /* Ext phy ctrl regs 1-35 */
9074cc8b09SKipisz, Steven static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
9174cc8b09SKipisz, Steven 	0x10040100,
9211e2b043SLokesh Vutla 	0x00910091,
9311e2b043SLokesh Vutla 	0x00950095,
9411e2b043SLokesh Vutla 	0x009B009B,
9511e2b043SLokesh Vutla 	0x009E009E,
9611e2b043SLokesh Vutla 	0x00980098,
9774cc8b09SKipisz, Steven 	0x00340034,
9874cc8b09SKipisz, Steven 	0x00350035,
9911e2b043SLokesh Vutla 	0x00340034,
10011e2b043SLokesh Vutla 	0x00310031,
10111e2b043SLokesh Vutla 	0x00340034,
10211e2b043SLokesh Vutla 	0x007F007F,
10311e2b043SLokesh Vutla 	0x007F007F,
10411e2b043SLokesh Vutla 	0x007F007F,
10511e2b043SLokesh Vutla 	0x007F007F,
10611e2b043SLokesh Vutla 	0x007F007F,
10711e2b043SLokesh Vutla 	0x00480048,
10811e2b043SLokesh Vutla 	0x004A004A,
10911e2b043SLokesh Vutla 	0x00520052,
11011e2b043SLokesh Vutla 	0x00550055,
11111e2b043SLokesh Vutla 	0x00500050,
11274cc8b09SKipisz, Steven 	0x00000000,
11374cc8b09SKipisz, Steven 	0x00600020,
11474cc8b09SKipisz, Steven 	0x40011080,
11574cc8b09SKipisz, Steven 	0x08102040,
11611e2b043SLokesh Vutla 	0x0,
11711e2b043SLokesh Vutla 	0x0,
11811e2b043SLokesh Vutla 	0x0,
11911e2b043SLokesh Vutla 	0x0,
12011e2b043SLokesh Vutla 	0x0,
12174cc8b09SKipisz, Steven 	0x0,
12274cc8b09SKipisz, Steven 	0x0,
12374cc8b09SKipisz, Steven 	0x0,
12474cc8b09SKipisz, Steven 	0x0,
12574cc8b09SKipisz, Steven 	0x0
12674cc8b09SKipisz, Steven };
12774cc8b09SKipisz, Steven 
12874cc8b09SKipisz, Steven static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
12974cc8b09SKipisz, Steven 	.sdram_config_init	= 0x61851b32,
13074cc8b09SKipisz, Steven 	.sdram_config		= 0x61851b32,
13111e2b043SLokesh Vutla 	.sdram_config2		= 0x08000000,
13274cc8b09SKipisz, Steven 	.ref_ctrl		= 0x000040F1,
13374cc8b09SKipisz, Steven 	.ref_ctrl_final		= 0x00001035,
13411e2b043SLokesh Vutla 	.sdram_tim1		= 0xcccf36ab,
13511e2b043SLokesh Vutla 	.sdram_tim2		= 0x308f7fda,
13611e2b043SLokesh Vutla 	.sdram_tim3		= 0x409f88a8,
13774cc8b09SKipisz, Steven 	.read_idle_ctrl		= 0x00050000,
13811e2b043SLokesh Vutla 	.zq_config		= 0x5007190b,
13974cc8b09SKipisz, Steven 	.temp_alert_config	= 0x00000000,
14074cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1_init = 0x0024400b,
14174cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1	= 0x0e24400b,
14274cc8b09SKipisz, Steven 	.emif_ddr_ext_phy_ctrl_1 = 0x10040100,
14311e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_2 = 0x00910091,
14411e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_3 = 0x00950095,
14511e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_4 = 0x009b009b,
14611e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_5 = 0x009e009e,
14774cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_win	= 0x00000000,
14874cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_ctl	= 0x80000000,
14974cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_ctl	= 0x00000000,
15074cc8b09SKipisz, Steven 	.emif_rd_wr_exec_thresh	= 0x00000305
15174cc8b09SKipisz, Steven };
15274cc8b09SKipisz, Steven 
15374cc8b09SKipisz, Steven static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
15474cc8b09SKipisz, Steven 	0x10040100,
15511e2b043SLokesh Vutla 	0x00910091,
15611e2b043SLokesh Vutla 	0x00950095,
15711e2b043SLokesh Vutla 	0x009B009B,
15811e2b043SLokesh Vutla 	0x009E009E,
15911e2b043SLokesh Vutla 	0x00980098,
16011e2b043SLokesh Vutla 	0x00340034,
16174cc8b09SKipisz, Steven 	0x00350035,
16211e2b043SLokesh Vutla 	0x00340034,
16311e2b043SLokesh Vutla 	0x00310031,
16411e2b043SLokesh Vutla 	0x00340034,
16511e2b043SLokesh Vutla 	0x007F007F,
16611e2b043SLokesh Vutla 	0x007F007F,
16711e2b043SLokesh Vutla 	0x007F007F,
16811e2b043SLokesh Vutla 	0x007F007F,
16911e2b043SLokesh Vutla 	0x007F007F,
17011e2b043SLokesh Vutla 	0x00480048,
17111e2b043SLokesh Vutla 	0x004A004A,
17211e2b043SLokesh Vutla 	0x00520052,
17311e2b043SLokesh Vutla 	0x00550055,
17411e2b043SLokesh Vutla 	0x00500050,
17574cc8b09SKipisz, Steven 	0x00000000,
17674cc8b09SKipisz, Steven 	0x00600020,
17774cc8b09SKipisz, Steven 	0x40011080,
17874cc8b09SKipisz, Steven 	0x08102040,
17911e2b043SLokesh Vutla 	0x0,
18011e2b043SLokesh Vutla 	0x0,
18111e2b043SLokesh Vutla 	0x0,
18211e2b043SLokesh Vutla 	0x0,
18311e2b043SLokesh Vutla 	0x0,
18474cc8b09SKipisz, Steven 	0x0,
18574cc8b09SKipisz, Steven 	0x0,
18674cc8b09SKipisz, Steven 	0x0,
18774cc8b09SKipisz, Steven 	0x0,
18874cc8b09SKipisz, Steven 	0x0
18974cc8b09SKipisz, Steven };
19074cc8b09SKipisz, Steven 
19174cc8b09SKipisz, Steven void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
19274cc8b09SKipisz, Steven {
19374cc8b09SKipisz, Steven 	switch (emif_nr) {
19474cc8b09SKipisz, Steven 	case 1:
19574cc8b09SKipisz, Steven 		*regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
19674cc8b09SKipisz, Steven 		break;
19774cc8b09SKipisz, Steven 	case 2:
19874cc8b09SKipisz, Steven 		*regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs;
19974cc8b09SKipisz, Steven 		break;
20074cc8b09SKipisz, Steven 	}
20174cc8b09SKipisz, Steven }
20274cc8b09SKipisz, Steven 
20374cc8b09SKipisz, Steven void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size)
20474cc8b09SKipisz, Steven {
20574cc8b09SKipisz, Steven 	switch (emif_nr) {
20674cc8b09SKipisz, Steven 	case 1:
20774cc8b09SKipisz, Steven 		*regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs;
20874cc8b09SKipisz, Steven 		*size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs);
20974cc8b09SKipisz, Steven 		break;
21074cc8b09SKipisz, Steven 	case 2:
21174cc8b09SKipisz, Steven 		*regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs;
21274cc8b09SKipisz, Steven 		*size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs);
21374cc8b09SKipisz, Steven 		break;
21474cc8b09SKipisz, Steven 	}
21574cc8b09SKipisz, Steven }
21674cc8b09SKipisz, Steven 
21774cc8b09SKipisz, Steven struct vcores_data beagle_x15_volts = {
21874cc8b09SKipisz, Steven 	.mpu.value		= VDD_MPU_DRA752,
21974cc8b09SKipisz, Steven 	.mpu.efuse.reg		= STD_FUSE_OPP_VMIN_MPU_NOM,
22074cc8b09SKipisz, Steven 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
22174cc8b09SKipisz, Steven 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
22274cc8b09SKipisz, Steven 	.mpu.pmic		= &tps659038,
22374cc8b09SKipisz, Steven 
22474cc8b09SKipisz, Steven 	.eve.value		= VDD_EVE_DRA752,
22574cc8b09SKipisz, Steven 	.eve.efuse.reg		= STD_FUSE_OPP_VMIN_DSPEVE_NOM,
22674cc8b09SKipisz, Steven 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
22774cc8b09SKipisz, Steven 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
22874cc8b09SKipisz, Steven 	.eve.pmic		= &tps659038,
22974cc8b09SKipisz, Steven 
23074cc8b09SKipisz, Steven 	.gpu.value		= VDD_GPU_DRA752,
23174cc8b09SKipisz, Steven 	.gpu.efuse.reg		= STD_FUSE_OPP_VMIN_GPU_NOM,
23274cc8b09SKipisz, Steven 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
23374cc8b09SKipisz, Steven 	.gpu.addr		= TPS659038_REG_ADDR_SMPS45,
23474cc8b09SKipisz, Steven 	.gpu.pmic		= &tps659038,
23574cc8b09SKipisz, Steven 
23674cc8b09SKipisz, Steven 	.core.value		= VDD_CORE_DRA752,
23774cc8b09SKipisz, Steven 	.core.efuse.reg		= STD_FUSE_OPP_VMIN_CORE_NOM,
23874cc8b09SKipisz, Steven 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
23974cc8b09SKipisz, Steven 	.core.addr		= TPS659038_REG_ADDR_SMPS6,
24074cc8b09SKipisz, Steven 	.core.pmic		= &tps659038,
24174cc8b09SKipisz, Steven 
24274cc8b09SKipisz, Steven 	.iva.value		= VDD_IVA_DRA752,
24374cc8b09SKipisz, Steven 	.iva.efuse.reg		= STD_FUSE_OPP_VMIN_IVA_NOM,
24474cc8b09SKipisz, Steven 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
24574cc8b09SKipisz, Steven 	.iva.addr		= TPS659038_REG_ADDR_SMPS45,
24674cc8b09SKipisz, Steven 	.iva.pmic		= &tps659038,
24774cc8b09SKipisz, Steven };
24874cc8b09SKipisz, Steven 
249212f96f6SKipisz, Steven #ifdef CONFIG_SPL_BUILD
250212f96f6SKipisz, Steven /* No env to setup for SPL */
251212f96f6SKipisz, Steven static inline void setup_board_eeprom_env(void) { }
252212f96f6SKipisz, Steven 
253212f96f6SKipisz, Steven /* Override function to read eeprom information */
254212f96f6SKipisz, Steven void do_board_detect(void)
255212f96f6SKipisz, Steven {
256212f96f6SKipisz, Steven 	int rc;
257212f96f6SKipisz, Steven 
258212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
259212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
260212f96f6SKipisz, Steven 	if (rc)
261212f96f6SKipisz, Steven 		printf("ti_i2c_eeprom_init failed %d\n", rc);
262212f96f6SKipisz, Steven }
263212f96f6SKipisz, Steven 
264212f96f6SKipisz, Steven #else	/* CONFIG_SPL_BUILD */
265212f96f6SKipisz, Steven 
266212f96f6SKipisz, Steven /* Override function to read eeprom information: actual i2c read done by SPL*/
267212f96f6SKipisz, Steven void do_board_detect(void)
268212f96f6SKipisz, Steven {
269212f96f6SKipisz, Steven 	char *bname = NULL;
270212f96f6SKipisz, Steven 	int rc;
271212f96f6SKipisz, Steven 
272212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
273212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
274212f96f6SKipisz, Steven 	if (rc)
275212f96f6SKipisz, Steven 		printf("ti_i2c_eeprom_init failed %d\n", rc);
276212f96f6SKipisz, Steven 
277212f96f6SKipisz, Steven 	if (board_is_x15())
278212f96f6SKipisz, Steven 		bname = "BeagleBoard X15";
279212f96f6SKipisz, Steven 	else if (board_is_am572x_evm())
280212f96f6SKipisz, Steven 		bname = "AM572x EVM";
281212f96f6SKipisz, Steven 
282212f96f6SKipisz, Steven 	if (bname)
283212f96f6SKipisz, Steven 		snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
284212f96f6SKipisz, Steven 			 "Board: %s REV %s\n", bname, board_ti_get_rev());
285212f96f6SKipisz, Steven }
286212f96f6SKipisz, Steven 
287212f96f6SKipisz, Steven static void setup_board_eeprom_env(void)
288212f96f6SKipisz, Steven {
289212f96f6SKipisz, Steven 	char *name = "beagle_x15";
290212f96f6SKipisz, Steven 	int rc;
291212f96f6SKipisz, Steven 
292212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
293212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
294212f96f6SKipisz, Steven 	if (rc)
295212f96f6SKipisz, Steven 		goto invalid_eeprom;
296212f96f6SKipisz, Steven 
297212f96f6SKipisz, Steven 	if (board_is_am572x_evm())
298212f96f6SKipisz, Steven 		name = "am57xx_evm";
299212f96f6SKipisz, Steven 	else
300212f96f6SKipisz, Steven 		printf("Unidentified board claims %s in eeprom header\n",
301212f96f6SKipisz, Steven 		       board_ti_get_name());
302212f96f6SKipisz, Steven 
303212f96f6SKipisz, Steven invalid_eeprom:
304212f96f6SKipisz, Steven 	set_board_info_env(name);
305212f96f6SKipisz, Steven }
306212f96f6SKipisz, Steven 
307212f96f6SKipisz, Steven #endif	/* CONFIG_SPL_BUILD */
308212f96f6SKipisz, Steven 
30974cc8b09SKipisz, Steven void hw_data_init(void)
31074cc8b09SKipisz, Steven {
31174cc8b09SKipisz, Steven 	*prcm = &dra7xx_prcm;
31274cc8b09SKipisz, Steven 	*dplls_data = &dra7xx_dplls;
31374cc8b09SKipisz, Steven 	*omap_vcores = &beagle_x15_volts;
31474cc8b09SKipisz, Steven 	*ctrl = &dra7xx_ctrl;
31574cc8b09SKipisz, Steven }
31674cc8b09SKipisz, Steven 
31774cc8b09SKipisz, Steven int board_init(void)
31874cc8b09SKipisz, Steven {
31974cc8b09SKipisz, Steven 	gpmc_init();
32074cc8b09SKipisz, Steven 	gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
32174cc8b09SKipisz, Steven 
32274cc8b09SKipisz, Steven 	return 0;
32374cc8b09SKipisz, Steven }
32474cc8b09SKipisz, Steven 
32574cc8b09SKipisz, Steven int board_late_init(void)
32674cc8b09SKipisz, Steven {
32774cc8b09SKipisz, Steven 	init_sata(0);
328212f96f6SKipisz, Steven 	setup_board_eeprom_env();
329212f96f6SKipisz, Steven 
33074cc8b09SKipisz, Steven 	/*
33174cc8b09SKipisz, Steven 	 * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
33274cc8b09SKipisz, Steven 	 * This is the POWERHOLD-in-Low behavior.
33374cc8b09SKipisz, Steven 	 */
33474cc8b09SKipisz, Steven 	palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
33574cc8b09SKipisz, Steven 	return 0;
33674cc8b09SKipisz, Steven }
33774cc8b09SKipisz, Steven 
338*3ef56e61SPaul Kocialkowski void set_muxconf_regs(void)
33974cc8b09SKipisz, Steven {
34074cc8b09SKipisz, Steven 	do_set_mux32((*ctrl)->control_padconf_core_base,
34174cc8b09SKipisz, Steven 		     early_padconf, ARRAY_SIZE(early_padconf));
34274cc8b09SKipisz, Steven }
34374cc8b09SKipisz, Steven 
34474cc8b09SKipisz, Steven #ifdef CONFIG_IODELAY_RECALIBRATION
34574cc8b09SKipisz, Steven void recalibrate_iodelay(void)
34674cc8b09SKipisz, Steven {
34774cc8b09SKipisz, Steven 	__recalibrate_iodelay(core_padconf_array_essential,
34874cc8b09SKipisz, Steven 			      ARRAY_SIZE(core_padconf_array_essential),
34974cc8b09SKipisz, Steven 			      iodelay_cfg_array, ARRAY_SIZE(iodelay_cfg_array));
35074cc8b09SKipisz, Steven }
35174cc8b09SKipisz, Steven #endif
35274cc8b09SKipisz, Steven 
35374cc8b09SKipisz, Steven #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
35474cc8b09SKipisz, Steven int board_mmc_init(bd_t *bis)
35574cc8b09SKipisz, Steven {
35674cc8b09SKipisz, Steven 	omap_mmc_init(0, 0, 0, -1, -1);
35774cc8b09SKipisz, Steven 	omap_mmc_init(1, 0, 0, -1, -1);
35874cc8b09SKipisz, Steven 	return 0;
35974cc8b09SKipisz, Steven }
36074cc8b09SKipisz, Steven #endif
36174cc8b09SKipisz, Steven 
36274cc8b09SKipisz, Steven #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
36374cc8b09SKipisz, Steven int spl_start_uboot(void)
36474cc8b09SKipisz, Steven {
36574cc8b09SKipisz, Steven 	/* break into full u-boot on 'c' */
36674cc8b09SKipisz, Steven 	if (serial_tstc() && serial_getc() == 'c')
36774cc8b09SKipisz, Steven 		return 1;
36874cc8b09SKipisz, Steven 
36974cc8b09SKipisz, Steven #ifdef CONFIG_SPL_ENV_SUPPORT
37074cc8b09SKipisz, Steven 	env_init();
37174cc8b09SKipisz, Steven 	env_relocate_spec();
37274cc8b09SKipisz, Steven 	if (getenv_yesno("boot_os") != 1)
37374cc8b09SKipisz, Steven 		return 1;
37474cc8b09SKipisz, Steven #endif
37574cc8b09SKipisz, Steven 
37674cc8b09SKipisz, Steven 	return 0;
37774cc8b09SKipisz, Steven }
37874cc8b09SKipisz, Steven #endif
37974cc8b09SKipisz, Steven 
38074cc8b09SKipisz, Steven #ifdef CONFIG_USB_DWC3
38174cc8b09SKipisz, Steven static struct dwc3_device usb_otg_ss1 = {
38274cc8b09SKipisz, Steven 	.maximum_speed = USB_SPEED_SUPER,
38374cc8b09SKipisz, Steven 	.base = DRA7_USB_OTG_SS1_BASE,
38474cc8b09SKipisz, Steven 	.tx_fifo_resize = false,
38574cc8b09SKipisz, Steven 	.index = 0,
38674cc8b09SKipisz, Steven };
38774cc8b09SKipisz, Steven 
38874cc8b09SKipisz, Steven static struct dwc3_omap_device usb_otg_ss1_glue = {
38974cc8b09SKipisz, Steven 	.base = (void *)DRA7_USB_OTG_SS1_GLUE_BASE,
39074cc8b09SKipisz, Steven 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
39174cc8b09SKipisz, Steven 	.index = 0,
39274cc8b09SKipisz, Steven };
39374cc8b09SKipisz, Steven 
39474cc8b09SKipisz, Steven static struct ti_usb_phy_device usb_phy1_device = {
39574cc8b09SKipisz, Steven 	.pll_ctrl_base = (void *)DRA7_USB3_PHY1_PLL_CTRL,
39674cc8b09SKipisz, Steven 	.usb2_phy_power = (void *)DRA7_USB2_PHY1_POWER,
39774cc8b09SKipisz, Steven 	.usb3_phy_power = (void *)DRA7_USB3_PHY1_POWER,
39874cc8b09SKipisz, Steven 	.index = 0,
39974cc8b09SKipisz, Steven };
40074cc8b09SKipisz, Steven 
40174cc8b09SKipisz, Steven static struct dwc3_device usb_otg_ss2 = {
40274cc8b09SKipisz, Steven 	.maximum_speed = USB_SPEED_HIGH,
40374cc8b09SKipisz, Steven 	.base = DRA7_USB_OTG_SS2_BASE,
40474cc8b09SKipisz, Steven 	.tx_fifo_resize = false,
40574cc8b09SKipisz, Steven 	.index = 1,
40674cc8b09SKipisz, Steven };
40774cc8b09SKipisz, Steven 
40874cc8b09SKipisz, Steven static struct dwc3_omap_device usb_otg_ss2_glue = {
40974cc8b09SKipisz, Steven 	.base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
41074cc8b09SKipisz, Steven 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
41174cc8b09SKipisz, Steven 	.index = 1,
41274cc8b09SKipisz, Steven };
41374cc8b09SKipisz, Steven 
41474cc8b09SKipisz, Steven static struct ti_usb_phy_device usb_phy2_device = {
41574cc8b09SKipisz, Steven 	.usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
41674cc8b09SKipisz, Steven 	.index = 1,
41774cc8b09SKipisz, Steven };
41874cc8b09SKipisz, Steven 
41974cc8b09SKipisz, Steven int board_usb_init(int index, enum usb_init_type init)
42074cc8b09SKipisz, Steven {
42174cc8b09SKipisz, Steven 	enable_usb_clocks(index);
42274cc8b09SKipisz, Steven 	switch (index) {
42374cc8b09SKipisz, Steven 	case 0:
42474cc8b09SKipisz, Steven 		if (init == USB_INIT_DEVICE) {
42574cc8b09SKipisz, Steven 			printf("port %d can't be used as device\n", index);
42674cc8b09SKipisz, Steven 			disable_usb_clocks(index);
42774cc8b09SKipisz, Steven 			return -EINVAL;
42874cc8b09SKipisz, Steven 		} else {
42974cc8b09SKipisz, Steven 			usb_otg_ss1.dr_mode = USB_DR_MODE_HOST;
43074cc8b09SKipisz, Steven 			usb_otg_ss1_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
43174cc8b09SKipisz, Steven 			setbits_le32((*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
43274cc8b09SKipisz, Steven 				     OTG_SS_CLKCTRL_MODULEMODE_HW |
43374cc8b09SKipisz, Steven 				     OPTFCLKEN_REFCLK960M);
43474cc8b09SKipisz, Steven 		}
43574cc8b09SKipisz, Steven 
43674cc8b09SKipisz, Steven 		ti_usb_phy_uboot_init(&usb_phy1_device);
43774cc8b09SKipisz, Steven 		dwc3_omap_uboot_init(&usb_otg_ss1_glue);
43874cc8b09SKipisz, Steven 		dwc3_uboot_init(&usb_otg_ss1);
43974cc8b09SKipisz, Steven 		break;
44074cc8b09SKipisz, Steven 	case 1:
44174cc8b09SKipisz, Steven 		if (init == USB_INIT_DEVICE) {
44274cc8b09SKipisz, Steven 			usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
44374cc8b09SKipisz, Steven 			usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
44474cc8b09SKipisz, Steven 		} else {
44574cc8b09SKipisz, Steven 			printf("port %d can't be used as host\n", index);
44674cc8b09SKipisz, Steven 			disable_usb_clocks(index);
44774cc8b09SKipisz, Steven 			return -EINVAL;
44874cc8b09SKipisz, Steven 		}
44974cc8b09SKipisz, Steven 
45074cc8b09SKipisz, Steven 		ti_usb_phy_uboot_init(&usb_phy2_device);
45174cc8b09SKipisz, Steven 		dwc3_omap_uboot_init(&usb_otg_ss2_glue);
45274cc8b09SKipisz, Steven 		dwc3_uboot_init(&usb_otg_ss2);
45374cc8b09SKipisz, Steven 		break;
45474cc8b09SKipisz, Steven 	default:
45574cc8b09SKipisz, Steven 		printf("Invalid Controller Index\n");
45674cc8b09SKipisz, Steven 	}
45774cc8b09SKipisz, Steven 
45874cc8b09SKipisz, Steven 	return 0;
45974cc8b09SKipisz, Steven }
46074cc8b09SKipisz, Steven 
46174cc8b09SKipisz, Steven int board_usb_cleanup(int index, enum usb_init_type init)
46274cc8b09SKipisz, Steven {
46374cc8b09SKipisz, Steven 	switch (index) {
46474cc8b09SKipisz, Steven 	case 0:
46574cc8b09SKipisz, Steven 	case 1:
46674cc8b09SKipisz, Steven 		ti_usb_phy_uboot_exit(index);
46774cc8b09SKipisz, Steven 		dwc3_uboot_exit(index);
46874cc8b09SKipisz, Steven 		dwc3_omap_uboot_exit(index);
46974cc8b09SKipisz, Steven 		break;
47074cc8b09SKipisz, Steven 	default:
47174cc8b09SKipisz, Steven 		printf("Invalid Controller Index\n");
47274cc8b09SKipisz, Steven 	}
47374cc8b09SKipisz, Steven 	disable_usb_clocks(index);
47474cc8b09SKipisz, Steven 	return 0;
47574cc8b09SKipisz, Steven }
47674cc8b09SKipisz, Steven 
47774cc8b09SKipisz, Steven int usb_gadget_handle_interrupts(int index)
47874cc8b09SKipisz, Steven {
47974cc8b09SKipisz, Steven 	u32 status;
48074cc8b09SKipisz, Steven 
48174cc8b09SKipisz, Steven 	status = dwc3_omap_uboot_interrupt_status(index);
48274cc8b09SKipisz, Steven 	if (status)
48374cc8b09SKipisz, Steven 		dwc3_uboot_handle_interrupt(index);
48474cc8b09SKipisz, Steven 
48574cc8b09SKipisz, Steven 	return 0;
48674cc8b09SKipisz, Steven }
48774cc8b09SKipisz, Steven #endif
48874cc8b09SKipisz, Steven 
48974cc8b09SKipisz, Steven #ifdef CONFIG_DRIVER_TI_CPSW
49074cc8b09SKipisz, Steven 
49174cc8b09SKipisz, Steven /* Delay value to add to calibrated value */
49274cc8b09SKipisz, Steven #define RGMII0_TXCTL_DLY_VAL		((0x3 << 5) + 0x8)
49374cc8b09SKipisz, Steven #define RGMII0_TXD0_DLY_VAL		((0x3 << 5) + 0x8)
49474cc8b09SKipisz, Steven #define RGMII0_TXD1_DLY_VAL		((0x3 << 5) + 0x2)
49574cc8b09SKipisz, Steven #define RGMII0_TXD2_DLY_VAL		((0x4 << 5) + 0x0)
49674cc8b09SKipisz, Steven #define RGMII0_TXD3_DLY_VAL		((0x4 << 5) + 0x0)
49774cc8b09SKipisz, Steven #define VIN2A_D13_DLY_VAL		((0x3 << 5) + 0x8)
49874cc8b09SKipisz, Steven #define VIN2A_D17_DLY_VAL		((0x3 << 5) + 0x8)
49974cc8b09SKipisz, Steven #define VIN2A_D16_DLY_VAL		((0x3 << 5) + 0x2)
50074cc8b09SKipisz, Steven #define VIN2A_D15_DLY_VAL		((0x4 << 5) + 0x0)
50174cc8b09SKipisz, Steven #define VIN2A_D14_DLY_VAL		((0x4 << 5) + 0x0)
50274cc8b09SKipisz, Steven 
50374cc8b09SKipisz, Steven static void cpsw_control(int enabled)
50474cc8b09SKipisz, Steven {
50574cc8b09SKipisz, Steven 	/* VTP can be added here */
50674cc8b09SKipisz, Steven }
50774cc8b09SKipisz, Steven 
50874cc8b09SKipisz, Steven static struct cpsw_slave_data cpsw_slaves[] = {
50974cc8b09SKipisz, Steven 	{
51074cc8b09SKipisz, Steven 		.slave_reg_ofs	= 0x208,
51174cc8b09SKipisz, Steven 		.sliver_reg_ofs	= 0xd80,
51274cc8b09SKipisz, Steven 		.phy_addr	= 1,
51374cc8b09SKipisz, Steven 	},
51474cc8b09SKipisz, Steven 	{
51574cc8b09SKipisz, Steven 		.slave_reg_ofs	= 0x308,
51674cc8b09SKipisz, Steven 		.sliver_reg_ofs	= 0xdc0,
51774cc8b09SKipisz, Steven 		.phy_addr	= 2,
51874cc8b09SKipisz, Steven 	},
51974cc8b09SKipisz, Steven };
52074cc8b09SKipisz, Steven 
52174cc8b09SKipisz, Steven static struct cpsw_platform_data cpsw_data = {
52274cc8b09SKipisz, Steven 	.mdio_base		= CPSW_MDIO_BASE,
52374cc8b09SKipisz, Steven 	.cpsw_base		= CPSW_BASE,
52474cc8b09SKipisz, Steven 	.mdio_div		= 0xff,
52574cc8b09SKipisz, Steven 	.channels		= 8,
52674cc8b09SKipisz, Steven 	.cpdma_reg_ofs		= 0x800,
52774cc8b09SKipisz, Steven 	.slaves			= 1,
52874cc8b09SKipisz, Steven 	.slave_data		= cpsw_slaves,
52974cc8b09SKipisz, Steven 	.ale_reg_ofs		= 0xd00,
53074cc8b09SKipisz, Steven 	.ale_entries		= 1024,
53174cc8b09SKipisz, Steven 	.host_port_reg_ofs	= 0x108,
53274cc8b09SKipisz, Steven 	.hw_stats_reg_ofs	= 0x900,
53374cc8b09SKipisz, Steven 	.bd_ram_ofs		= 0x2000,
53474cc8b09SKipisz, Steven 	.mac_control		= (1 << 5),
53574cc8b09SKipisz, Steven 	.control		= cpsw_control,
53674cc8b09SKipisz, Steven 	.host_port_num		= 0,
53774cc8b09SKipisz, Steven 	.version		= CPSW_CTRL_VERSION_2,
53874cc8b09SKipisz, Steven };
53974cc8b09SKipisz, Steven 
54074cc8b09SKipisz, Steven int board_eth_init(bd_t *bis)
54174cc8b09SKipisz, Steven {
54274cc8b09SKipisz, Steven 	int ret;
54374cc8b09SKipisz, Steven 	uint8_t mac_addr[6];
54474cc8b09SKipisz, Steven 	uint32_t mac_hi, mac_lo;
54574cc8b09SKipisz, Steven 	uint32_t ctrl_val;
54674cc8b09SKipisz, Steven 
54774cc8b09SKipisz, Steven 	/* try reading mac address from efuse */
54874cc8b09SKipisz, Steven 	mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
54974cc8b09SKipisz, Steven 	mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
55074cc8b09SKipisz, Steven 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
55174cc8b09SKipisz, Steven 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
55274cc8b09SKipisz, Steven 	mac_addr[2] = mac_hi & 0xFF;
55374cc8b09SKipisz, Steven 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
55474cc8b09SKipisz, Steven 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
55574cc8b09SKipisz, Steven 	mac_addr[5] = mac_lo & 0xFF;
55674cc8b09SKipisz, Steven 
55774cc8b09SKipisz, Steven 	if (!getenv("ethaddr")) {
55874cc8b09SKipisz, Steven 		printf("<ethaddr> not set. Validating first E-fuse MAC\n");
55974cc8b09SKipisz, Steven 
56074cc8b09SKipisz, Steven 		if (is_valid_ethaddr(mac_addr))
56174cc8b09SKipisz, Steven 			eth_setenv_enetaddr("ethaddr", mac_addr);
56274cc8b09SKipisz, Steven 	}
56374cc8b09SKipisz, Steven 
56474cc8b09SKipisz, Steven 	mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
56574cc8b09SKipisz, Steven 	mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
56674cc8b09SKipisz, Steven 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
56774cc8b09SKipisz, Steven 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
56874cc8b09SKipisz, Steven 	mac_addr[2] = mac_hi & 0xFF;
56974cc8b09SKipisz, Steven 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
57074cc8b09SKipisz, Steven 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
57174cc8b09SKipisz, Steven 	mac_addr[5] = mac_lo & 0xFF;
57274cc8b09SKipisz, Steven 
57374cc8b09SKipisz, Steven 	if (!getenv("eth1addr")) {
57474cc8b09SKipisz, Steven 		if (is_valid_ethaddr(mac_addr))
57574cc8b09SKipisz, Steven 			eth_setenv_enetaddr("eth1addr", mac_addr);
57674cc8b09SKipisz, Steven 	}
57774cc8b09SKipisz, Steven 
57874cc8b09SKipisz, Steven 	ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
57974cc8b09SKipisz, Steven 	ctrl_val |= 0x22;
58074cc8b09SKipisz, Steven 	writel(ctrl_val, (*ctrl)->control_core_control_io1);
58174cc8b09SKipisz, Steven 
58274cc8b09SKipisz, Steven 	ret = cpsw_register(&cpsw_data);
58374cc8b09SKipisz, Steven 	if (ret < 0)
58474cc8b09SKipisz, Steven 		printf("Error %d registering CPSW switch\n", ret);
58574cc8b09SKipisz, Steven 
58674cc8b09SKipisz, Steven 	return ret;
58774cc8b09SKipisz, Steven }
58874cc8b09SKipisz, Steven #endif
58974cc8b09SKipisz, Steven 
59074cc8b09SKipisz, Steven #ifdef CONFIG_BOARD_EARLY_INIT_F
59174cc8b09SKipisz, Steven /* VTT regulator enable */
59274cc8b09SKipisz, Steven static inline void vtt_regulator_enable(void)
59374cc8b09SKipisz, Steven {
59474cc8b09SKipisz, Steven 	if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
59574cc8b09SKipisz, Steven 		return;
59674cc8b09SKipisz, Steven 
59774cc8b09SKipisz, Steven 	gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
59874cc8b09SKipisz, Steven 	gpio_direction_output(GPIO_DDR_VTT_EN, 1);
59974cc8b09SKipisz, Steven }
60074cc8b09SKipisz, Steven 
60174cc8b09SKipisz, Steven int board_early_init_f(void)
60274cc8b09SKipisz, Steven {
60374cc8b09SKipisz, Steven 	vtt_regulator_enable();
60474cc8b09SKipisz, Steven 	return 0;
60574cc8b09SKipisz, Steven }
60674cc8b09SKipisz, Steven #endif
607