xref: /openbmc/u-boot/board/samsung/smdkc100/lowlevel_init.S (revision 8bc4ee9e8213abe4031ea1720aa02fa98d4402ad)
1*8bc4ee9eSMinkyu Kang/*
2*8bc4ee9eSMinkyu Kang * Copyright (C) 2009 Samsung Electronics
3*8bc4ee9eSMinkyu Kang * Kyungmin Park <kyungmin.park@samsung.com>
4*8bc4ee9eSMinkyu Kang * Minkyu Kang <mk7.kang@samsung.com>
5*8bc4ee9eSMinkyu Kang *
6*8bc4ee9eSMinkyu Kang * See file CREDITS for list of people who contributed to this
7*8bc4ee9eSMinkyu Kang * project.
8*8bc4ee9eSMinkyu Kang *
9*8bc4ee9eSMinkyu Kang * This program is free software; you can redistribute it and/or
10*8bc4ee9eSMinkyu Kang * modify it under the terms of the GNU General Public License as
11*8bc4ee9eSMinkyu Kang * published by the Free Software Foundation; either version 2 of
12*8bc4ee9eSMinkyu Kang * the License, or (at your option) any later version.
13*8bc4ee9eSMinkyu Kang *
14*8bc4ee9eSMinkyu Kang * This program is distributed in the hope that it will be useful,
15*8bc4ee9eSMinkyu Kang * but WITHOUT ANY WARRANTY; without even the implied warranty of
16*8bc4ee9eSMinkyu Kang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*8bc4ee9eSMinkyu Kang * GNU General Public License for more details.
18*8bc4ee9eSMinkyu Kang *
19*8bc4ee9eSMinkyu Kang * You should have received a copy of the GNU General Public License
20*8bc4ee9eSMinkyu Kang * along with this program; if not, write to the Free Software
21*8bc4ee9eSMinkyu Kang * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
22*8bc4ee9eSMinkyu Kang * MA 02111-1307 USA
23*8bc4ee9eSMinkyu Kang */
24*8bc4ee9eSMinkyu Kang
25*8bc4ee9eSMinkyu Kang#include <config.h>
26*8bc4ee9eSMinkyu Kang#include <version.h>
27*8bc4ee9eSMinkyu Kang#include <asm/arch/cpu.h>
28*8bc4ee9eSMinkyu Kang#include <asm/arch/power.h>
29*8bc4ee9eSMinkyu Kang
30*8bc4ee9eSMinkyu Kang/*
31*8bc4ee9eSMinkyu Kang * Register usages:
32*8bc4ee9eSMinkyu Kang *
33*8bc4ee9eSMinkyu Kang * r5 has zero always
34*8bc4ee9eSMinkyu Kang */
35*8bc4ee9eSMinkyu Kang
36*8bc4ee9eSMinkyu Kang_TEXT_BASE:
37*8bc4ee9eSMinkyu Kang	.word	TEXT_BASE
38*8bc4ee9eSMinkyu Kang
39*8bc4ee9eSMinkyu Kang	.globl lowlevel_init
40*8bc4ee9eSMinkyu Kanglowlevel_init:
41*8bc4ee9eSMinkyu Kang	mov	r9, lr
42*8bc4ee9eSMinkyu Kang
43*8bc4ee9eSMinkyu Kang	/* r5 has always zero */
44*8bc4ee9eSMinkyu Kang	mov	r5, #0
45*8bc4ee9eSMinkyu Kang
46*8bc4ee9eSMinkyu Kang	ldr	r8, =S5PC100_GPIO_BASE
47*8bc4ee9eSMinkyu Kang
48*8bc4ee9eSMinkyu Kang	/* Disable Watchdog */
49*8bc4ee9eSMinkyu Kang	ldr	r0, =S5PC100_WATCHDOG_BASE		@0xEA200000
50*8bc4ee9eSMinkyu Kang	orr	r0, r0, #0x0
51*8bc4ee9eSMinkyu Kang	str	r5, [r0]
52*8bc4ee9eSMinkyu Kang
53*8bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL
54*8bc4ee9eSMinkyu Kang	/* setting SRAM */
55*8bc4ee9eSMinkyu Kang	ldr	r0, =S5PC100_SROMC_BASE
56*8bc4ee9eSMinkyu Kang	ldr	r1, =0x9
57*8bc4ee9eSMinkyu Kang	str	r1, [r0]
58*8bc4ee9eSMinkyu Kang#endif
59*8bc4ee9eSMinkyu Kang
60*8bc4ee9eSMinkyu Kang	/* S5PC100 has 3 groups of interrupt sources */
61*8bc4ee9eSMinkyu Kang	ldr	r0, =S5PC100_VIC0_BASE			@0xE4000000
62*8bc4ee9eSMinkyu Kang	ldr	r1, =S5PC100_VIC1_BASE			@0xE4000000
63*8bc4ee9eSMinkyu Kang	ldr	r2, =S5PC100_VIC2_BASE			@0xE4000000
64*8bc4ee9eSMinkyu Kang
65*8bc4ee9eSMinkyu Kang	/* Disable all interrupts (VIC0, VIC1 and VIC2) */
66*8bc4ee9eSMinkyu Kang	mvn	r3, #0x0
67*8bc4ee9eSMinkyu Kang	str	r3, [r0, #0x14]				@INTENCLEAR
68*8bc4ee9eSMinkyu Kang	str	r3, [r1, #0x14]				@INTENCLEAR
69*8bc4ee9eSMinkyu Kang	str	r3, [r2, #0x14]				@INTENCLEAR
70*8bc4ee9eSMinkyu Kang
71*8bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL
72*8bc4ee9eSMinkyu Kang	/* Set all interrupts as IRQ */
73*8bc4ee9eSMinkyu Kang	str	r5, [r0, #0xc]				@INTSELECT
74*8bc4ee9eSMinkyu Kang	str	r5, [r1, #0xc]				@INTSELECT
75*8bc4ee9eSMinkyu Kang	str	r5, [r2, #0xc]				@INTSELECT
76*8bc4ee9eSMinkyu Kang
77*8bc4ee9eSMinkyu Kang	/* Pending Interrupt Clear */
78*8bc4ee9eSMinkyu Kang	str	r5, [r0, #0xf00]			@INTADDRESS
79*8bc4ee9eSMinkyu Kang	str	r5, [r1, #0xf00]			@INTADDRESS
80*8bc4ee9eSMinkyu Kang	str	r5, [r2, #0xf00]			@INTADDRESS
81*8bc4ee9eSMinkyu Kang#endif
82*8bc4ee9eSMinkyu Kang
83*8bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL
84*8bc4ee9eSMinkyu Kang	/* for UART */
85*8bc4ee9eSMinkyu Kang	bl uart_asm_init
86*8bc4ee9eSMinkyu Kang
87*8bc4ee9eSMinkyu Kang	/* for TZPC */
88*8bc4ee9eSMinkyu Kang	bl tzpc_asm_init
89*8bc4ee9eSMinkyu Kang#endif
90*8bc4ee9eSMinkyu Kang
91*8bc4ee9eSMinkyu Kang#ifdef CONFIG_ONENAND_IPL
92*8bc4ee9eSMinkyu Kang	/* init system clock */
93*8bc4ee9eSMinkyu Kang	bl	system_clock_init
94*8bc4ee9eSMinkyu Kang
95*8bc4ee9eSMinkyu Kang	bl	mem_ctrl_asm_init
96*8bc4ee9eSMinkyu Kang
97*8bc4ee9eSMinkyu Kang	/* Wakeup support. Don't know if it's going to be used, untested. */
98*8bc4ee9eSMinkyu Kang	ldr	r0, =S5PC100_RST_STAT
99*8bc4ee9eSMinkyu Kang	ldr	r1, [r0]
100*8bc4ee9eSMinkyu Kang	bic	r1, r1, #0xfffffff7
101*8bc4ee9eSMinkyu Kang	cmp	r1, #0x8
102*8bc4ee9eSMinkyu Kang	beq	wakeup_reset
103*8bc4ee9eSMinkyu Kang#endif
104*8bc4ee9eSMinkyu Kang
105*8bc4ee9eSMinkyu Kang1:
106*8bc4ee9eSMinkyu Kang	mov	lr, r9
107*8bc4ee9eSMinkyu Kang	mov	pc, lr
108*8bc4ee9eSMinkyu Kang
109*8bc4ee9eSMinkyu Kang#ifdef CONFIG_ONENAND_IPL
110*8bc4ee9eSMinkyu Kangwakeup_reset:
111*8bc4ee9eSMinkyu Kang
112*8bc4ee9eSMinkyu Kang	/* Clear wakeup status register */
113*8bc4ee9eSMinkyu Kang	ldr	r0, =S5PC100_WAKEUP_STAT
114*8bc4ee9eSMinkyu Kang	ldr	r1, [r0]
115*8bc4ee9eSMinkyu Kang	str	r1, [r0]
116*8bc4ee9eSMinkyu Kang
117*8bc4ee9eSMinkyu Kang	/* Load return address and jump to kernel */
118*8bc4ee9eSMinkyu Kang	ldr	r0, =S5PC100_INFORM0
119*8bc4ee9eSMinkyu Kang
120*8bc4ee9eSMinkyu Kang	/* r1 = physical address of s5pc100_cpu_resume function */
121*8bc4ee9eSMinkyu Kang	ldr	r1, [r0]
122*8bc4ee9eSMinkyu Kang
123*8bc4ee9eSMinkyu Kang	/* Jump to kernel (sleep.S) */
124*8bc4ee9eSMinkyu Kang	mov	pc, r1
125*8bc4ee9eSMinkyu Kang	nop
126*8bc4ee9eSMinkyu Kang	nop
127*8bc4ee9eSMinkyu Kang#endif
128*8bc4ee9eSMinkyu Kang
129*8bc4ee9eSMinkyu Kang/*
130*8bc4ee9eSMinkyu Kang * system_clock_init: Initialize core clock and bus clock.
131*8bc4ee9eSMinkyu Kang * void system_clock_init(void)
132*8bc4ee9eSMinkyu Kang */
133*8bc4ee9eSMinkyu Kangsystem_clock_init:
134*8bc4ee9eSMinkyu Kang	ldr	r8, =S5PC1XX_CLOCK_BASE		@ 0xE0100000
135*8bc4ee9eSMinkyu Kang
136*8bc4ee9eSMinkyu Kang	/* Set Clock divider */
137*8bc4ee9eSMinkyu Kang	ldr	r1, =0x00011110
138*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x304]
139*8bc4ee9eSMinkyu Kang	ldr	r1, =0x1
140*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x308]
141*8bc4ee9eSMinkyu Kang	ldr	r1, =0x00011301
142*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x300]
143*8bc4ee9eSMinkyu Kang
144*8bc4ee9eSMinkyu Kang	/* Set Lock Time */
145*8bc4ee9eSMinkyu Kang	ldr	r1, =0xe10			@ Locktime : 0xe10 = 3600
146*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x000]		@ APLL_LOCK
147*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x004]		@ MPLL_LOCK
148*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x008]		@ EPLL_LOCK
149*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x00C]		@ HPLL_LOCK
150*8bc4ee9eSMinkyu Kang
151*8bc4ee9eSMinkyu Kang	/* APLL_CON */
152*8bc4ee9eSMinkyu Kang	ldr	r1, =0x81bc0400		@ SDIV 0, PDIV 4, MDIV 444 (1332MHz)
153*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x100]
154*8bc4ee9eSMinkyu Kang	/* MPLL_CON */
155*8bc4ee9eSMinkyu Kang	ldr	r1, =0x80590201		@ SDIV 1, PDIV 2, MDIV 89 (267MHz)
156*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x104]
157*8bc4ee9eSMinkyu Kang	/* EPLL_CON */
158*8bc4ee9eSMinkyu Kang	ldr	r1, =0x80870303		@ SDIV 3, PDIV 3, MDIV 135 (67.5MHz)
159*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x108]
160*8bc4ee9eSMinkyu Kang	/* HPLL_CON */
161*8bc4ee9eSMinkyu Kang	ldr	r1, =0x80600603
162*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x10C]
163*8bc4ee9eSMinkyu Kang
164*8bc4ee9eSMinkyu Kang	/* Set Source Clock */
165*8bc4ee9eSMinkyu Kang	ldr	r1, =0x1111			@ A, M, E, HPLL Muxing
166*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x200]		@ CLK_SRC0
167*8bc4ee9eSMinkyu Kang
168*8bc4ee9eSMinkyu Kang	ldr	r1, =0x1000001			@ Uart Clock & CLK48M Muxing
169*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x204]		@ CLK_SRC1
170*8bc4ee9eSMinkyu Kang
171*8bc4ee9eSMinkyu Kang	ldr	r1, =0x9000			@ ARMCLK/4
172*8bc4ee9eSMinkyu Kang	str	r1, [r8, #0x400]		@ CLK_OUT
173*8bc4ee9eSMinkyu Kang
174*8bc4ee9eSMinkyu Kang	/* wait at least 200us to stablize all clock */
175*8bc4ee9eSMinkyu Kang	mov	r2, #0x10000
176*8bc4ee9eSMinkyu Kang1:	subs	r2, r2, #1
177*8bc4ee9eSMinkyu Kang	bne	1b
178*8bc4ee9eSMinkyu Kang
179*8bc4ee9eSMinkyu Kang	mov	pc, lr
180*8bc4ee9eSMinkyu Kang
181*8bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL
182*8bc4ee9eSMinkyu Kang/*
183*8bc4ee9eSMinkyu Kang * uart_asm_init: Initialize UART's pins
184*8bc4ee9eSMinkyu Kang */
185*8bc4ee9eSMinkyu Kanguart_asm_init:
186*8bc4ee9eSMinkyu Kang	mov	r0, r8
187*8bc4ee9eSMinkyu Kang	ldr	r1, =0x22222222
188*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x0]			@ GPA0_CON
189*8bc4ee9eSMinkyu Kang	ldr	r1, =0x00022222
190*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x20]			@ GPA1_CON
191*8bc4ee9eSMinkyu Kang
192*8bc4ee9eSMinkyu Kang	mov	pc, lr
193*8bc4ee9eSMinkyu Kang
194*8bc4ee9eSMinkyu Kang/*
195*8bc4ee9eSMinkyu Kang * tzpc_asm_init: Initialize TZPC
196*8bc4ee9eSMinkyu Kang */
197*8bc4ee9eSMinkyu Kangtzpc_asm_init:
198*8bc4ee9eSMinkyu Kang	ldr	r0, =0xE3800000
199*8bc4ee9eSMinkyu Kang	mov	r1, #0x0
200*8bc4ee9eSMinkyu Kang	str	r1, [r0]
201*8bc4ee9eSMinkyu Kang	mov	r1, #0xff
202*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x804]
203*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x810]
204*8bc4ee9eSMinkyu Kang
205*8bc4ee9eSMinkyu Kang	ldr	r0, =0xE2800000
206*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x804]
207*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x810]
208*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x81C]
209*8bc4ee9eSMinkyu Kang
210*8bc4ee9eSMinkyu Kang	ldr	r0, =0xE2900000
211*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x804]
212*8bc4ee9eSMinkyu Kang	str	r1, [r0, #0x810]
213*8bc4ee9eSMinkyu Kang
214*8bc4ee9eSMinkyu Kang	mov	pc, lr
215*8bc4ee9eSMinkyu Kang#endif
216