xref: /rk3399_rockchip-uboot/board/freescale/b4860qds/spl.c (revision 203e94f6c9ca03e260175ce240f5856507395585)
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