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