xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-imx/mx5/lowlevel_init.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * (C) Copyright 2009 Freescale Semiconductor, Inc.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0+
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun#include <config.h>
10*4882a593Smuzhiyun#include <asm/arch/imx-regs.h>
11*4882a593Smuzhiyun#include <generated/asm-offsets.h>
12*4882a593Smuzhiyun#include <linux/linkage.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun.section ".text.init", "x"
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun.macro init_arm_erratum
17*4882a593Smuzhiyun	/* ARM erratum ID #468414 */
18*4882a593Smuzhiyun	mrc 15, 0, r1, c1, c0, 1
19*4882a593Smuzhiyun	orr r1, r1, #(1 << 5)    /* enable L1NEON bit */
20*4882a593Smuzhiyun	mcr 15, 0, r1, c1, c0, 1
21*4882a593Smuzhiyun.endm
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun/*
24*4882a593Smuzhiyun * L2CC Cache setup/invalidation/disable
25*4882a593Smuzhiyun */
26*4882a593Smuzhiyun.macro init_l2cc
27*4882a593Smuzhiyun	/* explicitly disable L2 cache */
28*4882a593Smuzhiyun	mrc 15, 0, r0, c1, c0, 1
29*4882a593Smuzhiyun	bic r0, r0, #0x2
30*4882a593Smuzhiyun	mcr 15, 0, r0, c1, c0, 1
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun	/* reconfigure L2 cache aux control reg */
33*4882a593Smuzhiyun	ldr r0, =0xC0 |			/* tag RAM */ \
34*4882a593Smuzhiyun		 0x4 |			/* data RAM */ \
35*4882a593Smuzhiyun		 1 << 24 |		/* disable write allocate delay */ \
36*4882a593Smuzhiyun		 1 << 23 |		/* disable write allocate combine */ \
37*4882a593Smuzhiyun		 1 << 22		/* disable write allocate */
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun#if defined(CONFIG_MX51)
40*4882a593Smuzhiyun	ldr r3, [r4, #ROM_SI_REV]
41*4882a593Smuzhiyun	cmp r3, #0x10
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun	/* disable write combine for TO 2 and lower revs */
44*4882a593Smuzhiyun	orrls r0, r0, #1 << 25
45*4882a593Smuzhiyun#endif
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun	mcr 15, 1, r0, c9, c0, 2
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun	/* enable L2 cache */
50*4882a593Smuzhiyun	mrc 15, 0, r0, c1, c0, 1
51*4882a593Smuzhiyun	orr r0, r0, #2
52*4882a593Smuzhiyun	mcr 15, 0, r0, c1, c0, 1
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun.endm /* init_l2cc */
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun/* AIPS setup - Only setup MPROTx registers.
57*4882a593Smuzhiyun * The PACR default values are good.*/
58*4882a593Smuzhiyun.macro init_aips
59*4882a593Smuzhiyun	/*
60*4882a593Smuzhiyun	 * Set all MPROTx to be non-bufferable, trusted for R/W,
61*4882a593Smuzhiyun	 * not forced to user-mode.
62*4882a593Smuzhiyun	 */
63*4882a593Smuzhiyun	ldr r0, =AIPS1_BASE_ADDR
64*4882a593Smuzhiyun	ldr r1, =0x77777777
65*4882a593Smuzhiyun	str r1, [r0, #0x0]
66*4882a593Smuzhiyun	str r1, [r0, #0x4]
67*4882a593Smuzhiyun	ldr r0, =AIPS2_BASE_ADDR
68*4882a593Smuzhiyun	str r1, [r0, #0x0]
69*4882a593Smuzhiyun	str r1, [r0, #0x4]
70*4882a593Smuzhiyun	/*
71*4882a593Smuzhiyun	 * Clear the on and off peripheral modules Supervisor Protect bit
72*4882a593Smuzhiyun	 * for SDMA to access them. Did not change the AIPS control registers
73*4882a593Smuzhiyun	 * (offset 0x20) access type
74*4882a593Smuzhiyun	 */
75*4882a593Smuzhiyun.endm /* init_aips */
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun/* M4IF setup */
78*4882a593Smuzhiyun.macro init_m4if
79*4882a593Smuzhiyun#ifdef CONFIG_MX51
80*4882a593Smuzhiyun	/* VPU and IPU given higher priority (0x4)
81*4882a593Smuzhiyun	 * IPU accesses with ID=0x1 given highest priority (=0xA)
82*4882a593Smuzhiyun	 */
83*4882a593Smuzhiyun	ldr r0, =M4IF_BASE_ADDR
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun	ldr r1, =0x00000203
86*4882a593Smuzhiyun	str r1, [r0, #0x40]
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun	str r4, [r0, #0x44]
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun	ldr r1, =0x00120125
91*4882a593Smuzhiyun	str r1, [r0, #0x9C]
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun	ldr r1, =0x001901A3
94*4882a593Smuzhiyun	str r1, [r0, #0x48]
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun#endif
97*4882a593Smuzhiyun.endm /* init_m4if */
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun.macro setup_pll pll, freq
100*4882a593Smuzhiyun	ldr r0, =\pll
101*4882a593Smuzhiyun	adr r2, W_DP_\freq
102*4882a593Smuzhiyun	bl setup_pll_func
103*4882a593Smuzhiyun.endm
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun#define W_DP_OP		0
106*4882a593Smuzhiyun#define W_DP_MFD	4
107*4882a593Smuzhiyun#define W_DP_MFN	8
108*4882a593Smuzhiyun
109*4882a593Smuzhiyunsetup_pll_func:
110*4882a593Smuzhiyun	ldr r1, =0x00001232
111*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_CTL] /* Set DPLL ON (set UPEN bit): BRMO=1 */
112*4882a593Smuzhiyun	mov r1, #0x2
113*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_CONFIG] /* Enable auto-restart AREN bit */
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun	ldr r1, [r2, #W_DP_OP]
116*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_OP]
117*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_HFS_OP]
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun	ldr r1, [r2, #W_DP_MFD]
120*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_MFD]
121*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_HFS_MFD]
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun	ldr r1, [r2, #W_DP_MFN]
124*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_MFN]
125*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_HFS_MFN]
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun	ldr r1, =0x00001232
128*4882a593Smuzhiyun	str r1, [r0, #PLL_DP_CTL]
129*4882a593Smuzhiyun1:	ldr r1, [r0, #PLL_DP_CTL]
130*4882a593Smuzhiyun	ands r1, r1, #0x1
131*4882a593Smuzhiyun	beq 1b
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun	/* r10 saved upper lr */
134*4882a593Smuzhiyun	mov pc, lr
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun.macro setup_pll_errata pll, freq
137*4882a593Smuzhiyun	ldr r2, =\pll
138*4882a593Smuzhiyun	str r4, [r2, #PLL_DP_CONFIG] /* Disable auto-restart AREN bit */
139*4882a593Smuzhiyun	ldr r1, =0x00001236
140*4882a593Smuzhiyun	str r1, [r2, #PLL_DP_CTL]    /* Restart PLL with PLM=1 */
141*4882a593Smuzhiyun1:	ldr r1, [r2, #PLL_DP_CTL]    /* Wait for lock */
142*4882a593Smuzhiyun	ands r1, r1, #0x1
143*4882a593Smuzhiyun	beq 1b
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun	ldr r5, \freq
146*4882a593Smuzhiyun	str r5, [r2, #PLL_DP_MFN]    /* Modify MFN value */
147*4882a593Smuzhiyun	str r5, [r2, #PLL_DP_HFS_MFN]
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun	mov r1, #0x1
150*4882a593Smuzhiyun	str r1, [r2, #PLL_DP_CONFIG] /* Reload MFN value */
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun2:	ldr r1, [r2, #PLL_DP_CONFIG]
153*4882a593Smuzhiyun	tst r1, #1
154*4882a593Smuzhiyun	bne 2b
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun	ldr r1, =100		     /* Wait at least 4 us */
157*4882a593Smuzhiyun3:	subs r1, r1, #1
158*4882a593Smuzhiyun	bge 3b
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun	mov r1, #0x2
161*4882a593Smuzhiyun	str r1, [r2, #PLL_DP_CONFIG] /* Enable auto-restart AREN bit */
162*4882a593Smuzhiyun.endm
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun.macro init_clock
165*4882a593Smuzhiyun#if defined (CONFIG_MX51)
166*4882a593Smuzhiyun	ldr r0, =CCM_BASE_ADDR
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun	/* Gate of clocks to the peripherals first */
169*4882a593Smuzhiyun	ldr r1, =0x3FFFFFFF
170*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR0]
171*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCGR1]
172*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCGR2]
173*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCGR3]
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun	ldr r1, =0x00030000
176*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR4]
177*4882a593Smuzhiyun	ldr r1, =0x00FFF030
178*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR5]
179*4882a593Smuzhiyun	ldr r1, =0x00000300
180*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR6]
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun	/* Disable IPU and HSC dividers */
183*4882a593Smuzhiyun	mov r1, #0x60000
184*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCDR]
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun	/* Make sure to switch the DDR away from PLL 1 */
187*4882a593Smuzhiyun	ldr r1, =0x19239145
188*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCDR]
189*4882a593Smuzhiyun	/* make sure divider effective */
190*4882a593Smuzhiyun1:	ldr r1, [r0, #CLKCTL_CDHIPR]
191*4882a593Smuzhiyun	cmp r1, #0x0
192*4882a593Smuzhiyun	bne 1b
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun	/* Switch ARM to step clock */
195*4882a593Smuzhiyun	mov r1, #0x4
196*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCSR]
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun#if defined(CONFIG_MX51_PLL_ERRATA)
199*4882a593Smuzhiyun	setup_pll PLL1_BASE_ADDR, 864
200*4882a593Smuzhiyun	setup_pll_errata PLL1_BASE_ADDR, W_DP_MFN_800_DIT
201*4882a593Smuzhiyun#else
202*4882a593Smuzhiyun	setup_pll PLL1_BASE_ADDR, 800
203*4882a593Smuzhiyun#endif
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun	setup_pll PLL3_BASE_ADDR, 665
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun	/* Switch peripheral to PLL 3 */
208*4882a593Smuzhiyun	ldr r0, =CCM_BASE_ADDR
209*4882a593Smuzhiyun	ldr r1, =0x000010C0 | CONFIG_SYS_DDR_CLKSEL
210*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCMR]
211*4882a593Smuzhiyun	ldr r1, =0x13239145
212*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCDR]
213*4882a593Smuzhiyun	setup_pll PLL2_BASE_ADDR, 665
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun	/* Switch peripheral to PLL2 */
216*4882a593Smuzhiyun	ldr r0, =CCM_BASE_ADDR
217*4882a593Smuzhiyun	ldr r1, =0x19239145
218*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCDR]
219*4882a593Smuzhiyun	ldr r1, =0x000020C0 | CONFIG_SYS_DDR_CLKSEL
220*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCMR]
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun	setup_pll PLL3_BASE_ADDR, 216
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun	/* Set the platform clock dividers */
225*4882a593Smuzhiyun	ldr r0, =ARM_BASE_ADDR
226*4882a593Smuzhiyun	ldr r1, =0x00000725
227*4882a593Smuzhiyun	str r1, [r0, #0x14]
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun	ldr r0, =CCM_BASE_ADDR
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun	/* Run 3.0 at Full speed, for other TO's wait till we increase VDDGP */
232*4882a593Smuzhiyun	ldr r3, [r4, #ROM_SI_REV]
233*4882a593Smuzhiyun	cmp r3, #0x10
234*4882a593Smuzhiyun	movls r1, #0x1
235*4882a593Smuzhiyun	movhi r1, #0
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CACRR]
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun	/* Switch ARM back to PLL 1 */
240*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCSR]
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun	/* setup the rest */
243*4882a593Smuzhiyun	/* Use lp_apm (24MHz) source for perclk */
244*4882a593Smuzhiyun	ldr r1, =0x000020C2 | CONFIG_SYS_DDR_CLKSEL
245*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCMR]
246*4882a593Smuzhiyun	/* ddr clock from PLL 1, all perclk dividers are 1 since using 24MHz */
247*4882a593Smuzhiyun	ldr r1, =CONFIG_SYS_CLKTL_CBCDR
248*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCDR]
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun	/* Restore the default values in the Gate registers */
251*4882a593Smuzhiyun	ldr r1, =0xFFFFFFFF
252*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR0]
253*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR1]
254*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR2]
255*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR3]
256*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR4]
257*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR5]
258*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR6]
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun	/* Use PLL 2 for UART's, get 66.5MHz from it */
261*4882a593Smuzhiyun	ldr r1, =0xA5A2A020
262*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CSCMR1]
263*4882a593Smuzhiyun	ldr r1, =0x00C30321
264*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CSCDR1]
265*4882a593Smuzhiyun	/* make sure divider effective */
266*4882a593Smuzhiyun1:	ldr r1, [r0, #CLKCTL_CDHIPR]
267*4882a593Smuzhiyun	cmp r1, #0x0
268*4882a593Smuzhiyun	bne 1b
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCDR]
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun	/* for cko - for ARM div by 8 */
273*4882a593Smuzhiyun	mov r1, #0x000A0000
274*4882a593Smuzhiyun	add r1, r1, #0x00000F0
275*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCOSR]
276*4882a593Smuzhiyun#else	/* CONFIG_MX53 */
277*4882a593Smuzhiyun	ldr r0, =CCM_BASE_ADDR
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun	/* Gate of clocks to the peripherals first */
280*4882a593Smuzhiyun	ldr r1, =0x3FFFFFFF
281*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR0]
282*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCGR1]
283*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCGR2]
284*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCGR3]
285*4882a593Smuzhiyun	str r4, [r0, #CLKCTL_CCGR7]
286*4882a593Smuzhiyun	ldr r1, =0x00030000
287*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR4]
288*4882a593Smuzhiyun	ldr r1, =0x00FFF030
289*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR5]
290*4882a593Smuzhiyun	ldr r1, =0x0F00030F
291*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR6]
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun	/* Switch ARM to step clock */
294*4882a593Smuzhiyun	mov r1, #0x4
295*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCSR]
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun	setup_pll PLL1_BASE_ADDR, 800
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun	setup_pll PLL3_BASE_ADDR, 400
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun	/* Switch peripheral to PLL3 */
302*4882a593Smuzhiyun	ldr r0, =CCM_BASE_ADDR
303*4882a593Smuzhiyun	ldr r1, =0x00015154
304*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCMR]
305*4882a593Smuzhiyun	ldr r1, =0x02898945
306*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCDR]
307*4882a593Smuzhiyun	/* make sure change is effective */
308*4882a593Smuzhiyun1:      ldr r1, [r0, #CLKCTL_CDHIPR]
309*4882a593Smuzhiyun	cmp r1, #0x0
310*4882a593Smuzhiyun	bne 1b
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun	setup_pll PLL2_BASE_ADDR, 400
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun	/* Switch peripheral to PLL2 */
315*4882a593Smuzhiyun	ldr r0, =CCM_BASE_ADDR
316*4882a593Smuzhiyun	ldr r1, =0x00888945
317*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCDR]
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun	ldr r1, =0x00016154
320*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CBCMR]
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun	/*change uart clk parent to pll2*/
323*4882a593Smuzhiyun	ldr r1, [r0, #CLKCTL_CSCMR1]
324*4882a593Smuzhiyun	and r1, r1, #0xfcffffff
325*4882a593Smuzhiyun	orr r1, r1, #0x01000000
326*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CSCMR1]
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun	/* make sure change is effective */
329*4882a593Smuzhiyun1:      ldr r1, [r0, #CLKCTL_CDHIPR]
330*4882a593Smuzhiyun	cmp r1, #0x0
331*4882a593Smuzhiyun	bne 1b
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun	setup_pll PLL3_BASE_ADDR, 216
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun	setup_pll PLL4_BASE_ADDR, 455
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun	/* Set the platform clock dividers */
338*4882a593Smuzhiyun	ldr r0, =ARM_BASE_ADDR
339*4882a593Smuzhiyun	ldr r1, =0x00000124
340*4882a593Smuzhiyun	str r1, [r0, #0x14]
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun	ldr r0, =CCM_BASE_ADDR
343*4882a593Smuzhiyun	mov r1, #0
344*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CACRR]
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun	/* Switch ARM back to PLL 1. */
347*4882a593Smuzhiyun	mov r1, #0x0
348*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCSR]
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun	/* make uart div=6 */
351*4882a593Smuzhiyun	ldr r1, [r0, #CLKCTL_CSCDR1]
352*4882a593Smuzhiyun	and r1, r1, #0xffffffc0
353*4882a593Smuzhiyun	orr r1, r1, #0x0a
354*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CSCDR1]
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun	/* Restore the default values in the Gate registers */
357*4882a593Smuzhiyun	ldr r1, =0xFFFFFFFF
358*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR0]
359*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR1]
360*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR2]
361*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR3]
362*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR4]
363*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR5]
364*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR6]
365*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCGR7]
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun	mov r1, #0x00000
368*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCDR]
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun	/* for cko - for ARM div by 8 */
371*4882a593Smuzhiyun	mov r1, #0x000A0000
372*4882a593Smuzhiyun	add r1, r1, #0x00000F0
373*4882a593Smuzhiyun	str r1, [r0, #CLKCTL_CCOSR]
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun#endif	/* CONFIG_MX53 */
376*4882a593Smuzhiyun.endm
377*4882a593Smuzhiyun
378*4882a593SmuzhiyunENTRY(lowlevel_init)
379*4882a593Smuzhiyun	mov r10, lr
380*4882a593Smuzhiyun	mov r4, #0	/* Fix R4 to 0 */
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun#if defined(CONFIG_SYS_MAIN_PWR_ON)
383*4882a593Smuzhiyun	ldr r0, =GPIO1_BASE_ADDR
384*4882a593Smuzhiyun	ldr r1, [r0, #0x0]
385*4882a593Smuzhiyun	orr r1, r1, #1 << 23
386*4882a593Smuzhiyun	str r1, [r0, #0x0]
387*4882a593Smuzhiyun	ldr r1, [r0, #0x4]
388*4882a593Smuzhiyun	orr r1, r1, #1 << 23
389*4882a593Smuzhiyun	str r1, [r0, #0x4]
390*4882a593Smuzhiyun#endif
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun	init_arm_erratum
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun	init_l2cc
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun	init_aips
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun	init_m4if
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun	init_clock
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun	mov pc, r10
403*4882a593SmuzhiyunENDPROC(lowlevel_init)
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun/* Board level setting value */
406*4882a593Smuzhiyun#if defined(CONFIG_MX51_PLL_ERRATA)
407*4882a593SmuzhiyunW_DP_864:		.word DP_OP_864
408*4882a593Smuzhiyun			.word DP_MFD_864
409*4882a593Smuzhiyun			.word DP_MFN_864
410*4882a593SmuzhiyunW_DP_MFN_800_DIT:	.word DP_MFN_800_DIT
411*4882a593Smuzhiyun#else
412*4882a593SmuzhiyunW_DP_800:		.word DP_OP_800
413*4882a593Smuzhiyun			.word DP_MFD_800
414*4882a593Smuzhiyun			.word DP_MFN_800
415*4882a593Smuzhiyun#endif
416*4882a593Smuzhiyun#if defined(CONFIG_MX51)
417*4882a593SmuzhiyunW_DP_665:		.word DP_OP_665
418*4882a593Smuzhiyun			.word DP_MFD_665
419*4882a593Smuzhiyun			.word DP_MFN_665
420*4882a593Smuzhiyun#endif
421*4882a593SmuzhiyunW_DP_216:		.word DP_OP_216
422*4882a593Smuzhiyun			.word DP_MFD_216
423*4882a593Smuzhiyun			.word DP_MFN_216
424*4882a593SmuzhiyunW_DP_400:               .word DP_OP_400
425*4882a593Smuzhiyun			.word DP_MFD_400
426*4882a593Smuzhiyun			.word DP_MFN_400
427*4882a593SmuzhiyunW_DP_455:               .word DP_OP_455
428*4882a593Smuzhiyun			.word DP_MFD_455
429*4882a593Smuzhiyun			.word DP_MFN_455
430