]> git.ipfire.org Git - people/ms/u-boot.git/blame - arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
Add GPL-2.0+ SPDX-License-Identifier to source files
[people/ms/u-boot.git] / arch / arm / cpu / arm920t / ks8695 / lowlevel_init.S
CommitLineData
3a574cbe
WD
1/*
2 * lowlevel_init.S - basic hardware initialization for the KS8695 CPU
3 *
4 * Copyright (c) 2004-2005, Greg Ungerer <greg.ungerer@opengear.com>
5 *
1a459660 6 * SPDX-License-Identifier: GPL-2.0+
3a574cbe
WD
7 */
8
9#include <config.h>
10#include <version.h>
11#include <asm/arch/platform.h>
12
13#ifndef CONFIG_SKIP_LOWLEVEL_INIT
14
15/*
16 *************************************************************************
17 *
18 * Handy dandy macros
19 *
20 *************************************************************************
21 */
22
23/* Delay a bit */
24.macro DELAY_FOR cycles, reg0
25 ldr \reg0, =\cycles
26 subs \reg0, \reg0, #1
27 subne pc, pc, #0xc
28.endm
29
30/*
31 *************************************************************************
32 *
33 * Some local storage.
34 *
35 *************************************************************************
36 */
37
38/* Should we boot with an interactive console or not */
39.globl serial_console
40
41/*
42 *************************************************************************
43 *
44 * Raw hardware initialization code. The important thing is to get
45 * SDRAM setup and running. We do some other basic things here too,
46 * like getting the PLL set for high speed, and init the LEDs.
47 *
48 *************************************************************************
49 */
50
51.globl lowlevel_init
52lowlevel_init:
53
54#if DEBUG
55 /*
56 * enable UART for early debug trace
57 */
58 ldr r1, =(KS8695_IO_BASE+KS8695_UART_DIVISOR)
bff679dd
YV
59 mov r2, #((25000000+CONFIG_BAUDRATE/2) / CONFIG_BAUDRATE)
60 str r2, [r1]
3a574cbe 61 ldr r1, =(KS8695_IO_BASE+KS8695_UART_LINE_CTRL)
bff679dd 62 mov r2, #KS8695_UART_LINEC_WLEN8
3a574cbe
WD
63 str r2, [r1] /* 8 data bits, no parity, 1 stop */
64 ldr r1, =(KS8695_IO_BASE+KS8695_UART_TX_HOLDING)
65 mov r2, #0x41
66 str r2, [r1] /* write 'A' */
67#endif
68#if DEBUG
69 ldr r1, =(KS8695_IO_BASE+KS8695_UART_TX_HOLDING)
70 mov r2, #0x42
71 str r2, [r1]
72#endif
73
74 /*
75 * remap the memory and flash regions. we want to end up with
76 * ram from address 0, and flash at 32MB.
77 */
78 ldr r1, =(KS8695_IO_BASE+KS8695_MEM_CTRL0)
79 ldr r2, =0xbfc00040
80 str r2, [r1] /* large flash map */
81 ldr pc, =(highflash+0x02000000-0x00f00000) /* jump to high flash address */
82highflash:
83 ldr r2, =0x8fe00040
84 str r2, [r1] /* remap flash range */
85
86 /*
87 * remap the second select region to the 4MB immediately after
88 * the first region. This way if you have a larger flash (say 8Mb)
89 * then you can have it all mapped nicely. Has no effect if you
90 * only have a 4Mb or smaller flash.
91 */
92 ldr r1, =(KS8695_IO_BASE+KS8695_MEM_CTRL1)
93 ldr r2, =0x9fe40040
94 str r2, [r1] /* remap flash2 region, contiguous */
95 ldr r1, =(KS8695_IO_BASE+KS8695_MEM_GENERAL)
96 ldr r2, =0x30000005
97 str r2, [r1] /* enable both flash selects */
98
99#ifdef CONFIG_CM41xx
100 /*
101 * map the second flash chip, using the external IO lines.
102 */
103 ldr r1, =(KS8695_IO_BASE+KS8695_IO_CTRL0)
104 ldr r2, =0xafe80b6d
105 str r2, [r1] /* remap io0 region, contiguous */
106 ldr r1, =(KS8695_IO_BASE+KS8695_IO_CTRL1)
107 ldr r2, =0xbfec0b6d
108 str r2, [r1] /* remap io1 region, contiguous */
109 ldr r1, =(KS8695_IO_BASE+KS8695_MEM_GENERAL)
110 ldr r2, =0x30050005
111 str r2, [r1] /* enable second flash */
112#endif
113
114 /*
115 * before relocating, we have to setup RAM timing
116 */
117 ldr r1, =(KS8695_IO_BASE+KS8695_SDRAM_CTRL0)
118#if (PHYS_SDRAM_1_SIZE == 0x02000000)
119 ldr r2, =0x7fc0000e /* 32MB */
120#else
121 ldr r2, =0x3fc0000e /* 16MB */
122#endif
123 str r2, [r1] /* configure sdram bank0 setup */
124 ldr r1, =(KS8695_IO_BASE+KS8695_SDRAM_CTRL1)
125 mov r2, #0
126 str r2, [r1] /* configure sdram bank1 setup */
127
128 ldr r1, =(KS8695_IO_BASE+KS8695_SDRAM_GENERAL)
129 ldr r2, =0x0000000a
130 str r2, [r1] /* set RAS/CAS timing */
131
132 ldr r1, =(KS8695_IO_BASE+KS8695_SDRAM_BUFFER)
133 ldr r2, =0x00030000
134 str r2, [r1] /* send NOP command */
135 DELAY_FOR 0x100, r0
136 ldr r2, =0x00010000
137 str r2, [r1] /* send PRECHARGE-ALL */
138 DELAY_FOR 0x100, r0
139
140 ldr r1, =(KS8695_IO_BASE+KS8695_SDRAM_REFRESH)
141 ldr r2, =0x00000020
142 str r2, [r1] /* set for fast refresh */
143 DELAY_FOR 0x100, r0
144 ldr r2, =0x00000190
145 str r2, [r1] /* set normal refresh timing */
146
147 ldr r1, =(KS8695_IO_BASE+KS8695_SDRAM_BUFFER)
148 ldr r2, =0x00020033
149 str r2, [r1] /* send mode command */
150 DELAY_FOR 0x100, r0
151 ldr r2, =0x01f00000
152 str r2, [r1] /* enable sdram fifos */
153
154 /*
155 * set pll to top speed
156 */
157 ldr r1, =(KS8695_IO_BASE+KS8695_SYSTEN_BUS_CLOCK)
158 mov r2, #0
159 str r2, [r1] /* set pll clock to 166MHz */
160
161 ldr r1, =(KS8695_IO_BASE+KS8695_SWITCH_CTRL0)
162 ldr r2, [r1] /* Get switch ctrl0 register */
163 and r2, r2, #0x0fc00000 /* Mask out LED control bits */
164 orr r2, r2, #0x01800000 /* Set Link/activity/speed actions */
165 str r2, [r1]
166
167#ifdef CONFIG_CM4008
168 ldr r1, =(KS8695_IO_BASE+KS8695_GPIO_MODE)
169 ldr r2, =0x0000fe30
170 str r2, [r1] /* enable LED's as outputs */
171 ldr r1, =(KS8695_IO_BASE+KS8695_GPIO_DATA)
172 ldr r2, =0x0000fe20
173 str r2, [r1] /* turn on power LED */
174#endif
175#if defined(CONFIG_CM4008) || defined(CONFIG_CM41xx)
176 ldr r2, [r1] /* get current GPIO input data */
177 tst r2, #0x8 /* check if "erase" depressed */
178 beq nobutton
179 mov r2, #0 /* be quiet on boot, no console */
180 ldr r1, =serial_console
181 str r2, [r1]
182nobutton:
183#endif
184
185 add lr, lr, #0x02000000 /* flash is now mapped high */
186 add ip, ip, #0x02000000 /* this is a hack */
187 mov pc, lr /* all done, return */
188
189#endif /* CONFIG_SKIP_LOWLEVEL_INIT */