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