xref: /rk3399_rockchip-uboot/board/isee/igep003x/board.c (revision 35affd7a2ff9a77b9946bf93b616228fcf218d60)
1a96c08f5SLadislav Michl /*
209533e5dSPau Pajuelo  * Board functions for IGEP COM AQUILA and SMARC AM335x based boards
3a96c08f5SLadislav Michl  *
409533e5dSPau Pajuelo  * Copyright (C) 2013-2017, ISEE 2007 SL - http://www.isee.biz/
5a96c08f5SLadislav Michl  *
6a96c08f5SLadislav Michl  * SPDX-License-Identifier:	GPL-2.0+
7a96c08f5SLadislav Michl  */
8a96c08f5SLadislav Michl 
9a96c08f5SLadislav Michl #include <common.h>
10a96c08f5SLadislav Michl #include <errno.h>
11a96c08f5SLadislav Michl #include <spl.h>
12a96c08f5SLadislav Michl #include <asm/arch/cpu.h>
13a96c08f5SLadislav Michl #include <asm/arch/hardware.h>
14a96c08f5SLadislav Michl #include <asm/arch/omap.h>
15a96c08f5SLadislav Michl #include <asm/arch/ddr_defs.h>
16a96c08f5SLadislav Michl #include <asm/arch/clock.h>
17a96c08f5SLadislav Michl #include <asm/arch/gpio.h>
18a96c08f5SLadislav Michl #include <asm/arch/mmc_host_def.h>
19a96c08f5SLadislav Michl #include <asm/arch/sys_proto.h>
20a96c08f5SLadislav Michl #include <asm/io.h>
21a96c08f5SLadislav Michl #include <asm/emif.h>
22a96c08f5SLadislav Michl #include <asm/gpio.h>
23a96c08f5SLadislav Michl #include <i2c.h>
24a96c08f5SLadislav Michl #include <miiphy.h>
25a96c08f5SLadislav Michl #include <cpsw.h>
263607e0f8SLadislav Michl #include <fdt_support.h>
273607e0f8SLadislav Michl #include <mtd_node.h>
283607e0f8SLadislav Michl #include <jffs2/load_kernel.h>
2909533e5dSPau Pajuelo #include <environment.h>
30a96c08f5SLadislav Michl #include "board.h"
31a96c08f5SLadislav Michl 
32a96c08f5SLadislav Michl DECLARE_GLOBAL_DATA_PTR;
33a96c08f5SLadislav Michl 
3409533e5dSPau Pajuelo /* GPIO0_27 and GPIO0_26 are used to read board revision from IGEP003x boards
3509533e5dSPau Pajuelo  * and control IGEP0034 green and red LEDs.
3609533e5dSPau Pajuelo  * U-boot configures these pins as input pullup to detect board revision:
3709533e5dSPau Pajuelo  * IGEP0034-LITE = 0b00
3809533e5dSPau Pajuelo  * IGEP0034 (FULL) = 0b01
3909533e5dSPau Pajuelo  * IGEP0033 = 0b1X
4009533e5dSPau Pajuelo  */
4109533e5dSPau Pajuelo #define GPIO_GREEN_REVISION	27
4209533e5dSPau Pajuelo #define GPIO_RED_REVISION	26
4309533e5dSPau Pajuelo 
44a96c08f5SLadislav Michl static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
45a96c08f5SLadislav Michl 
4609533e5dSPau Pajuelo /*
4709533e5dSPau Pajuelo  * Routine: get_board_revision
4809533e5dSPau Pajuelo  * Description: Returns the board revision
4909533e5dSPau Pajuelo  */
get_board_revision(void)5009533e5dSPau Pajuelo static int get_board_revision(void)
5109533e5dSPau Pajuelo {
5209533e5dSPau Pajuelo 	int revision;
5309533e5dSPau Pajuelo 
5409533e5dSPau Pajuelo 	gpio_request(GPIO_GREEN_REVISION, "green_revision");
5509533e5dSPau Pajuelo 	gpio_direction_input(GPIO_GREEN_REVISION);
5609533e5dSPau Pajuelo 	revision = 2 * gpio_get_value(GPIO_GREEN_REVISION);
5709533e5dSPau Pajuelo 	gpio_free(GPIO_GREEN_REVISION);
5809533e5dSPau Pajuelo 
5909533e5dSPau Pajuelo 	gpio_request(GPIO_RED_REVISION, "red_revision");
6009533e5dSPau Pajuelo 	gpio_direction_input(GPIO_RED_REVISION);
6109533e5dSPau Pajuelo 	revision = revision + gpio_get_value(GPIO_RED_REVISION);
6209533e5dSPau Pajuelo 	gpio_free(GPIO_RED_REVISION);
6309533e5dSPau Pajuelo 
6409533e5dSPau Pajuelo 	return revision;
6509533e5dSPau Pajuelo }
6609533e5dSPau Pajuelo 
67a96c08f5SLadislav Michl #ifdef CONFIG_SPL_BUILD
6809533e5dSPau Pajuelo /* PN H5TQ4G63AFR is equivalent to MT41K256M16HA125*/
6909533e5dSPau Pajuelo static const struct ddr_data ddr3_igep0034_data = {
7009533e5dSPau Pajuelo 	.datardsratio0 = MT41K256M16HA125E_RD_DQS,
7109533e5dSPau Pajuelo 	.datawdsratio0 = MT41K256M16HA125E_WR_DQS,
7209533e5dSPau Pajuelo 	.datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE,
7309533e5dSPau Pajuelo 	.datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA,
7409533e5dSPau Pajuelo };
7509533e5dSPau Pajuelo 
7609533e5dSPau Pajuelo static const struct ddr_data ddr3_igep0034_lite_data = {
77a96c08f5SLadislav Michl 	.datardsratio0 = K4B2G1646EBIH9_RD_DQS,
78a96c08f5SLadislav Michl 	.datawdsratio0 = K4B2G1646EBIH9_WR_DQS,
79a96c08f5SLadislav Michl 	.datafwsratio0 = K4B2G1646EBIH9_PHY_FIFO_WE,
80a96c08f5SLadislav Michl 	.datawrsratio0 = K4B2G1646EBIH9_PHY_WR_DATA,
81a96c08f5SLadislav Michl };
82a96c08f5SLadislav Michl 
8309533e5dSPau Pajuelo static const struct cmd_control ddr3_igep0034_cmd_ctrl_data = {
8409533e5dSPau Pajuelo 	.cmd0csratio = MT41K256M16HA125E_RATIO,
8509533e5dSPau Pajuelo 	.cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
8609533e5dSPau Pajuelo 
8709533e5dSPau Pajuelo 	.cmd1csratio = MT41K256M16HA125E_RATIO,
8809533e5dSPau Pajuelo 	.cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
8909533e5dSPau Pajuelo 
9009533e5dSPau Pajuelo 	.cmd2csratio = MT41K256M16HA125E_RATIO,
9109533e5dSPau Pajuelo 	.cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT,
9209533e5dSPau Pajuelo };
9309533e5dSPau Pajuelo 
9409533e5dSPau Pajuelo static const struct cmd_control ddr3_igep0034_lite_cmd_ctrl_data = {
95a96c08f5SLadislav Michl 	.cmd0csratio = K4B2G1646EBIH9_RATIO,
96a96c08f5SLadislav Michl 	.cmd0iclkout = K4B2G1646EBIH9_INVERT_CLKOUT,
97a96c08f5SLadislav Michl 
98a96c08f5SLadislav Michl 	.cmd1csratio = K4B2G1646EBIH9_RATIO,
99a96c08f5SLadislav Michl 	.cmd1iclkout = K4B2G1646EBIH9_INVERT_CLKOUT,
100a96c08f5SLadislav Michl 
101a96c08f5SLadislav Michl 	.cmd2csratio = K4B2G1646EBIH9_RATIO,
102a96c08f5SLadislav Michl 	.cmd2iclkout = K4B2G1646EBIH9_INVERT_CLKOUT,
103a96c08f5SLadislav Michl };
104a96c08f5SLadislav Michl 
10509533e5dSPau Pajuelo static struct emif_regs ddr3_igep0034_emif_reg_data = {
10609533e5dSPau Pajuelo 	.sdram_config = MT41K256M16HA125E_EMIF_SDCFG,
10709533e5dSPau Pajuelo 	.ref_ctrl = MT41K256M16HA125E_EMIF_SDREF,
10809533e5dSPau Pajuelo 	.sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1,
10909533e5dSPau Pajuelo 	.sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2,
11009533e5dSPau Pajuelo 	.sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3,
11109533e5dSPau Pajuelo 	.zq_config = MT41K256M16HA125E_ZQ_CFG,
11209533e5dSPau Pajuelo 	.emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY,
11309533e5dSPau Pajuelo };
11409533e5dSPau Pajuelo 
11509533e5dSPau Pajuelo static struct emif_regs ddr3_igep0034_lite_emif_reg_data = {
116a96c08f5SLadislav Michl 	.sdram_config = K4B2G1646EBIH9_EMIF_SDCFG,
117a96c08f5SLadislav Michl 	.ref_ctrl = K4B2G1646EBIH9_EMIF_SDREF,
118a96c08f5SLadislav Michl 	.sdram_tim1 = K4B2G1646EBIH9_EMIF_TIM1,
119a96c08f5SLadislav Michl 	.sdram_tim2 = K4B2G1646EBIH9_EMIF_TIM2,
120a96c08f5SLadislav Michl 	.sdram_tim3 = K4B2G1646EBIH9_EMIF_TIM3,
121a96c08f5SLadislav Michl 	.zq_config = K4B2G1646EBIH9_ZQ_CFG,
122a96c08f5SLadislav Michl 	.emif_ddr_phy_ctlr_1 = K4B2G1646EBIH9_EMIF_READ_LATENCY,
123a96c08f5SLadislav Michl };
124a96c08f5SLadislav Michl 
12509533e5dSPau Pajuelo const struct ctrl_ioregs ioregs_igep0034 = {
12609533e5dSPau Pajuelo 	.cm0ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
12709533e5dSPau Pajuelo 	.cm1ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
12809533e5dSPau Pajuelo 	.cm2ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
12909533e5dSPau Pajuelo 	.dt0ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
13009533e5dSPau Pajuelo 	.dt1ioctl		= MT41K256M16HA125E_IOCTRL_VALUE,
13109533e5dSPau Pajuelo };
13209533e5dSPau Pajuelo 
13309533e5dSPau Pajuelo const struct ctrl_ioregs ioregs_igep0034_lite = {
13409533e5dSPau Pajuelo 	.cm0ioctl		= K4B2G1646EBIH9_IOCTRL_VALUE,
13509533e5dSPau Pajuelo 	.cm1ioctl		= K4B2G1646EBIH9_IOCTRL_VALUE,
13609533e5dSPau Pajuelo 	.cm2ioctl		= K4B2G1646EBIH9_IOCTRL_VALUE,
13709533e5dSPau Pajuelo 	.dt0ioctl		= K4B2G1646EBIH9_IOCTRL_VALUE,
13809533e5dSPau Pajuelo 	.dt1ioctl		= K4B2G1646EBIH9_IOCTRL_VALUE,
13909533e5dSPau Pajuelo };
14009533e5dSPau Pajuelo 
141a96c08f5SLadislav Michl #define OSC    (V_OSCK/1000000)
142a96c08f5SLadislav Michl const struct dpll_params dpll_ddr = {
143a96c08f5SLadislav Michl 		400, OSC-1, 1, -1, -1, -1, -1};
144a96c08f5SLadislav Michl 
get_dpll_ddr_params(void)145a96c08f5SLadislav Michl const struct dpll_params *get_dpll_ddr_params(void)
146a96c08f5SLadislav Michl {
147a96c08f5SLadislav Michl 	return &dpll_ddr;
148a96c08f5SLadislav Michl }
149a96c08f5SLadislav Michl 
set_uart_mux_conf(void)150a96c08f5SLadislav Michl void set_uart_mux_conf(void)
151a96c08f5SLadislav Michl {
152a96c08f5SLadislav Michl 	enable_uart0_pin_mux();
153a96c08f5SLadislav Michl }
154a96c08f5SLadislav Michl 
set_mux_conf_regs(void)155a96c08f5SLadislav Michl void set_mux_conf_regs(void)
156a96c08f5SLadislav Michl {
157a96c08f5SLadislav Michl 	enable_board_pin_mux();
158a96c08f5SLadislav Michl }
159a96c08f5SLadislav Michl 
sdram_init(void)160a96c08f5SLadislav Michl void sdram_init(void)
161a96c08f5SLadislav Michl {
16209533e5dSPau Pajuelo 	if (get_board_revision() == 1)
16309533e5dSPau Pajuelo 		config_ddr(400, &ioregs_igep0034, &ddr3_igep0034_data,
16409533e5dSPau Pajuelo 			&ddr3_igep0034_cmd_ctrl_data, &ddr3_igep0034_emif_reg_data, 0);
16509533e5dSPau Pajuelo 	else
16609533e5dSPau Pajuelo 		config_ddr(400, &ioregs_igep0034_lite, &ddr3_igep0034_lite_data,
16709533e5dSPau Pajuelo 			&ddr3_igep0034_lite_cmd_ctrl_data, &ddr3_igep0034_lite_emif_reg_data, 0);
168a96c08f5SLadislav Michl }
169ab3b7770SLadislav Michl 
170ab3b7770SLadislav Michl #ifdef CONFIG_SPL_OS_BOOT
spl_start_uboot(void)171ab3b7770SLadislav Michl int spl_start_uboot(void)
172ab3b7770SLadislav Michl {
173ab3b7770SLadislav Michl 	/* break into full u-boot on 'c' */
174ab3b7770SLadislav Michl 	return serial_tstc() && serial_getc() == 'c';
175ab3b7770SLadislav Michl }
176ab3b7770SLadislav Michl #endif
177a96c08f5SLadislav Michl #endif
178a96c08f5SLadislav Michl 
179a96c08f5SLadislav Michl /*
180a96c08f5SLadislav Michl  * Basic board specific setup.  Pinmux has been handled already.
181a96c08f5SLadislav Michl  */
board_init(void)182a96c08f5SLadislav Michl int board_init(void)
183a96c08f5SLadislav Michl {
184a96c08f5SLadislav Michl 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
185a96c08f5SLadislav Michl 
186a96c08f5SLadislav Michl 	gpmc_init();
187a96c08f5SLadislav Michl 
188a96c08f5SLadislav Michl 	return 0;
189a96c08f5SLadislav Michl }
190a96c08f5SLadislav Michl 
19109533e5dSPau Pajuelo #ifdef CONFIG_BOARD_LATE_INIT
board_late_init(void)19209533e5dSPau Pajuelo int board_late_init(void)
19309533e5dSPau Pajuelo {
19409533e5dSPau Pajuelo #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
19509533e5dSPau Pajuelo 	switch (get_board_revision()) {
19609533e5dSPau Pajuelo 		case 0:
197382bee57SSimon Glass 			env_set("board_name", "igep0034-lite");
19809533e5dSPau Pajuelo 			break;
19909533e5dSPau Pajuelo 		case 1:
200382bee57SSimon Glass 			env_set("board_name", "igep0034");
20109533e5dSPau Pajuelo 			break;
20209533e5dSPau Pajuelo 		default:
203382bee57SSimon Glass 			env_set("board_name", "igep0033");
20409533e5dSPau Pajuelo 			break;
20509533e5dSPau Pajuelo 	}
20609533e5dSPau Pajuelo #endif
20709533e5dSPau Pajuelo 	return 0;
20809533e5dSPau Pajuelo }
20909533e5dSPau Pajuelo #endif
21009533e5dSPau Pajuelo 
2113607e0f8SLadislav Michl #ifdef CONFIG_OF_BOARD_SETUP
ft_board_setup(void * blob,bd_t * bd)2123607e0f8SLadislav Michl int ft_board_setup(void *blob, bd_t *bd)
2133607e0f8SLadislav Michl {
2143607e0f8SLadislav Michl #ifdef CONFIG_FDT_FIXUP_PARTITIONS
2153607e0f8SLadislav Michl 	static struct node_info nodes[] = {
2163607e0f8SLadislav Michl 		{ "ti,omap2-nand", MTD_DEV_TYPE_NAND, },
2173607e0f8SLadislav Michl 	};
2183607e0f8SLadislav Michl 
2193607e0f8SLadislav Michl 	fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
2203607e0f8SLadislav Michl #endif
2213607e0f8SLadislav Michl 	return 0;
2223607e0f8SLadislav Michl }
2233607e0f8SLadislav Michl #endif
2243607e0f8SLadislav Michl 
225a96c08f5SLadislav Michl #if defined(CONFIG_DRIVER_TI_CPSW)
cpsw_control(int enabled)226a96c08f5SLadislav Michl static void cpsw_control(int enabled)
227a96c08f5SLadislav Michl {
228a96c08f5SLadislav Michl 	/* VTP can be added here */
229a96c08f5SLadislav Michl 
230a96c08f5SLadislav Michl 	return;
231a96c08f5SLadislav Michl }
232a96c08f5SLadislav Michl 
233a96c08f5SLadislav Michl static struct cpsw_slave_data cpsw_slaves[] = {
234a96c08f5SLadislav Michl 	{
235a96c08f5SLadislav Michl 		.slave_reg_ofs	= 0x208,
236a96c08f5SLadislav Michl 		.sliver_reg_ofs	= 0xd80,
237a96c08f5SLadislav Michl 		.phy_addr	= 0,
238a96c08f5SLadislav Michl 		.phy_if		= PHY_INTERFACE_MODE_RMII,
239a96c08f5SLadislav Michl 	},
240a96c08f5SLadislav Michl };
241a96c08f5SLadislav Michl 
242a96c08f5SLadislav Michl static struct cpsw_platform_data cpsw_data = {
243a96c08f5SLadislav Michl 	.mdio_base		= CPSW_MDIO_BASE,
244a96c08f5SLadislav Michl 	.cpsw_base		= CPSW_BASE,
245a96c08f5SLadislav Michl 	.mdio_div		= 0xff,
246a96c08f5SLadislav Michl 	.channels		= 8,
247a96c08f5SLadislav Michl 	.cpdma_reg_ofs		= 0x800,
248a96c08f5SLadislav Michl 	.slaves			= 1,
249a96c08f5SLadislav Michl 	.slave_data		= cpsw_slaves,
250a96c08f5SLadislav Michl 	.ale_reg_ofs		= 0xd00,
251a96c08f5SLadislav Michl 	.ale_entries		= 1024,
252a96c08f5SLadislav Michl 	.host_port_reg_ofs	= 0x108,
253a96c08f5SLadislav Michl 	.hw_stats_reg_ofs	= 0x900,
254a96c08f5SLadislav Michl 	.bd_ram_ofs		= 0x2000,
255a96c08f5SLadislav Michl 	.mac_control		= (1 << 5),
256a96c08f5SLadislav Michl 	.control		= cpsw_control,
257a96c08f5SLadislav Michl 	.host_port_num		= 0,
258a96c08f5SLadislav Michl 	.version		= CPSW_CTRL_VERSION_2,
259a96c08f5SLadislav Michl };
260a96c08f5SLadislav Michl 
board_eth_init(bd_t * bis)261a96c08f5SLadislav Michl int board_eth_init(bd_t *bis)
262a96c08f5SLadislav Michl {
263a96c08f5SLadislav Michl 	int rv, ret = 0;
264a96c08f5SLadislav Michl 	uint8_t mac_addr[6];
265a96c08f5SLadislav Michl 	uint32_t mac_hi, mac_lo;
266a96c08f5SLadislav Michl 
267*35affd7aSSimon Glass 	if (!eth_env_get_enetaddr("ethaddr", mac_addr)) {
268a96c08f5SLadislav Michl 		/* try reading mac address from efuse */
269a96c08f5SLadislav Michl 		mac_lo = readl(&cdev->macid0l);
270a96c08f5SLadislav Michl 		mac_hi = readl(&cdev->macid0h);
271a96c08f5SLadislav Michl 		mac_addr[0] = mac_hi & 0xFF;
272a96c08f5SLadislav Michl 		mac_addr[1] = (mac_hi & 0xFF00) >> 8;
273a96c08f5SLadislav Michl 		mac_addr[2] = (mac_hi & 0xFF0000) >> 16;
274a96c08f5SLadislav Michl 		mac_addr[3] = (mac_hi & 0xFF000000) >> 24;
275a96c08f5SLadislav Michl 		mac_addr[4] = mac_lo & 0xFF;
276a96c08f5SLadislav Michl 		mac_addr[5] = (mac_lo & 0xFF00) >> 8;
277a96c08f5SLadislav Michl 		if (is_valid_ethaddr(mac_addr))
278fd1e959eSSimon Glass 			eth_env_set_enetaddr("ethaddr", mac_addr);
279a96c08f5SLadislav Michl 	}
280a96c08f5SLadislav Michl 
281a96c08f5SLadislav Michl 	writel((GMII1_SEL_RMII | RMII1_IO_CLK_EN),
282a96c08f5SLadislav Michl 	       &cdev->miisel);
283a96c08f5SLadislav Michl 
28409533e5dSPau Pajuelo 	if (get_board_revision() == 1)
28509533e5dSPau Pajuelo 		cpsw_slaves[0].phy_addr = 1;
28609533e5dSPau Pajuelo 
287a96c08f5SLadislav Michl 	rv = cpsw_register(&cpsw_data);
288a96c08f5SLadislav Michl 	if (rv < 0)
289a96c08f5SLadislav Michl 		printf("Error %d registering CPSW switch\n", rv);
290a96c08f5SLadislav Michl 	else
291a96c08f5SLadislav Michl 		ret += rv;
292a96c08f5SLadislav Michl 
293a96c08f5SLadislav Michl 	return ret;
294a96c08f5SLadislav Michl }
295a96c08f5SLadislav Michl #endif
296