xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-omap2/omap3/lowlevel_init.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Board specific setup info
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * (C) Copyright 2008
5*4882a593Smuzhiyun * Texas Instruments, <www.ti.com>
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Initial Code by:
8*4882a593Smuzhiyun * Richard Woodruff <r-woodruff2@ti.com>
9*4882a593Smuzhiyun * Syed Mohammed Khasim <khasim@ti.com>
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0+
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun#include <config.h>
15*4882a593Smuzhiyun#include <asm/arch/mem.h>
16*4882a593Smuzhiyun#include <asm/arch/clocks_omap3.h>
17*4882a593Smuzhiyun#include <linux/linkage.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun/*
20*4882a593Smuzhiyun * Funtion for making PPA HAL API calls in secure devices
21*4882a593Smuzhiyun * Input:
22*4882a593Smuzhiyun *	R0 - Service ID
23*4882a593Smuzhiyun *	R1 - paramer list
24*4882a593Smuzhiyun */
25*4882a593SmuzhiyunENTRY(do_omap3_emu_romcode_call)
26*4882a593Smuzhiyun	PUSH {r4-r12, lr} @ Save all registers from ROM code!
27*4882a593Smuzhiyun	MOV r12, r0	@ Copy the Secure Service ID in R12
28*4882a593Smuzhiyun	MOV r3, r1	@ Copy the pointer to va_list in R3
29*4882a593Smuzhiyun	MOV r1, #0	@ Process ID - 0
30*4882a593Smuzhiyun	MOV r2, #OMAP3_EMU_HAL_START_HAL_CRITICAL	@ Copy the pointer
31*4882a593Smuzhiyun							@ to va_list in R3
32*4882a593Smuzhiyun	MOV r6, #0xFF	@ Indicate new Task call
33*4882a593Smuzhiyun	mcr     p15, 0, r0, c7, c10, 4	@ DSB
34*4882a593Smuzhiyun	mcr     p15, 0, r0, c7, c10, 5	@ DMB
35*4882a593Smuzhiyun	.word	0xe1600071	@ SMC #1 to call PPA service - hand assembled
36*4882a593Smuzhiyun				@ because we use -march=armv5
37*4882a593Smuzhiyun	POP {r4-r12, pc}
38*4882a593SmuzhiyunENDPROC(do_omap3_emu_romcode_call)
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun#if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_NAND_BOOT)
41*4882a593Smuzhiyun/**************************************************************************
42*4882a593Smuzhiyun * cpy_clk_code: relocates clock code into SRAM where its safer to execute
43*4882a593Smuzhiyun * R1 = SRAM destination address.
44*4882a593Smuzhiyun *************************************************************************/
45*4882a593SmuzhiyunENTRY(cpy_clk_code)
46*4882a593Smuzhiyun	/* Copy DPLL code into SRAM */
47*4882a593Smuzhiyun	adr	r0, go_to_speed		/* copy from start of go_to_speed... */
48*4882a593Smuzhiyun	adr	r2, lowlevel_init	/* ... up to start of low_level_init */
49*4882a593Smuzhiyunnext2:
50*4882a593Smuzhiyun	ldmia	r0!, {r3 - r10}		/* copy from source address [r0] */
51*4882a593Smuzhiyun	stmia	r1!, {r3 - r10}		/* copy to   target address [r1] */
52*4882a593Smuzhiyun	cmp	r0, r2			/* until source end address [r2] */
53*4882a593Smuzhiyun	blo	next2
54*4882a593Smuzhiyun	mov	pc, lr			/* back to caller */
55*4882a593SmuzhiyunENDPROC(cpy_clk_code)
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun/* ***************************************************************************
58*4882a593Smuzhiyun *  go_to_speed: -Moves to bypass, -Commits clock dividers, -puts dpll at speed
59*4882a593Smuzhiyun *               -executed from SRAM.
60*4882a593Smuzhiyun *  R0 = CM_CLKEN_PLL-bypass value
61*4882a593Smuzhiyun *  R1 = CM_CLKSEL1_PLL-m, n, and divider values
62*4882a593Smuzhiyun *  R2 = CM_CLKSEL_CORE-divider values
63*4882a593Smuzhiyun *  R3 = CM_IDLEST_CKGEN - addr dpll lock wait
64*4882a593Smuzhiyun *
65*4882a593Smuzhiyun *  Note: If core unlocks/relocks and SDRAM is running fast already it gets
66*4882a593Smuzhiyun *        confused.  A reset of the controller gets it back.  Taking away its
67*4882a593Smuzhiyun *        L3 when its not in self refresh seems bad for it.  Normally, this
68*4882a593Smuzhiyun *	  code runs from flash before SDR is init so that should be ok.
69*4882a593Smuzhiyun ****************************************************************************/
70*4882a593SmuzhiyunENTRY(go_to_speed)
71*4882a593Smuzhiyun	stmfd sp!, {r4 - r6}
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun	/* move into fast relock bypass */
74*4882a593Smuzhiyun	ldr	r4, pll_ctl_add
75*4882a593Smuzhiyun	str	r0, [r4]
76*4882a593Smuzhiyunwait1:
77*4882a593Smuzhiyun	ldr	r5, [r3]		/* get status */
78*4882a593Smuzhiyun	and	r5, r5, #0x1		/* isolate core status */
79*4882a593Smuzhiyun	cmp	r5, #0x1		/* still locked? */
80*4882a593Smuzhiyun	beq	wait1			/* if lock, loop */
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun	/* set new dpll dividers _after_ in bypass */
83*4882a593Smuzhiyun	ldr	r5, pll_div_add1
84*4882a593Smuzhiyun	str	r1, [r5]		/* set m, n, m2 */
85*4882a593Smuzhiyun	ldr	r5, pll_div_add2
86*4882a593Smuzhiyun	str	r2, [r5]		/* set l3/l4/.. dividers*/
87*4882a593Smuzhiyun	ldr	r5, pll_div_add3	/* wkup */
88*4882a593Smuzhiyun	ldr	r2, pll_div_val3	/* rsm val */
89*4882a593Smuzhiyun	str	r2, [r5]
90*4882a593Smuzhiyun	ldr	r5, pll_div_add4	/* gfx */
91*4882a593Smuzhiyun	ldr	r2, pll_div_val4
92*4882a593Smuzhiyun	str	r2, [r5]
93*4882a593Smuzhiyun	ldr	r5, pll_div_add5	/* emu */
94*4882a593Smuzhiyun	ldr	r2, pll_div_val5
95*4882a593Smuzhiyun	str	r2, [r5]
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun	/* now prepare GPMC (flash) for new dpll speed */
98*4882a593Smuzhiyun	/* flash needs to be stable when we jump back to it */
99*4882a593Smuzhiyun	ldr	r5, flash_cfg3_addr
100*4882a593Smuzhiyun	ldr	r2, flash_cfg3_val
101*4882a593Smuzhiyun	str	r2, [r5]
102*4882a593Smuzhiyun	ldr	r5, flash_cfg4_addr
103*4882a593Smuzhiyun	ldr	r2, flash_cfg4_val
104*4882a593Smuzhiyun	str	r2, [r5]
105*4882a593Smuzhiyun	ldr	r5, flash_cfg5_addr
106*4882a593Smuzhiyun	ldr	r2, flash_cfg5_val
107*4882a593Smuzhiyun	str	r2, [r5]
108*4882a593Smuzhiyun	ldr	r5, flash_cfg1_addr
109*4882a593Smuzhiyun	ldr	r2, [r5]
110*4882a593Smuzhiyun	orr	r2, r2, #0x3		/* up gpmc divider */
111*4882a593Smuzhiyun	str	r2, [r5]
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun	/* lock DPLL3 and wait a bit */
114*4882a593Smuzhiyun	orr	r0, r0, #0x7	/* set up for lock mode */
115*4882a593Smuzhiyun	str	r0, [r4]	/* lock */
116*4882a593Smuzhiyun	nop			/* ARM slow at this point working at sys_clk */
117*4882a593Smuzhiyun	nop
118*4882a593Smuzhiyun	nop
119*4882a593Smuzhiyun	nop
120*4882a593Smuzhiyunwait2:
121*4882a593Smuzhiyun	ldr	r5, [r3]	/* get status */
122*4882a593Smuzhiyun	and	r5, r5, #0x1	/* isolate core status */
123*4882a593Smuzhiyun	cmp	r5, #0x1	/* still locked? */
124*4882a593Smuzhiyun	bne	wait2		/* if lock, loop */
125*4882a593Smuzhiyun	nop
126*4882a593Smuzhiyun	nop
127*4882a593Smuzhiyun	nop
128*4882a593Smuzhiyun	nop
129*4882a593Smuzhiyun	ldmfd	sp!, {r4 - r6}
130*4882a593Smuzhiyun	mov	pc, lr		/* back to caller, locked */
131*4882a593SmuzhiyunENDPROC(go_to_speed)
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun_go_to_speed: .word go_to_speed
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun/* these constants need to be close for PIC code */
136*4882a593Smuzhiyun/* The Nor has to be in the Flash Base CS0 for this condition to happen */
137*4882a593Smuzhiyunflash_cfg1_addr:
138*4882a593Smuzhiyun	.word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG1)
139*4882a593Smuzhiyunflash_cfg3_addr:
140*4882a593Smuzhiyun	.word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG3)
141*4882a593Smuzhiyunflash_cfg3_val:
142*4882a593Smuzhiyun	.word STNOR_GPMC_CONFIG3
143*4882a593Smuzhiyunflash_cfg4_addr:
144*4882a593Smuzhiyun	.word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG4)
145*4882a593Smuzhiyunflash_cfg4_val:
146*4882a593Smuzhiyun	.word STNOR_GPMC_CONFIG4
147*4882a593Smuzhiyunflash_cfg5_val:
148*4882a593Smuzhiyun	.word STNOR_GPMC_CONFIG5
149*4882a593Smuzhiyunflash_cfg5_addr:
150*4882a593Smuzhiyun	.word (GPMC_CONFIG_CS0_BASE + GPMC_CONFIG5)
151*4882a593Smuzhiyunpll_ctl_add:
152*4882a593Smuzhiyun	.word CM_CLKEN_PLL
153*4882a593Smuzhiyunpll_div_add1:
154*4882a593Smuzhiyun	.word CM_CLKSEL1_PLL
155*4882a593Smuzhiyunpll_div_add2:
156*4882a593Smuzhiyun	.word CM_CLKSEL_CORE
157*4882a593Smuzhiyunpll_div_add3:
158*4882a593Smuzhiyun	.word CM_CLKSEL_WKUP
159*4882a593Smuzhiyunpll_div_val3:
160*4882a593Smuzhiyun	.word (WKUP_RSM << 1)
161*4882a593Smuzhiyunpll_div_add4:
162*4882a593Smuzhiyun	.word CM_CLKSEL_GFX
163*4882a593Smuzhiyunpll_div_val4:
164*4882a593Smuzhiyun	.word (GFX_DIV << 0)
165*4882a593Smuzhiyunpll_div_add5:
166*4882a593Smuzhiyun	.word CM_CLKSEL1_EMU
167*4882a593Smuzhiyunpll_div_val5:
168*4882a593Smuzhiyun	.word CLSEL1_EMU_VAL
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun#endif
171*4882a593Smuzhiyun
172*4882a593SmuzhiyunENTRY(lowlevel_init)
173*4882a593Smuzhiyun	ldr	sp, SRAM_STACK
174*4882a593Smuzhiyun	str	ip, [sp]	/* stash ip register */
175*4882a593Smuzhiyun	mov	ip, lr		/* save link reg across call */
176*4882a593Smuzhiyun#if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_ONENAND_BOOT)
177*4882a593Smuzhiyun/*
178*4882a593Smuzhiyun * No need to copy/exec the clock code - DPLL adjust already done
179*4882a593Smuzhiyun * in NAND/oneNAND Boot.
180*4882a593Smuzhiyun */
181*4882a593Smuzhiyun	ldr	r1, =SRAM_CLK_CODE
182*4882a593Smuzhiyun	bl	cpy_clk_code
183*4882a593Smuzhiyun#endif /* NAND Boot */
184*4882a593Smuzhiyun	mov	lr, ip		/* restore link reg */
185*4882a593Smuzhiyun	ldr	ip, [sp]	/* restore save ip */
186*4882a593Smuzhiyun	/* tail-call s_init to setup pll, mux, memory */
187*4882a593Smuzhiyun	b	s_init
188*4882a593Smuzhiyun
189*4882a593SmuzhiyunENDPROC(lowlevel_init)
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun	/* the literal pools origin */
192*4882a593Smuzhiyun	.ltorg
193*4882a593Smuzhiyun
194*4882a593SmuzhiyunREG_CONTROL_STATUS:
195*4882a593Smuzhiyun	.word CONTROL_STATUS
196*4882a593SmuzhiyunSRAM_STACK:
197*4882a593Smuzhiyun	.word LOW_LEVEL_SRAM_STACK
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun/* DPLL(1-4) PARAM TABLES */
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun/*
202*4882a593Smuzhiyun * Each of the tables has M, N, FREQSEL, M2 values defined for nominal
203*4882a593Smuzhiyun * OPP (1.2V). The fields are defined according to dpll_param struct (clock.c).
204*4882a593Smuzhiyun * The values are defined for all possible sysclk and for ES1 and ES2.
205*4882a593Smuzhiyun */
206*4882a593Smuzhiyun
207*4882a593Smuzhiyunmpu_dpll_param:
208*4882a593Smuzhiyun/* 12MHz */
209*4882a593Smuzhiyun/* ES1 */
210*4882a593Smuzhiyun.word MPU_M_12_ES1, MPU_N_12_ES1, MPU_FSEL_12_ES1, MPU_M2_12_ES1
211*4882a593Smuzhiyun/* ES2 */
212*4882a593Smuzhiyun.word MPU_M_12_ES2, MPU_N_12_ES2, MPU_FSEL_12_ES2, MPU_M2_ES2
213*4882a593Smuzhiyun/* 3410 */
214*4882a593Smuzhiyun.word MPU_M_12, MPU_N_12, MPU_FSEL_12, MPU_M2_12
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun/* 13MHz */
217*4882a593Smuzhiyun/* ES1 */
218*4882a593Smuzhiyun.word MPU_M_13_ES1, MPU_N_13_ES1, MPU_FSEL_13_ES1, MPU_M2_13_ES1
219*4882a593Smuzhiyun/* ES2 */
220*4882a593Smuzhiyun.word MPU_M_13_ES2, MPU_N_13_ES2, MPU_FSEL_13_ES2, MPU_M2_13_ES2
221*4882a593Smuzhiyun/* 3410 */
222*4882a593Smuzhiyun.word MPU_M_13, MPU_N_13, MPU_FSEL_13, MPU_M2_13
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun/* 19.2MHz */
225*4882a593Smuzhiyun/* ES1 */
226*4882a593Smuzhiyun.word MPU_M_19P2_ES1, MPU_N_19P2_ES1, MPU_FSEL_19P2_ES1, MPU_M2_19P2_ES1
227*4882a593Smuzhiyun/* ES2 */
228*4882a593Smuzhiyun.word MPU_M_19P2_ES2, MPU_N_19P2_ES2, MPU_FSEL_19P2_ES2, MPU_M2_19P2_ES2
229*4882a593Smuzhiyun/* 3410 */
230*4882a593Smuzhiyun.word MPU_M_19P2, MPU_N_19P2, MPU_FSEL_19P2, MPU_M2_19P2
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun/* 26MHz */
233*4882a593Smuzhiyun/* ES1 */
234*4882a593Smuzhiyun.word MPU_M_26_ES1, MPU_N_26_ES1, MPU_FSEL_26_ES1, MPU_M2_26_ES1
235*4882a593Smuzhiyun/* ES2 */
236*4882a593Smuzhiyun.word MPU_M_26_ES2, MPU_N_26_ES2, MPU_FSEL_26_ES2, MPU_M2_26_ES2
237*4882a593Smuzhiyun/* 3410 */
238*4882a593Smuzhiyun.word MPU_M_26, MPU_N_26, MPU_FSEL_26, MPU_M2_26
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun/* 38.4MHz */
241*4882a593Smuzhiyun/* ES1 */
242*4882a593Smuzhiyun.word MPU_M_38P4_ES1, MPU_N_38P4_ES1, MPU_FSEL_38P4_ES1, MPU_M2_38P4_ES1
243*4882a593Smuzhiyun/* ES2 */
244*4882a593Smuzhiyun.word MPU_M_38P4_ES2, MPU_N_38P4_ES2, MPU_FSEL_38P4_ES2, MPU_M2_38P4_ES2
245*4882a593Smuzhiyun/* 3410 */
246*4882a593Smuzhiyun.word MPU_M_38P4, MPU_N_38P4, MPU_FSEL_38P4, MPU_M2_38P4
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun.globl get_mpu_dpll_param
250*4882a593Smuzhiyunget_mpu_dpll_param:
251*4882a593Smuzhiyun	adr	r0, mpu_dpll_param
252*4882a593Smuzhiyun	mov	pc, lr
253*4882a593Smuzhiyun
254*4882a593Smuzhiyuniva_dpll_param:
255*4882a593Smuzhiyun/* 12MHz */
256*4882a593Smuzhiyun/* ES1 */
257*4882a593Smuzhiyun.word IVA_M_12_ES1, IVA_N_12_ES1, IVA_FSEL_12_ES1, IVA_M2_12_ES1
258*4882a593Smuzhiyun/* ES2 */
259*4882a593Smuzhiyun.word IVA_M_12_ES2, IVA_N_12_ES2, IVA_FSEL_12_ES2, IVA_M2_12_ES2
260*4882a593Smuzhiyun/* 3410 */
261*4882a593Smuzhiyun.word IVA_M_12, IVA_N_12, IVA_FSEL_12, IVA_M2_12
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun/* 13MHz */
264*4882a593Smuzhiyun/* ES1 */
265*4882a593Smuzhiyun.word IVA_M_13_ES1, IVA_N_13_ES1, IVA_FSEL_13_ES1, IVA_M2_13_ES1
266*4882a593Smuzhiyun/* ES2 */
267*4882a593Smuzhiyun.word IVA_M_13_ES2, IVA_N_13_ES2,  IVA_FSEL_13_ES2, IVA_M2_13_ES2
268*4882a593Smuzhiyun/* 3410 */
269*4882a593Smuzhiyun.word IVA_M_13, IVA_N_13, IVA_FSEL_13, IVA_M2_13
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun/* 19.2MHz */
272*4882a593Smuzhiyun/* ES1 */
273*4882a593Smuzhiyun.word IVA_M_19P2_ES1, IVA_N_19P2_ES1, IVA_FSEL_19P2_ES1, IVA_M2_19P2_ES1
274*4882a593Smuzhiyun/* ES2 */
275*4882a593Smuzhiyun.word IVA_M_19P2_ES2, IVA_N_19P2_ES2, IVA_FSEL_19P2_ES2, IVA_M2_19P2_ES2
276*4882a593Smuzhiyun/* 3410 */
277*4882a593Smuzhiyun.word IVA_M_19P2, IVA_N_19P2, IVA_FSEL_19P2, IVA_M2_19P2
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun/* 26MHz */
280*4882a593Smuzhiyun/* ES1 */
281*4882a593Smuzhiyun.word IVA_M_26_ES1, IVA_N_26_ES1, IVA_FSEL_26_ES1, IVA_M2_26_ES1
282*4882a593Smuzhiyun/* ES2 */
283*4882a593Smuzhiyun.word IVA_M_26_ES2, IVA_N_26_ES2, IVA_FSEL_26_ES2, IVA_M2_26_ES2
284*4882a593Smuzhiyun/* 3410 */
285*4882a593Smuzhiyun.word IVA_M_26, IVA_N_26, IVA_FSEL_26, IVA_M2_26
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun/* 38.4MHz */
288*4882a593Smuzhiyun/* ES1 */
289*4882a593Smuzhiyun.word IVA_M_38P4_ES1, IVA_N_38P4_ES1, IVA_FSEL_38P4_ES1, IVA_M2_38P4_ES1
290*4882a593Smuzhiyun/* ES2 */
291*4882a593Smuzhiyun.word IVA_M_38P4_ES2, IVA_N_38P4_ES2, IVA_FSEL_38P4_ES2, IVA_M2_38P4_ES2
292*4882a593Smuzhiyun/* 3410 */
293*4882a593Smuzhiyun.word IVA_M_38P4, IVA_N_38P4, IVA_FSEL_38P4, IVA_M2_38P4
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun.globl get_iva_dpll_param
297*4882a593Smuzhiyunget_iva_dpll_param:
298*4882a593Smuzhiyun	adr	r0, iva_dpll_param
299*4882a593Smuzhiyun	mov	pc, lr
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun/* Core DPLL targets for L3 at 166 & L133 */
302*4882a593Smuzhiyuncore_dpll_param:
303*4882a593Smuzhiyun/* 12MHz */
304*4882a593Smuzhiyun/* ES1 */
305*4882a593Smuzhiyun.word CORE_M_12_ES1, CORE_N_12_ES1, CORE_FSL_12_ES1, CORE_M2_12_ES1
306*4882a593Smuzhiyun/* ES2 */
307*4882a593Smuzhiyun.word CORE_M_12, CORE_N_12, CORE_FSEL_12, CORE_M2_12
308*4882a593Smuzhiyun/* 3410 */
309*4882a593Smuzhiyun.word CORE_M_12, CORE_N_12, CORE_FSEL_12, CORE_M2_12
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun/* 13MHz */
312*4882a593Smuzhiyun/* ES1 */
313*4882a593Smuzhiyun.word CORE_M_13_ES1, CORE_N_13_ES1, CORE_FSL_13_ES1, CORE_M2_13_ES1
314*4882a593Smuzhiyun/* ES2 */
315*4882a593Smuzhiyun.word CORE_M_13, CORE_N_13, CORE_FSEL_13, CORE_M2_13
316*4882a593Smuzhiyun/* 3410 */
317*4882a593Smuzhiyun.word CORE_M_13, CORE_N_13, CORE_FSEL_13, CORE_M2_13
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun/* 19.2MHz */
320*4882a593Smuzhiyun/* ES1 */
321*4882a593Smuzhiyun.word CORE_M_19P2_ES1, CORE_N_19P2_ES1, CORE_FSL_19P2_ES1, CORE_M2_19P2_ES1
322*4882a593Smuzhiyun/* ES2 */
323*4882a593Smuzhiyun.word CORE_M_19P2, CORE_N_19P2, CORE_FSEL_19P2, CORE_M2_19P2
324*4882a593Smuzhiyun/* 3410 */
325*4882a593Smuzhiyun.word CORE_M_19P2, CORE_N_19P2, CORE_FSEL_19P2, CORE_M2_19P2
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun/* 26MHz */
328*4882a593Smuzhiyun/* ES1 */
329*4882a593Smuzhiyun.word CORE_M_26_ES1, CORE_N_26_ES1, CORE_FSL_26_ES1, CORE_M2_26_ES1
330*4882a593Smuzhiyun/* ES2 */
331*4882a593Smuzhiyun.word CORE_M_26, CORE_N_26, CORE_FSEL_26, CORE_M2_26
332*4882a593Smuzhiyun/* 3410 */
333*4882a593Smuzhiyun.word CORE_M_26, CORE_N_26, CORE_FSEL_26, CORE_M2_26
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun/* 38.4MHz */
336*4882a593Smuzhiyun/* ES1 */
337*4882a593Smuzhiyun.word CORE_M_38P4_ES1, CORE_N_38P4_ES1, CORE_FSL_38P4_ES1, CORE_M2_38P4_ES1
338*4882a593Smuzhiyun/* ES2 */
339*4882a593Smuzhiyun.word CORE_M_38P4, CORE_N_38P4, CORE_FSEL_38P4, CORE_M2_38P4
340*4882a593Smuzhiyun/* 3410 */
341*4882a593Smuzhiyun.word CORE_M_38P4, CORE_N_38P4, CORE_FSEL_38P4, CORE_M2_38P4
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun.globl get_core_dpll_param
344*4882a593Smuzhiyunget_core_dpll_param:
345*4882a593Smuzhiyun	adr	r0, core_dpll_param
346*4882a593Smuzhiyun	mov	pc, lr
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun/* PER DPLL values are same for both ES1 and ES2 */
349*4882a593Smuzhiyunper_dpll_param:
350*4882a593Smuzhiyun/* 12MHz */
351*4882a593Smuzhiyun.word PER_M_12, PER_N_12, PER_FSEL_12, PER_M2_12
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun/* 13MHz */
354*4882a593Smuzhiyun.word PER_M_13, PER_N_13, PER_FSEL_13, PER_M2_13
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun/* 19.2MHz */
357*4882a593Smuzhiyun.word PER_M_19P2, PER_N_19P2, PER_FSEL_19P2, PER_M2_19P2
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun/* 26MHz */
360*4882a593Smuzhiyun.word PER_M_26, PER_N_26, PER_FSEL_26, PER_M2_26
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun/* 38.4MHz */
363*4882a593Smuzhiyun.word PER_M_38P4, PER_N_38P4, PER_FSEL_38P4, PER_M2_38P4
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun.globl get_per_dpll_param
366*4882a593Smuzhiyunget_per_dpll_param:
367*4882a593Smuzhiyun	adr	r0, per_dpll_param
368*4882a593Smuzhiyun	mov	pc, lr
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun/* PER2 DPLL values */
371*4882a593Smuzhiyunper2_dpll_param:
372*4882a593Smuzhiyun/* 12MHz */
373*4882a593Smuzhiyun.word PER2_M_12, PER2_N_12, PER2_FSEL_12, PER2_M2_12
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun/* 13MHz */
376*4882a593Smuzhiyun.word PER2_M_13, PER2_N_13, PER2_FSEL_13, PER2_M2_13
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun/* 19.2MHz */
379*4882a593Smuzhiyun.word PER2_M_19P2, PER2_N_19P2, PER2_FSEL_19P2, PER2_M2_19P2
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun/* 26MHz */
382*4882a593Smuzhiyun.word PER2_M_26, PER2_N_26, PER2_FSEL_26, PER2_M2_26
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun/* 38.4MHz */
385*4882a593Smuzhiyun.word PER2_M_38P4, PER2_N_38P4, PER2_FSEL_38P4, PER2_M2_38P4
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun.globl get_per2_dpll_param
388*4882a593Smuzhiyunget_per2_dpll_param:
389*4882a593Smuzhiyun	adr	r0, per2_dpll_param
390*4882a593Smuzhiyun	mov	pc, lr
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun/*
393*4882a593Smuzhiyun * Tables for 36XX/37XX devices
394*4882a593Smuzhiyun *
395*4882a593Smuzhiyun */
396*4882a593Smuzhiyunmpu_36x_dpll_param:
397*4882a593Smuzhiyun/* 12MHz */
398*4882a593Smuzhiyun.word 50, 0, 0, 1
399*4882a593Smuzhiyun/* 13MHz */
400*4882a593Smuzhiyun.word 600, 12, 0, 1
401*4882a593Smuzhiyun/* 19.2MHz */
402*4882a593Smuzhiyun.word 125, 3, 0, 1
403*4882a593Smuzhiyun/* 26MHz */
404*4882a593Smuzhiyun.word 300, 12, 0, 1
405*4882a593Smuzhiyun/* 38.4MHz */
406*4882a593Smuzhiyun.word 125, 7, 0, 1
407*4882a593Smuzhiyun
408*4882a593Smuzhiyuniva_36x_dpll_param:
409*4882a593Smuzhiyun/* 12MHz */
410*4882a593Smuzhiyun.word 130, 2, 0, 1
411*4882a593Smuzhiyun/* 13MHz */
412*4882a593Smuzhiyun.word 20, 0, 0, 1
413*4882a593Smuzhiyun/* 19.2MHz */
414*4882a593Smuzhiyun.word 325, 11, 0, 1
415*4882a593Smuzhiyun/* 26MHz */
416*4882a593Smuzhiyun.word 10, 0, 0, 1
417*4882a593Smuzhiyun/* 38.4MHz */
418*4882a593Smuzhiyun.word 325, 23, 0, 1
419*4882a593Smuzhiyun
420*4882a593Smuzhiyuncore_36x_dpll_param:
421*4882a593Smuzhiyun/* 12MHz */
422*4882a593Smuzhiyun.word 100, 2, 0, 1
423*4882a593Smuzhiyun/* 13MHz */
424*4882a593Smuzhiyun.word 400, 12, 0, 1
425*4882a593Smuzhiyun/* 19.2MHz */
426*4882a593Smuzhiyun.word 375, 17, 0, 1
427*4882a593Smuzhiyun/* 26MHz */
428*4882a593Smuzhiyun.word 200, 12, 0, 1
429*4882a593Smuzhiyun/* 38.4MHz */
430*4882a593Smuzhiyun.word 375, 35, 0, 1
431*4882a593Smuzhiyun
432*4882a593Smuzhiyunper_36x_dpll_param:
433*4882a593Smuzhiyun/*    SYSCLK    M       N      M2      M3      M4     M5      M6      m2DIV */
434*4882a593Smuzhiyun.word 12000,    360,    4,     9,      16,     5,     4,      3,      1
435*4882a593Smuzhiyun.word 13000,    864,   12,     9,      16,     9,     4,      3,      1
436*4882a593Smuzhiyun.word 19200,    360,    7,     9,      16,     5,     4,      3,      1
437*4882a593Smuzhiyun.word 26000,    432,   12,     9,      16,     9,     4,      3,      1
438*4882a593Smuzhiyun.word 38400,    360,   15,     9,      16,     5,     4,      3,      1
439*4882a593Smuzhiyun
440*4882a593Smuzhiyunper2_36x_dpll_param:
441*4882a593Smuzhiyun/* 12MHz */
442*4882a593Smuzhiyun.word PER2_36XX_M_12, PER2_36XX_N_12, 0, PER2_36XX_M2_12
443*4882a593Smuzhiyun/* 13MHz */
444*4882a593Smuzhiyun.word PER2_36XX_M_13, PER2_36XX_N_13, 0, PER2_36XX_M2_13
445*4882a593Smuzhiyun/* 19.2MHz */
446*4882a593Smuzhiyun.word PER2_36XX_M_19P2, PER2_36XX_N_19P2, 0, PER2_36XX_M2_19P2
447*4882a593Smuzhiyun/* 26MHz */
448*4882a593Smuzhiyun.word PER2_36XX_M_26, PER2_36XX_N_26, 0, PER2_36XX_M2_26
449*4882a593Smuzhiyun/* 38.4MHz */
450*4882a593Smuzhiyun.word PER2_36XX_M_38P4, PER2_36XX_N_38P4, 0, PER2_36XX_M2_38P4
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun
453*4882a593SmuzhiyunENTRY(get_36x_mpu_dpll_param)
454*4882a593Smuzhiyun	adr	r0, mpu_36x_dpll_param
455*4882a593Smuzhiyun	mov	pc, lr
456*4882a593SmuzhiyunENDPROC(get_36x_mpu_dpll_param)
457*4882a593Smuzhiyun
458*4882a593SmuzhiyunENTRY(get_36x_iva_dpll_param)
459*4882a593Smuzhiyun	adr	r0, iva_36x_dpll_param
460*4882a593Smuzhiyun	mov	pc, lr
461*4882a593SmuzhiyunENDPROC(get_36x_iva_dpll_param)
462*4882a593Smuzhiyun
463*4882a593SmuzhiyunENTRY(get_36x_core_dpll_param)
464*4882a593Smuzhiyun	adr	r0, core_36x_dpll_param
465*4882a593Smuzhiyun	mov	pc, lr
466*4882a593SmuzhiyunENDPROC(get_36x_core_dpll_param)
467*4882a593Smuzhiyun
468*4882a593SmuzhiyunENTRY(get_36x_per_dpll_param)
469*4882a593Smuzhiyun	adr	r0, per_36x_dpll_param
470*4882a593Smuzhiyun	mov	pc, lr
471*4882a593SmuzhiyunENDPROC(get_36x_per_dpll_param)
472*4882a593Smuzhiyun
473*4882a593SmuzhiyunENTRY(get_36x_per2_dpll_param)
474*4882a593Smuzhiyun	adr	r0, per2_36x_dpll_param
475*4882a593Smuzhiyun	mov	pc, lr
476*4882a593SmuzhiyunENDPROC(get_36x_per2_dpll_param)
477