1c5dfe6ecSPrabhakar Kushwaha /* Copyright 2013 Freescale Semiconductor, Inc.
2c5dfe6ecSPrabhakar Kushwaha *
3c5dfe6ecSPrabhakar Kushwaha * SPDX-License-Identifier: GPL-2.0+
4c5dfe6ecSPrabhakar Kushwaha */
5c5dfe6ecSPrabhakar Kushwaha
6c5dfe6ecSPrabhakar Kushwaha #include <common.h>
724b852a7SSimon Glass #include <console.h>
8*203e94f6SSimon Glass #include <environment.h>
9c5dfe6ecSPrabhakar Kushwaha #include <asm/spl.h>
10c5dfe6ecSPrabhakar Kushwaha #include <malloc.h>
11c5dfe6ecSPrabhakar Kushwaha #include <ns16550.h>
12c5dfe6ecSPrabhakar Kushwaha #include <nand.h>
13c5dfe6ecSPrabhakar Kushwaha #include <i2c.h>
14c5dfe6ecSPrabhakar Kushwaha #include "../common/qixis.h"
15c5dfe6ecSPrabhakar Kushwaha #include "b4860qds_qixis.h"
16c5dfe6ecSPrabhakar Kushwaha
17c5dfe6ecSPrabhakar Kushwaha DECLARE_GLOBAL_DATA_PTR;
18c5dfe6ecSPrabhakar Kushwaha
get_effective_memsize(void)19c5dfe6ecSPrabhakar Kushwaha phys_size_t get_effective_memsize(void)
20c5dfe6ecSPrabhakar Kushwaha {
21c5dfe6ecSPrabhakar Kushwaha return CONFIG_SYS_L3_SIZE;
22c5dfe6ecSPrabhakar Kushwaha }
23c5dfe6ecSPrabhakar Kushwaha
get_board_sys_clk(void)24c5dfe6ecSPrabhakar Kushwaha unsigned long get_board_sys_clk(void)
25c5dfe6ecSPrabhakar Kushwaha {
26c5dfe6ecSPrabhakar Kushwaha u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
27c5dfe6ecSPrabhakar Kushwaha
28c5dfe6ecSPrabhakar Kushwaha switch ((sysclk_conf & 0x0C) >> 2) {
29c5dfe6ecSPrabhakar Kushwaha case QIXIS_CLK_100:
30c5dfe6ecSPrabhakar Kushwaha return 100000000;
31c5dfe6ecSPrabhakar Kushwaha case QIXIS_CLK_125:
32c5dfe6ecSPrabhakar Kushwaha return 125000000;
33c5dfe6ecSPrabhakar Kushwaha case QIXIS_CLK_133:
34c5dfe6ecSPrabhakar Kushwaha return 133333333;
35c5dfe6ecSPrabhakar Kushwaha }
36c5dfe6ecSPrabhakar Kushwaha return 66666666;
37c5dfe6ecSPrabhakar Kushwaha }
38c5dfe6ecSPrabhakar Kushwaha
get_board_ddr_clk(void)39c5dfe6ecSPrabhakar Kushwaha unsigned long get_board_ddr_clk(void)
40c5dfe6ecSPrabhakar Kushwaha {
41c5dfe6ecSPrabhakar Kushwaha u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
42c5dfe6ecSPrabhakar Kushwaha
43c5dfe6ecSPrabhakar Kushwaha switch (ddrclk_conf & 0x03) {
44c5dfe6ecSPrabhakar Kushwaha case QIXIS_CLK_100:
45c5dfe6ecSPrabhakar Kushwaha return 100000000;
46c5dfe6ecSPrabhakar Kushwaha case QIXIS_CLK_125:
47c5dfe6ecSPrabhakar Kushwaha return 125000000;
48c5dfe6ecSPrabhakar Kushwaha case QIXIS_CLK_133:
49c5dfe6ecSPrabhakar Kushwaha return 133333333;
50c5dfe6ecSPrabhakar Kushwaha }
51c5dfe6ecSPrabhakar Kushwaha return 66666666;
52c5dfe6ecSPrabhakar Kushwaha }
53c5dfe6ecSPrabhakar Kushwaha
board_init_f(ulong bootflag)54c5dfe6ecSPrabhakar Kushwaha void board_init_f(ulong bootflag)
55c5dfe6ecSPrabhakar Kushwaha {
56c5dfe6ecSPrabhakar Kushwaha u32 plat_ratio, sys_clk, uart_clk;
57c5dfe6ecSPrabhakar Kushwaha ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
58c5dfe6ecSPrabhakar Kushwaha
59c5dfe6ecSPrabhakar Kushwaha /* Memcpy existing GD at CONFIG_SPL_GD_ADDR */
60c5dfe6ecSPrabhakar Kushwaha memcpy((void *)CONFIG_SPL_GD_ADDR, (void *)gd, sizeof(gd_t));
61c5dfe6ecSPrabhakar Kushwaha
62c5dfe6ecSPrabhakar Kushwaha /* Update GD pointer */
63c5dfe6ecSPrabhakar Kushwaha gd = (gd_t *)(CONFIG_SPL_GD_ADDR);
64c5dfe6ecSPrabhakar Kushwaha
65c5dfe6ecSPrabhakar Kushwaha /* compiler optimization barrier needed for GCC >= 3.4 */
66c5dfe6ecSPrabhakar Kushwaha __asm__ __volatile__("" : : : "memory");
67c5dfe6ecSPrabhakar Kushwaha
68c5dfe6ecSPrabhakar Kushwaha console_init_f();
69c5dfe6ecSPrabhakar Kushwaha
70c5dfe6ecSPrabhakar Kushwaha /* initialize selected port with appropriate baud rate */
71c5dfe6ecSPrabhakar Kushwaha sys_clk = get_board_sys_clk();
72c5dfe6ecSPrabhakar Kushwaha plat_ratio = (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f;
73c5dfe6ecSPrabhakar Kushwaha uart_clk = sys_clk * plat_ratio / 2;
74c5dfe6ecSPrabhakar Kushwaha
75c5dfe6ecSPrabhakar Kushwaha NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1,
76c5dfe6ecSPrabhakar Kushwaha uart_clk / 16 / CONFIG_BAUDRATE);
77c5dfe6ecSPrabhakar Kushwaha
78c5dfe6ecSPrabhakar Kushwaha relocate_code(CONFIG_SPL_RELOC_STACK, (gd_t *)CONFIG_SPL_GD_ADDR, 0x0);
79c5dfe6ecSPrabhakar Kushwaha }
80c5dfe6ecSPrabhakar Kushwaha
board_init_r(gd_t * gd,ulong dest_addr)81c5dfe6ecSPrabhakar Kushwaha void board_init_r(gd_t *gd, ulong dest_addr)
82c5dfe6ecSPrabhakar Kushwaha {
83c5dfe6ecSPrabhakar Kushwaha bd_t *bd;
84c5dfe6ecSPrabhakar Kushwaha
85c5dfe6ecSPrabhakar Kushwaha bd = (bd_t *)(gd + sizeof(gd_t));
86c5dfe6ecSPrabhakar Kushwaha memset(bd, 0, sizeof(bd_t));
87c5dfe6ecSPrabhakar Kushwaha gd->bd = bd;
88c5dfe6ecSPrabhakar Kushwaha bd->bi_memstart = CONFIG_SYS_INIT_L3_ADDR;
89c5dfe6ecSPrabhakar Kushwaha bd->bi_memsize = CONFIG_SYS_L3_SIZE;
90c5dfe6ecSPrabhakar Kushwaha
91cbcbf71bSSimon Glass arch_cpu_init();
92c5dfe6ecSPrabhakar Kushwaha get_clocks();
93c5dfe6ecSPrabhakar Kushwaha mem_malloc_init(CONFIG_SPL_RELOC_MALLOC_ADDR,
94c5dfe6ecSPrabhakar Kushwaha CONFIG_SPL_RELOC_MALLOC_SIZE);
95ed4708aaSSumit Garg gd->flags |= GD_FLG_FULL_MALLOC_INIT;
96c5dfe6ecSPrabhakar Kushwaha
97c5dfe6ecSPrabhakar Kushwaha #ifndef CONFIG_SPL_NAND_BOOT
98c5dfe6ecSPrabhakar Kushwaha env_init();
99c5dfe6ecSPrabhakar Kushwaha env_relocate();
100c5dfe6ecSPrabhakar Kushwaha #else
101c5dfe6ecSPrabhakar Kushwaha /* relocate environment function pointers etc. */
102c5dfe6ecSPrabhakar Kushwaha nand_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
103c5dfe6ecSPrabhakar Kushwaha (uchar *)CONFIG_ENV_ADDR);
104c5dfe6ecSPrabhakar Kushwaha gd->env_addr = (ulong)(CONFIG_ENV_ADDR);
105*203e94f6SSimon Glass gd->env_valid = ENV_VALID;
106c5dfe6ecSPrabhakar Kushwaha #endif
107c5dfe6ecSPrabhakar Kushwaha
108c5dfe6ecSPrabhakar Kushwaha i2c_init_all();
109c5dfe6ecSPrabhakar Kushwaha
110c5dfe6ecSPrabhakar Kushwaha puts("\n\n");
111c5dfe6ecSPrabhakar Kushwaha
112f1683aa7SSimon Glass dram_init();
113c5dfe6ecSPrabhakar Kushwaha
114c5dfe6ecSPrabhakar Kushwaha #ifdef CONFIG_SPL_NAND_BOOT
115c5dfe6ecSPrabhakar Kushwaha nand_boot();
116c5dfe6ecSPrabhakar Kushwaha #endif
117c5dfe6ecSPrabhakar Kushwaha }
118