xref: /rk3399_rockchip-uboot/board/freescale/mx35pdk/lowlevel_init.S (revision 151d63cb9145b5eeb4585cb1b5a9c95f985a0e12)
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"
26*151d63cbSBenoî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]
97eae4988bSStefano Babic.endm
98eae4988bSStefano Babic
99eae4988bSStefano Babic.macro setup_sdram
100eae4988bSStefano Babic	ldr r0, =ESDCTL_BASE_ADDR
101eae4988bSStefano Babic	mov r3, #0x2000
102eae4988bSStefano Babic	str r3, [r0, #0x0]
103eae4988bSStefano Babic	str r3, [r0, #0x8]
104eae4988bSStefano Babic
105eae4988bSStefano Babic	/*ip(r12) has used to save lr register in upper calling*/
106eae4988bSStefano Babic	mov fp, lr
107eae4988bSStefano Babic
108eae4988bSStefano Babic	mov r5, #0x00
109eae4988bSStefano Babic	mov r2, #0x00
110eae4988bSStefano Babic	mov r1, #CSD0_BASE_ADDR
111eae4988bSStefano Babic	bl setup_sdram_bank
1126b5acfc1SStefano Babic
1136b5acfc1SStefano Babic	mov r5, #0x00
1146b5acfc1SStefano Babic	mov r2, #0x00
1156b5acfc1SStefano Babic	mov r1, #CSD1_BASE_ADDR
1166b5acfc1SStefano Babic	bl setup_sdram_bank
117eae4988bSStefano Babic
118eae4988bSStefano Babic	mov lr, fp
119eae4988bSStefano Babic
120eae4988bSStefano Babic1:
121eae4988bSStefano Babic	ldr r3, =ESDCTL_DELAY_LINE5
122eae4988bSStefano Babic	str r3, [r0, #0x30]
123eae4988bSStefano Babic.endm
124eae4988bSStefano Babic
125eae4988bSStefano Babic.globl lowlevel_init
126eae4988bSStefano Babiclowlevel_init:
127eae4988bSStefano Babic	mov r10, lr
128eae4988bSStefano Babic
129*151d63cbSBenoît Thébaudeau	core_init
130eae4988bSStefano Babic
131eae4988bSStefano Babic	init_aips
132eae4988bSStefano Babic
133eae4988bSStefano Babic	init_max
134eae4988bSStefano Babic
135eae4988bSStefano Babic	init_m3if
136eae4988bSStefano Babic
137eae4988bSStefano Babic	init_clock
138eae4988bSStefano Babic	init_debug_board
139eae4988bSStefano Babic
140eae4988bSStefano Babic	cmp pc, #PHYS_SDRAM_1
141eae4988bSStefano Babic	blo init_sdram_start
142eae4988bSStefano Babic	cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE)
143eae4988bSStefano Babic	blo skip_sdram_setup
144eae4988bSStefano Babic
145eae4988bSStefano Babicinit_sdram_start:
146eae4988bSStefano Babic	/*init_sdram*/
147eae4988bSStefano Babic	setup_sdram
148eae4988bSStefano Babic
149eae4988bSStefano Babicskip_sdram_setup:
150eae4988bSStefano Babic	mov lr, r10
151eae4988bSStefano Babic	mov pc, lr
152eae4988bSStefano Babic
153eae4988bSStefano Babic
154eae4988bSStefano Babic/*
155eae4988bSStefano Babic * r0: ESDCTL control base, r1: sdram slot base
156eae4988bSStefano Babic * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base
157eae4988bSStefano Babic */
158eae4988bSStefano Babicsetup_sdram_bank:
159eae4988bSStefano Babic	mov r3, #0xE
160eae4988bSStefano Babic	tst r2, #0x1
161eae4988bSStefano Babic	orreq r3, r3, #0x300 /*DDR2*/
162eae4988bSStefano Babic	str r3, [r0, #0x10]
163eae4988bSStefano Babic	bic r3, r3, #0x00A
164eae4988bSStefano Babic	str r3, [r0, #0x10]
165eae4988bSStefano Babic	beq 2f
166eae4988bSStefano Babic
167eae4988bSStefano Babic	mov r3, #0x20000
168eae4988bSStefano Babic1:      subs r3, r3, #1
169eae4988bSStefano Babic	bne 1b
170eae4988bSStefano Babic
171eae4988bSStefano Babic2:      tst r2, #0x1
172eae4988bSStefano Babic	ldreq r3, =ESDCTL_DDR2_CONFIG
173eae4988bSStefano Babic	ldrne r3, =ESDCTL_MDDR_CONFIG
174eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
175eae4988bSStefano Babic	strlo r3, [r0, #0x4]
176eae4988bSStefano Babic	strhs r3, [r0, #0xC]
177eae4988bSStefano Babic
178eae4988bSStefano Babic	ldr r3, =ESDCTL_0x92220000
179eae4988bSStefano Babic	strlo r3, [r0, #0x0]
180eae4988bSStefano Babic	strhs r3, [r0, #0x8]
181eae4988bSStefano Babic	mov r3, #0xDA
182eae4988bSStefano Babic	ldr r4, =ESDCTL_PRECHARGE
183eae4988bSStefano Babic	strb r3, [r1, r4]
184eae4988bSStefano Babic
185eae4988bSStefano Babic	tst r2, #0x1
186eae4988bSStefano Babic	bne skip_set_mode
187eae4988bSStefano Babic
188eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
189eae4988bSStefano Babic	ldr r3, =ESDCTL_0xB2220000
190eae4988bSStefano Babic	strlo r3, [r0, #0x0]
191eae4988bSStefano Babic	strhs r3, [r0, #0x8]
192eae4988bSStefano Babic	mov r3, #0xDA
193eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EMR2
194eae4988bSStefano Babic	strb r3, [r1, r4]
195eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EMR3
196eae4988bSStefano Babic	strb r3, [r1, r4]
197eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_EN_DLL
198eae4988bSStefano Babic	strb r3, [r1, r4]
199eae4988bSStefano Babic	ldr r4, =ESDCTL_DDR2_RESET_DLL
200eae4988bSStefano Babic	strb r3, [r1, r4]
201eae4988bSStefano Babic
202eae4988bSStefano Babic	ldr r3, =ESDCTL_0x92220000
203eae4988bSStefano Babic	strlo r3, [r0, #0x0]
204eae4988bSStefano Babic	strhs r3, [r0, #0x8]
205eae4988bSStefano Babic	mov r3, #0xDA
206eae4988bSStefano Babic	ldr r4, =ESDCTL_PRECHARGE
207eae4988bSStefano Babic	strb r3, [r1, r4]
208eae4988bSStefano Babic
209eae4988bSStefano Babicskip_set_mode:
210eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
211eae4988bSStefano Babic	ldr r3, =ESDCTL_0xA2220000
212eae4988bSStefano Babic	strlo r3, [r0, #0x0]
213eae4988bSStefano Babic	strhs r3, [r0, #0x8]
214eae4988bSStefano Babic	mov r3, #0xDA
215eae4988bSStefano Babic	strb r3, [r1]
216eae4988bSStefano Babic	strb r3, [r1]
217eae4988bSStefano Babic
218eae4988bSStefano Babic	ldr r3, =ESDCTL_0xB2220000
219eae4988bSStefano Babic	strlo r3, [r0, #0x0]
220eae4988bSStefano Babic	strhs r3, [r0, #0x8]
221eae4988bSStefano Babic	tst r2, #0x1
222eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_MR
223eae4988bSStefano Babic	ldrne r4, =ESDCTL_MDDR_MR
224eae4988bSStefano Babic	mov r3, #0xDA
225eae4988bSStefano Babic	strb r3, [r1, r4]
226eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT
227eae4988bSStefano Babic	streqb r3, [r1, r4]
228eae4988bSStefano Babic	ldreq r4, =ESDCTL_DDR2_EN_DLL
229eae4988bSStefano Babic	ldrne r4, =ESDCTL_MDDR_EMR
230eae4988bSStefano Babic	strb r3, [r1, r4]
231eae4988bSStefano Babic
232eae4988bSStefano Babic	cmp r1, #CSD1_BASE_ADDR
233eae4988bSStefano Babic	ldr r3, =ESDCTL_0x82228080
234eae4988bSStefano Babic	strlo r3, [r0, #0x0]
235eae4988bSStefano Babic	strhs r3, [r0, #0x8]
236eae4988bSStefano Babic
237eae4988bSStefano Babic	tst r2, #0x1
238eae4988bSStefano Babic	moveq r4, #0x20000
239eae4988bSStefano Babic	movne r4, #0x200
240eae4988bSStefano Babic1:      subs r4, r4, #1
241eae4988bSStefano Babic	bne 1b
242eae4988bSStefano Babic
243eae4988bSStefano Babic	str r3, [r1, #0x100]
244eae4988bSStefano Babic	ldr r4, [r1, #0x100]
245eae4988bSStefano Babic	cmp r3, r4
246eae4988bSStefano Babic	movne r3, #1
247eae4988bSStefano Babic	moveq r3, #0
248eae4988bSStefano Babic
249eae4988bSStefano Babic	mov pc, lr
250