blob: 197b8360677231e9436b1a619537c338180c3c36 [file] [log] [blame]
Aubrey Li10ebdd92007-03-19 01:24:52 +08001#define ASSEMBLY
2
3#include <linux/config.h>
4#include <config.h>
5#include <asm/blackfin.h>
6#include <asm/mem_init.h>
Mike Frysinger66c4cf42008-02-04 19:26:55 -05007#include <asm/mach-common/bits/bootrom.h>
8#include <asm/mach-common/bits/ebiu.h>
9#include <asm/mach-common/bits/pll.h>
10#include <asm/mach-common/bits/uart.h>
Aubrey Li10ebdd92007-03-19 01:24:52 +080011.global init_sdram;
12
13#if (BFIN_BOOT_MODE != BF537_UART_BOOT)
14#if (CONFIG_CCLK_DIV == 1)
15#define CONFIG_CCLK_ACT_DIV CCLK_DIV1
16#endif
17#if (CONFIG_CCLK_DIV == 2)
18#define CONFIG_CCLK_ACT_DIV CCLK_DIV2
19#endif
20#if (CONFIG_CCLK_DIV == 4)
21#define CONFIG_CCLK_ACT_DIV CCLK_DIV4
22#endif
23#if (CONFIG_CCLK_DIV == 8)
24#define CONFIG_CCLK_ACT_DIV CCLK_DIV8
25#endif
26#ifndef CONFIG_CCLK_ACT_DIV
27#define CONFIG_CCLK_ACT_DIV CONFIG_CCLK_DIV_not_defined_properly
28#endif
29#endif
30
31init_sdram:
32 [--SP] = ASTAT;
33 [--SP] = RETS;
34 [--SP] = (R7:0);
35 [--SP] = (P5:0);
36
37#if (BFIN_BOOT_MODE == BF537_SPI_MASTER_BOOT)
38 p0.h = hi(SIC_IWR);
39 p0.l = lo(SIC_IWR);
40 r0.l = 0x1;
41 w[p0] = r0.l;
42 SSYNC;
43
44 p0.h = hi(SPI_BAUD);
45 p0.l = lo(SPI_BAUD);
46 r0.l = CONFIG_SPI_BAUD_INITBLOCK;
47 w[p0] = r0.l;
48 SSYNC;
49#endif
50
51#if (BFIN_BOOT_MODE != BF537_UART_BOOT)
52
53#ifdef CONFIG_BF537
54 /* Enable PHY CLK buffer output */
55 p0.h = hi(VR_CTL);
56 p0.l = lo(VR_CTL);
57 r0.l = w[p0];
58 bitset(r0, 14);
59 w[p0] = r0.l;
60 ssync;
61#endif
62 /*
63 * PLL_LOCKCNT - how many SCLK Cycles to delay while PLL becomes stable
64 */
65 p0.h = hi(PLL_LOCKCNT);
66 p0.l = lo(PLL_LOCKCNT);
67 r0 = 0x300(Z);
68 w[p0] = r0.l;
69 ssync;
70
71 /*
72 * Put SDRAM in self-refresh, incase anything is running
73 */
74 P2.H = hi(EBIU_SDGCTL);
75 P2.L = lo(EBIU_SDGCTL);
76 R0 = [P2];
77 BITSET (R0, 24);
78 [P2] = R0;
79 SSYNC;
80
81 /*
82 * Set PLL_CTL with the value that we calculate in R0
83 * - [14:09] = MSEL[5:0] : CLKIN / VCO multiplication factors
84 * - [8] = BYPASS : BYPASS the PLL, run CLKIN into CCLK/SCLK
85 * - [7] = output delay (add 200ps of delay to mem signals)
86 * - [6] = input delay (add 200ps of input delay to mem signals)
87 * - [5] = PDWN : 1=All Clocks off
88 * - [3] = STOPCK : 1=Core Clock off
89 * - [1] = PLL_OFF : 1=Disable Power to PLL
90 * - [0] = DF : 1=Pass CLKIN/2 to PLL / 0=Pass CLKIN to PLL
91 * all other bits set to zero
92 */
93
94 r0 = CONFIG_VCO_MULT & 63; /* Load the VCO multiplier */
95 r0 = r0 << 9; /* Shift it over */
96 r1 = CONFIG_CLKIN_HALF; /* Do we need to divide CLKIN by 2?*/
97 r0 = r1 | r0;
98 r1 = CONFIG_PLL_BYPASS; /* Bypass the PLL? */
99 r1 = r1 << 8; /* Shift it over */
100 r0 = r1 | r0; /* add them all together */
101
102 p0.h = hi(PLL_CTL);
103 p0.l = lo(PLL_CTL); /* Load the address */
104 cli r2; /* Disable interrupts */
105 ssync;
106 w[p0] = r0.l; /* Set the value */
107 idle; /* Wait for the PLL to stablize */
108 sti r2; /* Enable interrupts */
109
110check_again:
111 p0.h = hi(PLL_STAT);
112 p0.l = lo(PLL_STAT);
113 R0 = W[P0](Z);
114 CC = BITTST(R0,5);
115 if ! CC jump check_again;
116
117 /* Configure SCLK & CCLK Dividers */
118 r0 = (CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
119 p0.h = hi(PLL_DIV);
120 p0.l = lo(PLL_DIV);
121 w[p0] = r0.l;
122 ssync;
123#endif
124
125 /*
126 * We now are running at speed, time to set the Async mem bank wait states
127 * This will speed up execution, since we are normally running from FLASH.
128 */
129
130 p2.h = (EBIU_AMBCTL1 >> 16);
131 p2.l = (EBIU_AMBCTL1 & 0xFFFF);
132 r0.h = (AMBCTL1VAL >> 16);
133 r0.l = (AMBCTL1VAL & 0xFFFF);
134 [p2] = r0;
135 ssync;
136
137 p2.h = (EBIU_AMBCTL0 >> 16);
138 p2.l = (EBIU_AMBCTL0 & 0xFFFF);
139 r0.h = (AMBCTL0VAL >> 16);
140 r0.l = (AMBCTL0VAL & 0xFFFF);
141 [p2] = r0;
142 ssync;
143
144 p2.h = (EBIU_AMGCTL >> 16);
145 p2.l = (EBIU_AMGCTL & 0xffff);
146 r0 = AMGCTLVAL;
147 w[p2] = r0;
148 ssync;
149
150 /*
151 * Now, Initialize the SDRAM,
152 * start with the SDRAM Refresh Rate Control Register
153 */
154 p0.l = lo(EBIU_SDRRC);
155 p0.h = hi(EBIU_SDRRC);
156 r0 = mem_SDRRC;
157 w[p0] = r0.l;
158 ssync;
159
160 /*
161 * SDRAM Memory Bank Control Register - bank specific parameters
162 */
163 p0.l = (EBIU_SDBCTL & 0xFFFF);
164 p0.h = (EBIU_SDBCTL >> 16);
165 r0 = mem_SDBCTL;
166 w[p0] = r0.l;
167 ssync;
168
169 /*
170 * SDRAM Global Control Register - global programmable parameters
171 * Disable self-refresh
172 */
173 P2.H = hi(EBIU_SDGCTL);
174 P2.L = lo(EBIU_SDGCTL);
175 R0 = [P2];
176 BITCLR (R0, 24);
177
178 /*
179 * Check if SDRAM is already powered up, if it is, enable self-refresh
180 */
181 p0.h = hi(EBIU_SDSTAT);
182 p0.l = lo(EBIU_SDSTAT);
183 r2.l = w[p0];
184 cc = bittst(r2,3);
185 if !cc jump skip;
186 NOP;
187 BITSET (R0, 23);
188skip:
189 [P2] = R0;
190 SSYNC;
191
192 /* Write in the new value in the register */
193 R0.L = lo(mem_SDGCTL);
194 R0.H = hi(mem_SDGCTL);
195 [P2] = R0;
196 SSYNC;
197 nop;
198
199 (P5:0) = [SP++];
200 (R7:0) = [SP++];
201 RETS = [SP++];
202 ASTAT = [SP++];
203 RTS;