2 * This was originally from the Lubbock u-boot port.
4 * Most of this taken from Redboot hal_platform_setup.h with cleanup
6 * NOTE: I haven't clean this up considerably, just enough to get it
7 * running. See hal_platform_setup.h for the source. See
8 * board/cradle/lowlevel_init.S for another PXA250 setup that is
11 * See file CREDITS for list of people who contributed to this
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License as
16 * published by the Free Software Foundation; either version 2 of
17 * the License, or (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
32 #include <asm/arch/pxa-regs.h>
34 /* wait for coprocessor write complete */
36 mrc p15,0,\reg,c2,c0,0
49 /* Set up GPIO pins first ----------------------------------------- */
52 ldr r1, =CONFIG_SYS_GPSR0_VAL
56 ldr r1, =CONFIG_SYS_GPSR1_VAL
60 ldr r1, =CONFIG_SYS_GPSR2_VAL
64 ldr r1, =CONFIG_SYS_GPSR3_VAL
68 ldr r1, =CONFIG_SYS_GPCR0_VAL
72 ldr r1, =CONFIG_SYS_GPCR1_VAL
76 ldr r1, =CONFIG_SYS_GPCR2_VAL
80 ldr r1, =CONFIG_SYS_GPCR3_VAL
84 ldr r1, =CONFIG_SYS_GRER0_VAL
88 ldr r1, =CONFIG_SYS_GRER1_VAL
92 ldr r1, =CONFIG_SYS_GRER2_VAL
96 ldr r1, =CONFIG_SYS_GRER3_VAL
100 ldr r1, =CONFIG_SYS_GFER0_VAL
104 ldr r1, =CONFIG_SYS_GFER1_VAL
108 ldr r1, =CONFIG_SYS_GFER2_VAL
112 ldr r1, =CONFIG_SYS_GFER3_VAL
116 ldr r1, =CONFIG_SYS_GPDR0_VAL
120 ldr r1, =CONFIG_SYS_GPDR1_VAL
124 ldr r1, =CONFIG_SYS_GPDR2_VAL
128 ldr r1, =CONFIG_SYS_GPDR3_VAL
132 ldr r1, =CONFIG_SYS_GAFR0_L_VAL
136 ldr r1, =CONFIG_SYS_GAFR0_U_VAL
140 ldr r1, =CONFIG_SYS_GAFR1_L_VAL
144 ldr r1, =CONFIG_SYS_GAFR1_U_VAL
148 ldr r1, =CONFIG_SYS_GAFR2_L_VAL
152 ldr r1, =CONFIG_SYS_GAFR2_U_VAL
156 ldr r1, =CONFIG_SYS_GAFR3_L_VAL
160 ldr r1, =CONFIG_SYS_GAFR3_U_VAL
163 ldr r0, =PSSR /* enable GPIO pins */
164 ldr r1, =CONFIG_SYS_PSSR_VAL
167 /* ---------------------------------------------------------------- */
168 /* Enable memory interface */
170 /* The sequence below is based on the recommended init steps */
171 /* detailed in the Intel PXA250 Operating Systems Developers Guide, */
173 /* ---------------------------------------------------------------- */
175 /* ---------------------------------------------------------------- */
176 /* Step 1: Wait for at least 200 microsedonds to allow internal */
177 /* clocks to settle. Only necessary after hard reset... */
178 /* FIXME: can be optimized later */
179 /* ---------------------------------------------------------------- */
181 ldr r3, =OSCR /* reset the OS Timer Count to zero */
184 ldr r4, =0x300 /* really 0x2E1 is about 200usec, */
185 /* so 0x300 should be plenty */
193 ldr r1, =MEMC_BASE /* get memory controller base addr. */
195 /* ---------------------------------------------------------------- */
196 /* Step 2a: Initialize Asynchronous static memory controller */
197 /* ---------------------------------------------------------------- */
199 /* MSC registers: timing, bus width, mem type */
202 ldr r2, =CONFIG_SYS_MSC0_VAL
203 str r2, [r1, #MSC0_OFFSET]
204 ldr r2, [r1, #MSC0_OFFSET] /* read back to ensure */
205 /* that data latches */
207 ldr r2, =CONFIG_SYS_MSC1_VAL
208 str r2, [r1, #MSC1_OFFSET]
209 ldr r2, [r1, #MSC1_OFFSET]
212 ldr r2, =CONFIG_SYS_MSC2_VAL
213 str r2, [r1, #MSC2_OFFSET]
214 ldr r2, [r1, #MSC2_OFFSET]
216 /* ---------------------------------------------------------------- */
217 /* Step 2b: Initialize Card Interface */
218 /* ---------------------------------------------------------------- */
220 /* MECR: Memory Expansion Card Register */
221 ldr r2, =CONFIG_SYS_MECR_VAL
222 str r2, [r1, #MECR_OFFSET]
223 ldr r2, [r1, #MECR_OFFSET]
225 /* MCMEM0: Card Interface slot 0 timing */
226 ldr r2, =CONFIG_SYS_MCMEM0_VAL
227 str r2, [r1, #MCMEM0_OFFSET]
228 ldr r2, [r1, #MCMEM0_OFFSET]
230 /* MCMEM1: Card Interface slot 1 timing */
231 ldr r2, =CONFIG_SYS_MCMEM1_VAL
232 str r2, [r1, #MCMEM1_OFFSET]
233 ldr r2, [r1, #MCMEM1_OFFSET]
235 /* MCATT0: Card Interface Attribute Space Timing, slot 0 */
236 ldr r2, =CONFIG_SYS_MCATT0_VAL
237 str r2, [r1, #MCATT0_OFFSET]
238 ldr r2, [r1, #MCATT0_OFFSET]
240 /* MCATT1: Card Interface Attribute Space Timing, slot 1 */
241 ldr r2, =CONFIG_SYS_MCATT1_VAL
242 str r2, [r1, #MCATT1_OFFSET]
243 ldr r2, [r1, #MCATT1_OFFSET]
245 /* MCIO0: Card Interface I/O Space Timing, slot 0 */
246 ldr r2, =CONFIG_SYS_MCIO0_VAL
247 str r2, [r1, #MCIO0_OFFSET]
248 ldr r2, [r1, #MCIO0_OFFSET]
250 /* MCIO1: Card Interface I/O Space Timing, slot 1 */
251 ldr r2, =CONFIG_SYS_MCIO1_VAL
252 str r2, [r1, #MCIO1_OFFSET]
253 ldr r2, [r1, #MCIO1_OFFSET]
255 /* ---------------------------------------------------------------- */
256 /* Step 2c: Write FLYCNFG FIXME: what's that??? */
257 /* ---------------------------------------------------------------- */
258 ldr r2, =CONFIG_SYS_FLYCNFG_VAL
259 str r2, [r1, #FLYCNFG_OFFSET]
260 str r2, [r1, #FLYCNFG_OFFSET]
262 /* ---------------------------------------------------------------- */
263 /* Step 2d: Initialize Timing for Sync Memory (SDCLK0) */
264 /* ---------------------------------------------------------------- */
266 /* Before accessing MDREFR we need a valid DRI field, so we set */
267 /* this to power on defaults + DRI field. */
269 ldr r4, [r1, #MDREFR_OFFSET]
273 ldr r3, =CONFIG_SYS_MDREFR_VAL
277 str r4, [r1, #MDREFR_OFFSET] /* write back MDREFR */
279 orr r4, r4, #MDREFR_K0RUN
280 orr r4, r4, #MDREFR_K0DB4
281 orr r4, r4, #MDREFR_K0FREE
282 orr r4, r4, #MDREFR_K0DB2
283 orr r4, r4, #MDREFR_K1DB2
284 bic r4, r4, #MDREFR_K1FREE
285 bic r4, r4, #MDREFR_K2FREE
287 str r4, [r1, #MDREFR_OFFSET] /* write back MDREFR */
288 ldr r4, [r1, #MDREFR_OFFSET]
290 /* Note: preserve the mdrefr value in r4 */
293 /* ---------------------------------------------------------------- */
294 /* Step 3: Initialize Synchronous Static Memory (Flash/Peripherals) */
295 /* ---------------------------------------------------------------- */
297 /* Initialize SXCNFG register. Assert the enable bits */
299 /* Write SXMRS to cause an MRS command to all enabled banks of */
300 /* synchronous static memory. Note that SXLCR need not be written */
303 ldr r2, =CONFIG_SYS_SXCNFG_VAL
304 str r2, [r1, #SXCNFG_OFFSET]
306 /* ---------------------------------------------------------------- */
307 /* Step 4: Initialize SDRAM */
308 /* ---------------------------------------------------------------- */
310 bic r4, r4, #(MDREFR_K2FREE |MDREFR_K1FREE | MDREFR_K0FREE)
312 orr r4, r4, #MDREFR_K1RUN
313 bic r4, r4, #MDREFR_K2DB2
314 str r4, [r1, #MDREFR_OFFSET]
315 ldr r4, [r1, #MDREFR_OFFSET]
317 bic r4, r4, #MDREFR_SLFRSH
318 str r4, [r1, #MDREFR_OFFSET]
319 ldr r4, [r1, #MDREFR_OFFSET]
321 orr r4, r4, #MDREFR_E1PIN
322 str r4, [r1, #MDREFR_OFFSET]
323 ldr r4, [r1, #MDREFR_OFFSET]
329 /* Step 4d: write MDCNFG with MDCNFG:DEx deasserted (set to 0), to */
330 /* configure but not enable each SDRAM partition pair. */
332 ldr r4, =CONFIG_SYS_MDCNFG_VAL
333 bic r4, r4, #(MDCNFG_DE0|MDCNFG_DE1)
334 bic r4, r4, #(MDCNFG_DE2|MDCNFG_DE3)
336 str r4, [r1, #MDCNFG_OFFSET] /* write back MDCNFG */
337 ldr r4, [r1, #MDCNFG_OFFSET]
340 /* Step 4e: Wait for the clock to the SDRAMs to stabilize, */
343 ldr r3, =OSCR /* reset the OS Timer Count to zero */
346 ldr r4, =0x300 /* really 0x2E1 is about 200usec, */
347 /* so 0x300 should be plenty */
354 /* Step 4f: Trigger a number (usually 8) refresh cycles by */
355 /* attempting non-burst read or write accesses to disabled */
356 /* SDRAM, as commonly specified in the power up sequence */
357 /* documented in SDRAM data sheets. The address(es) used */
358 /* for this purpose must not be cacheable. */
360 ldr r3, =CONFIG_SYS_DRAM_BASE
371 /* Step 4g: Write MDCNFG with enable bits asserted */
372 /* (MDCNFG:DEx set to 1). */
374 ldr r3, [r1, #MDCNFG_OFFSET]
376 orr r3, r3, #MDCNFG_DE0
377 str r3, [r1, #MDCNFG_OFFSET]
380 /* Step 4h: Write MDMRS. */
382 ldr r2, =CONFIG_SYS_MDMRS_VAL
383 str r2, [r1, #MDMRS_OFFSET]
386 ldr r3, [r1, #MDREFR_OFFSET]
387 orr r3, r3, #MDREFR_APD
388 str r3, [r1, #MDREFR_OFFSET]
390 /* We are finished with Intel's memory controller initialisation */
396 bl initPXAvoltage /* In case the board is rebooting with a */
397 mov lr, r10 /* low voltage raise it up to a good one. */
404 /* Are we waking from sleep? */
407 and r1, r1, #(RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR)
417 /* if so, resume at PSPR */
422 /* ---------------------------------------------------------------- */
423 /* Disable (mask) all interrupts at interrupt controller */
424 /* ---------------------------------------------------------------- */
428 mov r1, #0 /* clear int. level register (IRQ, not FIQ) */
432 ldr r2, =ICMR /* mask all interrupts at the controller */
435 /* ---------------------------------------------------------------- */
436 /* Clock initialisation */
437 /* ---------------------------------------------------------------- */
441 /* Disable the peripheral clocks, and set the core clock frequency */
443 /* Turn Off on-chip peripheral clocks (except for memory) */
444 /* for re-configuration. */
446 ldr r2, =CONFIG_SYS_CKEN
449 /* ... and write the core clock config register */
450 ldr r2, =CONFIG_SYS_CCCR
454 /* Turn on turbo mode */
455 mrc p14, 0, r2, c6, c0, 0
456 orr r2, r2, #0xB /* Turbo, Fast-Bus, Freq change**/
457 mcr p14, 0, r2, c6, c0, 0
459 /* Re-write MDREFR */
461 ldr r2, [r1, #MDREFR_OFFSET]
462 str r2, [r1, #MDREFR_OFFSET]
464 /* enable the 32Khz oscillator for RTC and PowerManager */
469 /* NOTE: spin here until OSCC.OOK get set, meaning the PLL */
476 #error "RTC not defined"
479 /* Interrupt init: Mask all interrupts */
480 ldr r0, =ICMR /* enable no sources */
486 /*Disable software and data breakpoints */
488 mcr p15,0,r0,c14,c8,0 /* ibcr0 */
489 mcr p15,0,r0,c14,c9,0 /* ibcr1 */
490 mcr p15,0,r0,c14,c4,0 /* dbcon */
492 /*Enable all debug functionality */
494 mcr p14,0,r0,c10,c0,0 /* dcsr */
497 /* ---------------------------------------------------------------- */
498 /* End lowlevel_init */
499 /* ---------------------------------------------------------------- */