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