xref: /rk3399_rockchip-uboot/arch/arm/cpu/arm926ejs/spear/spr_lowlevel_init.S (revision c25c4fd0104e8a6695783e41f896ce5f288a6a70)
1*c25c4fd0SThomas Petazzoni/*
2*c25c4fd0SThomas Petazzoni * (C) Copyright 2006
3*c25c4fd0SThomas Petazzoni * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com.
4*c25c4fd0SThomas Petazzoni *
5*c25c4fd0SThomas Petazzoni * SPDX-License-Identifier:	GPL-2.0+
6*c25c4fd0SThomas Petazzoni */
7*c25c4fd0SThomas Petazzoni
8*c25c4fd0SThomas Petazzoni#include <config.h>
9*c25c4fd0SThomas Petazzoni
10*c25c4fd0SThomas Petazzoni/*
11*c25c4fd0SThomas Petazzoni * platform specific initializations are already done in Xloader
12*c25c4fd0SThomas Petazzoni * Initializations already done include
13*c25c4fd0SThomas Petazzoni * DDR, PLLs, IP's clock enable and reset release etc
14*c25c4fd0SThomas Petazzoni */
15*c25c4fd0SThomas Petazzoni.globl lowlevel_init
16*c25c4fd0SThomas Petazzonilowlevel_init:
17*c25c4fd0SThomas Petazzoni	mov	pc, lr
18*c25c4fd0SThomas Petazzoni
19*c25c4fd0SThomas Petazzoni/* void setfreq(unsigned int device, unsigned int frequency) */
20*c25c4fd0SThomas Petazzoni.global setfreq
21*c25c4fd0SThomas Petazzonisetfreq:
22*c25c4fd0SThomas Petazzoni	stmfd 	sp!,{r14}
23*c25c4fd0SThomas Petazzoni	stmfd 	sp!,{r0-r12}
24*c25c4fd0SThomas Petazzoni
25*c25c4fd0SThomas Petazzoni	mov  	r8,sp
26*c25c4fd0SThomas Petazzoni	ldr 	sp,SRAM_STACK_V
27*c25c4fd0SThomas Petazzoni
28*c25c4fd0SThomas Petazzoni	/* Saving the function arguements for later use */
29*c25c4fd0SThomas Petazzoni	mov  	r4,r0
30*c25c4fd0SThomas Petazzoni	mov  	r5,r1
31*c25c4fd0SThomas Petazzoni
32*c25c4fd0SThomas Petazzoni	/* Putting DDR into self refresh */
33*c25c4fd0SThomas Petazzoni	ldr 	r0,DDR_07_V
34*c25c4fd0SThomas Petazzoni	ldr	r1,[r0]
35*c25c4fd0SThomas Petazzoni	ldr	r2,DDR_ACTIVE_V
36*c25c4fd0SThomas Petazzoni	bic	r1, r1, r2
37*c25c4fd0SThomas Petazzoni	str	r1,[r0]
38*c25c4fd0SThomas Petazzoni	ldr 	r0,DDR_57_V
39*c25c4fd0SThomas Petazzoni	ldr	r1,[r0]
40*c25c4fd0SThomas Petazzoni	ldr	r2,CYCLES_MASK_V
41*c25c4fd0SThomas Petazzoni	bic	r1, r1, r2
42*c25c4fd0SThomas Petazzoni	ldr	r2,REFRESH_CYCLES_V
43*c25c4fd0SThomas Petazzoni	orr	r1, r1, r2, lsl #16
44*c25c4fd0SThomas Petazzoni	str	r1,[r0]
45*c25c4fd0SThomas Petazzoni	ldr 	r0,DDR_07_V
46*c25c4fd0SThomas Petazzoni	ldr	r1,[r0]
47*c25c4fd0SThomas Petazzoni	ldr	r2,SREFRESH_MASK_V
48*c25c4fd0SThomas Petazzoni	orr	r1, r1, r2
49*c25c4fd0SThomas Petazzoni	str	r1,[r0]
50*c25c4fd0SThomas Petazzoni
51*c25c4fd0SThomas Petazzoni	/* flush pipeline */
52*c25c4fd0SThomas Petazzoni	b	flush
53*c25c4fd0SThomas Petazzoni	.align 5
54*c25c4fd0SThomas Petazzoniflush:
55*c25c4fd0SThomas Petazzoni	/* Delay to ensure self refresh mode */
56*c25c4fd0SThomas Petazzoni	ldr	r0,SREFRESH_DELAY_V
57*c25c4fd0SThomas Petazzonidelay:
58*c25c4fd0SThomas Petazzoni	sub	r0,r0,#1
59*c25c4fd0SThomas Petazzoni	cmp	r0,#0
60*c25c4fd0SThomas Petazzoni	bne	delay
61*c25c4fd0SThomas Petazzoni
62*c25c4fd0SThomas Petazzoni	/* Putting system in slow mode */
63*c25c4fd0SThomas Petazzoni	ldr	r0,SCCTRL_V
64*c25c4fd0SThomas Petazzoni	mov	r1,#2
65*c25c4fd0SThomas Petazzoni	str	r1,[r0]
66*c25c4fd0SThomas Petazzoni
67*c25c4fd0SThomas Petazzoni	/* Changing PLL(1/2) frequency */
68*c25c4fd0SThomas Petazzoni	mov	r0,r4
69*c25c4fd0SThomas Petazzoni	mov	r1,r5
70*c25c4fd0SThomas Petazzoni
71*c25c4fd0SThomas Petazzoni	cmp	r4,#0
72*c25c4fd0SThomas Petazzoni	beq	pll1_freq
73*c25c4fd0SThomas Petazzoni
74*c25c4fd0SThomas Petazzoni	/* Change PLL2 (DDR frequency) */
75*c25c4fd0SThomas Petazzoni	ldr	r6,PLL2_FREQ_V
76*c25c4fd0SThomas Petazzoni	ldr	r7,PLL2_CNTL_V
77*c25c4fd0SThomas Petazzoni	b	pll2_freq
78*c25c4fd0SThomas Petazzoni
79*c25c4fd0SThomas Petazzonipll1_freq:
80*c25c4fd0SThomas Petazzoni	/* Change PLL1 (CPU frequency) */
81*c25c4fd0SThomas Petazzoni	ldr	r6,PLL1_FREQ_V
82*c25c4fd0SThomas Petazzoni	ldr	r7,PLL1_CNTL_V
83*c25c4fd0SThomas Petazzoni
84*c25c4fd0SThomas Petazzonipll2_freq:
85*c25c4fd0SThomas Petazzoni	mov	r0,r6
86*c25c4fd0SThomas Petazzoni	ldr	r1,[r0]
87*c25c4fd0SThomas Petazzoni	ldr	r2,PLLFREQ_MASK_V
88*c25c4fd0SThomas Petazzoni	bic	r1,r1,r2
89*c25c4fd0SThomas Petazzoni	mov	r2,r5,lsr#1
90*c25c4fd0SThomas Petazzoni	orr	r1,r1,r2,lsl#24
91*c25c4fd0SThomas Petazzoni	str	r1,[r0]
92*c25c4fd0SThomas Petazzoni
93*c25c4fd0SThomas Petazzoni	mov	r0,r7
94*c25c4fd0SThomas Petazzoni	ldr	r1,P1C0A_V
95*c25c4fd0SThomas Petazzoni	str	r1,[r0]
96*c25c4fd0SThomas Petazzoni	ldr	r1,P1C0E_V
97*c25c4fd0SThomas Petazzoni	str	r1,[r0]
98*c25c4fd0SThomas Petazzoni	ldr	r1,P1C06_V
99*c25c4fd0SThomas Petazzoni	str	r1,[r0]
100*c25c4fd0SThomas Petazzoni	ldr	r1,P1C0E_V
101*c25c4fd0SThomas Petazzoni	str	r1,[r0]
102*c25c4fd0SThomas Petazzoni
103*c25c4fd0SThomas Petazzonilock:
104*c25c4fd0SThomas Petazzoni	ldr	r1,[r0]
105*c25c4fd0SThomas Petazzoni	and	r1,r1,#1
106*c25c4fd0SThomas Petazzoni	cmp	r1,#0
107*c25c4fd0SThomas Petazzoni	beq	lock
108*c25c4fd0SThomas Petazzoni
109*c25c4fd0SThomas Petazzoni	/* Putting system back to normal mode */
110*c25c4fd0SThomas Petazzoni	ldr	r0,SCCTRL_V
111*c25c4fd0SThomas Petazzoni	mov	r1,#4
112*c25c4fd0SThomas Petazzoni	str	r1,[r0]
113*c25c4fd0SThomas Petazzoni
114*c25c4fd0SThomas Petazzoni	/* Putting DDR back to normal */
115*c25c4fd0SThomas Petazzoni	ldr	r0,DDR_07_V
116*c25c4fd0SThomas Petazzoni	ldr	r1,[R0]
117*c25c4fd0SThomas Petazzoni	ldr	r2,SREFRESH_MASK_V
118*c25c4fd0SThomas Petazzoni	bic	r1, r1, r2
119*c25c4fd0SThomas Petazzoni	str	r1,[r0]
120*c25c4fd0SThomas Petazzoni	ldr	r2,DDR_ACTIVE_V
121*c25c4fd0SThomas Petazzoni	orr	r1, r1, r2
122*c25c4fd0SThomas Petazzoni	str	r1,[r0]
123*c25c4fd0SThomas Petazzoni
124*c25c4fd0SThomas Petazzoni	/* Delay to ensure self refresh mode */
125*c25c4fd0SThomas Petazzoni	ldr	r0,SREFRESH_DELAY_V
126*c25c4fd0SThomas Petazzoni1:
127*c25c4fd0SThomas Petazzoni	sub	r0,r0,#1
128*c25c4fd0SThomas Petazzoni	cmp	r0,#0
129*c25c4fd0SThomas Petazzoni	bne	1b
130*c25c4fd0SThomas Petazzoni
131*c25c4fd0SThomas Petazzoni	mov	sp,r8
132*c25c4fd0SThomas Petazzoni	/* Resuming back to code */
133*c25c4fd0SThomas Petazzoni	ldmia	sp!,{r0-r12}
134*c25c4fd0SThomas Petazzoni	ldmia	sp!,{pc}
135*c25c4fd0SThomas Petazzoni
136*c25c4fd0SThomas PetazzoniSCCTRL_V:
137*c25c4fd0SThomas Petazzoni	.word 0xfca00000
138*c25c4fd0SThomas PetazzoniPLL1_FREQ_V:
139*c25c4fd0SThomas Petazzoni	.word 0xfca8000C
140*c25c4fd0SThomas PetazzoniPLL1_CNTL_V:
141*c25c4fd0SThomas Petazzoni	.word 0xfca80008
142*c25c4fd0SThomas PetazzoniPLL2_FREQ_V:
143*c25c4fd0SThomas Petazzoni	.word 0xfca80018
144*c25c4fd0SThomas PetazzoniPLL2_CNTL_V:
145*c25c4fd0SThomas Petazzoni	.word 0xfca80014
146*c25c4fd0SThomas PetazzoniPLLFREQ_MASK_V:
147*c25c4fd0SThomas Petazzoni	.word 0xff000000
148*c25c4fd0SThomas PetazzoniP1C0A_V:
149*c25c4fd0SThomas Petazzoni	.word 0x1C0A
150*c25c4fd0SThomas PetazzoniP1C0E_V:
151*c25c4fd0SThomas Petazzoni	.word 0x1C0E
152*c25c4fd0SThomas PetazzoniP1C06_V:
153*c25c4fd0SThomas Petazzoni	.word 0x1C06
154*c25c4fd0SThomas Petazzoni
155*c25c4fd0SThomas PetazzoniSREFRESH_DELAY_V:
156*c25c4fd0SThomas Petazzoni	.word 0x9999
157*c25c4fd0SThomas PetazzoniSRAM_STACK_V:
158*c25c4fd0SThomas Petazzoni	.word 0xD2800600
159*c25c4fd0SThomas PetazzoniDDR_07_V:
160*c25c4fd0SThomas Petazzoni	.word 0xfc60001c
161*c25c4fd0SThomas PetazzoniDDR_ACTIVE_V:
162*c25c4fd0SThomas Petazzoni	.word 0x01000000
163*c25c4fd0SThomas PetazzoniDDR_57_V:
164*c25c4fd0SThomas Petazzoni	.word 0xfc6000e4
165*c25c4fd0SThomas PetazzoniCYCLES_MASK_V:
166*c25c4fd0SThomas Petazzoni	.word 0xffff0000
167*c25c4fd0SThomas PetazzoniREFRESH_CYCLES_V:
168*c25c4fd0SThomas Petazzoni	.word 0xf0f0
169*c25c4fd0SThomas PetazzoniSREFRESH_MASK_V:
170*c25c4fd0SThomas Petazzoni	.word 0x00010000
171*c25c4fd0SThomas Petazzoni
172*c25c4fd0SThomas Petazzoni.global setfreq_sz
173*c25c4fd0SThomas Petazzonisetfreq_sz:
174*c25c4fd0SThomas Petazzoni	.word setfreq_sz - setfreq
175