xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-davinci/lowlevel_init.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Low-level board setup code for TI DaVinci SoC based boards.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Partially based on TI sources, original copyrights follow:
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun/*
10*4882a593Smuzhiyun * Board specific setup info
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * (C) Copyright 2003
13*4882a593Smuzhiyun * Texas Instruments, <www.ti.com>
14*4882a593Smuzhiyun * Kshitij Gupta <Kshitij@ti.com>
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun * Modified for OMAP 1610 H2 board by Nishant Kamat, Jan 2004
17*4882a593Smuzhiyun *
18*4882a593Smuzhiyun * Modified for OMAP 5912 OSK board by Rishi Bhattacharya, Apr 2004
19*4882a593Smuzhiyun *
20*4882a593Smuzhiyun * Modified for DV-EVM board by Rishi Bhattacharya, Apr 2005
21*4882a593Smuzhiyun *
22*4882a593Smuzhiyun * Modified for DV-EVM board by Swaminathan S, Nov 2005
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0+
25*4882a593Smuzhiyun */
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun#include <config.h>
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun#define MDSTAT_STATE	0x3f
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun.globl	lowlevel_init
32*4882a593Smuzhiyunlowlevel_init:
33*4882a593Smuzhiyun#ifdef CONFIG_SOC_DM644X
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun	/*-------------------------------------------------------*
36*4882a593Smuzhiyun	 * Mask all IRQs by setting all bits in the EINT default *
37*4882a593Smuzhiyun	 *-------------------------------------------------------*/
38*4882a593Smuzhiyun	mov	r1, $0
39*4882a593Smuzhiyun	ldr	r0, =EINT_ENABLE0
40*4882a593Smuzhiyun	str	r1, [r0]
41*4882a593Smuzhiyun	ldr	r0, =EINT_ENABLE1
42*4882a593Smuzhiyun	str	r1, [r0]
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	/*------------------------------------------------------*
45*4882a593Smuzhiyun	 * Put the GEM in reset					*
46*4882a593Smuzhiyun	 *------------------------------------------------------*/
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun	/* Put the GEM in reset */
49*4882a593Smuzhiyun	ldr	r8, PSC_GEM_FLAG_CLEAR
50*4882a593Smuzhiyun	ldr	r6, MDCTL_GEM
51*4882a593Smuzhiyun	ldr	r7, [r6]
52*4882a593Smuzhiyun	and	r7, r7, r8
53*4882a593Smuzhiyun	str	r7, [r6]
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun	/* Enable the Power Domain Transition Command */
56*4882a593Smuzhiyun	ldr	r6, PTCMD
57*4882a593Smuzhiyun	ldr	r7, [r6]
58*4882a593Smuzhiyun	orr	r7, r7, $0x02
59*4882a593Smuzhiyun	str	r7, [r6]
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun	/* Check for Transition Complete(PTSTAT) */
62*4882a593SmuzhiyuncheckStatClkStopGem:
63*4882a593Smuzhiyun	ldr	r6, PTSTAT
64*4882a593Smuzhiyun	ldr	r7, [r6]
65*4882a593Smuzhiyun	ands	r7, r7, $0x02
66*4882a593Smuzhiyun	bne	checkStatClkStopGem
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun	/* Check for GEM Reset Completion */
69*4882a593SmuzhiyuncheckGemStatClkStop:
70*4882a593Smuzhiyun	ldr	r6, MDSTAT_GEM
71*4882a593Smuzhiyun	ldr	r7, [r6]
72*4882a593Smuzhiyun	ands	r7, r7, $0x100
73*4882a593Smuzhiyun	bne	checkGemStatClkStop
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun	/* Do this for enabling a WDT initiated reset this is a workaround
76*4882a593Smuzhiyun	   for a chip bug.  Not required under normal situations */
77*4882a593Smuzhiyun	ldr	r6, P1394
78*4882a593Smuzhiyun	mov	r10, $0
79*4882a593Smuzhiyun	str	r10, [r6]
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun	/*------------------------------------------------------*
82*4882a593Smuzhiyun	 * Enable L1 & L2 Memories in Fast mode                 *
83*4882a593Smuzhiyun	 *------------------------------------------------------*/
84*4882a593Smuzhiyun	ldr	r6, DFT_ENABLE
85*4882a593Smuzhiyun	mov	r10, $0x01
86*4882a593Smuzhiyun	str	r10, [r6]
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun	ldr	r6, MMARG_BRF0
89*4882a593Smuzhiyun	ldr	r10, MMARG_BRF0_VAL
90*4882a593Smuzhiyun	str	r10, [r6]
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun	ldr	r6, DFT_ENABLE
93*4882a593Smuzhiyun	mov	r10, $0
94*4882a593Smuzhiyun	str	r10, [r6]
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun	/*------------------------------------------------------*
97*4882a593Smuzhiyun	 * DDR2 PLL Initialization				*
98*4882a593Smuzhiyun	 *------------------------------------------------------*/
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun	/* Select the Clock Mode Depending on the Value written in the Boot Table by the run script */
101*4882a593Smuzhiyun	mov	r10, $0
102*4882a593Smuzhiyun	ldr	r6, PLL2_CTL
103*4882a593Smuzhiyun	ldr	r7, PLL_CLKSRC_MASK
104*4882a593Smuzhiyun	ldr	r8, [r6]
105*4882a593Smuzhiyun	and	r8, r8, r7
106*4882a593Smuzhiyun	mov	r9, r10, lsl $8
107*4882a593Smuzhiyun	orr	r8, r8, r9
108*4882a593Smuzhiyun	str	r8, [r6]
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun	/* Select the PLLEN source */
111*4882a593Smuzhiyun	ldr	r7, PLL_ENSRC_MASK
112*4882a593Smuzhiyun	and	r8, r8, r7
113*4882a593Smuzhiyun	str	r8, [r6]
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun	/* Bypass the PLL */
116*4882a593Smuzhiyun	ldr	r7, PLL_BYPASS_MASK
117*4882a593Smuzhiyun	and	r8, r8, r7
118*4882a593Smuzhiyun	str	r8, [r6]
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun	/* Wait for few cycles to allow PLLEN Mux switch properly to bypass Clock */
121*4882a593Smuzhiyun	mov	r10, $0x20
122*4882a593SmuzhiyunWaitPPL2Loop:
123*4882a593Smuzhiyun	subs	r10, r10, $1
124*4882a593Smuzhiyun	bne	WaitPPL2Loop
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun	/* Reset the PLL */
127*4882a593Smuzhiyun	ldr	r7, PLL_RESET_MASK
128*4882a593Smuzhiyun	and	r8, r8, r7
129*4882a593Smuzhiyun	str	r8, [r6]
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun	/* Power up the PLL */
132*4882a593Smuzhiyun	ldr	r7, PLL_PWRUP_MASK
133*4882a593Smuzhiyun	and	r8, r8, r7
134*4882a593Smuzhiyun	str	r8, [r6]
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun	/* Enable the PLL from Disable Mode */
137*4882a593Smuzhiyun	ldr	r7, PLL_DISABLE_ENABLE_MASK
138*4882a593Smuzhiyun	and	r8, r8, r7
139*4882a593Smuzhiyun	str	r8, [r6]
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun	/* Program the PLL Multiplier */
142*4882a593Smuzhiyun	ldr	r6, PLL2_PLLM
143*4882a593Smuzhiyun	mov	r2, $0x17	/* 162 MHz */
144*4882a593Smuzhiyun	str	r2, [r6]
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun	/* Program the PLL2 Divisor Value */
147*4882a593Smuzhiyun	ldr	r6, PLL2_DIV2
148*4882a593Smuzhiyun	mov	r3, $0x01
149*4882a593Smuzhiyun	str	r3, [r6]
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun	/* Program the PLL2 Divisor Value */
152*4882a593Smuzhiyun	ldr	r6, PLL2_DIV1
153*4882a593Smuzhiyun	mov	r4, $0x0b	/* 54 MHz */
154*4882a593Smuzhiyun	str	r4, [r6]
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun	/* PLL2 DIV2 MMR */
157*4882a593Smuzhiyun	ldr	r8, PLL2_DIV_MASK
158*4882a593Smuzhiyun	ldr	r6, PLL2_DIV2
159*4882a593Smuzhiyun	ldr	r9, [r6]
160*4882a593Smuzhiyun	and	r8, r8, r9
161*4882a593Smuzhiyun	mov	r9, $0x01
162*4882a593Smuzhiyun	mov	r9, r9, lsl $15
163*4882a593Smuzhiyun	orr	r8, r8, r9
164*4882a593Smuzhiyun	str	r8, [r6]
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun	/* Program the GOSET bit to take new divider values */
167*4882a593Smuzhiyun	ldr	r6, PLL2_PLLCMD
168*4882a593Smuzhiyun	ldr	r7, [r6]
169*4882a593Smuzhiyun	orr	r7, r7, $0x01
170*4882a593Smuzhiyun	str	r7, [r6]
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun	/* Wait for Done */
173*4882a593Smuzhiyun	ldr	r6, PLL2_PLLSTAT
174*4882a593SmuzhiyundoneLoop_0:
175*4882a593Smuzhiyun	ldr	r7, [r6]
176*4882a593Smuzhiyun	ands	r7, r7, $0x01
177*4882a593Smuzhiyun	bne	doneLoop_0
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun	/* PLL2 DIV1 MMR */
180*4882a593Smuzhiyun	ldr	r8, PLL2_DIV_MASK
181*4882a593Smuzhiyun	ldr	r6, PLL2_DIV1
182*4882a593Smuzhiyun	ldr	r9, [r6]
183*4882a593Smuzhiyun	and	r8, r8, r9
184*4882a593Smuzhiyun	mov	r9, $0x01
185*4882a593Smuzhiyun	mov	r9, r9, lsl $15
186*4882a593Smuzhiyun	orr	r8, r8, r9
187*4882a593Smuzhiyun	str	r8, [r6]
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun	/* Program the GOSET bit to take new divider values */
190*4882a593Smuzhiyun	ldr	r6, PLL2_PLLCMD
191*4882a593Smuzhiyun	ldr	r7, [r6]
192*4882a593Smuzhiyun	orr	r7, r7, $0x01
193*4882a593Smuzhiyun	str	r7, [r6]
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun	/* Wait for Done */
196*4882a593Smuzhiyun	ldr	r6, PLL2_PLLSTAT
197*4882a593SmuzhiyundoneLoop:
198*4882a593Smuzhiyun	ldr	r7, [r6]
199*4882a593Smuzhiyun	ands	r7, r7, $0x01
200*4882a593Smuzhiyun	bne	doneLoop
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun	/* Wait for PLL to Reset Properly */
203*4882a593Smuzhiyun	mov	r10, $0x218
204*4882a593SmuzhiyunResetPPL2Loop:
205*4882a593Smuzhiyun	subs	r10, r10, $1
206*4882a593Smuzhiyun	bne	ResetPPL2Loop
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun	/* Bring PLL out of Reset */
209*4882a593Smuzhiyun	ldr	r6, PLL2_CTL
210*4882a593Smuzhiyun	ldr	r8, [r6]
211*4882a593Smuzhiyun	orr	r8, r8, $0x08
212*4882a593Smuzhiyun	str	r8, [r6]
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun	/* Wait for PLL to Lock */
215*4882a593Smuzhiyun	ldr	r10, PLL_LOCK_COUNT
216*4882a593SmuzhiyunPLL2Lock:
217*4882a593Smuzhiyun	subs	r10, r10, $1
218*4882a593Smuzhiyun	bne	PLL2Lock
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun	/* Enable the PLL */
221*4882a593Smuzhiyun	ldr	r6, PLL2_CTL
222*4882a593Smuzhiyun	ldr	r8, [r6]
223*4882a593Smuzhiyun	orr	r8, r8, $0x01
224*4882a593Smuzhiyun	str	r8, [r6]
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun	/*------------------------------------------------------*
227*4882a593Smuzhiyun	 * Issue Soft Reset to DDR Module			*
228*4882a593Smuzhiyun	 *------------------------------------------------------*/
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun	/* Shut down the DDR2 LPSC Module */
231*4882a593Smuzhiyun	ldr	r8, PSC_FLAG_CLEAR
232*4882a593Smuzhiyun	ldr	r6, MDCTL_DDR2
233*4882a593Smuzhiyun	ldr	r7, [r6]
234*4882a593Smuzhiyun	and	r7, r7, r8
235*4882a593Smuzhiyun	orr	r7, r7, $0x03
236*4882a593Smuzhiyun	str	r7, [r6]
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun	/* Enable the Power Domain Transition Command */
239*4882a593Smuzhiyun	ldr	r6, PTCMD
240*4882a593Smuzhiyun	ldr	r7, [r6]
241*4882a593Smuzhiyun	orr	r7, r7, $0x01
242*4882a593Smuzhiyun	str	r7, [r6]
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun	/* Check for Transition Complete(PTSTAT) */
245*4882a593SmuzhiyuncheckStatClkStop:
246*4882a593Smuzhiyun	ldr	r6, PTSTAT
247*4882a593Smuzhiyun	ldr	r7, [r6]
248*4882a593Smuzhiyun	ands	r7, r7, $0x01
249*4882a593Smuzhiyun	bne	checkStatClkStop
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun	/* Check for DDR2 Controller Enable Completion */
252*4882a593SmuzhiyuncheckDDRStatClkStop:
253*4882a593Smuzhiyun	ldr	r6, MDSTAT_DDR2
254*4882a593Smuzhiyun	ldr	r7, [r6]
255*4882a593Smuzhiyun	and	r7, r7, $MDSTAT_STATE
256*4882a593Smuzhiyun	cmp	r7, $0x03
257*4882a593Smuzhiyun	bne	checkDDRStatClkStop
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun	/*------------------------------------------------------*
260*4882a593Smuzhiyun	 * Program DDR2 MMRs for 162MHz Setting			*
261*4882a593Smuzhiyun	 *------------------------------------------------------*/
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun	/* Program PHY Control Register */
264*4882a593Smuzhiyun	ldr	r6, DDRCTL
265*4882a593Smuzhiyun	ldr	r7, DDRCTL_VAL
266*4882a593Smuzhiyun	str	r7, [r6]
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun	/* Program SDRAM Bank Config Register */
269*4882a593Smuzhiyun	ldr	r6, SDCFG
270*4882a593Smuzhiyun	ldr	r7, SDCFG_VAL
271*4882a593Smuzhiyun	str	r7, [r6]
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun	/* Program SDRAM TIM-0 Config Register */
274*4882a593Smuzhiyun	ldr	r6, SDTIM0
275*4882a593Smuzhiyun	ldr	r7, SDTIM0_VAL_162MHz
276*4882a593Smuzhiyun	str	r7, [r6]
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun	/* Program SDRAM TIM-1 Config Register */
279*4882a593Smuzhiyun	ldr	r6, SDTIM1
280*4882a593Smuzhiyun	ldr	r7, SDTIM1_VAL_162MHz
281*4882a593Smuzhiyun	str	r7, [r6]
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun	/* Program the SDRAM Bank Config Control Register */
284*4882a593Smuzhiyun	ldr	r10, MASK_VAL
285*4882a593Smuzhiyun	ldr	r8, SDCFG
286*4882a593Smuzhiyun	ldr	r9, SDCFG_VAL
287*4882a593Smuzhiyun	and	r9, r9, r10
288*4882a593Smuzhiyun	str	r9, [r8]
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun	/* Program SDRAM SDREF Config Register */
291*4882a593Smuzhiyun	ldr	r6, SDREF
292*4882a593Smuzhiyun	ldr	r7, SDREF_VAL
293*4882a593Smuzhiyun	str	r7, [r6]
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun	/*------------------------------------------------------*
296*4882a593Smuzhiyun	 * Issue Soft Reset to DDR Module			*
297*4882a593Smuzhiyun	 *------------------------------------------------------*/
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun	/* Issue a Dummy DDR2 read/write */
300*4882a593Smuzhiyun	ldr	r8, DDR2_START_ADDR
301*4882a593Smuzhiyun	ldr	r7, DUMMY_VAL
302*4882a593Smuzhiyun	str	r7, [r8]
303*4882a593Smuzhiyun	ldr	r7, [r8]
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun	/* Shut down the DDR2 LPSC Module */
306*4882a593Smuzhiyun	ldr	r8, PSC_FLAG_CLEAR
307*4882a593Smuzhiyun	ldr	r6, MDCTL_DDR2
308*4882a593Smuzhiyun	ldr	r7, [r6]
309*4882a593Smuzhiyun	and	r7, r7, r8
310*4882a593Smuzhiyun	orr	r7, r7, $0x01
311*4882a593Smuzhiyun	str	r7, [r6]
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun	/* Enable the Power Domain Transition Command */
314*4882a593Smuzhiyun	ldr	r6, PTCMD
315*4882a593Smuzhiyun	ldr	r7, [r6]
316*4882a593Smuzhiyun	orr	r7, r7, $0x01
317*4882a593Smuzhiyun	str	r7, [r6]
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun	/* Check for Transition Complete(PTSTAT) */
320*4882a593SmuzhiyuncheckStatClkStop2:
321*4882a593Smuzhiyun	ldr	r6, PTSTAT
322*4882a593Smuzhiyun	ldr	r7, [r6]
323*4882a593Smuzhiyun	ands	r7, r7, $0x01
324*4882a593Smuzhiyun	bne	checkStatClkStop2
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun	/* Check for DDR2 Controller Enable Completion */
327*4882a593SmuzhiyuncheckDDRStatClkStop2:
328*4882a593Smuzhiyun	ldr	r6, MDSTAT_DDR2
329*4882a593Smuzhiyun	ldr	r7, [r6]
330*4882a593Smuzhiyun	and	r7, r7, $MDSTAT_STATE
331*4882a593Smuzhiyun	cmp	r7, $0x01
332*4882a593Smuzhiyun	bne	checkDDRStatClkStop2
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun	/*------------------------------------------------------*
335*4882a593Smuzhiyun	 * Turn DDR2 Controller Clocks On			*
336*4882a593Smuzhiyun	 *------------------------------------------------------*/
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun	/* Enable the DDR2 LPSC Module */
339*4882a593Smuzhiyun	ldr	r6, MDCTL_DDR2
340*4882a593Smuzhiyun	ldr	r7, [r6]
341*4882a593Smuzhiyun	orr	r7, r7, $0x03
342*4882a593Smuzhiyun	str	r7, [r6]
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun	/* Enable the Power Domain Transition Command */
345*4882a593Smuzhiyun	ldr	r6, PTCMD
346*4882a593Smuzhiyun	ldr	r7, [r6]
347*4882a593Smuzhiyun	orr	r7, r7, $0x01
348*4882a593Smuzhiyun	str	r7, [r6]
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun	/* Check for Transition Complete(PTSTAT) */
351*4882a593SmuzhiyuncheckStatClkEn2:
352*4882a593Smuzhiyun	ldr	r6, PTSTAT
353*4882a593Smuzhiyun	ldr	r7, [r6]
354*4882a593Smuzhiyun	ands	r7, r7, $0x01
355*4882a593Smuzhiyun	bne	checkStatClkEn2
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun	/* Check for DDR2 Controller Enable Completion */
358*4882a593SmuzhiyuncheckDDRStatClkEn2:
359*4882a593Smuzhiyun	ldr	r6, MDSTAT_DDR2
360*4882a593Smuzhiyun	ldr	r7, [r6]
361*4882a593Smuzhiyun	and	r7, r7, $MDSTAT_STATE
362*4882a593Smuzhiyun	cmp	r7, $0x03
363*4882a593Smuzhiyun	bne	checkDDRStatClkEn2
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun	/*  DDR Writes and Reads */
366*4882a593Smuzhiyun	ldr	r6, CFGTEST
367*4882a593Smuzhiyun	mov	r3, $0x01
368*4882a593Smuzhiyun	str	r3, [r6]
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun	/*------------------------------------------------------*
371*4882a593Smuzhiyun	 * System PLL Initialization				*
372*4882a593Smuzhiyun	 *------------------------------------------------------*/
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun	/* Select the Clock Mode Depending on the Value written in the Boot Table by the run script */
375*4882a593Smuzhiyun	mov	r2, $0
376*4882a593Smuzhiyun	ldr	r6, PLL1_CTL
377*4882a593Smuzhiyun	ldr	r7, PLL_CLKSRC_MASK
378*4882a593Smuzhiyun	ldr	r8, [r6]
379*4882a593Smuzhiyun	and	r8, r8, r7
380*4882a593Smuzhiyun	mov	r9, r2, lsl $8
381*4882a593Smuzhiyun	orr	r8, r8, r9
382*4882a593Smuzhiyun	str	r8, [r6]
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun	/* Select the PLLEN source */
385*4882a593Smuzhiyun	ldr	r7, PLL_ENSRC_MASK
386*4882a593Smuzhiyun	and	r8, r8, r7
387*4882a593Smuzhiyun	str	r8, [r6]
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun	/* Bypass the PLL */
390*4882a593Smuzhiyun	ldr	r7, PLL_BYPASS_MASK
391*4882a593Smuzhiyun	and	r8, r8, r7
392*4882a593Smuzhiyun	str	r8, [r6]
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun	/* Wait for few cycles to allow PLLEN Mux switch properly to bypass Clock */
395*4882a593Smuzhiyun	mov	r10, $0x20
396*4882a593Smuzhiyun
397*4882a593SmuzhiyunWaitLoop:
398*4882a593Smuzhiyun	subs	r10, r10, $1
399*4882a593Smuzhiyun	bne	WaitLoop
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun	/* Reset the PLL */
402*4882a593Smuzhiyun	ldr	r7, PLL_RESET_MASK
403*4882a593Smuzhiyun	and	r8, r8, r7
404*4882a593Smuzhiyun	str	r8, [r6]
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun	/* Disable the PLL */
407*4882a593Smuzhiyun	orr	r8, r8, $0x10
408*4882a593Smuzhiyun	str	r8, [r6]
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun	/* Power up the PLL */
411*4882a593Smuzhiyun	ldr	r7, PLL_PWRUP_MASK
412*4882a593Smuzhiyun	and	r8, r8, r7
413*4882a593Smuzhiyun	str	r8, [r6]
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun	/* Enable the PLL from Disable Mode */
416*4882a593Smuzhiyun	ldr	r7, PLL_DISABLE_ENABLE_MASK
417*4882a593Smuzhiyun	and	r8, r8, r7
418*4882a593Smuzhiyun	str	r8, [r6]
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun	/* Program the PLL Multiplier */
421*4882a593Smuzhiyun	ldr	r6, PLL1_PLLM
422*4882a593Smuzhiyun	mov	r3, $0x15	/* For 594MHz */
423*4882a593Smuzhiyun	str	r3, [r6]
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun	/* Wait for PLL to Reset Properly */
426*4882a593Smuzhiyun	mov	r10, $0xff
427*4882a593Smuzhiyun
428*4882a593SmuzhiyunResetLoop:
429*4882a593Smuzhiyun	subs	r10, r10, $1
430*4882a593Smuzhiyun	bne	ResetLoop
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun	/* Bring PLL out of Reset */
433*4882a593Smuzhiyun	ldr	r6, PLL1_CTL
434*4882a593Smuzhiyun	orr	r8, r8, $0x08
435*4882a593Smuzhiyun	str	r8, [r6]
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun	/* Wait for PLL to Lock */
438*4882a593Smuzhiyun	ldr	r10, PLL_LOCK_COUNT
439*4882a593Smuzhiyun
440*4882a593SmuzhiyunPLL1Lock:
441*4882a593Smuzhiyun	subs	r10, r10, $1
442*4882a593Smuzhiyun	bne	PLL1Lock
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun	/* Enable the PLL */
445*4882a593Smuzhiyun	orr	r8, r8, $0x01
446*4882a593Smuzhiyun	str	r8, [r6]
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun	nop
449*4882a593Smuzhiyun	nop
450*4882a593Smuzhiyun	nop
451*4882a593Smuzhiyun	nop
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun	/*------------------------------------------------------*
454*4882a593Smuzhiyun	 * AEMIF configuration for NOR Flash (double check)     *
455*4882a593Smuzhiyun	 *------------------------------------------------------*/
456*4882a593Smuzhiyun	ldr	r0, _PINMUX0
457*4882a593Smuzhiyun	ldr	r1, _DEV_SETTING
458*4882a593Smuzhiyun	str	r1, [r0]
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun	ldr	r0, WAITCFG
461*4882a593Smuzhiyun	ldr	r1, WAITCFG_VAL
462*4882a593Smuzhiyun	ldr	r2, [r0]
463*4882a593Smuzhiyun	orr	r2, r2, r1
464*4882a593Smuzhiyun	str	r2, [r0]
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun	ldr	r0, ACFG3
467*4882a593Smuzhiyun	ldr	r1, ACFG3_VAL
468*4882a593Smuzhiyun	ldr	r2, [r0]
469*4882a593Smuzhiyun	and	r1, r2, r1
470*4882a593Smuzhiyun	str	r1, [r0]
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun	ldr	r0, ACFG4
473*4882a593Smuzhiyun	ldr	r1, ACFG4_VAL
474*4882a593Smuzhiyun	ldr	r2, [r0]
475*4882a593Smuzhiyun	and	r1, r2, r1
476*4882a593Smuzhiyun	str	r1, [r0]
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun	ldr	r0, ACFG5
479*4882a593Smuzhiyun	ldr	r1, ACFG5_VAL
480*4882a593Smuzhiyun	ldr	r2, [r0]
481*4882a593Smuzhiyun	and	r1, r2, r1
482*4882a593Smuzhiyun	str	r1, [r0]
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun	/*--------------------------------------*
485*4882a593Smuzhiyun	 * VTP manual Calibration               *
486*4882a593Smuzhiyun	 *--------------------------------------*/
487*4882a593Smuzhiyun	ldr	r0, VTPIOCR
488*4882a593Smuzhiyun	ldr	r1, VTP_MMR0
489*4882a593Smuzhiyun	str	r1, [r0]
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun	ldr	r0, VTPIOCR
492*4882a593Smuzhiyun	ldr	r1, VTP_MMR1
493*4882a593Smuzhiyun	str	r1, [r0]
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun	/* Wait for 33 VTP CLK cycles.  VRP operates at 27 MHz */
496*4882a593Smuzhiyun	ldr	r10, VTP_LOCK_COUNT
497*4882a593SmuzhiyunVTPLock:
498*4882a593Smuzhiyun	subs	r10, r10, $1
499*4882a593Smuzhiyun	bne	VTPLock
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun	ldr	r6, DFT_ENABLE
502*4882a593Smuzhiyun	mov	r10, $0x01
503*4882a593Smuzhiyun	str	r10, [r6]
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun	ldr	r6, DDRVTPR
506*4882a593Smuzhiyun	ldr	r7, [r6]
507*4882a593Smuzhiyun	mov	r8, r7, LSL #32-10
508*4882a593Smuzhiyun	mov	r8, r8, LSR #32-10        /* grab low 10 bits  */
509*4882a593Smuzhiyun	ldr	r7, VTP_RECAL
510*4882a593Smuzhiyun	orr	r8, r7, r8
511*4882a593Smuzhiyun	ldr	r7, VTP_EN
512*4882a593Smuzhiyun	orr	r8, r7, r8
513*4882a593Smuzhiyun	str	r8, [r0]
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun	/* Wait for 33 VTP CLK cycles.  VRP operates at 27 MHz */
517*4882a593Smuzhiyun	ldr	r10, VTP_LOCK_COUNT
518*4882a593SmuzhiyunVTP1Lock:
519*4882a593Smuzhiyun	subs	r10, r10, $1
520*4882a593Smuzhiyun	bne	VTP1Lock
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun	ldr	r1, [r0]
523*4882a593Smuzhiyun	ldr	r2, VTP_MASK
524*4882a593Smuzhiyun	and	r2, r1, r2
525*4882a593Smuzhiyun	str	r2, [r0]
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun	ldr	r6, DFT_ENABLE
528*4882a593Smuzhiyun	mov	r10, $0
529*4882a593Smuzhiyun	str	r10, [r6]
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun	/*
532*4882a593Smuzhiyun	 * Call board-specific lowlevel init.
533*4882a593Smuzhiyun	 * That MUST be present and THAT returns
534*4882a593Smuzhiyun	 * back to arch calling code with "mov pc, lr."
535*4882a593Smuzhiyun	 */
536*4882a593Smuzhiyun	b	dv_board_init
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun.ltorg
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun_PINMUX0:
541*4882a593Smuzhiyun	.word	0x01c40000		/* Device Configuration Registers */
542*4882a593Smuzhiyun_PINMUX1:
543*4882a593Smuzhiyun	.word	0x01c40004		/* Device Configuration Registers */
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun_DEV_SETTING:
546*4882a593Smuzhiyun	.word	0x00000c1f
547*4882a593Smuzhiyun
548*4882a593SmuzhiyunWAITCFG:
549*4882a593Smuzhiyun	.word	0x01e00004
550*4882a593SmuzhiyunWAITCFG_VAL:
551*4882a593Smuzhiyun	.word	0
552*4882a593SmuzhiyunACFG3:
553*4882a593Smuzhiyun	.word	0x01e00014
554*4882a593SmuzhiyunACFG3_VAL:
555*4882a593Smuzhiyun	.word	0x3ffffffd
556*4882a593SmuzhiyunACFG4:
557*4882a593Smuzhiyun	.word	0x01e00018
558*4882a593SmuzhiyunACFG4_VAL:
559*4882a593Smuzhiyun	.word	0x3ffffffd
560*4882a593SmuzhiyunACFG5:
561*4882a593Smuzhiyun	.word	0x01e0001c
562*4882a593SmuzhiyunACFG5_VAL:
563*4882a593Smuzhiyun	.word	0x3ffffffd
564*4882a593Smuzhiyun
565*4882a593SmuzhiyunMDCTL_DDR2:
566*4882a593Smuzhiyun	.word	0x01c41a34
567*4882a593SmuzhiyunMDSTAT_DDR2:
568*4882a593Smuzhiyun	.word	0x01c41834
569*4882a593Smuzhiyun
570*4882a593SmuzhiyunPTCMD:
571*4882a593Smuzhiyun	.word	0x01c41120
572*4882a593SmuzhiyunPTSTAT:
573*4882a593Smuzhiyun	.word	0x01c41128
574*4882a593Smuzhiyun
575*4882a593SmuzhiyunEINT_ENABLE0:
576*4882a593Smuzhiyun	.word	0x01c48018
577*4882a593SmuzhiyunEINT_ENABLE1:
578*4882a593Smuzhiyun	.word	0x01c4801c
579*4882a593Smuzhiyun
580*4882a593SmuzhiyunPSC_FLAG_CLEAR:
581*4882a593Smuzhiyun	.word	0xffffffe0
582*4882a593SmuzhiyunPSC_GEM_FLAG_CLEAR:
583*4882a593Smuzhiyun	.word	0xfffffeff
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun/* DDR2 MMR & CONFIGURATION VALUES, 162 MHZ clock */
586*4882a593SmuzhiyunDDRCTL:
587*4882a593Smuzhiyun	.word	0x200000e4
588*4882a593SmuzhiyunDDRCTL_VAL:
589*4882a593Smuzhiyun	.word	0x50006405
590*4882a593SmuzhiyunSDREF:
591*4882a593Smuzhiyun	.word	0x2000000c
592*4882a593SmuzhiyunSDREF_VAL:
593*4882a593Smuzhiyun	.word	0x000005c3
594*4882a593SmuzhiyunSDCFG:
595*4882a593Smuzhiyun	.word	0x20000008
596*4882a593SmuzhiyunSDCFG_VAL:
597*4882a593Smuzhiyun#ifdef	DDR_4BANKS
598*4882a593Smuzhiyun	.word	0x00178622
599*4882a593Smuzhiyun#elif defined DDR_8BANKS
600*4882a593Smuzhiyun	.word	0x00178632
601*4882a593Smuzhiyun#else
602*4882a593Smuzhiyun#error "Unknown DDR configuration!!!"
603*4882a593Smuzhiyun#endif
604*4882a593SmuzhiyunSDTIM0:
605*4882a593Smuzhiyun	.word	0x20000010
606*4882a593SmuzhiyunSDTIM0_VAL_162MHz:
607*4882a593Smuzhiyun	.word	0x28923211
608*4882a593SmuzhiyunSDTIM1:
609*4882a593Smuzhiyun	.word	0x20000014
610*4882a593SmuzhiyunSDTIM1_VAL_162MHz:
611*4882a593Smuzhiyun	.word	0x0016c722
612*4882a593SmuzhiyunVTPIOCR:
613*4882a593Smuzhiyun	.word	0x200000f0	/* VTP IO Control register */
614*4882a593SmuzhiyunDDRVTPR:
615*4882a593Smuzhiyun	.word	0x01c42030	/* DDR VPTR MMR */
616*4882a593SmuzhiyunVTP_MMR0:
617*4882a593Smuzhiyun	.word	0x201f
618*4882a593SmuzhiyunVTP_MMR1:
619*4882a593Smuzhiyun	.word	0xa01f
620*4882a593SmuzhiyunDFT_ENABLE:
621*4882a593Smuzhiyun	.word	0x01c4004c
622*4882a593SmuzhiyunVTP_LOCK_COUNT:
623*4882a593Smuzhiyun	.word	0x5b0
624*4882a593SmuzhiyunVTP_MASK:
625*4882a593Smuzhiyun	.word	0xffffdfff
626*4882a593SmuzhiyunVTP_RECAL:
627*4882a593Smuzhiyun	.word	0x08000
628*4882a593SmuzhiyunVTP_EN:
629*4882a593Smuzhiyun	.word	0x02000
630*4882a593SmuzhiyunCFGTEST:
631*4882a593Smuzhiyun	.word	0x80010000
632*4882a593SmuzhiyunMASK_VAL:
633*4882a593Smuzhiyun	.word	0x00000fff
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun/* GEM Power Up & LPSC Control Register */
636*4882a593SmuzhiyunMDCTL_GEM:
637*4882a593Smuzhiyun	.word	0x01c41a9c
638*4882a593SmuzhiyunMDSTAT_GEM:
639*4882a593Smuzhiyun	.word	0x01c4189c
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun/* For WDT reset chip bug */
642*4882a593SmuzhiyunP1394:
643*4882a593Smuzhiyun	.word	0x01c41a20
644*4882a593Smuzhiyun
645*4882a593SmuzhiyunPLL_CLKSRC_MASK:
646*4882a593Smuzhiyun	.word	0xfffffeff	/* Mask the Clock Mode bit */
647*4882a593SmuzhiyunPLL_ENSRC_MASK:
648*4882a593Smuzhiyun	.word	0xffffffdf	/* Select the PLLEN source */
649*4882a593SmuzhiyunPLL_BYPASS_MASK:
650*4882a593Smuzhiyun	.word	0xfffffffe	/* Put the PLL in BYPASS */
651*4882a593SmuzhiyunPLL_RESET_MASK:
652*4882a593Smuzhiyun	.word	0xfffffff7	/* Put the PLL in Reset Mode */
653*4882a593SmuzhiyunPLL_PWRUP_MASK:
654*4882a593Smuzhiyun	.word	0xfffffffd	/* PLL Power up Mask Bit  */
655*4882a593SmuzhiyunPLL_DISABLE_ENABLE_MASK:
656*4882a593Smuzhiyun	.word	0xffffffef	/* Enable the PLL from Disable */
657*4882a593SmuzhiyunPLL_LOCK_COUNT:
658*4882a593Smuzhiyun	.word	0x2000
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun/* PLL1-SYSTEM PLL MMRs */
661*4882a593SmuzhiyunPLL1_CTL:
662*4882a593Smuzhiyun	.word	0x01c40900
663*4882a593SmuzhiyunPLL1_PLLM:
664*4882a593Smuzhiyun	.word	0x01c40910
665*4882a593Smuzhiyun
666*4882a593Smuzhiyun/* PLL2-SYSTEM PLL MMRs */
667*4882a593SmuzhiyunPLL2_CTL:
668*4882a593Smuzhiyun	.word	0x01c40d00
669*4882a593SmuzhiyunPLL2_PLLM:
670*4882a593Smuzhiyun	.word	0x01c40d10
671*4882a593SmuzhiyunPLL2_DIV1:
672*4882a593Smuzhiyun	.word	0x01c40d18
673*4882a593SmuzhiyunPLL2_DIV2:
674*4882a593Smuzhiyun	.word	0x01c40d1c
675*4882a593SmuzhiyunPLL2_PLLCMD:
676*4882a593Smuzhiyun	.word	0x01c40d38
677*4882a593SmuzhiyunPLL2_PLLSTAT:
678*4882a593Smuzhiyun	.word	0x01c40d3c
679*4882a593SmuzhiyunPLL2_DIV_MASK:
680*4882a593Smuzhiyun	.word	0xffff7fff
681*4882a593Smuzhiyun
682*4882a593SmuzhiyunMMARG_BRF0:
683*4882a593Smuzhiyun	.word	0x01c42010	/* BRF margin mode 0 (R/W)*/
684*4882a593SmuzhiyunMMARG_BRF0_VAL:
685*4882a593Smuzhiyun	.word	0x00444400
686*4882a593Smuzhiyun
687*4882a593SmuzhiyunDDR2_START_ADDR:
688*4882a593Smuzhiyun	.word	0x80000000
689*4882a593SmuzhiyunDUMMY_VAL:
690*4882a593Smuzhiyun	.word	0xa55aa55a
691*4882a593Smuzhiyun#else /* CONFIG_SOC_DM644X */
692*4882a593Smuzhiyun	mov pc, lr
693*4882a593Smuzhiyun#endif
694