xref: /rk3399_rockchip-uboot/arch/arm/mach-at91/arm926ejs/lowlevel_init.S (revision b9cb64825b5e6efeb715abd8b48d9b12f98973e9)
1*62011840SMasahiro Yamada/*
2*62011840SMasahiro Yamada * Memory Setup stuff - taken from blob memsetup.S
3*62011840SMasahiro Yamada *
4*62011840SMasahiro Yamada * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and
5*62011840SMasahiro Yamada *		       Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
6*62011840SMasahiro Yamada *
7*62011840SMasahiro Yamada * Copyright (C) 2008 Ronetix Ilko Iliev (www.ronetix.at)
8*62011840SMasahiro Yamada * Copyright (C) 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
9*62011840SMasahiro Yamada *
10*62011840SMasahiro Yamada * SPDX-License-Identifier:	GPL-2.0+
11*62011840SMasahiro Yamada */
12*62011840SMasahiro Yamada
13*62011840SMasahiro Yamada#include <config.h>
14*62011840SMasahiro Yamada#include <asm/arch/hardware.h>
15*62011840SMasahiro Yamada#include <asm/arch/at91_pmc.h>
16*62011840SMasahiro Yamada#include <asm/arch/at91_wdt.h>
17*62011840SMasahiro Yamada#include <asm/arch/at91_pio.h>
18*62011840SMasahiro Yamada#include <asm/arch/at91_matrix.h>
19*62011840SMasahiro Yamada#include <asm/arch/at91sam9_sdramc.h>
20*62011840SMasahiro Yamada#include <asm/arch/at91sam9_smc.h>
21*62011840SMasahiro Yamada#include <asm/arch/at91_rstc.h>
22*62011840SMasahiro Yamada#ifdef CONFIG_ATMEL_LEGACY
23*62011840SMasahiro Yamada#include <asm/arch/at91sam9_matrix.h>
24*62011840SMasahiro Yamada#endif
25*62011840SMasahiro Yamada#ifndef CONFIG_SYS_MATRIX_EBICSA_VAL
26*62011840SMasahiro Yamada#define CONFIG_SYS_MATRIX_EBICSA_VAL CONFIG_SYS_MATRIX_EBI0CSA_VAL
27*62011840SMasahiro Yamada#endif
28*62011840SMasahiro Yamada
29*62011840SMasahiro Yamada.globl lowlevel_init
30*62011840SMasahiro Yamada.type lowlevel_init,function
31*62011840SMasahiro Yamadalowlevel_init:
32*62011840SMasahiro Yamada
33*62011840SMasahiro YamadaPOS1:
34*62011840SMasahiro Yamada	adr	r5, POS1	/* r5 = POS1 run time */
35*62011840SMasahiro Yamada	ldr	r0, =POS1	/* r0 = POS1 compile */
36*62011840SMasahiro Yamada	sub	r5, r5, r0	/* r0 = CONFIG_SYS_TEXT_BASE-1 */
37*62011840SMasahiro Yamada
38*62011840SMasahiro Yamada	/* memory control configuration 1 */
39*62011840SMasahiro Yamada	ldr	r0, =SMRDATA
40*62011840SMasahiro Yamada	ldr	r2, =SMRDATA1
41*62011840SMasahiro Yamada	add	r0, r0, r5
42*62011840SMasahiro Yamada	add	r2, r2, r5
43*62011840SMasahiro Yamada0:
44*62011840SMasahiro Yamada	/* the address */
45*62011840SMasahiro Yamada	ldr	r1, [r0], #4
46*62011840SMasahiro Yamada	/* the value */
47*62011840SMasahiro Yamada	ldr	r3, [r0], #4
48*62011840SMasahiro Yamada	str	r3, [r1]
49*62011840SMasahiro Yamada	cmp	r2, r0
50*62011840SMasahiro Yamada	bne	0b
51*62011840SMasahiro Yamada
52*62011840SMasahiro Yamada/* ----------------------------------------------------------------------------
53*62011840SMasahiro Yamada * PMC Init Step 1.
54*62011840SMasahiro Yamada * ----------------------------------------------------------------------------
55*62011840SMasahiro Yamada * - Check if the PLL is already initialized
56*62011840SMasahiro Yamada * ----------------------------------------------------------------------------
57*62011840SMasahiro Yamada */
58*62011840SMasahiro Yamada	ldr	r1, =(AT91_ASM_PMC_MCKR)
59*62011840SMasahiro Yamada	ldr	r0, [r1]
60*62011840SMasahiro Yamada	and	r0, r0, #3
61*62011840SMasahiro Yamada	cmp	r0, #0
62*62011840SMasahiro Yamada	bne	PLL_setup_end
63*62011840SMasahiro Yamada
64*62011840SMasahiro Yamada/* ---------------------------------------------------------------------------
65*62011840SMasahiro Yamada * - Enable the Main Oscillator
66*62011840SMasahiro Yamada * ---------------------------------------------------------------------------
67*62011840SMasahiro Yamada */
68*62011840SMasahiro Yamada	ldr	r1, =(AT91_ASM_PMC_MOR)
69*62011840SMasahiro Yamada	ldr	r2, =(AT91_ASM_PMC_SR)
70*62011840SMasahiro Yamada	/* Main oscillator Enable register PMC_MOR: */
71*62011840SMasahiro Yamada	ldr	r0, =CONFIG_SYS_MOR_VAL
72*62011840SMasahiro Yamada	str	r0, [r1]
73*62011840SMasahiro Yamada
74*62011840SMasahiro Yamada	/* Reading the PMC Status to detect when the Main Oscillator is enabled */
75*62011840SMasahiro Yamada	mov	r4, #AT91_PMC_IXR_MOSCS
76*62011840SMasahiro YamadaMOSCS_Loop:
77*62011840SMasahiro Yamada	ldr	r3, [r2]
78*62011840SMasahiro Yamada	and	r3, r4, r3
79*62011840SMasahiro Yamada	cmp	r3, #AT91_PMC_IXR_MOSCS
80*62011840SMasahiro Yamada	bne	MOSCS_Loop
81*62011840SMasahiro Yamada
82*62011840SMasahiro Yamada/* ----------------------------------------------------------------------------
83*62011840SMasahiro Yamada * PMC Init Step 2.
84*62011840SMasahiro Yamada * ----------------------------------------------------------------------------
85*62011840SMasahiro Yamada * Setup PLLA
86*62011840SMasahiro Yamada * ----------------------------------------------------------------------------
87*62011840SMasahiro Yamada */
88*62011840SMasahiro Yamada	ldr	r1, =(AT91_ASM_PMC_PLLAR)
89*62011840SMasahiro Yamada	ldr	r0, =CONFIG_SYS_PLLAR_VAL
90*62011840SMasahiro Yamada	str	r0, [r1]
91*62011840SMasahiro Yamada
92*62011840SMasahiro Yamada	/* Reading the PMC Status register to detect when the PLLA is locked */
93*62011840SMasahiro Yamada	mov	r4, #AT91_PMC_IXR_LOCKA
94*62011840SMasahiro YamadaMOSCS_Loop1:
95*62011840SMasahiro Yamada	ldr	r3, [r2]
96*62011840SMasahiro Yamada	and	r3, r4, r3
97*62011840SMasahiro Yamada	cmp	r3, #AT91_PMC_IXR_LOCKA
98*62011840SMasahiro Yamada	bne	MOSCS_Loop1
99*62011840SMasahiro Yamada
100*62011840SMasahiro Yamada/* ----------------------------------------------------------------------------
101*62011840SMasahiro Yamada * PMC Init Step 3.
102*62011840SMasahiro Yamada * ----------------------------------------------------------------------------
103*62011840SMasahiro Yamada * - Switch on the Main Oscillator
104*62011840SMasahiro Yamada * ----------------------------------------------------------------------------
105*62011840SMasahiro Yamada */
106*62011840SMasahiro Yamada	ldr	r1, =(AT91_ASM_PMC_MCKR)
107*62011840SMasahiro Yamada
108*62011840SMasahiro Yamada	/* -Master Clock Controller register PMC_MCKR */
109*62011840SMasahiro Yamada	ldr	r0, =CONFIG_SYS_MCKR1_VAL
110*62011840SMasahiro Yamada	str	r0, [r1]
111*62011840SMasahiro Yamada
112*62011840SMasahiro Yamada	/* Reading the PMC Status to detect when the Master clock is ready */
113*62011840SMasahiro Yamada	mov	r4, #AT91_PMC_IXR_MCKRDY
114*62011840SMasahiro YamadaMCKRDY_Loop:
115*62011840SMasahiro Yamada	ldr	r3, [r2]
116*62011840SMasahiro Yamada	and	r3, r4, r3
117*62011840SMasahiro Yamada	cmp	r3, #AT91_PMC_IXR_MCKRDY
118*62011840SMasahiro Yamada	bne	MCKRDY_Loop
119*62011840SMasahiro Yamada
120*62011840SMasahiro Yamada	ldr	r0, =CONFIG_SYS_MCKR2_VAL
121*62011840SMasahiro Yamada	str	r0, [r1]
122*62011840SMasahiro Yamada
123*62011840SMasahiro Yamada	/* Reading the PMC Status to detect when the Master clock is ready */
124*62011840SMasahiro Yamada	mov	r4, #AT91_PMC_IXR_MCKRDY
125*62011840SMasahiro YamadaMCKRDY_Loop1:
126*62011840SMasahiro Yamada	ldr	r3, [r2]
127*62011840SMasahiro Yamada	and	r3, r4, r3
128*62011840SMasahiro Yamada	cmp	r3, #AT91_PMC_IXR_MCKRDY
129*62011840SMasahiro Yamada	bne	MCKRDY_Loop1
130*62011840SMasahiro YamadaPLL_setup_end:
131*62011840SMasahiro Yamada
132*62011840SMasahiro Yamada/* ----------------------------------------------------------------------------
133*62011840SMasahiro Yamada * - memory control configuration 2
134*62011840SMasahiro Yamada * ----------------------------------------------------------------------------
135*62011840SMasahiro Yamada */
136*62011840SMasahiro Yamada	ldr	r0, =(AT91_ASM_SDRAMC_TR)
137*62011840SMasahiro Yamada	ldr	r1, [r0]
138*62011840SMasahiro Yamada	cmp	r1, #0
139*62011840SMasahiro Yamada	bne	SDRAM_setup_end
140*62011840SMasahiro Yamada
141*62011840SMasahiro Yamada	ldr	r0, =SMRDATA1
142*62011840SMasahiro Yamada	ldr	r2, =SMRDATA2
143*62011840SMasahiro Yamada	add	r0, r0, r5
144*62011840SMasahiro Yamada	add	r2, r2, r5
145*62011840SMasahiro Yamada2:
146*62011840SMasahiro Yamada	/* the address */
147*62011840SMasahiro Yamada	ldr	r1, [r0], #4
148*62011840SMasahiro Yamada	/* the value */
149*62011840SMasahiro Yamada	ldr	r3, [r0], #4
150*62011840SMasahiro Yamada	str	r3, [r1]
151*62011840SMasahiro Yamada	cmp	r2, r0
152*62011840SMasahiro Yamada	bne	2b
153*62011840SMasahiro Yamada
154*62011840SMasahiro YamadaSDRAM_setup_end:
155*62011840SMasahiro Yamada	/* everything is fine now */
156*62011840SMasahiro Yamada	mov	pc, lr
157*62011840SMasahiro Yamada
158*62011840SMasahiro Yamada	.ltorg
159*62011840SMasahiro Yamada
160*62011840SMasahiro YamadaSMRDATA:
161*62011840SMasahiro Yamada	.word AT91_ASM_WDT_MR
162*62011840SMasahiro Yamada	.word CONFIG_SYS_WDTC_WDMR_VAL
163*62011840SMasahiro Yamada	/* configure PIOx as EBI0 D[16-31] */
164*62011840SMasahiro Yamada#if defined(CONFIG_AT91SAM9263)
165*62011840SMasahiro Yamada	.word AT91_ASM_PIOD_PDR
166*62011840SMasahiro Yamada	.word CONFIG_SYS_PIOD_PDR_VAL1
167*62011840SMasahiro Yamada	.word AT91_ASM_PIOD_PUDR
168*62011840SMasahiro Yamada	.word CONFIG_SYS_PIOD_PPUDR_VAL
169*62011840SMasahiro Yamada	.word AT91_ASM_PIOD_ASR
170*62011840SMasahiro Yamada	.word CONFIG_SYS_PIOD_PPUDR_VAL
171*62011840SMasahiro Yamada#elif defined(CONFIG_AT91SAM9260) || defined(CONFIG_AT91SAM9261) \
172*62011840SMasahiro Yamada	|| defined(CONFIG_AT91SAM9G20)
173*62011840SMasahiro Yamada	.word AT91_ASM_PIOC_PDR
174*62011840SMasahiro Yamada	.word CONFIG_SYS_PIOC_PDR_VAL1
175*62011840SMasahiro Yamada	.word AT91_ASM_PIOC_PUDR
176*62011840SMasahiro Yamada	.word CONFIG_SYS_PIOC_PPUDR_VAL
177*62011840SMasahiro Yamada#endif
178*62011840SMasahiro Yamada	.word AT91_ASM_MATRIX_CSA0
179*62011840SMasahiro Yamada	.word CONFIG_SYS_MATRIX_EBICSA_VAL
180*62011840SMasahiro Yamada
181*62011840SMasahiro Yamada	/* flash */
182*62011840SMasahiro Yamada	.word AT91_ASM_SMC_MODE0
183*62011840SMasahiro Yamada	.word CONFIG_SYS_SMC0_MODE0_VAL
184*62011840SMasahiro Yamada
185*62011840SMasahiro Yamada	.word AT91_ASM_SMC_CYCLE0
186*62011840SMasahiro Yamada	.word CONFIG_SYS_SMC0_CYCLE0_VAL
187*62011840SMasahiro Yamada
188*62011840SMasahiro Yamada	.word AT91_ASM_SMC_PULSE0
189*62011840SMasahiro Yamada	.word CONFIG_SYS_SMC0_PULSE0_VAL
190*62011840SMasahiro Yamada
191*62011840SMasahiro Yamada	.word AT91_ASM_SMC_SETUP0
192*62011840SMasahiro Yamada	.word CONFIG_SYS_SMC0_SETUP0_VAL
193*62011840SMasahiro Yamada
194*62011840SMasahiro YamadaSMRDATA1:
195*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_MR
196*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_MR_VAL1
197*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_TR
198*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_TR_VAL1
199*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_CR
200*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_CR_VAL
201*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_MDR
202*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_MDR_VAL
203*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_MR
204*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_MR_VAL2
205*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
206*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL1
207*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_MR
208*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_MR_VAL3
209*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
210*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL2
211*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
212*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL3
213*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
214*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL4
215*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
216*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL5
217*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
218*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL6
219*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
220*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL7
221*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
222*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL8
223*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
224*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL9
225*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_MR
226*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_MR_VAL4
227*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
228*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL10
229*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_MR
230*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_MR_VAL5
231*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
232*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL11
233*62011840SMasahiro Yamada	.word AT91_ASM_SDRAMC_TR
234*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRC_TR_VAL2
235*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_BASE
236*62011840SMasahiro Yamada	.word CONFIG_SYS_SDRAM_VAL12
237*62011840SMasahiro Yamada	/* User reset enable*/
238*62011840SMasahiro Yamada	.word AT91_ASM_RSTC_MR
239*62011840SMasahiro Yamada	.word CONFIG_SYS_RSTC_RMR_VAL
240*62011840SMasahiro Yamada#ifdef CONFIG_SYS_MATRIX_MCFG_REMAP
241*62011840SMasahiro Yamada	/* MATRIX_MCFG - REMAP all masters */
242*62011840SMasahiro Yamada	.word AT91_ASM_MATRIX_MCFG
243*62011840SMasahiro Yamada	.word 0x1FF
244*62011840SMasahiro Yamada#endif
245*62011840SMasahiro YamadaSMRDATA2:
246*62011840SMasahiro Yamada	.word 0
247