xref: /OK3568_Linux_fs/u-boot/board/wandboard/spl.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2014 Wandboard
3*4882a593Smuzhiyun  * Author: Tungyi Lin <tungyilin1127@gmail.com>
4*4882a593Smuzhiyun  *         Richard Hu <hakahu@gmail.com>
5*4882a593Smuzhiyun  * SPDX-License-Identifier:     GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <asm/arch/clock.h>
9*4882a593Smuzhiyun #include <asm/arch/imx-regs.h>
10*4882a593Smuzhiyun #include <asm/arch/iomux.h>
11*4882a593Smuzhiyun #include <asm/arch/mx6-pins.h>
12*4882a593Smuzhiyun #include <linux/errno.h>
13*4882a593Smuzhiyun #include <asm/gpio.h>
14*4882a593Smuzhiyun #include <asm/mach-imx/iomux-v3.h>
15*4882a593Smuzhiyun #include <asm/mach-imx/video.h>
16*4882a593Smuzhiyun #include <mmc.h>
17*4882a593Smuzhiyun #include <fsl_esdhc.h>
18*4882a593Smuzhiyun #include <asm/arch/crm_regs.h>
19*4882a593Smuzhiyun #include <asm/io.h>
20*4882a593Smuzhiyun #include <asm/arch/sys_proto.h>
21*4882a593Smuzhiyun #include <spl.h>
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #if defined(CONFIG_SPL_BUILD)
26*4882a593Smuzhiyun #include <asm/arch/mx6-ddr.h>
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun  * Driving strength:
29*4882a593Smuzhiyun  *   0x30 == 40 Ohm
30*4882a593Smuzhiyun  *   0x28 == 48 Ohm
31*4882a593Smuzhiyun  */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define IMX6DQ_DRIVE_STRENGTH		0x30
34*4882a593Smuzhiyun #define IMX6SDL_DRIVE_STRENGTH		0x28
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* configure MX6Q/DUAL mmdc DDR io registers */
37*4882a593Smuzhiyun static struct mx6dq_iomux_ddr_regs mx6dq_ddr_ioregs = {
38*4882a593Smuzhiyun 	.dram_sdclk_0 = IMX6DQ_DRIVE_STRENGTH,
39*4882a593Smuzhiyun 	.dram_sdclk_1 = IMX6DQ_DRIVE_STRENGTH,
40*4882a593Smuzhiyun 	.dram_cas = IMX6DQ_DRIVE_STRENGTH,
41*4882a593Smuzhiyun 	.dram_ras = IMX6DQ_DRIVE_STRENGTH,
42*4882a593Smuzhiyun 	.dram_reset = IMX6DQ_DRIVE_STRENGTH,
43*4882a593Smuzhiyun 	.dram_sdcke0 = IMX6DQ_DRIVE_STRENGTH,
44*4882a593Smuzhiyun 	.dram_sdcke1 = IMX6DQ_DRIVE_STRENGTH,
45*4882a593Smuzhiyun 	.dram_sdba2 = 0x00000000,
46*4882a593Smuzhiyun 	.dram_sdodt0 = IMX6DQ_DRIVE_STRENGTH,
47*4882a593Smuzhiyun 	.dram_sdodt1 = IMX6DQ_DRIVE_STRENGTH,
48*4882a593Smuzhiyun 	.dram_sdqs0 = IMX6DQ_DRIVE_STRENGTH,
49*4882a593Smuzhiyun 	.dram_sdqs1 = IMX6DQ_DRIVE_STRENGTH,
50*4882a593Smuzhiyun 	.dram_sdqs2 = IMX6DQ_DRIVE_STRENGTH,
51*4882a593Smuzhiyun 	.dram_sdqs3 = IMX6DQ_DRIVE_STRENGTH,
52*4882a593Smuzhiyun 	.dram_sdqs4 = IMX6DQ_DRIVE_STRENGTH,
53*4882a593Smuzhiyun 	.dram_sdqs5 = IMX6DQ_DRIVE_STRENGTH,
54*4882a593Smuzhiyun 	.dram_sdqs6 = IMX6DQ_DRIVE_STRENGTH,
55*4882a593Smuzhiyun 	.dram_sdqs7 = IMX6DQ_DRIVE_STRENGTH,
56*4882a593Smuzhiyun 	.dram_dqm0 = IMX6DQ_DRIVE_STRENGTH,
57*4882a593Smuzhiyun 	.dram_dqm1 = IMX6DQ_DRIVE_STRENGTH,
58*4882a593Smuzhiyun 	.dram_dqm2 = IMX6DQ_DRIVE_STRENGTH,
59*4882a593Smuzhiyun 	.dram_dqm3 = IMX6DQ_DRIVE_STRENGTH,
60*4882a593Smuzhiyun 	.dram_dqm4 = IMX6DQ_DRIVE_STRENGTH,
61*4882a593Smuzhiyun 	.dram_dqm5 = IMX6DQ_DRIVE_STRENGTH,
62*4882a593Smuzhiyun 	.dram_dqm6 = IMX6DQ_DRIVE_STRENGTH,
63*4882a593Smuzhiyun 	.dram_dqm7 = IMX6DQ_DRIVE_STRENGTH,
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* configure MX6Q/DUAL mmdc GRP io registers */
67*4882a593Smuzhiyun static struct mx6dq_iomux_grp_regs mx6dq_grp_ioregs = {
68*4882a593Smuzhiyun 	.grp_ddr_type = 0x000c0000,
69*4882a593Smuzhiyun 	.grp_ddrmode_ctl = 0x00020000,
70*4882a593Smuzhiyun 	.grp_ddrpke = 0x00000000,
71*4882a593Smuzhiyun 	.grp_addds = IMX6DQ_DRIVE_STRENGTH,
72*4882a593Smuzhiyun 	.grp_ctlds = IMX6DQ_DRIVE_STRENGTH,
73*4882a593Smuzhiyun 	.grp_ddrmode = 0x00020000,
74*4882a593Smuzhiyun 	.grp_b0ds = IMX6DQ_DRIVE_STRENGTH,
75*4882a593Smuzhiyun 	.grp_b1ds = IMX6DQ_DRIVE_STRENGTH,
76*4882a593Smuzhiyun 	.grp_b2ds = IMX6DQ_DRIVE_STRENGTH,
77*4882a593Smuzhiyun 	.grp_b3ds = IMX6DQ_DRIVE_STRENGTH,
78*4882a593Smuzhiyun 	.grp_b4ds = IMX6DQ_DRIVE_STRENGTH,
79*4882a593Smuzhiyun 	.grp_b5ds = IMX6DQ_DRIVE_STRENGTH,
80*4882a593Smuzhiyun 	.grp_b6ds = IMX6DQ_DRIVE_STRENGTH,
81*4882a593Smuzhiyun 	.grp_b7ds = IMX6DQ_DRIVE_STRENGTH,
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* configure MX6SOLO/DUALLITE mmdc DDR io registers */
85*4882a593Smuzhiyun struct mx6sdl_iomux_ddr_regs mx6sdl_ddr_ioregs = {
86*4882a593Smuzhiyun 	.dram_sdclk_0 = IMX6SDL_DRIVE_STRENGTH,
87*4882a593Smuzhiyun 	.dram_sdclk_1 = IMX6SDL_DRIVE_STRENGTH,
88*4882a593Smuzhiyun 	.dram_cas = IMX6SDL_DRIVE_STRENGTH,
89*4882a593Smuzhiyun 	.dram_ras = IMX6SDL_DRIVE_STRENGTH,
90*4882a593Smuzhiyun 	.dram_reset = IMX6SDL_DRIVE_STRENGTH,
91*4882a593Smuzhiyun 	.dram_sdcke0 = IMX6SDL_DRIVE_STRENGTH,
92*4882a593Smuzhiyun 	.dram_sdcke1 = IMX6SDL_DRIVE_STRENGTH,
93*4882a593Smuzhiyun 	.dram_sdba2 = 0x00000000,
94*4882a593Smuzhiyun 	.dram_sdodt0 = IMX6SDL_DRIVE_STRENGTH,
95*4882a593Smuzhiyun 	.dram_sdodt1 = IMX6SDL_DRIVE_STRENGTH,
96*4882a593Smuzhiyun 	.dram_sdqs0 = IMX6SDL_DRIVE_STRENGTH,
97*4882a593Smuzhiyun 	.dram_sdqs1 = IMX6SDL_DRIVE_STRENGTH,
98*4882a593Smuzhiyun 	.dram_sdqs2 = IMX6SDL_DRIVE_STRENGTH,
99*4882a593Smuzhiyun 	.dram_sdqs3 = IMX6SDL_DRIVE_STRENGTH,
100*4882a593Smuzhiyun 	.dram_sdqs4 = IMX6SDL_DRIVE_STRENGTH,
101*4882a593Smuzhiyun 	.dram_sdqs5 = IMX6SDL_DRIVE_STRENGTH,
102*4882a593Smuzhiyun 	.dram_sdqs6 = IMX6SDL_DRIVE_STRENGTH,
103*4882a593Smuzhiyun 	.dram_sdqs7 = IMX6SDL_DRIVE_STRENGTH,
104*4882a593Smuzhiyun 	.dram_dqm0 = IMX6SDL_DRIVE_STRENGTH,
105*4882a593Smuzhiyun 	.dram_dqm1 = IMX6SDL_DRIVE_STRENGTH,
106*4882a593Smuzhiyun 	.dram_dqm2 = IMX6SDL_DRIVE_STRENGTH,
107*4882a593Smuzhiyun 	.dram_dqm3 = IMX6SDL_DRIVE_STRENGTH,
108*4882a593Smuzhiyun 	.dram_dqm4 = IMX6SDL_DRIVE_STRENGTH,
109*4882a593Smuzhiyun 	.dram_dqm5 = IMX6SDL_DRIVE_STRENGTH,
110*4882a593Smuzhiyun 	.dram_dqm6 = IMX6SDL_DRIVE_STRENGTH,
111*4882a593Smuzhiyun 	.dram_dqm7 = IMX6SDL_DRIVE_STRENGTH,
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /* configure MX6SOLO/DUALLITE mmdc GRP io registers */
115*4882a593Smuzhiyun struct mx6sdl_iomux_grp_regs mx6sdl_grp_ioregs = {
116*4882a593Smuzhiyun 	.grp_ddr_type = 0x000c0000,
117*4882a593Smuzhiyun 	.grp_ddrmode_ctl = 0x00020000,
118*4882a593Smuzhiyun 	.grp_ddrpke = 0x00000000,
119*4882a593Smuzhiyun 	.grp_addds = IMX6SDL_DRIVE_STRENGTH,
120*4882a593Smuzhiyun 	.grp_ctlds = IMX6SDL_DRIVE_STRENGTH,
121*4882a593Smuzhiyun 	.grp_ddrmode = 0x00020000,
122*4882a593Smuzhiyun 	.grp_b0ds = IMX6SDL_DRIVE_STRENGTH,
123*4882a593Smuzhiyun 	.grp_b1ds = IMX6SDL_DRIVE_STRENGTH,
124*4882a593Smuzhiyun 	.grp_b2ds = IMX6SDL_DRIVE_STRENGTH,
125*4882a593Smuzhiyun 	.grp_b3ds = IMX6SDL_DRIVE_STRENGTH,
126*4882a593Smuzhiyun 	.grp_b4ds = IMX6SDL_DRIVE_STRENGTH,
127*4882a593Smuzhiyun 	.grp_b5ds = IMX6SDL_DRIVE_STRENGTH,
128*4882a593Smuzhiyun 	.grp_b6ds = IMX6SDL_DRIVE_STRENGTH,
129*4882a593Smuzhiyun 	.grp_b7ds = IMX6SDL_DRIVE_STRENGTH,
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /* H5T04G63AFR-PB */
133*4882a593Smuzhiyun static struct mx6_ddr3_cfg h5t04g63afr = {
134*4882a593Smuzhiyun 	.mem_speed = 1600,
135*4882a593Smuzhiyun 	.density = 4,
136*4882a593Smuzhiyun 	.width = 16,
137*4882a593Smuzhiyun 	.banks = 8,
138*4882a593Smuzhiyun 	.rowaddr = 15,
139*4882a593Smuzhiyun 	.coladdr = 10,
140*4882a593Smuzhiyun 	.pagesz = 2,
141*4882a593Smuzhiyun 	.trcd = 1375,
142*4882a593Smuzhiyun 	.trcmin = 4875,
143*4882a593Smuzhiyun 	.trasmin = 3500,
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* H5TQ2G63DFR-H9 */
147*4882a593Smuzhiyun static struct mx6_ddr3_cfg h5tq2g63dfr = {
148*4882a593Smuzhiyun 	.mem_speed = 1333,
149*4882a593Smuzhiyun 	.density = 2,
150*4882a593Smuzhiyun 	.width = 16,
151*4882a593Smuzhiyun 	.banks = 8,
152*4882a593Smuzhiyun 	.rowaddr = 14,
153*4882a593Smuzhiyun 	.coladdr = 10,
154*4882a593Smuzhiyun 	.pagesz = 2,
155*4882a593Smuzhiyun 	.trcd = 1350,
156*4882a593Smuzhiyun 	.trcmin = 4950,
157*4882a593Smuzhiyun 	.trasmin = 3600,
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun static struct mx6_mmdc_calibration mx6q_2g_mmdc_calib = {
161*4882a593Smuzhiyun 	.p0_mpwldectrl0 = 0x001f001f,
162*4882a593Smuzhiyun 	.p0_mpwldectrl1 = 0x001f001f,
163*4882a593Smuzhiyun 	.p1_mpwldectrl0 = 0x001f001f,
164*4882a593Smuzhiyun 	.p1_mpwldectrl1 = 0x001f001f,
165*4882a593Smuzhiyun 	.p0_mpdgctrl0 = 0x4301030d,
166*4882a593Smuzhiyun 	.p0_mpdgctrl1 = 0x03020277,
167*4882a593Smuzhiyun 	.p1_mpdgctrl0 = 0x4300030a,
168*4882a593Smuzhiyun 	.p1_mpdgctrl1 = 0x02780248,
169*4882a593Smuzhiyun 	.p0_mprddlctl = 0x4536393b,
170*4882a593Smuzhiyun 	.p1_mprddlctl = 0x36353441,
171*4882a593Smuzhiyun 	.p0_mpwrdlctl = 0x41414743,
172*4882a593Smuzhiyun 	.p1_mpwrdlctl = 0x462f453f,
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun /* DDR 64bit 2GB */
176*4882a593Smuzhiyun static struct mx6_ddr_sysinfo mem_q = {
177*4882a593Smuzhiyun 	.dsize		= 2,
178*4882a593Smuzhiyun 	.cs1_mirror	= 0,
179*4882a593Smuzhiyun 	/* config for full 4GB range so that get_mem_size() works */
180*4882a593Smuzhiyun 	.cs_density	= 32,
181*4882a593Smuzhiyun 	.ncs		= 1,
182*4882a593Smuzhiyun 	.bi_on		= 1,
183*4882a593Smuzhiyun 	.rtt_nom	= 1,
184*4882a593Smuzhiyun 	.rtt_wr		= 0,
185*4882a593Smuzhiyun 	.ralat		= 5,
186*4882a593Smuzhiyun 	.walat		= 0,
187*4882a593Smuzhiyun 	.mif3_mode	= 3,
188*4882a593Smuzhiyun 	.rst_to_cke	= 0x23,
189*4882a593Smuzhiyun 	.sde_to_rst	= 0x10,
190*4882a593Smuzhiyun 	.refsel = 1,	/* Refresh cycles at 32KHz */
191*4882a593Smuzhiyun 	.refr = 3,	/* 4 refresh commands per refresh cycle */
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun static struct mx6_mmdc_calibration mx6dl_1g_mmdc_calib = {
195*4882a593Smuzhiyun 	.p0_mpwldectrl0 = 0x001f001f,
196*4882a593Smuzhiyun 	.p0_mpwldectrl1 = 0x001f001f,
197*4882a593Smuzhiyun 	.p1_mpwldectrl0 = 0x001f001f,
198*4882a593Smuzhiyun 	.p1_mpwldectrl1 = 0x001f001f,
199*4882a593Smuzhiyun 	.p0_mpdgctrl0 = 0x420e020e,
200*4882a593Smuzhiyun 	.p0_mpdgctrl1 = 0x02000200,
201*4882a593Smuzhiyun 	.p1_mpdgctrl0 = 0x42020202,
202*4882a593Smuzhiyun 	.p1_mpdgctrl1 = 0x01720172,
203*4882a593Smuzhiyun 	.p0_mprddlctl = 0x494c4f4c,
204*4882a593Smuzhiyun 	.p1_mprddlctl = 0x4a4c4c49,
205*4882a593Smuzhiyun 	.p0_mpwrdlctl = 0x3f3f3133,
206*4882a593Smuzhiyun 	.p1_mpwrdlctl = 0x39373f2e,
207*4882a593Smuzhiyun };
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun static struct mx6_mmdc_calibration mx6s_512m_mmdc_calib = {
210*4882a593Smuzhiyun 	.p0_mpwldectrl0 = 0x0040003c,
211*4882a593Smuzhiyun 	.p0_mpwldectrl1 = 0x0032003e,
212*4882a593Smuzhiyun 	.p0_mpdgctrl0 = 0x42350231,
213*4882a593Smuzhiyun 	.p0_mpdgctrl1 = 0x021a0218,
214*4882a593Smuzhiyun 	.p0_mprddlctl = 0x4b4b4e49,
215*4882a593Smuzhiyun 	.p0_mpwrdlctl = 0x3f3f3035,
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun /* DDR 64bit 1GB */
219*4882a593Smuzhiyun static struct mx6_ddr_sysinfo mem_dl = {
220*4882a593Smuzhiyun 	.dsize		= 2,
221*4882a593Smuzhiyun 	.cs1_mirror	= 0,
222*4882a593Smuzhiyun 	/* config for full 4GB range so that get_mem_size() works */
223*4882a593Smuzhiyun 	.cs_density	= 32,
224*4882a593Smuzhiyun 	.ncs		= 1,
225*4882a593Smuzhiyun 	.bi_on		= 1,
226*4882a593Smuzhiyun 	.rtt_nom	= 1,
227*4882a593Smuzhiyun 	.rtt_wr		= 0,
228*4882a593Smuzhiyun 	.ralat		= 5,
229*4882a593Smuzhiyun 	.walat		= 0,
230*4882a593Smuzhiyun 	.mif3_mode	= 3,
231*4882a593Smuzhiyun 	.rst_to_cke	= 0x23,
232*4882a593Smuzhiyun 	.sde_to_rst	= 0x10,
233*4882a593Smuzhiyun 	.refsel = 1,	/* Refresh cycles at 32KHz */
234*4882a593Smuzhiyun 	.refr = 3,	/* 4 refresh commands per refresh cycle */
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /* DDR 32bit 512MB */
238*4882a593Smuzhiyun static struct mx6_ddr_sysinfo mem_s = {
239*4882a593Smuzhiyun 	.dsize		= 1,
240*4882a593Smuzhiyun 	.cs1_mirror	= 0,
241*4882a593Smuzhiyun 	/* config for full 4GB range so that get_mem_size() works */
242*4882a593Smuzhiyun 	.cs_density	= 32,
243*4882a593Smuzhiyun 	.ncs		= 1,
244*4882a593Smuzhiyun 	.bi_on		= 1,
245*4882a593Smuzhiyun 	.rtt_nom	= 1,
246*4882a593Smuzhiyun 	.rtt_wr		= 0,
247*4882a593Smuzhiyun 	.ralat		= 5,
248*4882a593Smuzhiyun 	.walat		= 0,
249*4882a593Smuzhiyun 	.mif3_mode	= 3,
250*4882a593Smuzhiyun 	.rst_to_cke	= 0x23,
251*4882a593Smuzhiyun 	.sde_to_rst	= 0x10,
252*4882a593Smuzhiyun 	.refsel = 1,	/* Refresh cycles at 32KHz */
253*4882a593Smuzhiyun 	.refr = 3,	/* 4 refresh commands per refresh cycle */
254*4882a593Smuzhiyun };
255*4882a593Smuzhiyun 
ccgr_init(void)256*4882a593Smuzhiyun static void ccgr_init(void)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun 	struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	writel(0x00C03F3F, &ccm->CCGR0);
261*4882a593Smuzhiyun 	writel(0x0030FC03, &ccm->CCGR1);
262*4882a593Smuzhiyun 	writel(0x0FFFC000, &ccm->CCGR2);
263*4882a593Smuzhiyun 	writel(0x3FF00000, &ccm->CCGR3);
264*4882a593Smuzhiyun 	writel(0x00FFF300, &ccm->CCGR4);
265*4882a593Smuzhiyun 	writel(0x0F0000C3, &ccm->CCGR5);
266*4882a593Smuzhiyun 	writel(0x000003FF, &ccm->CCGR6);
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
spl_dram_init(void)269*4882a593Smuzhiyun static void spl_dram_init(void)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun 	if (is_cpu_type(MXC_CPU_MX6SOLO)) {
272*4882a593Smuzhiyun 		mx6sdl_dram_iocfg(32, &mx6sdl_ddr_ioregs, &mx6sdl_grp_ioregs);
273*4882a593Smuzhiyun 		mx6_dram_cfg(&mem_s, &mx6s_512m_mmdc_calib, &h5tq2g63dfr);
274*4882a593Smuzhiyun 	} else if (is_cpu_type(MXC_CPU_MX6DL)) {
275*4882a593Smuzhiyun 		mx6sdl_dram_iocfg(64, &mx6sdl_ddr_ioregs, &mx6sdl_grp_ioregs);
276*4882a593Smuzhiyun 		mx6_dram_cfg(&mem_dl, &mx6dl_1g_mmdc_calib, &h5tq2g63dfr);
277*4882a593Smuzhiyun 	} else if (is_cpu_type(MXC_CPU_MX6Q)) {
278*4882a593Smuzhiyun 		mx6dq_dram_iocfg(64, &mx6dq_ddr_ioregs, &mx6dq_grp_ioregs);
279*4882a593Smuzhiyun 		mx6_dram_cfg(&mem_q, &mx6q_2g_mmdc_calib, &h5t04g63afr);
280*4882a593Smuzhiyun 	}
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun 
board_init_f(ulong dummy)283*4882a593Smuzhiyun void board_init_f(ulong dummy)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun 	ccgr_init();
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	/* setup AIPS and disable watchdog */
288*4882a593Smuzhiyun 	arch_cpu_init();
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	gpr_init();
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	/* iomux */
293*4882a593Smuzhiyun 	board_early_init_f();
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 	/* setup GP timer */
296*4882a593Smuzhiyun 	timer_init();
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	/* UART clocks enabled and gd valid - init serial console */
299*4882a593Smuzhiyun 	preloader_console_init();
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 	/* DDR initialization */
302*4882a593Smuzhiyun 	spl_dram_init();
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	/* Clear the BSS. */
305*4882a593Smuzhiyun 	memset(__bss_start, 0, __bss_end - __bss_start);
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	/* load/boot image from boot device */
308*4882a593Smuzhiyun 	board_init_r(NULL, 0);
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun #endif
311