36xx dpll table changes.
[pandaboard:x-loader-4460.git] / board / omap3430labrador / 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 .globl get_mpu_dpll_param
193 get_mpu_dpll_param:
194         adr r0, mpu_dpll_param
195         mov pc, lr
196
197 .globl get_iva_dpll_param
198 get_iva_dpll_param:
199         adr r0, iva_dpll_param
200         mov pc, lr
201
202 .globl get_core_dpll_param
203 get_core_dpll_param:
204         adr r0, core_dpll_param
205         mov pc, lr
206
207 .globl get_per_dpll_param
208 get_per_dpll_param:
209         adr r0, per_dpll_param
210         mov pc, lr
211
212 #if defined(CONFIG_OMAP36XX)
213 #include <asm/arch/dpll_table_36xx.S>
214 #elif defined(CONFIG_OMAP34XX)
215 #include <asm/arch/dpll_table_34xx.S>
216 #else
217 #error "DPLL Table is undefined"
218 #endif