xref: /OK3568_Linux_fs/u-boot/board/freescale/mx31ads/lowlevel_init.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Copyright (C) 2008, Guennadi Liakhovetski <lg@denx.de>
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun#include <asm/arch/imx-regs.h>
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun.macro REG reg, val
10*4882a593Smuzhiyun	ldr r2, =\reg
11*4882a593Smuzhiyun	ldr r3, =\val
12*4882a593Smuzhiyun	str r3, [r2]
13*4882a593Smuzhiyun.endm
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun.macro REG8 reg, val
16*4882a593Smuzhiyun	ldr r2, =\reg
17*4882a593Smuzhiyun	ldr r3, =\val
18*4882a593Smuzhiyun	strb r3, [r2]
19*4882a593Smuzhiyun.endm
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun.macro DELAY loops
22*4882a593Smuzhiyun	ldr r2, =\loops
23*4882a593Smuzhiyun1:
24*4882a593Smuzhiyun	subs	r2, r2, #1
25*4882a593Smuzhiyun	nop
26*4882a593Smuzhiyun	bcs 1b
27*4882a593Smuzhiyun.endm
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun/* RedBoot: AIPS setup - Only setup MPROTx registers.
30*4882a593Smuzhiyun * The PACR default values are good.*/
31*4882a593Smuzhiyun.macro init_aips
32*4882a593Smuzhiyun	/*
33*4882a593Smuzhiyun	 * Set all MPROTx to be non-bufferable, trusted for R/W,
34*4882a593Smuzhiyun	 * not forced to user-mode.
35*4882a593Smuzhiyun	 */
36*4882a593Smuzhiyun	ldr r0, =0x43F00000
37*4882a593Smuzhiyun	ldr r1, =0x77777777
38*4882a593Smuzhiyun	str r1, [r0, #0x00]
39*4882a593Smuzhiyun	str r1, [r0, #0x04]
40*4882a593Smuzhiyun	ldr r0, =0x53F00000
41*4882a593Smuzhiyun	str r1, [r0, #0x00]
42*4882a593Smuzhiyun	str r1, [r0, #0x04]
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	/*
45*4882a593Smuzhiyun	 * Clear the on and off peripheral modules Supervisor Protect bit
46*4882a593Smuzhiyun	 * for SDMA to access them. Did not change the AIPS control registers
47*4882a593Smuzhiyun	 * (offset 0x20) access type
48*4882a593Smuzhiyun	 */
49*4882a593Smuzhiyun	ldr r0, =0x43F00000
50*4882a593Smuzhiyun	ldr r1, =0x0
51*4882a593Smuzhiyun	str r1, [r0, #0x40]
52*4882a593Smuzhiyun	str r1, [r0, #0x44]
53*4882a593Smuzhiyun	str r1, [r0, #0x48]
54*4882a593Smuzhiyun	str r1, [r0, #0x4C]
55*4882a593Smuzhiyun	ldr r1, [r0, #0x50]
56*4882a593Smuzhiyun	and r1, r1, #0x00FFFFFF
57*4882a593Smuzhiyun	str r1, [r0, #0x50]
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun	ldr r0, =0x53F00000
60*4882a593Smuzhiyun	ldr r1, =0x0
61*4882a593Smuzhiyun	str r1, [r0, #0x40]
62*4882a593Smuzhiyun	str r1, [r0, #0x44]
63*4882a593Smuzhiyun	str r1, [r0, #0x48]
64*4882a593Smuzhiyun	str r1, [r0, #0x4C]
65*4882a593Smuzhiyun	ldr r1, [r0, #0x50]
66*4882a593Smuzhiyun	and r1, r1, #0x00FFFFFF
67*4882a593Smuzhiyun	str r1, [r0, #0x50]
68*4882a593Smuzhiyun.endm /* init_aips */
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun/* RedBoot: MAX (Multi-Layer AHB Crossbar Switch) setup */
71*4882a593Smuzhiyun.macro init_max
72*4882a593Smuzhiyun	ldr r0, =0x43F04000
73*4882a593Smuzhiyun	/* MPR - priority is M4 > M2 > M3 > M5 > M0 > M1 */
74*4882a593Smuzhiyun	ldr r1, =0x00302154
75*4882a593Smuzhiyun	str r1, [r0, #0x000]        /* for S0 */
76*4882a593Smuzhiyun	str r1, [r0, #0x100]        /* for S1 */
77*4882a593Smuzhiyun	str r1, [r0, #0x200]        /* for S2 */
78*4882a593Smuzhiyun	str r1, [r0, #0x300]        /* for S3 */
79*4882a593Smuzhiyun	str r1, [r0, #0x400]        /* for S4 */
80*4882a593Smuzhiyun	/* SGPCR - always park on last master */
81*4882a593Smuzhiyun	ldr r1, =0x10
82*4882a593Smuzhiyun	str r1, [r0, #0x010]        /* for S0 */
83*4882a593Smuzhiyun	str r1, [r0, #0x110]        /* for S1 */
84*4882a593Smuzhiyun	str r1, [r0, #0x210]        /* for S2 */
85*4882a593Smuzhiyun	str r1, [r0, #0x310]        /* for S3 */
86*4882a593Smuzhiyun	str r1, [r0, #0x410]        /* for S4 */
87*4882a593Smuzhiyun	/* MGPCR - restore default values */
88*4882a593Smuzhiyun	ldr r1, =0x0
89*4882a593Smuzhiyun	str r1, [r0, #0x800]        /* for M0 */
90*4882a593Smuzhiyun	str r1, [r0, #0x900]        /* for M1 */
91*4882a593Smuzhiyun	str r1, [r0, #0xA00]        /* for M2 */
92*4882a593Smuzhiyun	str r1, [r0, #0xB00]        /* for M3 */
93*4882a593Smuzhiyun	str r1, [r0, #0xC00]        /* for M4 */
94*4882a593Smuzhiyun	str r1, [r0, #0xD00]        /* for M5 */
95*4882a593Smuzhiyun.endm /* init_max */
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun/* RedBoot: M3IF setup */
98*4882a593Smuzhiyun.macro init_m3if
99*4882a593Smuzhiyun	/* Configure M3IF registers */
100*4882a593Smuzhiyun	ldr r1, =0xB8003000
101*4882a593Smuzhiyun	/*
102*4882a593Smuzhiyun	* M3IF Control Register (M3IFCTL)
103*4882a593Smuzhiyun	* MRRP[0] = L2CC0 not on priority list (0 << 0)	= 0x00000000
104*4882a593Smuzhiyun	* MRRP[1] = L2CC1 not on priority list (0 << 0)	= 0x00000000
105*4882a593Smuzhiyun	* MRRP[2] = MBX not on priority list (0 << 0)	= 0x00000000
106*4882a593Smuzhiyun	* MRRP[3] = MAX1 not on priority list (0 << 0)	= 0x00000000
107*4882a593Smuzhiyun	* MRRP[4] = SDMA not on priority list (0 << 0)	= 0x00000000
108*4882a593Smuzhiyun	* MRRP[5] = MPEG4 not on priority list (0 << 0)	= 0x00000000
109*4882a593Smuzhiyun	* MRRP[6] = IPU1 on priority list (1 << 6)	= 0x00000040
110*4882a593Smuzhiyun	* MRRP[7] = IPU2 not on priority list (0 << 0)	= 0x00000000
111*4882a593Smuzhiyun	*						------------
112*4882a593Smuzhiyun	*						  0x00000040
113*4882a593Smuzhiyun	*/
114*4882a593Smuzhiyun	ldr r0, =0x00000040
115*4882a593Smuzhiyun	str r0, [r1]  /* M3IF control reg */
116*4882a593Smuzhiyun.endm /* init_m3if */
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun/* RedBoot: To support 133MHz DDR */
119*4882a593Smuzhiyun.macro  init_drive_strength
120*4882a593Smuzhiyun	/*
121*4882a593Smuzhiyun	 * Disable maximum drive strength SDRAM/DDR lines by clearing DSE1 bits
122*4882a593Smuzhiyun	 * in SW_PAD_CTL registers
123*4882a593Smuzhiyun	 */
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun	/* SDCLK */
126*4882a593Smuzhiyun	ldr r1, =0x43FAC200
127*4882a593Smuzhiyun	ldr r0, [r1, #0x6C]
128*4882a593Smuzhiyun	bic r0, r0, #(1 << 12)
129*4882a593Smuzhiyun	str r0, [r1, #0x6C]
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun	/* CAS */
132*4882a593Smuzhiyun	ldr r0, [r1, #0x70]
133*4882a593Smuzhiyun	bic r0, r0, #(1 << 22)
134*4882a593Smuzhiyun	str r0, [r1, #0x70]
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun	/* RAS */
137*4882a593Smuzhiyun	ldr r0, [r1, #0x74]
138*4882a593Smuzhiyun	bic r0, r0, #(1 << 2)
139*4882a593Smuzhiyun	str r0, [r1, #0x74]
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun	/* CS2 (CSD0) */
142*4882a593Smuzhiyun	ldr r0, [r1, #0x7C]
143*4882a593Smuzhiyun	bic r0, r0, #(1 << 22)
144*4882a593Smuzhiyun	str r0, [r1, #0x7C]
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun	/* DQM3 */
147*4882a593Smuzhiyun	ldr r0, [r1, #0x84]
148*4882a593Smuzhiyun	bic r0, r0, #(1 << 22)
149*4882a593Smuzhiyun	str r0, [r1, #0x84]
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun	/* DQM2, DQM1, DQM0, SD31-SD0, A25-A0, MA10 (0x288..0x2DC) */
152*4882a593Smuzhiyun	ldr r2, =22	/* (0x2E0 - 0x288) / 4 = 22 */
153*4882a593Smuzhiyunpad_loop:
154*4882a593Smuzhiyun	ldr r0, [r1, #0x88]
155*4882a593Smuzhiyun	bic r0, r0, #(1 << 22)
156*4882a593Smuzhiyun	bic r0, r0, #(1 << 12)
157*4882a593Smuzhiyun	bic r0, r0, #(1 << 2)
158*4882a593Smuzhiyun	str r0, [r1, #0x88]
159*4882a593Smuzhiyun	add r1, r1, #4
160*4882a593Smuzhiyun	subs r2, r2, #0x1
161*4882a593Smuzhiyun	bne pad_loop
162*4882a593Smuzhiyun.endm /* init_drive_strength */
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun/* CPLD on CS4 setup */
165*4882a593Smuzhiyun.macro init_cs4
166*4882a593Smuzhiyun	ldr r0, =WEIM_BASE
167*4882a593Smuzhiyun	ldr r1, =0x0000D843
168*4882a593Smuzhiyun	str r1, [r0, #0x40]
169*4882a593Smuzhiyun	ldr r1, =0x22252521
170*4882a593Smuzhiyun	str r1, [r0, #0x44]
171*4882a593Smuzhiyun	ldr r1, =0x22220A00
172*4882a593Smuzhiyun	str r1, [r0, #0x48]
173*4882a593Smuzhiyun.endm /* init_cs4 */
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun.globl lowlevel_init
176*4882a593Smuzhiyunlowlevel_init:
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun	/* Redboot initializes very early AIPS, what for?
179*4882a593Smuzhiyun	 * Then it also initializes Multi-Layer AHB Crossbar Switch,
180*4882a593Smuzhiyun	 * M3IF */
181*4882a593Smuzhiyun	/* Also setup the Peripheral Port Remap register inside the core */
182*4882a593Smuzhiyun	ldr r0, =0x40000015        /* start from AIPS 2GB region */
183*4882a593Smuzhiyun	mcr p15, 0, r0, c15, c2, 4
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun	init_aips
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun	init_max
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun	init_m3if
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun	init_drive_strength
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun	init_cs4
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun	/* Image Processing Unit: */
196*4882a593Smuzhiyun	/* Too early to switch display on? */
197*4882a593Smuzhiyun	REG	IPU_CONF, IPU_CONF_DI_EN	/* Switch on Display Interface */
198*4882a593Smuzhiyun	/* Clock Control Module: */
199*4882a593Smuzhiyun	REG	CCM_CCMR, 0x074B0BF5		/* Use CKIH, MCU PLL off */
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun	DELAY 0x40000
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun	REG	CCM_CCMR, 0x074B0BF5 | CCMR_MPE			/* MCU PLL on */
204*4882a593Smuzhiyun	REG	CCM_CCMR, (0x074B0BF5 | CCMR_MPE) & ~CCMR_MDS	/* Switch to MCU PLL */
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun	/* PBC CPLD on CS4 */
207*4882a593Smuzhiyun	mov	r1, #CS4_BASE
208*4882a593Smuzhiyun	ldrh	r1, [r1, #0x2]
209*4882a593Smuzhiyun	/* Is 27MHz switch set? */
210*4882a593Smuzhiyun	ands	r1, r1, #0x10
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun	/* 532-133-66.5 */
213*4882a593Smuzhiyun	ldr	r0, =CCM_BASE
214*4882a593Smuzhiyun	ldr	r1, =0xFF871D58
215*4882a593Smuzhiyun	/* PDR0 */
216*4882a593Smuzhiyun	str	r1, [r0, #0x4]
217*4882a593Smuzhiyun	ldreq	r1, MPCTL_PARAM_532
218*4882a593Smuzhiyun	ldrne	r1, MPCTL_PARAM_532_27
219*4882a593Smuzhiyun	/* MPCTL */
220*4882a593Smuzhiyun	str	r1, [r0, #0x10]
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun	/* Set UPLL=240MHz, USB=60MHz */
223*4882a593Smuzhiyun	ldr	r1, =0x49FCFE7F
224*4882a593Smuzhiyun	/* PDR1 */
225*4882a593Smuzhiyun	str	r1, [r0, #0x8]
226*4882a593Smuzhiyun	ldreq	r1, UPCTL_PARAM_240
227*4882a593Smuzhiyun	ldrne	r1, UPCTL_PARAM_240_27
228*4882a593Smuzhiyun	/* UPCTL */
229*4882a593Smuzhiyun	str	r1, [r0, #0x14]
230*4882a593Smuzhiyun	/* default CLKO to 1/8 of the ARM core */
231*4882a593Smuzhiyun	mov	r1, #0x000002C0
232*4882a593Smuzhiyun	add	r1, r1, #0x00000006
233*4882a593Smuzhiyun	/* COSR */
234*4882a593Smuzhiyun	str	r1, [r0, #0x1c]
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun	/* RedBoot sets 0x3f, 7, 7, 3, 5, 1, 3, 0 */
237*4882a593Smuzhiyun/*	REG	CCM_PDR0, PDR0_CSI_PODF(0x3f) | PDR0_CSI_PRDF(7) | PDR0_PER_PODF(7) | PDR0_HSP_PODF(2) | PDR0_NFC_PODF(6) | PDR0_IPG_PODF(1) | PDR0_MAX_PODF(2) | PDR0_MCU_PODF(0)*/
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun	/* Redboot: 0, 51, 10, 12 / 0, 14, 9, 13 */
240*4882a593Smuzhiyun/*	REG	CCM_MPCTL, PLL_PD(0) | PLL_MFD(0x33) | PLL_MFI(7) | PLL_MFN(0x23)*/
241*4882a593Smuzhiyun	/* Default: 1, 4, 12, 1 */
242*4882a593Smuzhiyun	REG	CCM_SPCTL, PLL_PD(1) | PLL_MFD(4) | PLL_MFI(12) | PLL_MFN(1)
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun	/* B8xxxxxx - NAND, 8xxxxxxx - CSD0 RAM */
245*4882a593Smuzhiyun	REG	0xB8001010, 0x00000004
246*4882a593Smuzhiyun	REG	0xB8001004, 0x006ac73a
247*4882a593Smuzhiyun	REG	0xB8001000, 0x92100000
248*4882a593Smuzhiyun	REG	0x80000f00, 0x12344321
249*4882a593Smuzhiyun	REG	0xB8001000, 0xa2100000
250*4882a593Smuzhiyun	REG	0x80000000, 0x12344321
251*4882a593Smuzhiyun	REG	0x80000000, 0x12344321
252*4882a593Smuzhiyun	REG	0xB8001000, 0xb2100000
253*4882a593Smuzhiyun	REG8	0x80000033, 0xda
254*4882a593Smuzhiyun	REG8	0x81000000, 0xff
255*4882a593Smuzhiyun	REG	0xB8001000, 0x82226080
256*4882a593Smuzhiyun	REG	0x80000000, 0xDEADBEEF
257*4882a593Smuzhiyun	REG	0xB8001010, 0x0000000c
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun	mov	pc, lr
260*4882a593Smuzhiyun
261*4882a593SmuzhiyunMPCTL_PARAM_532:
262*4882a593Smuzhiyun	.word (((1-1) << 26) + ((52-1) << 16) + (10 << 10) + (12 << 0))
263*4882a593SmuzhiyunMPCTL_PARAM_532_27:
264*4882a593Smuzhiyun	.word (((1-1) << 26) + ((15-1) << 16) + (9  << 10) + (13 << 0))
265*4882a593SmuzhiyunUPCTL_PARAM_240:
266*4882a593Smuzhiyun	.word (((2-1) << 26) + ((13-1) << 16) + (9  << 10) + (3  << 0))
267*4882a593SmuzhiyunUPCTL_PARAM_240_27:
268*4882a593Smuzhiyun	.word (((2-1) << 26) + ((9 -1) << 16) + (8  << 10) + (8  << 0))
269