board: technexion: Add support for TDM3730 SoM
[x-loader:x-loader.git] / board / tdm3730 / platform.S
1 /*
2  * Board specific setup info
3  *
4  * (C) Copyright 2004-2006
5  * Texas Instruments, <www.ti.com>
6  * Richard Woodruff <r-woodruff2@ti.com>
7  *
8  * See file CREDITS for list of people who contributed to this
9  * project.
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License as
13  * published by the Free Software Foundation; either version 2 of
14  * the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24  * MA 02111-1307 USA
25  */
26
27 #include <config.h>
28 #include <asm/arch/cpu.h>
29 #include <asm/arch/mem.h>
30 #include <asm/arch/clocks.h>
31
32 _TEXT_BASE:
33         .word   TEXT_BASE       /* sdram load addr from config.mk */
34
35 #if !defined(CFG_NAND_BOOT) && !defined(CFG_NAND_BOOT)
36 /**************************************************************************
37  * cpy_clk_code: relocates clock code into SRAM where its safer to execute
38  * R1 = SRAM destination address.
39  *************************************************************************/
40 .global cpy_clk_code
41  cpy_clk_code:
42         /* Copy DPLL code into SRAM */ 
43         adr     r0, go_to_speed         /* get addr of clock setting code */
44         mov     r2, #384                /* r2 size to copy (div by 32 bytes) */
45         mov     r1, r1                  /* r1 <- dest address (passed in) */
46         add     r2, r2, r0              /* r2 <- source end address */
47 next2:
48         ldmia   r0!, {r3-r10}           /* copy from source address [r0]    */
49         stmia   r1!, {r3-r10}           /* copy to   target address [r1]    */
50         cmp     r0, r2                  /* until source end address [r2]    */
51         bne     next2
52         mov     pc, lr                  /* back to caller */
53
54 /* **************************************************************************** 
55  * NOTE: 3430 X-loader currently does not use this code.  
56 *   It could be removed its is kept for compatabily with u-boot.
57  *
58  *  go_to_speed: -Moves to bypass, -Commits clock dividers, -puts dpll at speed
59  *               -executed from SRAM.
60  *  R0 = CM_CLKEN_PLL-bypass value
61  *  R1 = CM_CLKSEL1_PLL-m, n, and divider values
62  *  R2 = CM_CLKSEL_CORE-divider values
63  *  R3 = CM_IDLEST_CKGEN - addr dpll lock wait
64  *
65  *  Note: If core unlocks/relocks and SDRAM is running fast already it gets
66  *        confused.  A reset of the controller gets it back.  Taking away its
67  *        L3 when its not in self refresh seems bad for it.  Normally, this code
68  *        runs from flash before SDR is init so that should be ok.
69  ******************************************************************************/    
70 .global go_to_speed
71  go_to_speed:
72         stmfd sp!, {r4-r6}
73
74         /* move into fast relock bypass */
75         ldr     r4, pll_ctl_add
76         str     r0, [r4]
77 wait1:
78         ldr     r5, [r3]       /* get status */
79         and     r5, r5, #0x1   /* isolate core status */
80         cmp     r5, #0x1       /* still locked? */
81         beq     wait1          /* if lock, loop */
82
83         /* set new dpll dividers _after_ in bypass */
84         ldr     r5, pll_div_add1
85         str     r1, [r5]          /* set m, n, m2 */
86         ldr     r5, pll_div_add2
87         str     r2, [r5]          /* set l3/l4/.. dividers*/
88         ldr     r5, pll_div_add3  /* wkup */
89         ldr     r2, pll_div_val3  /* rsm val */
90         str     r2, [r5]          
91         ldr     r5, pll_div_add4  /* gfx */
92         ldr     r2, pll_div_val4 
93         str     r2, [r5]         
94         ldr     r5, pll_div_add5  /* emu */
95         ldr     r2, pll_div_val5 
96         str     r2, [r5]     
97
98         /* now prepare GPMC (flash) for new dpll speed */
99         /* flash needs to be stable when we jump back to it */
100         ldr     r5, flash_cfg3_addr
101         ldr     r2, flash_cfg3_val
102         str     r2, [r5]
103         ldr     r5, flash_cfg4_addr
104         ldr     r2, flash_cfg4_val
105         str     r2, [r5]
106         ldr     r5, flash_cfg5_addr
107         ldr     r2, flash_cfg5_val
108         str     r2, [r5]
109         ldr     r5, flash_cfg1_addr
110         ldr     r2, [r5]
111         orr     r2, r2, #0x3     /* up gpmc divider */
112         str     r2, [r5]
113
114         /* lock DPLL3 and wait a bit */
115         orr     r0, r0, #0x7   /* set up for lock mode */     
116         str     r0, [r4]       /* lock */
117         nop                    /* ARM slow at this point working at sys_clk */
118         nop
119         nop
120         nop
121 wait2:
122         ldr     r5, [r3]       /* get status */
123         and     r5, r5, #0x1   /* isolate core status */
124         cmp     r5, #0x1       /* still locked? */
125         bne     wait2          /* if lock, loop */
126         nop
127         nop
128         nop
129         nop
130         ldmfd sp!, {r4-r6}
131         mov     pc, lr           /* back to caller, locked */        
132
133 _go_to_speed: .word go_to_speed
134
135 /* these constants need to be close for PIC code */
136 /* The Nor has to be in the Flash Base CS0 for this condition to happen */
137 flash_cfg1_addr:
138     .word (GPMC_CONFIG_CS0 + GPMC_CONFIG1)
139 flash_cfg3_addr:
140     .word  (GPMC_CONFIG_CS0 + GPMC_CONFIG3)
141 flash_cfg3_val: 
142     .word  STNOR_GPMC_CONFIG3
143 flash_cfg4_addr:
144     .word (GPMC_CONFIG_CS0 + GPMC_CONFIG4)
145 flash_cfg4_val:
146     .word  STNOR_GPMC_CONFIG4
147 flash_cfg5_val:
148     .word  STNOR_GPMC_CONFIG5
149 flash_cfg5_addr:
150     .word (GPMC_CONFIG_CS0 + GPMC_CONFIG5)
151 pll_ctl_add:
152     .word CM_CLKEN_PLL
153 pll_div_add1:
154     .word CM_CLKSEL1_PLL 
155 pll_div_add2:
156     .word CM_CLKSEL_CORE
157 pll_div_add3:
158     .word CM_CLKSEL_WKUP
159 pll_div_val3:
160     .word (WKUP_RSM << 1) 
161 pll_div_add4:
162     .word CM_CLKSEL_GFX
163 pll_div_val4:
164     .word (GFX_DIV << 0) 
165 pll_div_add5:
166     .word CM_CLKSEL1_EMU
167 pll_div_val5:
168     .word CLSEL1_EMU_VAL
169
170 #endif
171
172 .globl lowlevel_init
173 lowlevel_init:
174         ldr     sp,     SRAM_STACK
175         str     ip,     [sp]    /* stash old link register */
176         mov     ip,     lr      /* save link reg across call */
177         bl      s_init          /* go setup pll,mux,memory */
178         ldr     ip,     [sp]    /* restore save ip */
179         mov     lr,     ip      /* restore link reg */
180
181         /* back to arch calling code */
182         mov     pc,     lr
183
184         /* the literal pools origin */
185         .ltorg
186
187 REG_CONTROL_STATUS:
188         .word CONTROL_STATUS
189 SRAM_STACK:
190         .word LOW_LEVEL_SRAM_STACK
191
192 /* DPLL(1-4) PARAM TABLES */
193 /* Each of the tables has M, N, FREQSEL, M2 values defined for nominal
194  * OPP (1.2V). The fields are defined according to dpll_param struct(clock.c). 
195  * The values are defined for all possible sysclk and for ES1 and ES2.
196  */
197
198 mpu_dpll_param:
199 /* 12MHz */
200 /* ES1 */
201 .word 0x0FE,0x07,0x05,0x01
202 /* ES2 */
203 .word 0x0FA,0x05,0x07,0x01
204 /* 3410 */
205 .word 0x085,0x05,0x07,0x01
206
207 /* 13MHz */
208 /* ES1 */
209 .word 0x17D,0x0C,0x03,0x01
210 /* ES2 */
211 .word 0x1F4,0x0C,0x03,0x01
212 /* 3410 */
213 .word 0x10A,0x0C,0x03,0x01
214  
215 /* 19.2MHz */
216 /* ES1 */
217 .word 0x179,0x12,0x04,0x01
218 /* ES2 */
219 .word 0x271,0x17,0x03,0x01
220 /* 3410 */
221 .word 0x14C,0x17,0x03,0x01
222
223 /* 26MHz */
224 /* ES1 */
225 .word 0x17D,0x19,0x03,0x01
226 /* ES2 */
227 .word 0x0FA,0x0C,0x07,0x01
228 /* 3410 */
229 .word 0x085,0x0C,0x07,0x01
230
231 /* 38.4MHz */
232 /* ES1 */
233 .word 0x1FA,0x32,0x03,0x01
234 /* ES2 */
235 .word 0x271,0x2F,0x03,0x01
236 /* 3410 */
237 .word 0x14C,0x2F,0x03,0x01
238
239
240 .globl get_mpu_dpll_param
241 get_mpu_dpll_param:
242         adr r0, mpu_dpll_param
243         mov pc, lr
244
245 iva_dpll_param:
246 /* 12MHz */
247 /* ES1 */
248 .word 0x07D,0x05,0x07,0x01
249 /* ES2 */
250 .word 0x0B4,0x05,0x07,0x01
251 /* 3410 */
252 .word 0x085,0x05,0x07,0x01
253
254 /* 13MHz */
255 /* ES1 */
256 .word 0x0FA,0x0C,0x03,0x01
257 /* ES2 */
258 .word 0x168,0x0C,0x03,0x01
259 /* 3410 */
260 .word 0x10A,0x0C,0x03,0x01
261
262 /* 19.2MHz */
263 /* ES1 */
264 .word 0x082,0x09,0x07,0x01
265 /* ES2 */
266 .word 0x0E1,0x0B,0x06,0x01
267 /* 3410 */
268 .word 0x14C,0x17,0x03,0x01
269
270 /* 26MHz */
271 /* ES1 */
272 .word 0x07D,0x0C,0x07,0x01
273 /* ES2 */
274 .word 0x0B4,0x0C,0x07,0x01
275 /* 3410 */
276 .word 0x085,0x0C,0x07,0x01
277
278 /* 38.4MHz */
279 /* ES1 */
280 .word 0x13F,0x30,0x03,0x01
281 /* ES2 */
282 .word 0x0E1,0x17,0x06,0x01
283 /* 3410 */
284 .word 0x14C,0x2F,0x03,0x01
285
286
287 .globl get_iva_dpll_param
288 get_iva_dpll_param:
289         adr r0, iva_dpll_param
290         mov pc, lr
291
292 /* Core DPLL targets for L3 at 166 & L133 */
293 core_dpll_param:
294 /* 12MHz */
295 /* ES1 */
296 .word M_12_ES1,M_12_ES1,FSL_12_ES1,M2_12_ES1
297 /* ES2 */
298 .word M_12,N_12,FSEL_12,M2_12
299 /* 3410 */
300 .word M_12,N_12,FSEL_12,M2_12
301
302 /* 13MHz */
303 /* ES1 */
304 .word M_13_ES1,N_13_ES1,FSL_13_ES1,M2_13_ES1
305 /* ES2 */
306 .word M_13,N_13,FSEL_13,M2_13
307 /* 3410 */
308 .word M_13,N_13,FSEL_13,M2_13
309
310 /* 19.2MHz */
311 /* ES1 */
312 .word M_19p2_ES1,N_19p2_ES1,FSL_19p2_ES1,M2_19p2_ES1
313 /* ES2 */
314 .word M_19p2,N_19p2,FSEL_19p2,M2_19p2
315 /* 3410 */
316 .word M_19p2,N_19p2,FSEL_19p2,M2_19p2
317
318 /* 26MHz */
319 /* ES1 */
320 .word M_26_ES1,N_26_ES1,FSL_26_ES1,M2_26_ES1
321 /* ES2 */
322 .word M_26,N_26,FSEL_26,M2_26
323 /* 3410 */
324 .word M_26,N_26,FSEL_26,M2_26
325
326 /* 38.4MHz */
327 /* ES1 */
328 .word M_38p4_ES1,N_38p4_ES1,FSL_38p4_ES1,M2_38p4_ES1
329 /* ES2 */
330 .word M_38p4,N_38p4,FSEL_38p4,M2_38p4
331 /* 3410 */
332 .word M_38p4,N_38p4,FSEL_38p4,M2_38p4
333
334 .globl get_core_dpll_param
335 get_core_dpll_param:
336         adr r0, core_dpll_param
337         mov pc, lr
338
339 /* PER DPLL values are same for both ES1 and ES2 */
340 per_dpll_param:
341 /* 12MHz */
342 .word 0xD8,0x05,0x07,0x09
343
344 /* 13MHz */
345 .word 0x1B0,0x0C,0x03,0x09
346
347 /* 19.2MHz */
348 .word 0xE1,0x09,0x07,0x09
349
350 /* 26MHz */
351 .word 0xD8,0x0C,0x07,0x09
352
353 /* 38.4MHz */
354 .word 0xE1,0x13,0x07,0x09
355
356 .globl get_per_dpll_param
357 get_per_dpll_param:
358         adr r0, per_dpll_param
359         mov pc, lr
360