Import upstream u-boot 1.1.4
[u-boot.git] / board / incaip / lowlevel_init.S
1 /*
2  *  Memory sub-system initialization code for INCA-IP development board.
3  *
4  *  Copyright (c) 2003  Wolfgang Denk <wd@denx.de>
5  *
6  * See file CREDITS for list of people who contributed to this
7  * project.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation; either version 2 of
12  * the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
22  * MA 02111-1307 USA
23  */
24
25 #include <config.h>
26 #include <version.h>
27 #include <asm/regdef.h>
28
29
30 #define EBU_MODUL_BASE          0xB8000200
31 #define EBU_CLC(value)          0x0000(value)
32 #define EBU_CON(value)          0x0010(value)
33 #define EBU_ADDSEL0(value)      0x0020(value)
34 #define EBU_ADDSEL1(value)      0x0024(value)
35 #define EBU_ADDSEL2(value)      0x0028(value)
36 #define EBU_BUSCON0(value)      0x0060(value)
37 #define EBU_BUSCON1(value)      0x0064(value)
38 #define EBU_BUSCON2(value)      0x0068(value)
39
40 #define MC_MODUL_BASE           0xBF800000
41 #define MC_ERRCAUSE(value)      0x0100(value)
42 #define MC_ERRADDR(value)       0x0108(value)
43 #define MC_IOGP(value)          0x0800(value)
44 #define MC_SELFRFSH(value)      0x0A00(value)
45 #define MC_CTRLENA(value)       0x1000(value)
46 #define MC_MRSCODE(value)       0x1008(value)
47 #define MC_CFGDW(value)         0x1010(value)
48 #define MC_CFGPB0(value)        0x1018(value)
49 #define MC_LATENCY(value)       0x1038(value)
50 #define MC_TREFRESH(value)      0x1040(value)
51
52 #define CGU_MODUL_BASE          0xBF107000
53 #define CGU_PLL1CR(value)       0x0008(value)
54 #define CGU_DIVCR(value)        0x0010(value)
55 #define CGU_MUXCR(value)        0x0014(value)
56 #define CGU_PLL1SR(value)       0x000C(value)
57
58         .set    noreorder
59
60
61 /*
62  * void ebu_init(long)
63  *
64  * a0 has the clock value we are going to run at
65  */
66         .globl  ebu_init
67         .ent    ebu_init
68 ebu_init:
69 __ebu_init:
70
71         li      t1, EBU_MODUL_BASE
72         li      t2, 0xA0000041
73         sw      t2, EBU_ADDSEL0(t1)
74         li      t2, 0xA0800041
75         sw      t2, EBU_ADDSEL2(t1)
76         li      t2, 0xBE0000F1
77         sw      t2, EBU_ADDSEL1(t1)
78
79         li      t3, 100000000
80         beq     a0, t3, 1f
81         nop
82         li      t3, 133000000
83         beq     a0, t3, 2f
84         nop
85         li      t3, 150000000
86         beq     a0, t3, 2f
87         nop
88         b       3f
89         nop
90
91         /* 100 MHz */
92 1:
93         li      t2, 0x8841417D
94         sw      t2, EBU_BUSCON0(t1)
95         sw      t2, EBU_BUSCON2(t1)
96         li      t2, 0x684142BD
97         b       3f
98         sw      t2, EBU_BUSCON1(t1)     /* delay slot */
99
100         /* 133 or 150 MHz */
101 2:
102         li      t2, 0x8841417E
103         sw      t2, EBU_BUSCON0(t1)
104         sw      t2, EBU_BUSCON2(t1)
105         li      t2, 0x684143FD
106         sw      t2, EBU_BUSCON1(t1)
107 3:
108         j       ra
109         nop
110
111         .end    ebu_init
112
113
114 /*
115  * void cgu_init(long)
116  *
117  * a0 has the clock value
118  */
119         .globl  cgu_init
120         .ent    cgu_init
121 cgu_init:
122 __cgu_init:
123
124         li      t1, CGU_MODUL_BASE
125
126         li      t3, 100000000
127         beq     a0, t3, 1f
128         nop
129         li      t3, 133000000
130         beq     a0, t3, 2f
131         nop
132         li      t3, 150000000
133         beq     a0, t3, 3f
134         nop
135         b       5f
136         nop
137
138         /* 100 MHz clock */
139 1:
140         li      t2, 0x80000014
141         sw      t2, CGU_DIVCR(t1)
142         li      t2, 0x80000000
143         sw      t2, CGU_MUXCR(t1)
144         li      t2, 0x800B0001
145         b       5f
146         sw      t2, CGU_PLL1CR(t1)      /* delay slot */
147
148         /* 133 MHz clock */
149 2:
150         li      t2, 0x80000054
151         sw      t2, CGU_DIVCR(t1)
152         li      t2, 0x80000000
153         sw      t2, CGU_MUXCR(t1)
154         li      t2, 0x800B0001
155         b       5f
156         sw      t2, CGU_PLL1CR(t1)      /* delay slot */
157
158         /* 150 MHz clock */
159 3:
160         li      t2, 0x80000017
161         sw      t2, CGU_DIVCR(t1)
162         li      t2, 0xC00B0001
163         sw      t2, CGU_PLL1CR(t1)
164         li      t3, 0x80000000
165 4:
166         lw      t2, CGU_PLL1SR(t1)
167         and     t2, t2, t3
168         beq     t2, zero, 4b
169         nop
170         li      t2, 0x80000001
171         sw      t2, CGU_MUXCR(t1)
172 5:
173         j       ra
174         nop
175
176         .end    cgu_init
177
178
179 /*
180  * void sdram_init(long)
181  *
182  * a0 has the clock value
183  */
184         .globl  sdram_init
185         .ent    sdram_init
186 sdram_init:
187 __sdram_init:
188
189         li      t1, MC_MODUL_BASE
190
191 #if 0
192         /* Disable memory controller before changing any of its registers */
193         sw      zero, MC_CTRLENA(t1)
194 #endif
195
196         li      t2, 100000000
197         beq     a0, t2, 1f
198         nop
199         li      t2, 133000000
200         beq     a0, t2, 2f
201         nop
202         li      t2, 150000000
203         beq     a0, t2, 3f
204         nop
205         b       5f
206         nop
207
208         /* 100 MHz clock */
209 1:
210         /* Set clock ratio (clkrat=1:1, rddel=3) */
211         li      t2, 0x00000003
212         sw      t2, MC_IOGP(t1)
213
214         /* Set sdram refresh rate (4K/64ms @ 100MHz) */
215         li      t2, 0x0000061A
216         b       4f
217         sw      t2, MC_TREFRESH(t1)
218
219         /* 133 MHz clock */
220 2:
221         /* Set clock ratio (clkrat=1:1, rddel=3) */
222         li      t2, 0x00000003
223         sw      t2, MC_IOGP(t1)
224
225         /* Set sdram refresh rate (4K/64ms @ 133MHz) */
226         li      t2, 0x00000822
227         b       4f
228         sw      t2, MC_TREFRESH(t1)
229
230         /* 150 MHz clock */
231 3:
232         /* Set clock ratio (clkrat=3:2, rddel=4) */
233         li      t2, 0x00000014
234         sw      t2, MC_IOGP(t1)
235
236         /* Set sdram refresh rate (4K/64ms @ 150MHz) */
237         li      t2, 0x00000927
238         sw      t2, MC_TREFRESH(t1)
239
240 4:
241         /* Clear Error log registers */
242         sw      zero, MC_ERRCAUSE(t1)
243         sw      zero, MC_ERRADDR(t1)
244
245         /* Clear Power-down registers */
246         sw      zero, MC_SELFRFSH(t1)
247
248         /* Set CAS Latency */
249         li      t2, 0x00000020          /* CL = 2 */
250         sw      t2, MC_MRSCODE(t1)
251
252         /* Set word width to 16 bit */
253         li      t2, 0x2
254         sw      t2, MC_CFGDW(t1)
255
256         /* Set CS0 to SDRAM parameters */
257         li      t2, 0x000014C9
258         sw      t2, MC_CFGPB0(t1)
259
260         /* Set SDRAM latency parameters */
261         li      t2, 0x00026325          /* BC PC100 */
262         sw      t2, MC_LATENCY(t1)
263
264 5:
265         /* Finally enable the controller */
266         li      t2, 0x00000001
267         sw      t2, MC_CTRLENA(t1)
268
269         j       ra
270         nop
271
272         .end    sdram_init
273
274
275         .globl  lowlevel_init
276         .ent    lowlevel_init
277 lowlevel_init:
278
279         /* EBU, CGU and SDRAM Initialization.
280          */
281         li      a0, CPU_CLOCK_RATE
282         move    t0, ra
283
284         /* We rely on the fact that neither ebu_init() nor cgu_init() nor sdram_init()
285          * modify t0 and a0.
286          */
287         bal     __cgu_init
288         nop
289         bal     __ebu_init
290         nop
291         bal     __sdram_init
292         nop
293         move    ra, t0
294
295         j       ra
296         nop
297
298         .end    lowlevel_init