xref: /rk3399_rockchip-uboot/board/ti/am57xx/board.c (revision 376110525edc0ada3e41fab1d09302e20dbe61ba)
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>
1617c29873SAndreas Dannenberg #include <asm/omap_sec_common.h>
1774cc8b09SKipisz, Steven #include <asm/emif.h>
1874cc8b09SKipisz, Steven #include <asm/gpio.h>
1974cc8b09SKipisz, Steven #include <asm/arch/gpio.h>
2074cc8b09SKipisz, Steven #include <asm/arch/clock.h>
2174cc8b09SKipisz, Steven #include <asm/arch/dra7xx_iodelay.h>
2274cc8b09SKipisz, Steven #include <asm/arch/sys_proto.h>
2374cc8b09SKipisz, Steven #include <asm/arch/mmc_host_def.h>
2474cc8b09SKipisz, Steven #include <asm/arch/sata.h>
2574cc8b09SKipisz, Steven #include <asm/arch/gpio.h>
2674cc8b09SKipisz, Steven #include <asm/arch/omap.h>
2774cc8b09SKipisz, Steven #include <environment.h>
2874cc8b09SKipisz, Steven #include <usb.h>
2974cc8b09SKipisz, Steven #include <linux/usb/gadget.h>
3074cc8b09SKipisz, Steven #include <dwc3-uboot.h>
3174cc8b09SKipisz, Steven #include <dwc3-omap-uboot.h>
3274cc8b09SKipisz, Steven #include <ti-usb-phy-uboot.h>
3374cc8b09SKipisz, Steven 
34212f96f6SKipisz, Steven #include "../common/board_detect.h"
3574cc8b09SKipisz, Steven #include "mux_data.h"
3674cc8b09SKipisz, Steven 
37212f96f6SKipisz, Steven #define board_is_x15()		board_ti_is("BBRDX15_")
38f7f9f6beSLokesh Vutla #define board_is_x15_revb1()	(board_ti_is("BBRDX15_") && \
39f7f9f6beSLokesh Vutla 				 (strncmp("B.10", board_ti_get_rev(), 3) <= 0))
40212f96f6SKipisz, Steven #define board_is_am572x_evm()	board_ti_is("AM572PM_")
41bf43ce6cSNishanth Menon #define board_is_am572x_evm_reva3()	\
42bf43ce6cSNishanth Menon 				(board_ti_is("AM572PM_") && \
43bf43ce6cSNishanth Menon 				 (strncmp("A.30", board_ti_get_rev(), 3) <= 0))
44c020d355SSteve Kipisz #define board_is_am572x_idk()	board_ti_is("AM572IDK")
454d8397c6SSteve Kipisz #define board_is_am571x_idk()	board_ti_is("AM571IDK")
46212f96f6SKipisz, Steven 
4774cc8b09SKipisz, Steven #ifdef CONFIG_DRIVER_TI_CPSW
4874cc8b09SKipisz, Steven #include <cpsw.h>
4974cc8b09SKipisz, Steven #endif
5074cc8b09SKipisz, Steven 
5174cc8b09SKipisz, Steven DECLARE_GLOBAL_DATA_PTR;
5274cc8b09SKipisz, Steven 
53*37611052SRoger Quadros #define GPIO_ETH_LCD		GPIO_TO_PIN(2, 22)
5474cc8b09SKipisz, Steven /* GPIO 7_11 */
5574cc8b09SKipisz, Steven #define GPIO_DDR_VTT_EN 203
5674cc8b09SKipisz, Steven 
57212f96f6SKipisz, Steven #define SYSINFO_BOARD_NAME_MAX_LEN	45
58212f96f6SKipisz, Steven 
59385d3632SKeerthy #define TPS65903X_PRIMARY_SECONDARY_PAD2	0xFB
60385d3632SKeerthy #define TPS65903X_PAD2_POWERHOLD_MASK		0x20
61385d3632SKeerthy 
6274cc8b09SKipisz, Steven const struct omap_sysinfo sysinfo = {
63212f96f6SKipisz, Steven 	"Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n"
6474cc8b09SKipisz, Steven };
6574cc8b09SKipisz, Steven 
6674cc8b09SKipisz, Steven static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = {
6774cc8b09SKipisz, Steven 	.dmm_lisa_map_3 = 0x80740300,
6874cc8b09SKipisz, Steven 	.is_ma_present  = 0x1
6974cc8b09SKipisz, Steven };
7074cc8b09SKipisz, Steven 
714d8397c6SSteve Kipisz static const struct dmm_lisa_map_regs am571x_idk_lisa_regs = {
724d8397c6SSteve Kipisz 	.dmm_lisa_map_3 = 0x80640100,
734d8397c6SSteve Kipisz 	.is_ma_present  = 0x1
744d8397c6SSteve Kipisz };
754d8397c6SSteve Kipisz 
7674cc8b09SKipisz, Steven void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
7774cc8b09SKipisz, Steven {
784d8397c6SSteve Kipisz 	if (board_is_am571x_idk())
794d8397c6SSteve Kipisz 		*dmm_lisa_regs = &am571x_idk_lisa_regs;
804d8397c6SSteve Kipisz 	else
8174cc8b09SKipisz, Steven 		*dmm_lisa_regs = &beagle_x15_lisa_regs;
8274cc8b09SKipisz, Steven }
8374cc8b09SKipisz, Steven 
8474cc8b09SKipisz, Steven static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
8574cc8b09SKipisz, Steven 	.sdram_config_init		= 0x61851b32,
8674cc8b09SKipisz, Steven 	.sdram_config			= 0x61851b32,
8711e2b043SLokesh Vutla 	.sdram_config2			= 0x08000000,
8874cc8b09SKipisz, Steven 	.ref_ctrl			= 0x000040F1,
8974cc8b09SKipisz, Steven 	.ref_ctrl_final			= 0x00001035,
9011e2b043SLokesh Vutla 	.sdram_tim1			= 0xcccf36ab,
9111e2b043SLokesh Vutla 	.sdram_tim2			= 0x308f7fda,
9211e2b043SLokesh Vutla 	.sdram_tim3			= 0x409f88a8,
9374cc8b09SKipisz, Steven 	.read_idle_ctrl			= 0x00050000,
9411e2b043SLokesh Vutla 	.zq_config			= 0x5007190b,
9574cc8b09SKipisz, Steven 	.temp_alert_config		= 0x00000000,
9674cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1_init 	= 0x0024400b,
9774cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1		= 0x0e24400b,
9874cc8b09SKipisz, Steven 	.emif_ddr_ext_phy_ctrl_1 	= 0x10040100,
9911e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_2 	= 0x00910091,
10011e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_3 	= 0x00950095,
10111e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_4 	= 0x009b009b,
10211e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_5 	= 0x009e009e,
10374cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_win		= 0x00000000,
10474cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_ctl		= 0x80000000,
10574cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_ctl		= 0x00000000,
10674cc8b09SKipisz, Steven 	.emif_rd_wr_exec_thresh		= 0x00000305
10774cc8b09SKipisz, Steven };
10874cc8b09SKipisz, Steven 
10974cc8b09SKipisz, Steven /* Ext phy ctrl regs 1-35 */
11074cc8b09SKipisz, Steven static const u32 beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs[] = {
11174cc8b09SKipisz, Steven 	0x10040100,
11211e2b043SLokesh Vutla 	0x00910091,
11311e2b043SLokesh Vutla 	0x00950095,
11411e2b043SLokesh Vutla 	0x009B009B,
11511e2b043SLokesh Vutla 	0x009E009E,
11611e2b043SLokesh Vutla 	0x00980098,
11774cc8b09SKipisz, Steven 	0x00340034,
11874cc8b09SKipisz, Steven 	0x00350035,
11911e2b043SLokesh Vutla 	0x00340034,
12011e2b043SLokesh Vutla 	0x00310031,
12111e2b043SLokesh Vutla 	0x00340034,
12211e2b043SLokesh Vutla 	0x007F007F,
12311e2b043SLokesh Vutla 	0x007F007F,
12411e2b043SLokesh Vutla 	0x007F007F,
12511e2b043SLokesh Vutla 	0x007F007F,
12611e2b043SLokesh Vutla 	0x007F007F,
12711e2b043SLokesh Vutla 	0x00480048,
12811e2b043SLokesh Vutla 	0x004A004A,
12911e2b043SLokesh Vutla 	0x00520052,
13011e2b043SLokesh Vutla 	0x00550055,
13111e2b043SLokesh Vutla 	0x00500050,
13274cc8b09SKipisz, Steven 	0x00000000,
13374cc8b09SKipisz, Steven 	0x00600020,
13474cc8b09SKipisz, Steven 	0x40011080,
13574cc8b09SKipisz, Steven 	0x08102040,
13611e2b043SLokesh Vutla 	0x0,
13711e2b043SLokesh Vutla 	0x0,
13811e2b043SLokesh Vutla 	0x0,
13911e2b043SLokesh Vutla 	0x0,
14011e2b043SLokesh Vutla 	0x0,
14174cc8b09SKipisz, Steven 	0x0,
14274cc8b09SKipisz, Steven 	0x0,
14374cc8b09SKipisz, Steven 	0x0,
14474cc8b09SKipisz, Steven 	0x0,
14574cc8b09SKipisz, Steven 	0x0
14674cc8b09SKipisz, Steven };
14774cc8b09SKipisz, Steven 
14874cc8b09SKipisz, Steven static const struct emif_regs beagle_x15_emif2_ddr3_532mhz_emif_regs = {
14974cc8b09SKipisz, Steven 	.sdram_config_init		= 0x61851b32,
15074cc8b09SKipisz, Steven 	.sdram_config			= 0x61851b32,
15111e2b043SLokesh Vutla 	.sdram_config2			= 0x08000000,
15274cc8b09SKipisz, Steven 	.ref_ctrl			= 0x000040F1,
15374cc8b09SKipisz, Steven 	.ref_ctrl_final			= 0x00001035,
1545f405e7fSSchuyler Patton 	.sdram_tim1			= 0xcccf36b3,
15511e2b043SLokesh Vutla 	.sdram_tim2			= 0x308f7fda,
1565f405e7fSSchuyler Patton 	.sdram_tim3			= 0x407f88a8,
15774cc8b09SKipisz, Steven 	.read_idle_ctrl			= 0x00050000,
15811e2b043SLokesh Vutla 	.zq_config			= 0x5007190b,
15974cc8b09SKipisz, Steven 	.temp_alert_config		= 0x00000000,
16074cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1_init 	= 0x0024400b,
16174cc8b09SKipisz, Steven 	.emif_ddr_phy_ctlr_1		= 0x0e24400b,
16274cc8b09SKipisz, Steven 	.emif_ddr_ext_phy_ctrl_1 	= 0x10040100,
16311e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_2 	= 0x00910091,
16411e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_3 	= 0x00950095,
16511e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_4 	= 0x009b009b,
16611e2b043SLokesh Vutla 	.emif_ddr_ext_phy_ctrl_5 	= 0x009e009e,
16774cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_win		= 0x00000000,
16874cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_rmp_ctl		= 0x80000000,
16974cc8b09SKipisz, Steven 	.emif_rd_wr_lvl_ctl		= 0x00000000,
17074cc8b09SKipisz, Steven 	.emif_rd_wr_exec_thresh		= 0x00000305
17174cc8b09SKipisz, Steven };
17274cc8b09SKipisz, Steven 
17374cc8b09SKipisz, Steven static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
17474cc8b09SKipisz, Steven 	0x10040100,
17511e2b043SLokesh Vutla 	0x00910091,
17611e2b043SLokesh Vutla 	0x00950095,
17711e2b043SLokesh Vutla 	0x009B009B,
17811e2b043SLokesh Vutla 	0x009E009E,
17911e2b043SLokesh Vutla 	0x00980098,
18011e2b043SLokesh Vutla 	0x00340034,
18174cc8b09SKipisz, Steven 	0x00350035,
18211e2b043SLokesh Vutla 	0x00340034,
18311e2b043SLokesh Vutla 	0x00310031,
18411e2b043SLokesh Vutla 	0x00340034,
18511e2b043SLokesh Vutla 	0x007F007F,
18611e2b043SLokesh Vutla 	0x007F007F,
18711e2b043SLokesh Vutla 	0x007F007F,
18811e2b043SLokesh Vutla 	0x007F007F,
18911e2b043SLokesh Vutla 	0x007F007F,
19011e2b043SLokesh Vutla 	0x00480048,
19111e2b043SLokesh Vutla 	0x004A004A,
19211e2b043SLokesh Vutla 	0x00520052,
19311e2b043SLokesh Vutla 	0x00550055,
19411e2b043SLokesh Vutla 	0x00500050,
19574cc8b09SKipisz, Steven 	0x00000000,
19674cc8b09SKipisz, Steven 	0x00600020,
19774cc8b09SKipisz, Steven 	0x40011080,
19874cc8b09SKipisz, Steven 	0x08102040,
19911e2b043SLokesh Vutla 	0x0,
20011e2b043SLokesh Vutla 	0x0,
20111e2b043SLokesh Vutla 	0x0,
20211e2b043SLokesh Vutla 	0x0,
20311e2b043SLokesh Vutla 	0x0,
20474cc8b09SKipisz, Steven 	0x0,
20574cc8b09SKipisz, Steven 	0x0,
20674cc8b09SKipisz, Steven 	0x0,
20774cc8b09SKipisz, Steven 	0x0,
20874cc8b09SKipisz, Steven 	0x0
20974cc8b09SKipisz, Steven };
21074cc8b09SKipisz, Steven 
21174cc8b09SKipisz, Steven void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
21274cc8b09SKipisz, Steven {
21374cc8b09SKipisz, Steven 	switch (emif_nr) {
21474cc8b09SKipisz, Steven 	case 1:
21574cc8b09SKipisz, Steven 		*regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
21674cc8b09SKipisz, Steven 		break;
21774cc8b09SKipisz, Steven 	case 2:
21874cc8b09SKipisz, Steven 		*regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs;
21974cc8b09SKipisz, Steven 		break;
22074cc8b09SKipisz, Steven 	}
22174cc8b09SKipisz, Steven }
22274cc8b09SKipisz, Steven 
22374cc8b09SKipisz, Steven void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr, const u32 **regs, u32 *size)
22474cc8b09SKipisz, Steven {
22574cc8b09SKipisz, Steven 	switch (emif_nr) {
22674cc8b09SKipisz, Steven 	case 1:
22774cc8b09SKipisz, Steven 		*regs = beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs;
22874cc8b09SKipisz, Steven 		*size = ARRAY_SIZE(beagle_x15_emif1_ddr3_ext_phy_ctrl_const_regs);
22974cc8b09SKipisz, Steven 		break;
23074cc8b09SKipisz, Steven 	case 2:
23174cc8b09SKipisz, Steven 		*regs = beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs;
23274cc8b09SKipisz, Steven 		*size = ARRAY_SIZE(beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs);
23374cc8b09SKipisz, Steven 		break;
23474cc8b09SKipisz, Steven 	}
23574cc8b09SKipisz, Steven }
23674cc8b09SKipisz, Steven 
23774cc8b09SKipisz, Steven struct vcores_data beagle_x15_volts = {
238beb71279SLokesh Vutla 	.mpu.value[OPP_NOM]	= VDD_MPU_DRA7_NOM,
239beb71279SLokesh Vutla 	.mpu.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_MPU_NOM,
24074cc8b09SKipisz, Steven 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
24174cc8b09SKipisz, Steven 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
24274cc8b09SKipisz, Steven 	.mpu.pmic		= &tps659038,
2433708e78cSNishanth Menon 	.mpu.abb_tx_done_mask	= OMAP_ABB_MPU_TXDONE_MASK,
24474cc8b09SKipisz, Steven 
245beb71279SLokesh Vutla 	.eve.value[OPP_NOM]	= VDD_EVE_DRA7_NOM,
246beb71279SLokesh Vutla 	.eve.value[OPP_OD]	= VDD_EVE_DRA7_OD,
247beb71279SLokesh Vutla 	.eve.value[OPP_HIGH]	= VDD_EVE_DRA7_HIGH,
248beb71279SLokesh Vutla 	.eve.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_DSPEVE_NOM,
249beb71279SLokesh Vutla 	.eve.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_DSPEVE_OD,
250beb71279SLokesh Vutla 	.eve.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
25174cc8b09SKipisz, Steven 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
25274cc8b09SKipisz, Steven 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
25374cc8b09SKipisz, Steven 	.eve.pmic		= &tps659038,
254e52e334eSNishanth Menon 	.eve.abb_tx_done_mask	= OMAP_ABB_EVE_TXDONE_MASK,
25574cc8b09SKipisz, Steven 
256beb71279SLokesh Vutla 	.gpu.value[OPP_NOM]	= VDD_GPU_DRA7_NOM,
257beb71279SLokesh Vutla 	.gpu.value[OPP_OD]	= VDD_GPU_DRA7_OD,
258beb71279SLokesh Vutla 	.gpu.value[OPP_HIGH]	= VDD_GPU_DRA7_HIGH,
259beb71279SLokesh Vutla 	.gpu.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_GPU_NOM,
260beb71279SLokesh Vutla 	.gpu.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_GPU_OD,
261beb71279SLokesh Vutla 	.gpu.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_GPU_HIGH,
26274cc8b09SKipisz, Steven 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
26374cc8b09SKipisz, Steven 	.gpu.addr		= TPS659038_REG_ADDR_SMPS45,
26474cc8b09SKipisz, Steven 	.gpu.pmic		= &tps659038,
265e52e334eSNishanth Menon 	.gpu.abb_tx_done_mask	= OMAP_ABB_GPU_TXDONE_MASK,
26674cc8b09SKipisz, Steven 
267beb71279SLokesh Vutla 	.core.value[OPP_NOM]	= VDD_CORE_DRA7_NOM,
268beb71279SLokesh Vutla 	.core.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_CORE_NOM,
26974cc8b09SKipisz, Steven 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
27074cc8b09SKipisz, Steven 	.core.addr		= TPS659038_REG_ADDR_SMPS6,
27174cc8b09SKipisz, Steven 	.core.pmic		= &tps659038,
27274cc8b09SKipisz, Steven 
273beb71279SLokesh Vutla 	.iva.value[OPP_NOM]	= VDD_IVA_DRA7_NOM,
274beb71279SLokesh Vutla 	.iva.value[OPP_OD]	= VDD_IVA_DRA7_OD,
275beb71279SLokesh Vutla 	.iva.value[OPP_HIGH]	= VDD_IVA_DRA7_HIGH,
276beb71279SLokesh Vutla 	.iva.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_IVA_NOM,
277beb71279SLokesh Vutla 	.iva.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_IVA_OD,
278beb71279SLokesh Vutla 	.iva.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_IVA_HIGH,
27974cc8b09SKipisz, Steven 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
28074cc8b09SKipisz, Steven 	.iva.addr		= TPS659038_REG_ADDR_SMPS45,
28174cc8b09SKipisz, Steven 	.iva.pmic		= &tps659038,
282e52e334eSNishanth Menon 	.iva.abb_tx_done_mask	= OMAP_ABB_IVA_TXDONE_MASK,
28374cc8b09SKipisz, Steven };
28474cc8b09SKipisz, Steven 
285d60198daSKeerthy struct vcores_data am572x_idk_volts = {
286beb71279SLokesh Vutla 	.mpu.value[OPP_NOM]	= VDD_MPU_DRA7_NOM,
287beb71279SLokesh Vutla 	.mpu.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_MPU_NOM,
288d60198daSKeerthy 	.mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
289d60198daSKeerthy 	.mpu.addr		= TPS659038_REG_ADDR_SMPS12,
290d60198daSKeerthy 	.mpu.pmic		= &tps659038,
291d60198daSKeerthy 	.mpu.abb_tx_done_mask	= OMAP_ABB_MPU_TXDONE_MASK,
292d60198daSKeerthy 
293beb71279SLokesh Vutla 	.eve.value[OPP_NOM]	= VDD_EVE_DRA7_NOM,
294beb71279SLokesh Vutla 	.eve.value[OPP_OD]	= VDD_EVE_DRA7_OD,
295beb71279SLokesh Vutla 	.eve.value[OPP_HIGH]	= VDD_EVE_DRA7_HIGH,
296beb71279SLokesh Vutla 	.eve.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_DSPEVE_NOM,
297beb71279SLokesh Vutla 	.eve.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_DSPEVE_OD,
298beb71279SLokesh Vutla 	.eve.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
299d60198daSKeerthy 	.eve.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
300d60198daSKeerthy 	.eve.addr		= TPS659038_REG_ADDR_SMPS45,
301d60198daSKeerthy 	.eve.pmic		= &tps659038,
302d60198daSKeerthy 	.eve.abb_tx_done_mask	= OMAP_ABB_EVE_TXDONE_MASK,
303d60198daSKeerthy 
304beb71279SLokesh Vutla 	.gpu.value[OPP_NOM]	= VDD_GPU_DRA7_NOM,
305beb71279SLokesh Vutla 	.gpu.value[OPP_OD]	= VDD_GPU_DRA7_OD,
306beb71279SLokesh Vutla 	.gpu.value[OPP_HIGH]	= VDD_GPU_DRA7_HIGH,
307beb71279SLokesh Vutla 	.gpu.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_GPU_NOM,
308beb71279SLokesh Vutla 	.gpu.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_GPU_OD,
309beb71279SLokesh Vutla 	.gpu.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_GPU_HIGH,
310d60198daSKeerthy 	.gpu.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
311d60198daSKeerthy 	.gpu.addr		= TPS659038_REG_ADDR_SMPS6,
312d60198daSKeerthy 	.gpu.pmic		= &tps659038,
313d60198daSKeerthy 	.gpu.abb_tx_done_mask	= OMAP_ABB_GPU_TXDONE_MASK,
314d60198daSKeerthy 
315beb71279SLokesh Vutla 	.core.value[OPP_NOM]	= VDD_CORE_DRA7_NOM,
316beb71279SLokesh Vutla 	.core.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_CORE_NOM,
317d60198daSKeerthy 	.core.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
318d60198daSKeerthy 	.core.addr		= TPS659038_REG_ADDR_SMPS7,
319d60198daSKeerthy 	.core.pmic		= &tps659038,
320d60198daSKeerthy 
321beb71279SLokesh Vutla 	.iva.value[OPP_NOM]	= VDD_IVA_DRA7_NOM,
322beb71279SLokesh Vutla 	.iva.value[OPP_OD]	= VDD_IVA_DRA7_OD,
323beb71279SLokesh Vutla 	.iva.value[OPP_HIGH]	= VDD_IVA_DRA7_HIGH,
324beb71279SLokesh Vutla 	.iva.efuse.reg[OPP_NOM]	= STD_FUSE_OPP_VMIN_IVA_NOM,
325beb71279SLokesh Vutla 	.iva.efuse.reg[OPP_OD]	= STD_FUSE_OPP_VMIN_IVA_OD,
326beb71279SLokesh Vutla 	.iva.efuse.reg[OPP_HIGH]	= STD_FUSE_OPP_VMIN_IVA_HIGH,
327d60198daSKeerthy 	.iva.efuse.reg_bits	= DRA752_EFUSE_REGBITS,
328d60198daSKeerthy 	.iva.addr		= TPS659038_REG_ADDR_SMPS8,
329d60198daSKeerthy 	.iva.pmic		= &tps659038,
330d60198daSKeerthy 	.iva.abb_tx_done_mask	= OMAP_ABB_IVA_TXDONE_MASK,
331d60198daSKeerthy };
332d60198daSKeerthy 
333beb71279SLokesh Vutla int get_voltrail_opp(int rail_offset)
334beb71279SLokesh Vutla {
335beb71279SLokesh Vutla 	int opp;
336beb71279SLokesh Vutla 
337beb71279SLokesh Vutla 	switch (rail_offset) {
338beb71279SLokesh Vutla 	case VOLT_MPU:
339beb71279SLokesh Vutla 		opp = DRA7_MPU_OPP;
340beb71279SLokesh Vutla 		break;
341beb71279SLokesh Vutla 	case VOLT_CORE:
342beb71279SLokesh Vutla 		opp = DRA7_CORE_OPP;
343beb71279SLokesh Vutla 		break;
344beb71279SLokesh Vutla 	case VOLT_GPU:
345beb71279SLokesh Vutla 		opp = DRA7_GPU_OPP;
346beb71279SLokesh Vutla 		break;
347beb71279SLokesh Vutla 	case VOLT_EVE:
348beb71279SLokesh Vutla 		opp = DRA7_DSPEVE_OPP;
349beb71279SLokesh Vutla 		break;
350beb71279SLokesh Vutla 	case VOLT_IVA:
351beb71279SLokesh Vutla 		opp = DRA7_IVA_OPP;
352beb71279SLokesh Vutla 		break;
353beb71279SLokesh Vutla 	default:
354beb71279SLokesh Vutla 		opp = OPP_NOM;
355beb71279SLokesh Vutla 	}
356beb71279SLokesh Vutla 
357beb71279SLokesh Vutla 	return opp;
358beb71279SLokesh Vutla }
359beb71279SLokesh Vutla 
360beb71279SLokesh Vutla 
361212f96f6SKipisz, Steven #ifdef CONFIG_SPL_BUILD
362212f96f6SKipisz, Steven /* No env to setup for SPL */
363212f96f6SKipisz, Steven static inline void setup_board_eeprom_env(void) { }
364212f96f6SKipisz, Steven 
365212f96f6SKipisz, Steven /* Override function to read eeprom information */
366212f96f6SKipisz, Steven void do_board_detect(void)
367212f96f6SKipisz, Steven {
368212f96f6SKipisz, Steven 	int rc;
369212f96f6SKipisz, Steven 
370212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
371212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
372212f96f6SKipisz, Steven 	if (rc)
373212f96f6SKipisz, Steven 		printf("ti_i2c_eeprom_init failed %d\n", rc);
374212f96f6SKipisz, Steven }
375212f96f6SKipisz, Steven 
376212f96f6SKipisz, Steven #else	/* CONFIG_SPL_BUILD */
377212f96f6SKipisz, Steven 
378212f96f6SKipisz, Steven /* Override function to read eeprom information: actual i2c read done by SPL*/
379212f96f6SKipisz, Steven void do_board_detect(void)
380212f96f6SKipisz, Steven {
381212f96f6SKipisz, Steven 	char *bname = NULL;
382212f96f6SKipisz, Steven 	int rc;
383212f96f6SKipisz, Steven 
384212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
385212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
386212f96f6SKipisz, Steven 	if (rc)
387212f96f6SKipisz, Steven 		printf("ti_i2c_eeprom_init failed %d\n", rc);
388212f96f6SKipisz, Steven 
389212f96f6SKipisz, Steven 	if (board_is_x15())
390212f96f6SKipisz, Steven 		bname = "BeagleBoard X15";
391212f96f6SKipisz, Steven 	else if (board_is_am572x_evm())
392212f96f6SKipisz, Steven 		bname = "AM572x EVM";
393c020d355SSteve Kipisz 	else if (board_is_am572x_idk())
394c020d355SSteve Kipisz 		bname = "AM572x IDK";
3954d8397c6SSteve Kipisz 	else if (board_is_am571x_idk())
3964d8397c6SSteve Kipisz 		bname = "AM571x IDK";
397212f96f6SKipisz, Steven 
398212f96f6SKipisz, Steven 	if (bname)
399212f96f6SKipisz, Steven 		snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
400212f96f6SKipisz, Steven 			 "Board: %s REV %s\n", bname, board_ti_get_rev());
401212f96f6SKipisz, Steven }
402212f96f6SKipisz, Steven 
403212f96f6SKipisz, Steven static void setup_board_eeprom_env(void)
404212f96f6SKipisz, Steven {
405212f96f6SKipisz, Steven 	char *name = "beagle_x15";
406212f96f6SKipisz, Steven 	int rc;
407212f96f6SKipisz, Steven 
408212f96f6SKipisz, Steven 	rc = ti_i2c_eeprom_am_get(CONFIG_EEPROM_BUS_ADDRESS,
409212f96f6SKipisz, Steven 				  CONFIG_EEPROM_CHIP_ADDRESS);
410212f96f6SKipisz, Steven 	if (rc)
411212f96f6SKipisz, Steven 		goto invalid_eeprom;
412212f96f6SKipisz, Steven 
413bf43ce6cSNishanth Menon 	if (board_is_x15()) {
414f7f9f6beSLokesh Vutla 		if (board_is_x15_revb1())
415f7f9f6beSLokesh Vutla 			name = "beagle_x15_revb1";
416f7f9f6beSLokesh Vutla 		else
417c9891660SNishanth Menon 			name = "beagle_x15";
418bf43ce6cSNishanth Menon 	} else if (board_is_am572x_evm()) {
419bf43ce6cSNishanth Menon 		if (board_is_am572x_evm_reva3())
420bf43ce6cSNishanth Menon 			name = "am57xx_evm_reva3";
421212f96f6SKipisz, Steven 		else
422bf43ce6cSNishanth Menon 			name = "am57xx_evm";
423bf43ce6cSNishanth Menon 	} else if (board_is_am572x_idk()) {
424bf43ce6cSNishanth Menon 		name = "am572x_idk";
4254d8397c6SSteve Kipisz 	} else if (board_is_am571x_idk()) {
4264d8397c6SSteve Kipisz 		name = "am571x_idk";
427bf43ce6cSNishanth Menon 	} else {
428212f96f6SKipisz, Steven 		printf("Unidentified board claims %s in eeprom header\n",
429212f96f6SKipisz, Steven 		       board_ti_get_name());
430bf43ce6cSNishanth Menon 	}
431212f96f6SKipisz, Steven 
432212f96f6SKipisz, Steven invalid_eeprom:
433212f96f6SKipisz, Steven 	set_board_info_env(name);
434212f96f6SKipisz, Steven }
435212f96f6SKipisz, Steven 
436212f96f6SKipisz, Steven #endif	/* CONFIG_SPL_BUILD */
437212f96f6SKipisz, Steven 
438d60198daSKeerthy void vcores_init(void)
439d60198daSKeerthy {
440d60198daSKeerthy 	if (board_is_am572x_idk())
441d60198daSKeerthy 		*omap_vcores = &am572x_idk_volts;
442d60198daSKeerthy 	else
443d60198daSKeerthy 		*omap_vcores = &beagle_x15_volts;
444d60198daSKeerthy }
445d60198daSKeerthy 
44674cc8b09SKipisz, Steven void hw_data_init(void)
44774cc8b09SKipisz, Steven {
44874cc8b09SKipisz, Steven 	*prcm = &dra7xx_prcm;
44974cc8b09SKipisz, Steven 	*dplls_data = &dra7xx_dplls;
45074cc8b09SKipisz, Steven 	*ctrl = &dra7xx_ctrl;
45174cc8b09SKipisz, Steven }
45274cc8b09SKipisz, Steven 
453*37611052SRoger Quadros bool am571x_idk_needs_lcd(void)
454*37611052SRoger Quadros {
455*37611052SRoger Quadros 	bool needs_lcd;
456*37611052SRoger Quadros 
457*37611052SRoger Quadros 	gpio_request(GPIO_ETH_LCD, "nLCD_Detect");
458*37611052SRoger Quadros 	if (gpio_get_value(GPIO_ETH_LCD))
459*37611052SRoger Quadros 		needs_lcd = false;
460*37611052SRoger Quadros 	else
461*37611052SRoger Quadros 		needs_lcd = true;
462*37611052SRoger Quadros 
463*37611052SRoger Quadros 	gpio_free(GPIO_ETH_LCD);
464*37611052SRoger Quadros 
465*37611052SRoger Quadros 	return needs_lcd;
466*37611052SRoger Quadros }
467*37611052SRoger Quadros 
46874cc8b09SKipisz, Steven int board_init(void)
46974cc8b09SKipisz, Steven {
47074cc8b09SKipisz, Steven 	gpmc_init();
47174cc8b09SKipisz, Steven 	gd->bd->bi_boot_params = (CONFIG_SYS_SDRAM_BASE + 0x100);
47274cc8b09SKipisz, Steven 
47374cc8b09SKipisz, Steven 	return 0;
47474cc8b09SKipisz, Steven }
47574cc8b09SKipisz, Steven 
47674cc8b09SKipisz, Steven int board_late_init(void)
47774cc8b09SKipisz, Steven {
478*37611052SRoger Quadros 	char *idk_lcd;
479*37611052SRoger Quadros 
480212f96f6SKipisz, Steven 	setup_board_eeprom_env();
481385d3632SKeerthy 	u8 val;
482212f96f6SKipisz, Steven 
48374cc8b09SKipisz, Steven 	/*
48474cc8b09SKipisz, Steven 	 * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
48574cc8b09SKipisz, Steven 	 * This is the POWERHOLD-in-Low behavior.
48674cc8b09SKipisz, Steven 	 */
48774cc8b09SKipisz, Steven 	palmas_i2c_write_u8(TPS65903X_CHIP_P1, 0xA0, 0x1);
48882cca5a6SLokesh Vutla 
48982cca5a6SLokesh Vutla 	/*
49082cca5a6SLokesh Vutla 	 * Default FIT boot on HS devices. Non FIT images are not allowed
49182cca5a6SLokesh Vutla 	 * on HS devices.
49282cca5a6SLokesh Vutla 	 */
49382cca5a6SLokesh Vutla 	if (get_device_type() == HS_DEVICE)
49482cca5a6SLokesh Vutla 		setenv("boot_fit", "1");
49582cca5a6SLokesh Vutla 
496385d3632SKeerthy 	/*
497385d3632SKeerthy 	 * Set the GPIO7 Pad to POWERHOLD. This has higher priority
498385d3632SKeerthy 	 * over DEV_CTRL.DEV_ON bit. This can be reset in case of
499385d3632SKeerthy 	 * PMIC Power off. So to be on the safer side set it back
500385d3632SKeerthy 	 * to POWERHOLD mode irrespective of the current state.
501385d3632SKeerthy 	 */
502385d3632SKeerthy 	palmas_i2c_read_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2,
503385d3632SKeerthy 			   &val);
504385d3632SKeerthy 	val = val | TPS65903X_PAD2_POWERHOLD_MASK;
505385d3632SKeerthy 	palmas_i2c_write_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2,
506385d3632SKeerthy 			    val);
507385d3632SKeerthy 
5087a2af751SSemen Protsenko 	omap_die_id_serial();
5097a2af751SSemen Protsenko 
510*37611052SRoger Quadros 	/* TBD: Add LCD panel detection once information is available */
511*37611052SRoger Quadros 	if (am571x_idk_needs_lcd())
512*37611052SRoger Quadros 		idk_lcd = "osd101t2045"; /* Default to legacy LCD */
513*37611052SRoger Quadros 	else
514*37611052SRoger Quadros 		idk_lcd = "no";
515*37611052SRoger Quadros 	setenv("idk_lcd", idk_lcd);
516*37611052SRoger Quadros 
517*37611052SRoger Quadros #if !defined(CONFIG_SPL_BUILD)
518*37611052SRoger Quadros 	board_ti_set_ethaddr(2);
519*37611052SRoger Quadros #endif
520*37611052SRoger Quadros 
52174cc8b09SKipisz, Steven 	return 0;
52274cc8b09SKipisz, Steven }
52374cc8b09SKipisz, Steven 
5243ef56e61SPaul Kocialkowski void set_muxconf_regs(void)
52574cc8b09SKipisz, Steven {
52674cc8b09SKipisz, Steven 	do_set_mux32((*ctrl)->control_padconf_core_base,
52774cc8b09SKipisz, Steven 		     early_padconf, ARRAY_SIZE(early_padconf));
52874cc8b09SKipisz, Steven }
52974cc8b09SKipisz, Steven 
53074cc8b09SKipisz, Steven #ifdef CONFIG_IODELAY_RECALIBRATION
53174cc8b09SKipisz, Steven void recalibrate_iodelay(void)
53274cc8b09SKipisz, Steven {
533c020d355SSteve Kipisz 	const struct pad_conf_entry *pconf;
534c020d355SSteve Kipisz 	const struct iodelay_cfg_entry *iod;
535c020d355SSteve Kipisz 	int pconf_sz, iod_sz;
53689a38953SNishanth Menon 	int ret;
537c020d355SSteve Kipisz 
538c020d355SSteve Kipisz 	if (board_is_am572x_idk()) {
539c020d355SSteve Kipisz 		pconf = core_padconf_array_essential_am572x_idk;
540c020d355SSteve Kipisz 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am572x_idk);
541c020d355SSteve Kipisz 		iod = iodelay_cfg_array_am572x_idk;
542c020d355SSteve Kipisz 		iod_sz = ARRAY_SIZE(iodelay_cfg_array_am572x_idk);
5434d8397c6SSteve Kipisz 	} else if (board_is_am571x_idk()) {
5444d8397c6SSteve Kipisz 		pconf = core_padconf_array_essential_am571x_idk;
5454d8397c6SSteve Kipisz 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am571x_idk);
5464d8397c6SSteve Kipisz 		iod = iodelay_cfg_array_am571x_idk;
5474d8397c6SSteve Kipisz 		iod_sz = ARRAY_SIZE(iodelay_cfg_array_am571x_idk);
548c020d355SSteve Kipisz 	} else {
549c020d355SSteve Kipisz 		/* Common for X15/GPEVM */
550c020d355SSteve Kipisz 		pconf = core_padconf_array_essential_x15;
551c020d355SSteve Kipisz 		pconf_sz = ARRAY_SIZE(core_padconf_array_essential_x15);
55289a38953SNishanth Menon 		/* There never was an SR1.0 X15.. So.. */
55389a38953SNishanth Menon 		if (omap_revision() == DRA752_ES1_1) {
55489a38953SNishanth Menon 			iod = iodelay_cfg_array_x15_sr1_1;
55589a38953SNishanth Menon 			iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr1_1);
55689a38953SNishanth Menon 		} else {
55789a38953SNishanth Menon 			/* Since full production should switch to SR2.0  */
55889a38953SNishanth Menon 			iod = iodelay_cfg_array_x15_sr2_0;
55989a38953SNishanth Menon 			iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr2_0);
56089a38953SNishanth Menon 		}
561c020d355SSteve Kipisz 	}
562c020d355SSteve Kipisz 
56389a38953SNishanth Menon 	/* Setup I/O isolation */
56489a38953SNishanth Menon 	ret = __recalibrate_iodelay_start();
56589a38953SNishanth Menon 	if (ret)
56689a38953SNishanth Menon 		goto err;
56789a38953SNishanth Menon 
56889a38953SNishanth Menon 	/* Do the muxing here */
56989a38953SNishanth Menon 	do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
57089a38953SNishanth Menon 
57189a38953SNishanth Menon 	/* Now do the weird minor deltas that should be safe */
57289a38953SNishanth Menon 	if (board_is_x15() || board_is_am572x_evm()) {
57389a38953SNishanth Menon 		if (board_is_x15_revb1() || board_is_am572x_evm_reva3()) {
57489a38953SNishanth Menon 			pconf = core_padconf_array_delta_x15_sr2_0;
57589a38953SNishanth Menon 			pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr2_0);
57689a38953SNishanth Menon 		} else {
57789a38953SNishanth Menon 			pconf = core_padconf_array_delta_x15_sr1_1;
57889a38953SNishanth Menon 			pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr1_1);
57989a38953SNishanth Menon 		}
58089a38953SNishanth Menon 		do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
58189a38953SNishanth Menon 	}
58289a38953SNishanth Menon 
583*37611052SRoger Quadros 	if (board_is_am571x_idk()) {
584*37611052SRoger Quadros 		if (am571x_idk_needs_lcd()) {
585*37611052SRoger Quadros 			pconf = core_padconf_array_vout_am571x_idk;
586*37611052SRoger Quadros 			pconf_sz = ARRAY_SIZE(core_padconf_array_vout_am571x_idk);
587*37611052SRoger Quadros 		} else {
588*37611052SRoger Quadros 			pconf = core_padconf_array_icss1eth_am571x_idk;
589*37611052SRoger Quadros 			pconf_sz = ARRAY_SIZE(core_padconf_array_icss1eth_am571x_idk);
590*37611052SRoger Quadros 		}
591*37611052SRoger Quadros 		do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
592*37611052SRoger Quadros 	}
593*37611052SRoger Quadros 
59489a38953SNishanth Menon 	/* Setup IOdelay configuration */
59589a38953SNishanth Menon 	ret = do_set_iodelay((*ctrl)->iodelay_config_base, iod, iod_sz);
59689a38953SNishanth Menon err:
59789a38953SNishanth Menon 	/* Closeup.. remove isolation */
59889a38953SNishanth Menon 	__recalibrate_iodelay_end(ret);
59974cc8b09SKipisz, Steven }
60074cc8b09SKipisz, Steven #endif
60174cc8b09SKipisz, Steven 
602d5abcf94SJean-Jacques Hiblot #if defined(CONFIG_GENERIC_MMC)
60374cc8b09SKipisz, Steven int board_mmc_init(bd_t *bis)
60474cc8b09SKipisz, Steven {
60574cc8b09SKipisz, Steven 	omap_mmc_init(0, 0, 0, -1, -1);
60674cc8b09SKipisz, Steven 	omap_mmc_init(1, 0, 0, -1, -1);
60774cc8b09SKipisz, Steven 	return 0;
60874cc8b09SKipisz, Steven }
60974cc8b09SKipisz, Steven #endif
61074cc8b09SKipisz, Steven 
61174cc8b09SKipisz, Steven #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_OS_BOOT)
61274cc8b09SKipisz, Steven int spl_start_uboot(void)
61374cc8b09SKipisz, Steven {
61474cc8b09SKipisz, Steven 	/* break into full u-boot on 'c' */
61574cc8b09SKipisz, Steven 	if (serial_tstc() && serial_getc() == 'c')
61674cc8b09SKipisz, Steven 		return 1;
61774cc8b09SKipisz, Steven 
61874cc8b09SKipisz, Steven #ifdef CONFIG_SPL_ENV_SUPPORT
61974cc8b09SKipisz, Steven 	env_init();
62074cc8b09SKipisz, Steven 	env_relocate_spec();
62174cc8b09SKipisz, Steven 	if (getenv_yesno("boot_os") != 1)
62274cc8b09SKipisz, Steven 		return 1;
62374cc8b09SKipisz, Steven #endif
62474cc8b09SKipisz, Steven 
62574cc8b09SKipisz, Steven 	return 0;
62674cc8b09SKipisz, Steven }
62774cc8b09SKipisz, Steven #endif
62874cc8b09SKipisz, Steven 
62974cc8b09SKipisz, Steven #ifdef CONFIG_USB_DWC3
63074cc8b09SKipisz, Steven static struct dwc3_device usb_otg_ss2 = {
63174cc8b09SKipisz, Steven 	.maximum_speed = USB_SPEED_HIGH,
63274cc8b09SKipisz, Steven 	.base = DRA7_USB_OTG_SS2_BASE,
63374cc8b09SKipisz, Steven 	.tx_fifo_resize = false,
63474cc8b09SKipisz, Steven 	.index = 1,
63574cc8b09SKipisz, Steven };
63674cc8b09SKipisz, Steven 
63774cc8b09SKipisz, Steven static struct dwc3_omap_device usb_otg_ss2_glue = {
63874cc8b09SKipisz, Steven 	.base = (void *)DRA7_USB_OTG_SS2_GLUE_BASE,
63974cc8b09SKipisz, Steven 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
64074cc8b09SKipisz, Steven 	.index = 1,
64174cc8b09SKipisz, Steven };
64274cc8b09SKipisz, Steven 
64374cc8b09SKipisz, Steven static struct ti_usb_phy_device usb_phy2_device = {
64474cc8b09SKipisz, Steven 	.usb2_phy_power = (void *)DRA7_USB2_PHY2_POWER,
64574cc8b09SKipisz, Steven 	.index = 1,
64674cc8b09SKipisz, Steven };
64774cc8b09SKipisz, Steven 
64874cc8b09SKipisz, Steven int usb_gadget_handle_interrupts(int index)
64974cc8b09SKipisz, Steven {
65074cc8b09SKipisz, Steven 	u32 status;
65174cc8b09SKipisz, Steven 
65274cc8b09SKipisz, Steven 	status = dwc3_omap_uboot_interrupt_status(index);
65374cc8b09SKipisz, Steven 	if (status)
65474cc8b09SKipisz, Steven 		dwc3_uboot_handle_interrupt(index);
65574cc8b09SKipisz, Steven 
65674cc8b09SKipisz, Steven 	return 0;
65774cc8b09SKipisz, Steven }
65855efaddeSRoger Quadros #endif /* CONFIG_USB_DWC3 */
65955efaddeSRoger Quadros 
66055efaddeSRoger Quadros #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
66155efaddeSRoger Quadros int board_usb_init(int index, enum usb_init_type init)
66255efaddeSRoger Quadros {
66355efaddeSRoger Quadros 	enable_usb_clocks(index);
66455efaddeSRoger Quadros 	switch (index) {
66555efaddeSRoger Quadros 	case 0:
66655efaddeSRoger Quadros 		if (init == USB_INIT_DEVICE) {
66755efaddeSRoger Quadros 			printf("port %d can't be used as device\n", index);
66855efaddeSRoger Quadros 			disable_usb_clocks(index);
66955efaddeSRoger Quadros 			return -EINVAL;
67055efaddeSRoger Quadros 		}
67155efaddeSRoger Quadros 		break;
67255efaddeSRoger Quadros 	case 1:
67355efaddeSRoger Quadros 		if (init == USB_INIT_DEVICE) {
67455efaddeSRoger Quadros #ifdef CONFIG_USB_DWC3
67555efaddeSRoger Quadros 			usb_otg_ss2.dr_mode = USB_DR_MODE_PERIPHERAL;
67655efaddeSRoger Quadros 			usb_otg_ss2_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
67755efaddeSRoger Quadros 			ti_usb_phy_uboot_init(&usb_phy2_device);
67855efaddeSRoger Quadros 			dwc3_omap_uboot_init(&usb_otg_ss2_glue);
67955efaddeSRoger Quadros 			dwc3_uboot_init(&usb_otg_ss2);
68074cc8b09SKipisz, Steven #endif
68155efaddeSRoger Quadros 		} else {
68255efaddeSRoger Quadros 			printf("port %d can't be used as host\n", index);
68355efaddeSRoger Quadros 			disable_usb_clocks(index);
68455efaddeSRoger Quadros 			return -EINVAL;
68555efaddeSRoger Quadros 		}
68655efaddeSRoger Quadros 
68755efaddeSRoger Quadros 		break;
68855efaddeSRoger Quadros 	default:
68955efaddeSRoger Quadros 		printf("Invalid Controller Index\n");
69055efaddeSRoger Quadros 	}
69155efaddeSRoger Quadros 
69255efaddeSRoger Quadros 	return 0;
69355efaddeSRoger Quadros }
69455efaddeSRoger Quadros 
69555efaddeSRoger Quadros int board_usb_cleanup(int index, enum usb_init_type init)
69655efaddeSRoger Quadros {
69755efaddeSRoger Quadros #ifdef CONFIG_USB_DWC3
69855efaddeSRoger Quadros 	switch (index) {
69955efaddeSRoger Quadros 	case 0:
70055efaddeSRoger Quadros 	case 1:
70155efaddeSRoger Quadros 		if (init == USB_INIT_DEVICE) {
70255efaddeSRoger Quadros 			ti_usb_phy_uboot_exit(index);
70355efaddeSRoger Quadros 			dwc3_uboot_exit(index);
70455efaddeSRoger Quadros 			dwc3_omap_uboot_exit(index);
70555efaddeSRoger Quadros 		}
70655efaddeSRoger Quadros 		break;
70755efaddeSRoger Quadros 	default:
70855efaddeSRoger Quadros 		printf("Invalid Controller Index\n");
70955efaddeSRoger Quadros 	}
71055efaddeSRoger Quadros #endif
71155efaddeSRoger Quadros 	disable_usb_clocks(index);
71255efaddeSRoger Quadros 	return 0;
71355efaddeSRoger Quadros }
71455efaddeSRoger Quadros #endif /* defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP) */
71574cc8b09SKipisz, Steven 
71674cc8b09SKipisz, Steven #ifdef CONFIG_DRIVER_TI_CPSW
71774cc8b09SKipisz, Steven 
71874cc8b09SKipisz, Steven /* Delay value to add to calibrated value */
71974cc8b09SKipisz, Steven #define RGMII0_TXCTL_DLY_VAL		((0x3 << 5) + 0x8)
72074cc8b09SKipisz, Steven #define RGMII0_TXD0_DLY_VAL		((0x3 << 5) + 0x8)
72174cc8b09SKipisz, Steven #define RGMII0_TXD1_DLY_VAL		((0x3 << 5) + 0x2)
72274cc8b09SKipisz, Steven #define RGMII0_TXD2_DLY_VAL		((0x4 << 5) + 0x0)
72374cc8b09SKipisz, Steven #define RGMII0_TXD3_DLY_VAL		((0x4 << 5) + 0x0)
72474cc8b09SKipisz, Steven #define VIN2A_D13_DLY_VAL		((0x3 << 5) + 0x8)
72574cc8b09SKipisz, Steven #define VIN2A_D17_DLY_VAL		((0x3 << 5) + 0x8)
72674cc8b09SKipisz, Steven #define VIN2A_D16_DLY_VAL		((0x3 << 5) + 0x2)
72774cc8b09SKipisz, Steven #define VIN2A_D15_DLY_VAL		((0x4 << 5) + 0x0)
72874cc8b09SKipisz, Steven #define VIN2A_D14_DLY_VAL		((0x4 << 5) + 0x0)
72974cc8b09SKipisz, Steven 
73074cc8b09SKipisz, Steven static void cpsw_control(int enabled)
73174cc8b09SKipisz, Steven {
73274cc8b09SKipisz, Steven 	/* VTP can be added here */
73374cc8b09SKipisz, Steven }
73474cc8b09SKipisz, Steven 
73574cc8b09SKipisz, Steven static struct cpsw_slave_data cpsw_slaves[] = {
73674cc8b09SKipisz, Steven 	{
73774cc8b09SKipisz, Steven 		.slave_reg_ofs	= 0x208,
73874cc8b09SKipisz, Steven 		.sliver_reg_ofs	= 0xd80,
73974cc8b09SKipisz, Steven 		.phy_addr	= 1,
74074cc8b09SKipisz, Steven 	},
74174cc8b09SKipisz, Steven 	{
74274cc8b09SKipisz, Steven 		.slave_reg_ofs	= 0x308,
74374cc8b09SKipisz, Steven 		.sliver_reg_ofs	= 0xdc0,
74474cc8b09SKipisz, Steven 		.phy_addr	= 2,
74574cc8b09SKipisz, Steven 	},
74674cc8b09SKipisz, Steven };
74774cc8b09SKipisz, Steven 
74874cc8b09SKipisz, Steven static struct cpsw_platform_data cpsw_data = {
74974cc8b09SKipisz, Steven 	.mdio_base		= CPSW_MDIO_BASE,
75074cc8b09SKipisz, Steven 	.cpsw_base		= CPSW_BASE,
75174cc8b09SKipisz, Steven 	.mdio_div		= 0xff,
75274cc8b09SKipisz, Steven 	.channels		= 8,
75374cc8b09SKipisz, Steven 	.cpdma_reg_ofs		= 0x800,
75474cc8b09SKipisz, Steven 	.slaves			= 1,
75574cc8b09SKipisz, Steven 	.slave_data		= cpsw_slaves,
75674cc8b09SKipisz, Steven 	.ale_reg_ofs		= 0xd00,
75774cc8b09SKipisz, Steven 	.ale_entries		= 1024,
75874cc8b09SKipisz, Steven 	.host_port_reg_ofs	= 0x108,
75974cc8b09SKipisz, Steven 	.hw_stats_reg_ofs	= 0x900,
76074cc8b09SKipisz, Steven 	.bd_ram_ofs		= 0x2000,
76174cc8b09SKipisz, Steven 	.mac_control		= (1 << 5),
76274cc8b09SKipisz, Steven 	.control		= cpsw_control,
76374cc8b09SKipisz, Steven 	.host_port_num		= 0,
76474cc8b09SKipisz, Steven 	.version		= CPSW_CTRL_VERSION_2,
76574cc8b09SKipisz, Steven };
76674cc8b09SKipisz, Steven 
76792667e89SRoger Quadros static u64 mac_to_u64(u8 mac[6])
76892667e89SRoger Quadros {
76992667e89SRoger Quadros 	int i;
77092667e89SRoger Quadros 	u64 addr = 0;
77192667e89SRoger Quadros 
77292667e89SRoger Quadros 	for (i = 0; i < 6; i++) {
77392667e89SRoger Quadros 		addr <<= 8;
77492667e89SRoger Quadros 		addr |= mac[i];
77592667e89SRoger Quadros 	}
77692667e89SRoger Quadros 
77792667e89SRoger Quadros 	return addr;
77892667e89SRoger Quadros }
77992667e89SRoger Quadros 
78092667e89SRoger Quadros static void u64_to_mac(u64 addr, u8 mac[6])
78192667e89SRoger Quadros {
78292667e89SRoger Quadros 	mac[5] = addr;
78392667e89SRoger Quadros 	mac[4] = addr >> 8;
78492667e89SRoger Quadros 	mac[3] = addr >> 16;
78592667e89SRoger Quadros 	mac[2] = addr >> 24;
78692667e89SRoger Quadros 	mac[1] = addr >> 32;
78792667e89SRoger Quadros 	mac[0] = addr >> 40;
78892667e89SRoger Quadros }
78992667e89SRoger Quadros 
79074cc8b09SKipisz, Steven int board_eth_init(bd_t *bis)
79174cc8b09SKipisz, Steven {
79274cc8b09SKipisz, Steven 	int ret;
79374cc8b09SKipisz, Steven 	uint8_t mac_addr[6];
79474cc8b09SKipisz, Steven 	uint32_t mac_hi, mac_lo;
79574cc8b09SKipisz, Steven 	uint32_t ctrl_val;
79692667e89SRoger Quadros 	int i;
79792667e89SRoger Quadros 	u64 mac1, mac2;
79892667e89SRoger Quadros 	u8 mac_addr1[6], mac_addr2[6];
79992667e89SRoger Quadros 	int num_macs;
80074cc8b09SKipisz, Steven 
80174cc8b09SKipisz, Steven 	/* try reading mac address from efuse */
80274cc8b09SKipisz, Steven 	mac_lo = readl((*ctrl)->control_core_mac_id_0_lo);
80374cc8b09SKipisz, Steven 	mac_hi = readl((*ctrl)->control_core_mac_id_0_hi);
80474cc8b09SKipisz, Steven 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
80574cc8b09SKipisz, Steven 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
80674cc8b09SKipisz, Steven 	mac_addr[2] = mac_hi & 0xFF;
80774cc8b09SKipisz, Steven 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
80874cc8b09SKipisz, Steven 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
80974cc8b09SKipisz, Steven 	mac_addr[5] = mac_lo & 0xFF;
81074cc8b09SKipisz, Steven 
81174cc8b09SKipisz, Steven 	if (!getenv("ethaddr")) {
81274cc8b09SKipisz, Steven 		printf("<ethaddr> not set. Validating first E-fuse MAC\n");
81374cc8b09SKipisz, Steven 
81474cc8b09SKipisz, Steven 		if (is_valid_ethaddr(mac_addr))
81574cc8b09SKipisz, Steven 			eth_setenv_enetaddr("ethaddr", mac_addr);
81674cc8b09SKipisz, Steven 	}
81774cc8b09SKipisz, Steven 
81874cc8b09SKipisz, Steven 	mac_lo = readl((*ctrl)->control_core_mac_id_1_lo);
81974cc8b09SKipisz, Steven 	mac_hi = readl((*ctrl)->control_core_mac_id_1_hi);
82074cc8b09SKipisz, Steven 	mac_addr[0] = (mac_hi & 0xFF0000) >> 16;
82174cc8b09SKipisz, Steven 	mac_addr[1] = (mac_hi & 0xFF00) >> 8;
82274cc8b09SKipisz, Steven 	mac_addr[2] = mac_hi & 0xFF;
82374cc8b09SKipisz, Steven 	mac_addr[3] = (mac_lo & 0xFF0000) >> 16;
82474cc8b09SKipisz, Steven 	mac_addr[4] = (mac_lo & 0xFF00) >> 8;
82574cc8b09SKipisz, Steven 	mac_addr[5] = mac_lo & 0xFF;
82674cc8b09SKipisz, Steven 
82774cc8b09SKipisz, Steven 	if (!getenv("eth1addr")) {
82874cc8b09SKipisz, Steven 		if (is_valid_ethaddr(mac_addr))
82974cc8b09SKipisz, Steven 			eth_setenv_enetaddr("eth1addr", mac_addr);
83074cc8b09SKipisz, Steven 	}
83174cc8b09SKipisz, Steven 
83274cc8b09SKipisz, Steven 	ctrl_val = readl((*ctrl)->control_core_control_io1) & (~0x33);
83374cc8b09SKipisz, Steven 	ctrl_val |= 0x22;
83474cc8b09SKipisz, Steven 	writel(ctrl_val, (*ctrl)->control_core_control_io1);
83574cc8b09SKipisz, Steven 
8364d8397c6SSteve Kipisz 	/* The phy address for the AM57xx IDK are different than x15 */
8374d8397c6SSteve Kipisz 	if (board_is_am572x_idk() || board_is_am571x_idk()) {
838c020d355SSteve Kipisz 		cpsw_data.slave_data[0].phy_addr = 0;
839c020d355SSteve Kipisz 		cpsw_data.slave_data[1].phy_addr = 1;
840c020d355SSteve Kipisz 	}
841c020d355SSteve Kipisz 
84274cc8b09SKipisz, Steven 	ret = cpsw_register(&cpsw_data);
84374cc8b09SKipisz, Steven 	if (ret < 0)
84474cc8b09SKipisz, Steven 		printf("Error %d registering CPSW switch\n", ret);
84574cc8b09SKipisz, Steven 
84692667e89SRoger Quadros 	/*
84792667e89SRoger Quadros 	 * Export any Ethernet MAC addresses from EEPROM.
84892667e89SRoger Quadros 	 * On AM57xx the 2 MAC addresses define the address range
84992667e89SRoger Quadros 	 */
85092667e89SRoger Quadros 	board_ti_get_eth_mac_addr(0, mac_addr1);
85192667e89SRoger Quadros 	board_ti_get_eth_mac_addr(1, mac_addr2);
85292667e89SRoger Quadros 
85392667e89SRoger Quadros 	if (is_valid_ethaddr(mac_addr1) && is_valid_ethaddr(mac_addr2)) {
85492667e89SRoger Quadros 		mac1 = mac_to_u64(mac_addr1);
85592667e89SRoger Quadros 		mac2 = mac_to_u64(mac_addr2);
85692667e89SRoger Quadros 
85792667e89SRoger Quadros 		/* must contain an address range */
85892667e89SRoger Quadros 		num_macs = mac2 - mac1 + 1;
85992667e89SRoger Quadros 		/* <= 50 to protect against user programming error */
86092667e89SRoger Quadros 		if (num_macs > 0 && num_macs <= 50) {
86192667e89SRoger Quadros 			for (i = 0; i < num_macs; i++) {
86292667e89SRoger Quadros 				u64_to_mac(mac1 + i, mac_addr);
86392667e89SRoger Quadros 				if (is_valid_ethaddr(mac_addr)) {
86492667e89SRoger Quadros 					eth_setenv_enetaddr_by_index("eth",
86592667e89SRoger Quadros 								     i + 2,
86692667e89SRoger Quadros 								     mac_addr);
86792667e89SRoger Quadros 				}
86892667e89SRoger Quadros 			}
86992667e89SRoger Quadros 		}
87092667e89SRoger Quadros 	}
87192667e89SRoger Quadros 
87274cc8b09SKipisz, Steven 	return ret;
87374cc8b09SKipisz, Steven }
87474cc8b09SKipisz, Steven #endif
87574cc8b09SKipisz, Steven 
87674cc8b09SKipisz, Steven #ifdef CONFIG_BOARD_EARLY_INIT_F
87774cc8b09SKipisz, Steven /* VTT regulator enable */
87874cc8b09SKipisz, Steven static inline void vtt_regulator_enable(void)
87974cc8b09SKipisz, Steven {
88074cc8b09SKipisz, Steven 	if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
88174cc8b09SKipisz, Steven 		return;
88274cc8b09SKipisz, Steven 
88374cc8b09SKipisz, Steven 	gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
88474cc8b09SKipisz, Steven 	gpio_direction_output(GPIO_DDR_VTT_EN, 1);
88574cc8b09SKipisz, Steven }
88674cc8b09SKipisz, Steven 
88774cc8b09SKipisz, Steven int board_early_init_f(void)
88874cc8b09SKipisz, Steven {
88974cc8b09SKipisz, Steven 	vtt_regulator_enable();
89074cc8b09SKipisz, Steven 	return 0;
89174cc8b09SKipisz, Steven }
89274cc8b09SKipisz, Steven #endif
89362a09f05SDaniel Allred 
89462a09f05SDaniel Allred #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
89562a09f05SDaniel Allred int ft_board_setup(void *blob, bd_t *bd)
89662a09f05SDaniel Allred {
89762a09f05SDaniel Allred 	ft_cpu_setup(blob, bd);
89862a09f05SDaniel Allred 
89962a09f05SDaniel Allred 	return 0;
90062a09f05SDaniel Allred }
90162a09f05SDaniel Allred #endif
9027a0ea589SLokesh Vutla 
9037a0ea589SLokesh Vutla #ifdef CONFIG_SPL_LOAD_FIT
9047a0ea589SLokesh Vutla int board_fit_config_name_match(const char *name)
9057a0ea589SLokesh Vutla {
906f7f9f6beSLokesh Vutla 	if (board_is_x15()) {
907f7f9f6beSLokesh Vutla 		if (board_is_x15_revb1()) {
908f7f9f6beSLokesh Vutla 			if (!strcmp(name, "am57xx-beagle-x15-revb1"))
9097a0ea589SLokesh Vutla 				return 0;
910f7f9f6beSLokesh Vutla 		} else if (!strcmp(name, "am57xx-beagle-x15")) {
9117a0ea589SLokesh Vutla 			return 0;
912f7f9f6beSLokesh Vutla 		}
913f7f9f6beSLokesh Vutla 	} else if (board_is_am572x_evm() &&
914f7f9f6beSLokesh Vutla 		   !strcmp(name, "am57xx-beagle-x15")) {
915332dddc6SSchuyler Patton 		return 0;
916f7f9f6beSLokesh Vutla 	} else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk")) {
917f7f9f6beSLokesh Vutla 		return 0;
91845e7f7e7SSchuyler Patton 	} else if (board_is_am571x_idk() && !strcmp(name, "am571x-idk")) {
91945e7f7e7SSchuyler Patton 		return 0;
920f7f9f6beSLokesh Vutla 	}
921f7f9f6beSLokesh Vutla 
9227a0ea589SLokesh Vutla 	return -1;
9237a0ea589SLokesh Vutla }
9247a0ea589SLokesh Vutla #endif
92517c29873SAndreas Dannenberg 
92617c29873SAndreas Dannenberg #ifdef CONFIG_TI_SECURE_DEVICE
92717c29873SAndreas Dannenberg void board_fit_image_post_process(void **p_image, size_t *p_size)
92817c29873SAndreas Dannenberg {
92917c29873SAndreas Dannenberg 	secure_boot_verify_image(p_image, p_size);
93017c29873SAndreas Dannenberg }
9311b597adaSAndrew F. Davis 
9321b597adaSAndrew F. Davis void board_tee_image_process(ulong tee_image, size_t tee_size)
9331b597adaSAndrew F. Davis {
9341b597adaSAndrew F. Davis 	secure_tee_install((u32)tee_image);
9351b597adaSAndrew F. Davis }
9361b597adaSAndrew F. Davis 
9371b597adaSAndrew F. Davis U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
93817c29873SAndreas Dannenberg #endif
939