xref: /rk3399_rockchip-uboot/board/freescale/mx35pdk/lowlevel_init.S (revision 961a762838d55dc9bae8fa7ea57bc3c51a9c7b57)
1eae4988bSStefano Babic/*
2eae4988bSStefano Babic * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
3eae4988bSStefano Babic *
4eae4988bSStefano Babic * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
5eae4988bSStefano Babic *
6eae4988bSStefano Babic * This program is free software; you can redistribute it and/or
7eae4988bSStefano Babic * modify it under the terms of the GNU General Public License as
8eae4988bSStefano Babic * published by the Free Software Foundation; either version 2 of
9eae4988bSStefano Babic * the License, or (at your option) any later version.
10eae4988bSStefano Babic *
11eae4988bSStefano Babic * This program is distributed in the hope that it will be useful,
12eae4988bSStefano Babic * but WITHOUT ANY WARRANTY; without even the implied warranty of
13eae4988bSStefano Babic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14eae4988bSStefano Babic * GNU General Public License for more details.
15eae4988bSStefano Babic *
16eae4988bSStefano Babic * You should have received a copy of the GNU General Public License
17eae4988bSStefano Babic * along with this program; if not, write to the Free Software
18eae4988bSStefano Babic * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19eae4988bSStefano Babic * MA 02111-1307 USA
20eae4988bSStefano Babic */
21eae4988bSStefano Babic
22eae4988bSStefano Babic#include <config.h>
23eae4988bSStefano Babic#include <asm/arch/imx-regs.h>
24a4814a69SStefano Babic#include <generated/asm-offsets.h>
25eae4988bSStefano Babic#include "mx35pdk.h"
26151d63cbSBenoît Thébaudeau#include <asm/arch/lowlevel_macro.S>
27eae4988bSStefano Babic
28eae4988bSStefano Babic/*
29eae4988bSStefano Babic * return soc version
30eae4988bSStefano Babic * 	0x10:  TO1
31eae4988bSStefano Babic *	0x20:  TO2
32eae4988bSStefano Babic *	0x30:  TO3
33eae4988bSStefano Babic */
34eae4988bSStefano Babic.macro check_soc_version ret, tmp
35eae4988bSStefano Babic	ldr \tmp, =IIM_BASE_ADDR
36eae4988bSStefano Babic	ldr \ret, [\tmp, #IIM_SREV]
37eae4988bSStefano Babic	cmp \ret, #0x00
38eae4988bSStefano Babic	moveq \tmp, #ROMPATCH_REV
39eae4988bSStefano Babic	ldreq \ret, [\tmp]
40eae4988bSStefano Babic	moveq \ret, \ret, lsl #4
41eae4988bSStefano Babic	addne \ret, \ret, #0x10
42eae4988bSStefano Babic.endm
43eae4988bSStefano Babic
44eae4988bSStefano Babic/* CPLD on CS5 setup */
45eae4988bSStefano Babic.macro init_debug_board
46eae4988bSStefano Babic	ldr r0, =DBG_BASE_ADDR
47eae4988bSStefano Babic	ldr r1, =DBG_CSCR_U_CONFIG
48eae4988bSStefano Babic	str r1, [r0, #0x00]
49eae4988bSStefano Babic	ldr r1, =DBG_CSCR_L_CONFIG
50eae4988bSStefano Babic	str r1, [r0, #0x04]
51eae4988bSStefano Babic	ldr r1, =DBG_CSCR_A_CONFIG
52eae4988bSStefano Babic	str r1, [r0, #0x08]
53eae4988bSStefano Babic.endm
54eae4988bSStefano Babic
55eae4988bSStefano Babic/* clock setup */
56eae4988bSStefano Babic.macro init_clock
57eae4988bSStefano Babic	ldr r0, =CCM_BASE_ADDR
58eae4988bSStefano Babic
59eae4988bSStefano Babic	/* default CLKO to 1/32 of the ARM core*/
60eae4988bSStefano Babic	ldr r1, [r0, #CLKCTL_COSR]
61eae4988bSStefano Babic	bic r1, r1, #0x00000FF00
62eae4988bSStefano Babic	bic r1, r1, #0x0000000FF
63eae4988bSStefano Babic	mov r2, #0x00006C00
64eae4988bSStefano Babic	add r2, r2, #0x67
65eae4988bSStefano Babic	orr r1, r1, r2
66eae4988bSStefano Babic	str r1, [r0, #CLKCTL_COSR]
67eae4988bSStefano Babic
68eae4988bSStefano Babic	ldr r2, =CCM_CCMR_CONFIG
69eae4988bSStefano Babic	str r2, [r0, #CLKCTL_CCMR]
70eae4988bSStefano Babic
71eae4988bSStefano Babic	check_soc_version r1, r2
72eae4988bSStefano Babic	cmp r1, #CHIP_REV_2_0
73eae4988bSStefano Babic	ldrhs r3, =CCM_MPLL_532_HZ
74eae4988bSStefano Babic	bhs 1f
75eae4988bSStefano Babic	ldr r2, [r0, #CLKCTL_PDR0]
76eae4988bSStefano Babic	tst r2, #CLKMODE_CONSUMER
77eae4988bSStefano Babic	ldrne r3, =CCM_MPLL_532_HZ  /* consumer path*/
78eae4988bSStefano Babic	ldreq r3, =CCM_MPLL_399_HZ  /* auto path*/
79eae4988bSStefano Babic1:
80eae4988bSStefano Babic	str r3, [r0, #CLKCTL_MPCTL]
81eae4988bSStefano Babic
82eae4988bSStefano Babic	ldr r1, =CCM_PPLL_300_HZ
83eae4988bSStefano Babic	str r1, [r0, #CLKCTL_PPCTL]
84eae4988bSStefano Babic
85eae4988bSStefano Babic	ldr r1, =CCM_PDR0_CONFIG
86eae4988bSStefano Babic	bic r1, r1, #0x800000
87eae4988bSStefano Babic	str r1, [r0, #CLKCTL_PDR0]
88eae4988bSStefano Babic
89eae4988bSStefano Babic	ldr r1, [r0, #CLKCTL_CGR0]
90eae4988bSStefano Babic	orr r1, r1, #0x0C300000
91eae4988bSStefano Babic	str r1, [r0, #CLKCTL_CGR0]
92eae4988bSStefano Babic
93eae4988bSStefano Babic	ldr r1, [r0, #CLKCTL_CGR1]
94eae4988bSStefano Babic	orr r1, r1, #0x00000C00
95eae4988bSStefano Babic	orr r1, r1, #0x00000003
96eae4988bSStefano Babic	str r1, [r0, #CLKCTL_CGR1]
97*961a7628SBenoît Thébaudeau
98*961a7628SBenoît Thébaudeau	ldr r1, [r0, #CLKCTL_CGR2]
99*961a7628SBenoît Thébaudeau	orr r1, r1, #0x00C00000
100*961a7628SBenoît Thébaudeau	str r1, [r0, #CLKCTL_CGR2]
101eae4988bSStefano Babic.endm
102eae4988bSStefano Babic
103eae4988bSStefano Babic.macro setup_sdram
104eae4988bSStefano Babic	ldr r0, =ESDCTL_BASE_ADDR
105eae4988bSStefano Babic	mov r3, #0x2000
106eae4988bSStefano Babic	str r3, [r0, #0x0]
107eae4988bSStefano Babic	str r3, [r0, #0x8]
108eae4988bSStefano Babic
109eae4988bSStefano Babic	/*ip(r12) has used to save lr register in upper calling*/
110eae4988bSStefano Babic	mov fp, lr
111eae4988bSStefano Babic
112eae4988bSStefano Babic	mov r5, #0x00
113eae4988bSStefano Babic	mov r2, #0x00
114eae4988bSStefano Babic	mov r1, #CSD0_BASE_ADDR
115eae4988bSStefano Babic	bl setup_sdram_bank
1166b5acfc1SStefano Babic
1176b5acfc1SStefano Babic	mov r5, #0x00
1186b5acfc1SStefano Babic	mov r2, #0x00
1196b5acfc1SStefano Babic	mov r1, #CSD1_BASE_ADDR
1206b5acfc1SStefano Babic	bl setup_sdram_bank
121eae4988bSStefano Babic
122eae4988bSStefano Babic	mov lr, fp
123eae4988bSStefano Babic
124eae4988bSStefano Babic1:
125eae4988bSStefano Babic	ldr r3, =ESDCTL_DELAY_LINE5
126eae4988bSStefano Babic	str r3, [r0, #0x30]
127eae4988bSStefano Babic.endm
128eae4988bSStefano Babic
129eae4988bSStefano Babic.globl lowlevel_init
130eae4988bSStefano Babiclowlevel_init:
131eae4988bSStefano Babic	mov r10, lr
132eae4988bSStefano Babic
133151d63cbSBenoît Thébaudeau	core_init
134eae4988bSStefano Babic
135eae4988bSStefano Babic	init_aips
136eae4988bSStefano Babic
137eae4988bSStefano Babic	init_max
138eae4988bSStefano Babic
139eae4988bSStefano Babic	init_m3if
140eae4988bSStefano Babic
141eae4988bSStefano Babic	init_clock
142eae4988bSStefano Babic	init_debug_board
143eae4988bSStefano Babic
144eae4988bSStefano Babic	cmp pc, #PHYS_SDRAM_1
145eae4988bSStefano Babic	blo init_sdram_start
146eae4988bSStefano Babic	cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE)
147eae4988bSStefano Babic	blo skip_sdram_setup
148eae4988bSStefano Babic
149eae4988bSStefano Babicinit_sdram_start:
150eae4988bSStefano Babic	/*init_sdram*/
151eae4988bSStefano Babic	setup_sdram
152eae4988bSStefano Babic
153eae4988bSStefano Babicskip_sdram_setup:
154eae4988bSStefano Babic	mov lr, r10
155eae4988bSStefano Babic	mov pc, lr
156eae4988bSStefano Babic
157eae4988bSStefano Babic
158eae4988bSStefano Babic/*
159eae4988bSStefano Babic * r0: ESDCTL control base, r1: sdram slot base
160eae4988bSStefano Babic * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base
161eae4988bSStefano Babic */
162eae4988bSStefano Babicsetup_sdram_bank:
163eae4988bSStefano Babic	mov r3, #0xE
164eae4988bSStefano Babic	tst r2, #0x1
165eae4988bSStefano Babic	orreq r3, r3, #0x300 /*DDR2*/
166eae4988bSStefano Babic	str r3, [r0, #0x10]
167eae4988bSStefano Babic	bic r3, r3, #0x00A
168eae4988bSStefano Babic	str r3, [r0, #0x10]
169eae4988bSStefano Babic	beq 2f
170eae4988bSStefano Babic
171eae4988bSStefano Babic	mov r3, #0x20000
172eae4988bSStefano Babic1:      subs r3, r3, #1
173eae4988bSStefano Babic	bne 1b
174eae4988bSStefano Babic
175eae4988bSStefano Babic2:      tst r2, #0x1
176eae4988bSStefano Babic	ldreq r3, =ESDCTL_DDR2_CONFIG
177eae4988bSStefano Babic	ldrne r3, =ESDCTL_MDDR_CONFIG
178eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
179eae4988bSStefano Babic	strlo r3, [r0, #0x4]
180eae4988bSStefano Babic	strhs r3, [r0, #0xC]
181eae4988bSStefano Babic
182eae4988bSStefano Babic	ldr r3, =ESDCTL_0x92220000
183eae4988bSStefano Babic	strlo r3, [r0, #0x0]
184eae4988bSStefano Babic	strhs r3, [r0, #0x8]
185eae4988bSStefano Babic	mov r3, #0xDA
186eae4988bSStefano Babic	ldr r4, =ESDCTL_PRECHARGE
187eae4988bSStefano Babic	strb r3, [r1, r4]
188eae4988bSStefano Babic
189eae4988bSStefano Babic	tst r2, #0x1
190eae4988bSStefano Babic	bne skip_set_mode
191eae4988bSStefano Babic
192eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
193eae4988bSStefano Babic	ldr r3, =ESDCTL_0xB2220000
194eae4988bSStefano Babic	strlo r3, [r0, #0x0]
195eae4988bSStefano Babic	strhs r3, [r0, #0x8]
196eae4988bSStefano Babic	mov r3, #0xDA
197eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EMR2
198eae4988bSStefano Babic	strb r3, [r1, r4]
199eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EMR3
200eae4988bSStefano Babic	strb r3, [r1, r4]
201eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EN_DLL
202eae4988bSStefano Babic	strb r3, [r1, r4]
203eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_RESET_DLL
204eae4988bSStefano Babic	strb r3, [r1, r4]
205eae4988bSStefano Babic
206eae4988bSStefano Babic	ldr r3, =ESDCTL_0x92220000
207eae4988bSStefano Babic	strlo r3, [r0, #0x0]
208eae4988bSStefano Babic	strhs r3, [r0, #0x8]
209eae4988bSStefano Babic	mov r3, #0xDA
210eae4988bSStefano Babic	ldr r4, =ESDCTL_PRECHARGE
211eae4988bSStefano Babic	strb r3, [r1, r4]
212eae4988bSStefano Babic
213eae4988bSStefano Babicskip_set_mode:
214eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
215eae4988bSStefano Babic	ldr r3, =ESDCTL_0xA2220000
216eae4988bSStefano Babic	strlo r3, [r0, #0x0]
217eae4988bSStefano Babic	strhs r3, [r0, #0x8]
218eae4988bSStefano Babic	mov r3, #0xDA
219eae4988bSStefano Babic	strb r3, [r1]
220eae4988bSStefano Babic	strb r3, [r1]
221eae4988bSStefano Babic
222eae4988bSStefano Babic	ldr r3, =ESDCTL_0xB2220000
223eae4988bSStefano Babic	strlo r3, [r0, #0x0]
224eae4988bSStefano Babic	strhs r3, [r0, #0x8]
225eae4988bSStefano Babic	tst r2, #0x1
226eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_MR
227eae4988bSStefano Babic	ldrne r4, =ESDCTL_MDDR_MR
228eae4988bSStefano Babic	mov r3, #0xDA
229eae4988bSStefano Babic	strb r3, [r1, r4]
230eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT
231eae4988bSStefano Babic	streqb r3, [r1, r4]
232eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_EN_DLL
233eae4988bSStefano Babic	ldrne r4, =ESDCTL_MDDR_EMR
234eae4988bSStefano Babic	strb r3, [r1, r4]
235eae4988bSStefano Babic
236eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
237eae4988bSStefano Babic	ldr r3, =ESDCTL_0x82228080
238eae4988bSStefano Babic	strlo r3, [r0, #0x0]
239eae4988bSStefano Babic	strhs r3, [r0, #0x8]
240eae4988bSStefano Babic
241eae4988bSStefano Babic	tst r2, #0x1
242eae4988bSStefano Babic	moveq r4, #0x20000
243eae4988bSStefano Babic	movne r4, #0x200
244eae4988bSStefano Babic1:      subs r4, r4, #1
245eae4988bSStefano Babic	bne 1b
246eae4988bSStefano Babic
247eae4988bSStefano Babic	str r3, [r1, #0x100]
248eae4988bSStefano Babic	ldr r4, [r1, #0x100]
249eae4988bSStefano Babic	cmp r3, r4
250eae4988bSStefano Babic	movne r3, #1
251eae4988bSStefano Babic	moveq r3, #0
252eae4988bSStefano Babic
253eae4988bSStefano Babic	mov pc, lr
254