1b6036993SShaohui Xie /* Copyright 2014 Freescale Semiconductor, Inc.
2b6036993SShaohui Xie *
3b6036993SShaohui Xie * SPDX-License-Identifier: GPL-2.0+
4b6036993SShaohui Xie */
5b6036993SShaohui Xie
6b6036993SShaohui Xie #include <common.h>
724b852a7SSimon Glass #include <console.h>
8*203e94f6SSimon Glass #include <environment.h>
9b6036993SShaohui Xie #include <asm/spl.h>
10b6036993SShaohui Xie #include <malloc.h>
11b6036993SShaohui Xie #include <ns16550.h>
12b6036993SShaohui Xie #include <nand.h>
13b6036993SShaohui Xie #include <mmc.h>
14b6036993SShaohui Xie #include <fsl_esdhc.h>
15b6036993SShaohui Xie #include <i2c.h>
16b6036993SShaohui Xie #include "../common/qixis.h"
17b6036993SShaohui Xie #include "t4240qds_qixis.h"
18b6036993SShaohui Xie
19b6036993SShaohui Xie #define FSL_CORENET_CCSR_PORSR1_RCW_MASK 0xFF800000
20b6036993SShaohui Xie
21b6036993SShaohui Xie DECLARE_GLOBAL_DATA_PTR;
22b6036993SShaohui Xie
get_effective_memsize(void)23b6036993SShaohui Xie phys_size_t get_effective_memsize(void)
24b6036993SShaohui Xie {
25b6036993SShaohui Xie return CONFIG_SYS_L3_SIZE;
26b6036993SShaohui Xie }
27b6036993SShaohui Xie
get_board_sys_clk(void)28b6036993SShaohui Xie unsigned long get_board_sys_clk(void)
29b6036993SShaohui Xie {
30b6036993SShaohui Xie u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
31b6036993SShaohui Xie
32b6036993SShaohui Xie switch (sysclk_conf & 0x0F) {
33b6036993SShaohui Xie case QIXIS_SYSCLK_83:
34b6036993SShaohui Xie return 83333333;
35b6036993SShaohui Xie case QIXIS_SYSCLK_100:
36b6036993SShaohui Xie return 100000000;
37b6036993SShaohui Xie case QIXIS_SYSCLK_125:
38b6036993SShaohui Xie return 125000000;
39b6036993SShaohui Xie case QIXIS_SYSCLK_133:
40b6036993SShaohui Xie return 133333333;
41b6036993SShaohui Xie case QIXIS_SYSCLK_150:
42b6036993SShaohui Xie return 150000000;
43b6036993SShaohui Xie case QIXIS_SYSCLK_160:
44b6036993SShaohui Xie return 160000000;
45b6036993SShaohui Xie case QIXIS_SYSCLK_166:
46b6036993SShaohui Xie return 166666666;
47b6036993SShaohui Xie }
48b6036993SShaohui Xie return 66666666;
49b6036993SShaohui Xie }
50b6036993SShaohui Xie
get_board_ddr_clk(void)51b6036993SShaohui Xie unsigned long get_board_ddr_clk(void)
52b6036993SShaohui Xie {
53b6036993SShaohui Xie u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
54b6036993SShaohui Xie
55b6036993SShaohui Xie switch ((ddrclk_conf & 0x30) >> 4) {
56b6036993SShaohui Xie case QIXIS_DDRCLK_100:
57b6036993SShaohui Xie return 100000000;
58b6036993SShaohui Xie case QIXIS_DDRCLK_125:
59b6036993SShaohui Xie return 125000000;
60b6036993SShaohui Xie case QIXIS_DDRCLK_133:
61b6036993SShaohui Xie return 133333333;
62b6036993SShaohui Xie }
63b6036993SShaohui Xie return 66666666;
64b6036993SShaohui Xie }
65b6036993SShaohui Xie
board_init_f(ulong bootflag)66b6036993SShaohui Xie void board_init_f(ulong bootflag)
67b6036993SShaohui Xie {
68b6036993SShaohui Xie u32 plat_ratio, sys_clk, ccb_clk;
69b6036993SShaohui Xie ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
70b6036993SShaohui Xie #ifdef CONFIG_SPL_NAND_BOOT
71b6036993SShaohui Xie u32 porsr1, pinctl;
72b6036993SShaohui Xie #endif
73b6036993SShaohui Xie
74b6036993SShaohui Xie #ifdef CONFIG_SPL_NAND_BOOT
75b6036993SShaohui Xie porsr1 = in_be32(&gur->porsr1);
76b6036993SShaohui Xie pinctl = ((porsr1 & ~(FSL_CORENET_CCSR_PORSR1_RCW_MASK)) | 0x24800000);
77b6036993SShaohui Xie out_be32((unsigned int *)(CONFIG_SYS_DCSRBAR + 0x20000), pinctl);
78b6036993SShaohui Xie #endif
79b6036993SShaohui Xie /* Memcpy existing GD at CONFIG_SPL_GD_ADDR */
80b6036993SShaohui Xie memcpy((void *)CONFIG_SPL_GD_ADDR, (void *)gd, sizeof(gd_t));
81b6036993SShaohui Xie
82b6036993SShaohui Xie /* Update GD pointer */
83b6036993SShaohui Xie gd = (gd_t *)(CONFIG_SPL_GD_ADDR);
84b6036993SShaohui Xie
85b6036993SShaohui Xie /* compiler optimization barrier needed for GCC >= 3.4 */
86b6036993SShaohui Xie __asm__ __volatile__("" : : : "memory");
87b6036993SShaohui Xie
88b6036993SShaohui Xie console_init_f();
89b6036993SShaohui Xie
90b6036993SShaohui Xie /* initialize selected port with appropriate baud rate */
91b6036993SShaohui Xie sys_clk = get_board_sys_clk();
92b6036993SShaohui Xie plat_ratio = (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f;
93b6036993SShaohui Xie ccb_clk = sys_clk * plat_ratio / 2;
94b6036993SShaohui Xie
95b6036993SShaohui Xie NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1,
96b6036993SShaohui Xie ccb_clk / 16 / CONFIG_BAUDRATE);
97b6036993SShaohui Xie
98b6036993SShaohui Xie #ifdef CONFIG_SPL_MMC_BOOT
99b6036993SShaohui Xie puts("\nSD boot...\n");
100b6036993SShaohui Xie #elif defined(CONFIG_SPL_NAND_BOOT)
101b6036993SShaohui Xie puts("\nNAND boot...\n");
102b6036993SShaohui Xie #endif
103b6036993SShaohui Xie relocate_code(CONFIG_SPL_RELOC_STACK, (gd_t *)CONFIG_SPL_GD_ADDR, 0x0);
104b6036993SShaohui Xie }
105b6036993SShaohui Xie
board_init_r(gd_t * gd,ulong dest_addr)106b6036993SShaohui Xie void board_init_r(gd_t *gd, ulong dest_addr)
107b6036993SShaohui Xie {
108b6036993SShaohui Xie bd_t *bd;
109b6036993SShaohui Xie
110b6036993SShaohui Xie bd = (bd_t *)(gd + sizeof(gd_t));
111b6036993SShaohui Xie memset(bd, 0, sizeof(bd_t));
112b6036993SShaohui Xie gd->bd = bd;
113b6036993SShaohui Xie bd->bi_memstart = CONFIG_SYS_INIT_L3_ADDR;
114b6036993SShaohui Xie bd->bi_memsize = CONFIG_SYS_L3_SIZE;
115b6036993SShaohui Xie
116cbcbf71bSSimon Glass arch_cpu_init();
117b6036993SShaohui Xie get_clocks();
118b6036993SShaohui Xie mem_malloc_init(CONFIG_SPL_RELOC_MALLOC_ADDR,
119b6036993SShaohui Xie CONFIG_SPL_RELOC_MALLOC_SIZE);
120ed4708aaSSumit Garg gd->flags |= GD_FLG_FULL_MALLOC_INIT;
121b6036993SShaohui Xie
122b6036993SShaohui Xie #ifdef CONFIG_SPL_NAND_BOOT
123b6036993SShaohui Xie nand_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
124b6036993SShaohui Xie (uchar *)CONFIG_ENV_ADDR);
125b6036993SShaohui Xie #endif
126b6036993SShaohui Xie #ifdef CONFIG_SPL_MMC_BOOT
127b6036993SShaohui Xie mmc_initialize(bd);
128b6036993SShaohui Xie mmc_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
129b6036993SShaohui Xie (uchar *)CONFIG_ENV_ADDR);
130b6036993SShaohui Xie #endif
131b6036993SShaohui Xie
132b6036993SShaohui Xie gd->env_addr = (ulong)(CONFIG_ENV_ADDR);
133*203e94f6SSimon Glass gd->env_valid = ENV_VALID;
134b6036993SShaohui Xie
135b6036993SShaohui Xie i2c_init_all();
136b6036993SShaohui Xie
137f1683aa7SSimon Glass dram_init();
138b6036993SShaohui Xie
139b6036993SShaohui Xie #ifdef CONFIG_SPL_MMC_BOOT
140b6036993SShaohui Xie mmc_boot();
141b6036993SShaohui Xie #elif defined(CONFIG_SPL_NAND_BOOT)
142b6036993SShaohui Xie nand_boot();
143b6036993SShaohui Xie #endif
144b6036993SShaohui Xie }
145