blob: 14d738aa1a772b596419028db3cb3b23d714bad0 [file] [log] [blame]
wdenkbb1b8262003-03-27 12:09:35 +00001/*
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
wdenk1ebf41e2004-01-02 14:00:00 +000016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wdenkbb1b8262003-03-27 12:09:35 +000017 * 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
wdenk1ebf41e2004-01-02 14:00:00 +000030#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)
wdenkbb1b8262003-03-27 12:09:35 +000039
wdenk1ebf41e2004-01-02 14:00:00 +000040#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)
wdenkbb1b8262003-03-27 12:09:35 +000051
wdenk1ebf41e2004-01-02 14:00:00 +000052#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)
wdenkbb1b8262003-03-27 12:09:35 +000057
wdenk1ebf41e2004-01-02 14:00:00 +000058 .set noreorder
wdenkbb1b8262003-03-27 12:09:35 +000059
wdenkbb1b8262003-03-27 12:09:35 +000060
wdenk67f13362003-12-27 19:24:54 +000061/*
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
68ebu_init:
Wolfgang Denkf6a692b2005-12-04 00:40:34 +010069__ebu_init:
wdenkbb1b8262003-03-27 12:09:35 +000070
wdenk67f13362003-12-27 19:24:54 +000071 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)
wdenkbb1b8262003-03-27 12:09:35 +000078
wdenk67f13362003-12-27 19:24:54 +000079 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
wdenkbb1b8262003-03-27 12:09:35 +000090
wdenk67f13362003-12-27 19:24:54 +000091 /* 100 MHz */
921:
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 */
1012:
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)
1073:
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
121cgu_init:
Wolfgang Denkf6a692b2005-12-04 00:40:34 +0100122__cgu_init:
wdenk67f13362003-12-27 19:24:54 +0000123
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 */
1391:
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 */
1492:
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 */
1593:
160 li t2, 0x80000017
161 sw t2, CGU_DIVCR(t1)
162 li t2, 0xC00B0001
163 sw t2, CGU_PLL1CR(t1)
164 li t3, 0x80000000
1654:
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)
1725:
173 j ra
174 nop
175
176 .end cgu_init
wdenkbb1b8262003-03-27 12:09:35 +0000177
wdenkbb1b8262003-03-27 12:09:35 +0000178
wdenk433feff2004-01-29 09:22:58 +0000179/*
180 * void sdram_init(long)
181 *
182 * a0 has the clock value
183 */
184 .globl sdram_init
185 .ent sdram_init
186sdram_init:
Wolfgang Denkf6a692b2005-12-04 00:40:34 +0100187__sdram_init:
wdenk67f13362003-12-27 19:24:54 +0000188
wdenk433feff2004-01-29 09:22:58 +0000189 li t1, MC_MODUL_BASE
wdenk67f13362003-12-27 19:24:54 +0000190
wdenk4dd56e52004-02-20 22:02:48 +0000191#if 0
wdenk433feff2004-01-29 09:22:58 +0000192 /* Disable memory controller before changing any of its registers */
193 sw zero, MC_CTRLENA(t1)
wdenk4dd56e52004-02-20 22:02:48 +0000194#endif
wdenk433feff2004-01-29 09:22:58 +0000195
196 li t2, 100000000
197 beq a0, t2, 1f
wdenk67f13362003-12-27 19:24:54 +0000198 nop
wdenk433feff2004-01-29 09:22:58 +0000199 li t2, 133000000
200 beq a0, t2, 2f
wdenk67f13362003-12-27 19:24:54 +0000201 nop
wdenk433feff2004-01-29 09:22:58 +0000202 li t2, 150000000
203 beq a0, t2, 3f
204 nop
205 b 5f
206 nop
wdenkbb1b8262003-03-27 12:09:35 +0000207
wdenk433feff2004-01-29 09:22:58 +0000208 /* 100 MHz clock */
2091:
210 /* Set clock ratio (clkrat=1:1, rddel=3) */
211 li t2, 0x00000003
212 sw t2, MC_IOGP(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000213
wdenk433feff2004-01-29 09:22:58 +0000214 /* 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 */
2202:
221 /* Set clock ratio (clkrat=1:1, rddel=3) */
222 li t2, 0x00000003
223 sw t2, MC_IOGP(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000224
wdenk433feff2004-01-29 09:22:58 +0000225 /* 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 */
2313:
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
2404:
241 /* Clear Error log registers */
242 sw zero, MC_ERRCAUSE(t1)
243 sw zero, MC_ERRADDR(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000244
245 /* Clear Power-down registers */
wdenk433feff2004-01-29 09:22:58 +0000246 sw zero, MC_SELFRFSH(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000247
248 /* Set CAS Latency */
wdenk433feff2004-01-29 09:22:58 +0000249 li t2, 0x00000020 /* CL = 2 */
250 sw t2, MC_MRSCODE(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000251
252 /* Set word width to 16 bit */
wdenk433feff2004-01-29 09:22:58 +0000253 li t2, 0x2
254 sw t2, MC_CFGDW(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000255
256 /* Set CS0 to SDRAM parameters */
wdenk433feff2004-01-29 09:22:58 +0000257 li t2, 0x000014C9
258 sw t2, MC_CFGPB0(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000259
260 /* Set SDRAM latency parameters */
wdenk433feff2004-01-29 09:22:58 +0000261 li t2, 0x00026325 /* BC PC100 */
262 sw t2, MC_LATENCY(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000263
wdenk433feff2004-01-29 09:22:58 +00002645:
wdenkbb1b8262003-03-27 12:09:35 +0000265 /* Finally enable the controller */
wdenk433feff2004-01-29 09:22:58 +0000266 li t2, 0x00000001
267 sw t2, MC_CTRLENA(t1)
wdenkbb1b8262003-03-27 12:09:35 +0000268
269 j ra
270 nop
wdenk433feff2004-01-29 09:22:58 +0000271
272 .end sdram_init
273
274
wdenk336b2bc2005-04-02 23:52:25 +0000275 .globl lowlevel_init
276 .ent lowlevel_init
277lowlevel_init:
wdenk433feff2004-01-29 09:22:58 +0000278
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 */
Wolfgang Denkf6a692b2005-12-04 00:40:34 +0100287 bal __cgu_init
wdenk433feff2004-01-29 09:22:58 +0000288 nop
Wolfgang Denkf6a692b2005-12-04 00:40:34 +0100289 bal __ebu_init
wdenk433feff2004-01-29 09:22:58 +0000290 nop
Wolfgang Denkf6a692b2005-12-04 00:40:34 +0100291 bal __sdram_init
wdenk433feff2004-01-29 09:22:58 +0000292 nop
293 move ra, t0
294
295 j ra
296 nop
297
wdenk336b2bc2005-04-02 23:52:25 +0000298 .end lowlevel_init