]> git.ipfire.org Git - people/ms/u-boot.git/blame - board/ti/omap2420h4/lowlevel_init.S
omap: move TI's boards to board/ti/
[people/ms/u-boot.git] / board / ti / omap2420h4 / lowlevel_init.S
CommitLineData
8ed96046
WD
1/*
2 * Board specific setup info
3 *
4 * (C) Copyright 2004
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
082acfd4 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8ed96046
WD
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 <version.h>
29#include <asm/arch/omap2420.h>
30#include <asm/arch/mem.h>
31#include <asm/arch/clocks.h>
32
33_TEXT_BASE:
34 .word TEXT_BASE /* sdram load addr from config.mk */
35
8ed96046
WD
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:
082acfd4
WD
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 */
8ed96046 47next2:
082acfd4
WD
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 */
8ed96046 53
082acfd4 54/* ****************************************************************************
8ed96046 55 * go_to_speed: -Moves to bypass, -Commits clock dividers, -puts dpll at speed
082acfd4 56 * -executed from SRAM.
8ed96046
WD
57 * R0 = PRCM_CLKCFG_CTRL - addr of valid reg
58 * R1 = CM_CLKEN_PLL - addr dpll ctlr reg
59 * R2 = dpll value
60 * R3 = CM_IDLEST_CKGEN - addr dpll lock wait
082acfd4 61 ******************************************************************************/
8ed96046
WD
62.global go_to_speed
63 go_to_speed:
082acfd4
WD
64 sub sp, sp, #0x4 /* get some stack space */
65 str r4, [sp] /* save r4's value */
66
67 /* move into fast relock bypass */
68 ldr r8, pll_ctl_add
69 mov r4, #0x2
70 str r4, [r8]
71 ldr r4, pll_stat
8ed96046 72block:
082acfd4
WD
73 ldr r8, [r4] /* wait for bypass to take effect */
74 and r8, r8, #0x3
75 cmp r8, #0x1
76 bne block
8ed96046
WD
77
78 /* set new dpll dividers _after_ in bypass */
082acfd4
WD
79 ldr r4, pll_div_add
80 ldr r8, pll_div_val
81 str r8, [r4]
82
83 /* now prepare GPMC (flash) for new dpll speed */
8ed96046 84 /* flash needs to be stable when we jump back to it */
082acfd4
WD
85 ldr r4, cfg3_0_addr
86 ldr r8, cfg3_0_val
87 str r8, [r4]
88 ldr r4, cfg4_0_addr
89 ldr r8, cfg4_0_val
90 str r8, [r4]
91 ldr r4, cfg1_0_addr
92 ldr r8, [r4]
93 orr r8, r8, #0x3 /* up gpmc divider */
94 str r8, [r4]
95
96 /* setup to 2x loop though code. The first loop pre-loads the
97 * icache, the 2nd commits the prcm config, and locks the dpll
98 */
99 mov r4, #0x1000 /* spin spin spin */
100 mov r8, #0x4 /* first pass condition & set registers */
101 cmp r8, #0x4
8ed96046 1022:
082acfd4
WD
103 ldrne r8, [r3] /* DPLL lock check */
104 and r8, r8, #0x7
105 cmp r8, #0x2
106 beq 4f
8ed96046 1073:
082acfd4
WD
108 subeq r8, r8, #0x1
109 streq r8, [r0] /* commit dividers (2nd time) */
110 nop
8ed96046 111lloop1:
082acfd4
WD
112 sub r4, r4, #0x1 /* Loop currently necessary else bad jumps */
113 nop
114 cmp r4, #0x0
115 bne lloop1
116 mov r4, #0x40000
117 cmp r8, #0x1
118 nop
119 streq r2, [r1] /* lock dpll (2nd time) */
120 nop
8ed96046 121lloop2:
082acfd4
WD
122 sub r4, r4, #0x1 /* loop currently necessary else bad jumps */
123 nop
124 cmp r4, #0x0
125 bne lloop2
126 mov r4, #0x40000
127 cmp r8, #0x1
128 nop
129 ldreq r8, [r3] /* get lock condition for dpll */
130 cmp r8, #0x4 /* first time though? */
131 bne 2b
132 moveq r8, #0x2 /* set to dpll check condition. */
133 beq 3b /* if condition not true branch */
1344:
135 ldr r4, [sp]
136 add sp, sp, #0x4 /* return stack space */
137 mov pc, lr /* back to caller, locked */
8ed96046
WD
138
139_go_to_speed: .word go_to_speed
140
141/* these constants need to be close for PIC code */
142cfg3_0_addr:
143 .word GPMC_CONFIG3_0
082acfd4 144cfg3_0_val:
8ed96046
WD
145 .word H4_24XX_GPMC_CONFIG3_0
146cfg4_0_addr:
147 .word GPMC_CONFIG4_0
148cfg4_0_val:
149 .word H4_24XX_GPMC_CONFIG4_0
150cfg1_0_addr:
151 .word GPMC_CONFIG1_0
152pll_ctl_add:
153 .word CM_CLKEN_PLL
154pll_stat:
155 .word CM_IDLEST_CKGEN
156pll_div_add:
082acfd4 157 .word CM_CLKSEL1_PLL
8ed96046
WD
158pll_div_val:
159 .word DPLL_VAL /* DPLL setting (300MHz default) */
8ed96046 160
87cb6862
WD
161.globl lowlevel_init
162lowlevel_init:
8ed96046 163 ldr sp, SRAM_STACK
082acfd4 164 str ip, [sp] /* stash old link register */
8ed96046 165 mov ip, lr /* save link reg across call */
082acfd4
WD
166 bl s_init /* go setup pll,mux,memory */
167 ldr ip, [sp] /* restore save ip */
8ed96046 168 mov lr, ip /* restore link reg */
289f932c 169
8ed96046
WD
170 /* map interrupt controller */
171 ldr r0, VAL_INTH_SETUP
172 mcr p15, 0, r0, c15, c2, 4
173
174 /* back to arch calling code */
175 mov pc, lr
176
177 /* the literal pools origin */
178 .ltorg
179
180REG_CONTROL_STATUS:
181 .word CONTROL_STATUS
182VAL_INTH_SETUP:
183 .word PERIFERAL_PORT_BASE
184SRAM_STACK:
185 .word LOW_LEVEL_SRAM_STACK