~funderscore blog cgit wiki get in touch
aboutsummaryrefslogtreecommitdiff
blob: 6b7d3cbc71076ebef4fce8f93fb8410ef714e9cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and
 *		       Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
 *
 * Modified for the at91rm9200dk board by
 * (C) Copyright 2004
 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
 */

#include <config.h>

#if !CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT)

#include <asm/arch/hardware.h>
#include <asm/arch/at91_mc.h>
#include <asm/arch/at91_pmc.h>
#include <asm/arch/at91_pio.h>

#define ARM920T_CONTROL	0xC0000000	/* @ set bit 31 (iA) and 30 (nF) */

_MTEXT_BASE:
#undef START_FROM_MEM
#ifdef START_FROM_MEM
	.word	CONFIG_TEXT_BASE-PHYS_FLASH_1
#else
	.word	CONFIG_TEXT_BASE
#endif

.globl lowlevel_init
lowlevel_init:
	ldr     r1, =AT91_ASM_PMC_MOR
	/* Main oscillator Enable register */
#ifdef CONFIG_SYS_USE_MAIN_OSCILLATOR
	ldr     r0, =0x0000FF01		/* Enable main oscillator */
#else
	ldr     r0, =0x0000FF00		/* Disable main oscillator */
#endif
	str     r0, [r1] /*AT91C_CKGR_MOR] */
	/* Add loop to compensate Main Oscillator startup time */
	ldr     r0, =0x00000010
LoopOsc:
	subs    r0, r0, #1
	bhi     LoopOsc

	/* memory control configuration */
	/* this isn't very elegant, but	 what the heck */
	ldr	r0, =SMRDATA
	ldr	r1, _MTEXT_BASE
	sub	r0, r0, r1
	ldr	r2, =SMRDATAE
	sub	r2, r2, r1
pllloop:
	/* the address */
	ldr	r1, [r0], #4
	/* the value */
	ldr	r3, [r0], #4
	str	r3, [r1]
	cmp	r2, r0
	bne	pllloop
	/* delay - this is all done by guess */
	ldr	r0, =0x00010000
	/* (vs reading PMC_SR for LOCKA, LOCKB ... or MOSCS earlier) */
lock:
	subs	r0, r0, #1
	bhi	lock
	ldr	r0, =SMRDATA1
	ldr	r1, _MTEXT_BASE
	sub	r0, r0, r1
	ldr	r2, =SMRDATA1E
	sub	r2, r2, r1
sdinit:
	/* the address */
	ldr	r1, [r0], #4
	/* the value */
	ldr	r3, [r0], #4
	str	r3, [r1]
	cmp	r2, r0
	bne	sdinit

	/* switch from FastBus to Asynchronous clock mode */
	mrc	p15, 0, r0, c1, c0, 0
	orr	r0, r0, #ARM920T_CONTROL
	mcr	p15, 0, r0, c1, c0, 0

	/* everything is fine now */
	mov	pc, lr

	.ltorg

SMRDATA:
	.word AT91_ASM_MC_EBI_CFG
	.word CONFIG_SYS_EBI_CFGR_VAL
	.word AT91_ASM_MC_SMC_CSR0
	.word CONFIG_SYS_SMC_CSR0_VAL
	.word AT91_ASM_PMC_PLLAR
	.word CFG_SYS_PLLAR_VAL
	.word AT91_ASM_PMC_PLLBR
	.word CONFIG_SYS_PLLBR_VAL
	.word AT91_ASM_PMC_MCKR
	.word CFG_SYS_MCKR_VAL
SMRDATAE:
	/* here there's a delay */
SMRDATA1:
	.word AT91_ASM_PIOC_ASR
	.word CONFIG_SYS_PIOC_ASR_VAL
	.word AT91_ASM_PIOC_BSR
	.word CONFIG_SYS_PIOC_BSR_VAL
	.word AT91_ASM_PIOC_PDR
	.word CFG_SYS_PIOC_PDR_VAL
	.word AT91_ASM_MC_EBI_CSA
	.word CONFIG_SYS_EBI_CSA_VAL
	.word AT91_ASM_MC_SDRAMC_CR
	.word CFG_SYS_SDRC_CR_VAL
	.word AT91_ASM_MC_SDRAMC_MR
	.word CFG_SYS_SDRC_MR_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word AT91_ASM_MC_SDRAMC_MR
	.word CFG_SYS_SDRC_MR_VAL1
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word AT91_ASM_MC_SDRAMC_MR
	.word CFG_SYS_SDRC_MR_VAL2
	.word CFG_SYS_SDRAM1
	.word CFG_SYS_SDRAM_VAL
	.word AT91_ASM_MC_SDRAMC_TR
	.word CFG_SYS_SDRC_TR_VAL
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
	.word AT91_ASM_MC_SDRAMC_MR
	.word CFG_SYS_SDRC_MR_VAL3
	.word CFG_SYS_SDRAM
	.word CFG_SYS_SDRAM_VAL
SMRDATA1E:
	/* SMRDATA1 is 176 bytes long */
#endif /* CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT) */