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