LG Optimus Black (P970) support
[x-loader-sniper.git] / board / sniper / 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 .word 50, 0, 0, 1
201 /* 13MHz */
202 .word 600, 12, 0, 1
203 /* 19.2MHz */
204 .word 125, 3, 0, 1
205 /* 26MHz */
206 .word 300, 12, 0, 1
207 /* 38.4MHz */
208 .word 125, 7, 0, 1
209
210 .globl get_mpu_dpll_param
211 get_mpu_dpll_param:
212         adr r0, mpu_dpll_param
213         mov pc, lr
214
215 iva_dpll_param:
216 /* 12MHz */
217 .word 130, 2, 0, 1
218 /* 13MHz */
219 .word 40, 0, 0, 1
220 /* 19.2MHz */
221 .word 325, 11, 0, 1
222 /* 26MHz */
223 .word 20, 0, 0, 1
224 /* 38.4MHz */
225 .word 325, 23, 0, 1
226
227 .globl get_iva_dpll_param
228 get_iva_dpll_param:
229         adr r0, iva_dpll_param
230         mov pc, lr
231
232 core_dpll_param:
233 /* 12MHz */
234 .word 100, 2, 0, 1
235 /* 13MHz */
236 .word 400, 12, 0, 1
237 /* 19.2MHz */
238 .word 375, 17, 0, 1
239 /* 26MHz */
240 .word 200, 12, 0, 1
241 /* 38.4MHz */
242 .word 375, 35, 0, 1
243
244 .globl get_core_dpll_param
245 get_core_dpll_param:
246         adr r0, core_dpll_param
247         mov pc, lr
248
249 /* PER DPLL values are same for both ES1 and ES2 */
250 per_dpll_param:
251 /* Default to 96 MHz M2 */
252 /*      sys(kHz), m,    n,      clkin,  sd,     dco,    m2,     m3,     m4,     m5,     m6,     m2div */
253 .word 12000,    360,    4,      0,      4,      2,      9,      16,     5,      4,      3,      1
254 .word 13000,    432,    0,      1,      4,      2,      9,      16,     5,      4,      3,      1
255 .word 19200,    360,    7,      0,      4,      2,      9,      16,     5,      4,      3,      1
256 .word 26000,    432,    12,     0,      4,      2,      9,      16,     5,      4,      3,      1
257 .word 38400,    360,    15,     0,      4,      2,      9,      16,     5,      4,      3,      1
258 .word 0,        0,      0,      0,      0,      0,      0,      0,      0,      0,      0,      0
259
260 .globl get_per_dpll_param
261 get_per_dpll_param:
262         adr r0, per_dpll_param
263         mov pc, lr
264