10c4e840e32668a0c30afd464462f60cf9c96ec7
[oweals/u-boot.git] / board / incaip / memsetup.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
70         li      t1, EBU_MODUL_BASE
71         li      t2, 0xA0000041
72         sw      t2, EBU_ADDSEL0(t1)
73         li      t2, 0xA0800041
74         sw      t2, EBU_ADDSEL2(t1)
75         li      t2, 0xBE0000F1
76         sw      t2, EBU_ADDSEL1(t1)
77
78         li      t3, 100000000
79         beq     a0, t3, 1f
80         nop
81         li      t3, 133000000
82         beq     a0, t3, 2f
83         nop
84         li      t3, 150000000
85         beq     a0, t3, 2f
86         nop
87         b       3f
88         nop
89
90         /* 100 MHz */
91 1:
92         li      t2, 0x8841417D
93         sw      t2, EBU_BUSCON0(t1)
94         sw      t2, EBU_BUSCON2(t1)
95         li      t2, 0x684142BD
96         b       3f
97         sw      t2, EBU_BUSCON1(t1)     /* delay slot */
98
99         /* 133 or 150 MHz */
100 2:
101         li      t2, 0x8841417E
102         sw      t2, EBU_BUSCON0(t1)
103         sw      t2, EBU_BUSCON2(t1)
104         li      t2, 0x684143FD
105         sw      t2, EBU_BUSCON1(t1)
106 3:
107         j       ra
108         nop
109
110         .end    ebu_init
111
112
113 /*
114  * void cgu_init(long)
115  *
116  * a0 has the clock value
117  */
118         .globl  cgu_init
119         .ent    cgu_init
120 cgu_init:
121
122         li      t1, CGU_MODUL_BASE
123
124         li      t3, 100000000
125         beq     a0, t3, 1f
126         nop
127         li      t3, 133000000
128         beq     a0, t3, 2f
129         nop
130         li      t3, 150000000
131         beq     a0, t3, 3f
132         nop
133         b       5f
134         nop
135
136         /* 100 MHz clock */
137 1:
138         li      t2, 0x80000014
139         sw      t2, CGU_DIVCR(t1)
140         li      t2, 0x80000000
141         sw      t2, CGU_MUXCR(t1)
142         li      t2, 0x800B0001
143         b       5f
144         sw      t2, CGU_PLL1CR(t1)      /* delay slot */
145
146         /* 133 MHz clock */
147 2:
148         li      t2, 0x80000054
149         sw      t2, CGU_DIVCR(t1)
150         li      t2, 0x80000000
151         sw      t2, CGU_MUXCR(t1)
152         li      t2, 0x800B0001
153         b       5f
154         sw      t2, CGU_PLL1CR(t1)      /* delay slot */
155
156         /* 150 MHz clock */
157 3:
158         li      t2, 0x80000017
159         sw      t2, CGU_DIVCR(t1)
160         li      t2, 0xC00B0001
161         sw      t2, CGU_PLL1CR(t1)
162         li      t3, 0x80000000
163 4:
164         lw      t2, CGU_PLL1SR(t1)
165         and     t2, t2, t3
166         beq     t2, zero, 4b
167         nop
168         li      t2, 0x80000001
169         sw      t2, CGU_MUXCR(t1)
170 5:
171         j       ra
172         nop
173
174         .end    cgu_init
175
176
177 /*
178  * void sdram_init(long)
179  *
180  * a0 has the clock value
181  */
182         .globl  sdram_init
183         .ent    sdram_init
184 sdram_init:
185
186         li      t1, MC_MODUL_BASE
187
188         /* Disable memory controller before changing any of its registers */
189         sw      zero, MC_CTRLENA(t1)
190
191         li      t2, 100000000
192         beq     a0, t2, 1f
193         nop
194         li      t2, 133000000
195         beq     a0, t2, 2f
196         nop
197         li      t2, 150000000
198         beq     a0, t2, 3f
199         nop
200         b       5f
201         nop
202
203         /* 100 MHz clock */
204 1:
205         /* Set clock ratio (clkrat=1:1, rddel=3) */
206         li      t2, 0x00000003
207         sw      t2, MC_IOGP(t1)
208
209         /* Set sdram refresh rate (4K/64ms @ 100MHz) */
210         li      t2, 0x0000061A
211         b       4f
212         sw      t2, MC_TREFRESH(t1)
213
214         /* 133 MHz clock */
215 2:
216         /* Set clock ratio (clkrat=1:1, rddel=3) */
217         li      t2, 0x00000003
218         sw      t2, MC_IOGP(t1)
219
220         /* Set sdram refresh rate (4K/64ms @ 133MHz) */
221         li      t2, 0x00000822
222         b       4f
223         sw      t2, MC_TREFRESH(t1)
224
225         /* 150 MHz clock */
226 3:
227         /* Set clock ratio (clkrat=3:2, rddel=4) */
228         li      t2, 0x00000014
229         sw      t2, MC_IOGP(t1)
230
231         /* Set sdram refresh rate (4K/64ms @ 150MHz) */
232         li      t2, 0x00000927
233         sw      t2, MC_TREFRESH(t1)
234
235 4:
236         /* Clear Error log registers */
237         sw      zero, MC_ERRCAUSE(t1)
238         sw      zero, MC_ERRADDR(t1)
239
240         /* Clear Power-down registers */
241         sw      zero, MC_SELFRFSH(t1)
242
243         /* Set CAS Latency */
244         li      t2, 0x00000020          /* CL = 2 */
245         sw      t2, MC_MRSCODE(t1)
246
247         /* Set word width to 16 bit */
248         li      t2, 0x2
249         sw      t2, MC_CFGDW(t1)
250
251         /* Set CS0 to SDRAM parameters */
252         li      t2, 0x000014C9
253         sw      t2, MC_CFGPB0(t1)
254
255         /* Set SDRAM latency parameters */
256         li      t2, 0x00026325          /* BC PC100 */
257         sw      t2, MC_LATENCY(t1)
258
259 5:
260         /* Finally enable the controller */
261         li      t2, 0x00000001
262         sw      t2, MC_CTRLENA(t1)
263
264         j       ra
265         nop
266
267         .end    sdram_init
268
269
270         .globl  memsetup
271         .ent    memsetup
272 memsetup:
273
274         /* EBU, CGU and SDRAM Initialization.
275          */
276         li      a0, CPU_CLOCK_RATE
277         move    t0, ra
278
279         /* We rely on the fact that neither ebu_init() nor cgu_init() nor sdram_init()
280          * modify t0 and a0.
281          */
282         bal     cgu_init
283         nop
284         bal     ebu_init
285         nop
286         bal     sdram_init
287         nop
288         move    ra, t0
289
290         j       ra
291         nop
292
293         .end    memsetup