xref: /OK3568_Linux_fs/u-boot/arch/mips/mach-ath79/qca953x/lowlevel_init.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com>
3*4882a593Smuzhiyun * Based on Atheros LSDK/QSDK
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun#include <config.h>
9*4882a593Smuzhiyun#include <asm/asm.h>
10*4882a593Smuzhiyun#include <asm/regdef.h>
11*4882a593Smuzhiyun#include <asm/mipsregs.h>
12*4882a593Smuzhiyun#include <asm/addrspace.h>
13*4882a593Smuzhiyun#include <mach/ar71xx_regs.h>
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun#define MK_PLL_CONF(divint, refdiv, range, outdiv) \
16*4882a593Smuzhiyun     (((0x3F & divint) << 10) | \
17*4882a593Smuzhiyun     ((0x1F & refdiv) << 16) | \
18*4882a593Smuzhiyun     ((0x1 & range)   << 21) | \
19*4882a593Smuzhiyun     ((0x7 & outdiv)  << 23) )
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun#define MK_CLK_CNTL(cpudiv, ddrdiv, ahbdiv) \
22*4882a593Smuzhiyun    (((0x3 & (cpudiv - 1)) << 5)  | \
23*4882a593Smuzhiyun    ((0x3 & (ddrdiv - 1)) << 10) | \
24*4882a593Smuzhiyun    ((0x3 & (ahbdiv - 1)) << 15) )
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun#define SET_FIELD(name, v)      (((v) & QCA953X_##name##_MASK) << \
27*4882a593Smuzhiyun				 QCA953X_##name##_SHIFT)
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun#define DPLL2_KI(v)             SET_FIELD(SRIF_DPLL2_KI, v)
30*4882a593Smuzhiyun#define DPLL2_KD(v)             SET_FIELD(SRIF_DPLL2_KD, v)
31*4882a593Smuzhiyun#define DPLL2_PWD               QCA953X_SRIF_DPLL2_PWD
32*4882a593Smuzhiyun#define MK_DPLL2(ki, kd)        (DPLL2_KI(ki) | DPLL2_KD(kd) | DPLL2_PWD)
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun#define PLL_CPU_NFRAC(v)        SET_FIELD(PLL_CPU_CONFIG_NFRAC, v)
35*4882a593Smuzhiyun#define PLL_CPU_NINT(v)         SET_FIELD(PLL_CPU_CONFIG_NINT, v)
36*4882a593Smuzhiyun#define PLL_CPU_REFDIV(v)       SET_FIELD(PLL_CPU_CONFIG_REFDIV, v)
37*4882a593Smuzhiyun#define PLL_CPU_OUTDIV(v)       SET_FIELD(PLL_CPU_CONFIG_OUTDIV, v)
38*4882a593Smuzhiyun#define MK_PLL_CPU_CONF(frac, nint, ref, outdiv) \
39*4882a593Smuzhiyun				(PLL_CPU_NFRAC(frac) | \
40*4882a593Smuzhiyun				 PLL_CPU_NINT(nint) | \
41*4882a593Smuzhiyun				 PLL_CPU_REFDIV(ref) | \
42*4882a593Smuzhiyun				 PLL_CPU_OUTDIV(outdiv))
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun#define PLL_DDR_NFRAC(v)        SET_FIELD(PLL_DDR_CONFIG_NFRAC, v)
45*4882a593Smuzhiyun#define PLL_DDR_NINT(v)         SET_FIELD(PLL_DDR_CONFIG_NINT, v)
46*4882a593Smuzhiyun#define PLL_DDR_REFDIV(v)       SET_FIELD(PLL_DDR_CONFIG_REFDIV, v)
47*4882a593Smuzhiyun#define PLL_DDR_OUTDIV(v)       SET_FIELD(PLL_DDR_CONFIG_OUTDIV, v)
48*4882a593Smuzhiyun#define MK_PLL_DDR_CONF(frac, nint, ref, outdiv) \
49*4882a593Smuzhiyun				(PLL_DDR_NFRAC(frac) | \
50*4882a593Smuzhiyun				 PLL_DDR_REFDIV(ref) | \
51*4882a593Smuzhiyun				 PLL_DDR_NINT(nint) | \
52*4882a593Smuzhiyun				 PLL_DDR_OUTDIV(outdiv) | \
53*4882a593Smuzhiyun				 QCA953X_PLL_CONFIG_PWD)
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun#define PLL_CPU_CONF_VAL        MK_PLL_CPU_CONF(0, 26, 1, 0)
56*4882a593Smuzhiyun#define PLL_DDR_CONF_VAL        MK_PLL_DDR_CONF(0, 15, 1, 0)
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun#define PLL_CLK_CTRL_PLL_BYPASS (QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS | \
59*4882a593Smuzhiyun				 QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS | \
60*4882a593Smuzhiyun				 QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun#define PLL_CLK_CTRL_CPU_DIV(v) SET_FIELD(PLL_CLK_CTRL_CPU_POST_DIV, v)
63*4882a593Smuzhiyun#define PLL_CLK_CTRL_DDR_DIV(v) SET_FIELD(PLL_CLK_CTRL_DDR_POST_DIV, v)
64*4882a593Smuzhiyun#define PLL_CLK_CTRL_AHB_DIV(v) SET_FIELD(PLL_CLK_CTRL_AHB_POST_DIV, v)
65*4882a593Smuzhiyun#define MK_PLL_CLK_CTRL(cpu, ddr, ahb) \
66*4882a593Smuzhiyun				(PLL_CLK_CTRL_CPU_DIV(cpu) | \
67*4882a593Smuzhiyun				 PLL_CLK_CTRL_DDR_DIV(ddr) | \
68*4882a593Smuzhiyun				 PLL_CLK_CTRL_AHB_DIV(ahb))
69*4882a593Smuzhiyun#define PLL_CLK_CTRL_VAL    (MK_PLL_CLK_CTRL(0, 0, 2) | \
70*4882a593Smuzhiyun			     PLL_CLK_CTRL_PLL_BYPASS | \
71*4882a593Smuzhiyun			     QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL | \
72*4882a593Smuzhiyun			     QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun#define PLL_DDR_DIT_FRAC_MAX(v)     SET_FIELD(PLL_DDR_DIT_FRAC_MAX, v)
75*4882a593Smuzhiyun#define PLL_DDR_DIT_FRAC_MIN(v)     SET_FIELD(PLL_DDR_DIT_FRAC_MIN, v)
76*4882a593Smuzhiyun#define PLL_DDR_DIT_FRAC_STEP(v)    SET_FIELD(PLL_DDR_DIT_FRAC_STEP, v)
77*4882a593Smuzhiyun#define PLL_DDR_DIT_UPD_CNT(v)      SET_FIELD(PLL_DDR_DIT_UPD_CNT, v)
78*4882a593Smuzhiyun#define PLL_CPU_DIT_FRAC_MAX(v)     SET_FIELD(PLL_CPU_DIT_FRAC_MAX, v)
79*4882a593Smuzhiyun#define PLL_CPU_DIT_FRAC_MIN(v)     SET_FIELD(PLL_CPU_DIT_FRAC_MIN, v)
80*4882a593Smuzhiyun#define PLL_CPU_DIT_FRAC_STEP(v)    SET_FIELD(PLL_CPU_DIT_FRAC_STEP, v)
81*4882a593Smuzhiyun#define PLL_CPU_DIT_UPD_CNT(v)      SET_FIELD(PLL_CPU_DIT_UPD_CNT, v)
82*4882a593Smuzhiyun#define MK_PLL_DDR_DIT_FRAC(max, min, step, cnt) \
83*4882a593Smuzhiyun				(QCA953X_PLL_DIT_FRAC_EN | \
84*4882a593Smuzhiyun				 PLL_DDR_DIT_FRAC_MAX(max) | \
85*4882a593Smuzhiyun				 PLL_DDR_DIT_FRAC_MIN(min) | \
86*4882a593Smuzhiyun				 PLL_DDR_DIT_FRAC_STEP(step) | \
87*4882a593Smuzhiyun				 PLL_DDR_DIT_UPD_CNT(cnt))
88*4882a593Smuzhiyun#define MK_PLL_CPU_DIT_FRAC(max, min, step, cnt) \
89*4882a593Smuzhiyun				(QCA953X_PLL_DIT_FRAC_EN | \
90*4882a593Smuzhiyun				 PLL_CPU_DIT_FRAC_MAX(max) | \
91*4882a593Smuzhiyun				 PLL_CPU_DIT_FRAC_MIN(min) | \
92*4882a593Smuzhiyun				 PLL_CPU_DIT_FRAC_STEP(step) | \
93*4882a593Smuzhiyun				 PLL_CPU_DIT_UPD_CNT(cnt))
94*4882a593Smuzhiyun#define PLL_CPU_DIT_FRAC_VAL    MK_PLL_CPU_DIT_FRAC(63, 0, 1, 15)
95*4882a593Smuzhiyun#define PLL_DDR_DIT_FRAC_VAL    MK_PLL_DDR_DIT_FRAC(763, 635, 1, 15)
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun    .text
98*4882a593Smuzhiyun    .set noreorder
99*4882a593Smuzhiyun
100*4882a593SmuzhiyunLEAF(lowlevel_init)
101*4882a593Smuzhiyun	/* RTC Reset */
102*4882a593Smuzhiyun	li      t0, CKSEG1ADDR(AR71XX_RESET_BASE)
103*4882a593Smuzhiyun	lw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
104*4882a593Smuzhiyun	li      t2, 0x08000000
105*4882a593Smuzhiyun	or      t1, t1, t2
106*4882a593Smuzhiyun	sw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
107*4882a593Smuzhiyun	nop
108*4882a593Smuzhiyun	lw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
109*4882a593Smuzhiyun	li      t2, 0xf7ffffff
110*4882a593Smuzhiyun	and     t1, t1, t2
111*4882a593Smuzhiyun	sw      t1, QCA953X_RESET_REG_RESET_MODULE(t0)
112*4882a593Smuzhiyun	nop
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun	/* RTC Force Wake */
115*4882a593Smuzhiyun	li      t0, CKSEG1ADDR(QCA953X_RTC_BASE)
116*4882a593Smuzhiyun	li      t1, 0x01
117*4882a593Smuzhiyun	sw      t1, QCA953X_RTC_REG_SYNC_RESET(t0)
118*4882a593Smuzhiyun	nop
119*4882a593Smuzhiyun	nop
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun	/* Wait for RTC in on state */
122*4882a593Smuzhiyun1:
123*4882a593Smuzhiyun	lw      t1, QCA953X_RTC_REG_SYNC_STATUS(t0)
124*4882a593Smuzhiyun	andi    t1, t1, 0x02
125*4882a593Smuzhiyun	beqz    t1, 1b
126*4882a593Smuzhiyun	nop
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun	li      t0, CKSEG1ADDR(QCA953X_SRIF_BASE)
129*4882a593Smuzhiyun	li      t1, MK_DPLL2(2, 16)
130*4882a593Smuzhiyun	sw      t1, QCA953X_SRIF_BB_DPLL2_REG(t0)
131*4882a593Smuzhiyun	sw      t1, QCA953X_SRIF_PCIE_DPLL2_REG(t0)
132*4882a593Smuzhiyun	sw      t1, QCA953X_SRIF_DDR_DPLL2_REG(t0)
133*4882a593Smuzhiyun	sw      t1, QCA953X_SRIF_CPU_DPLL2_REG(t0)
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun	li      t0, CKSEG1ADDR(AR71XX_PLL_BASE)
136*4882a593Smuzhiyun	lw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
137*4882a593Smuzhiyun	ori     t1, PLL_CLK_CTRL_PLL_BYPASS
138*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
139*4882a593Smuzhiyun	nop
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun	li      t1, PLL_CPU_CONF_VAL
142*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
143*4882a593Smuzhiyun	nop
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun	li      t1, PLL_DDR_CONF_VAL
146*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
147*4882a593Smuzhiyun	nop
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun	li      t1, PLL_CLK_CTRL_VAL
150*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
151*4882a593Smuzhiyun	nop
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun	lw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
154*4882a593Smuzhiyun	li      t2, ~QCA953X_PLL_CONFIG_PWD
155*4882a593Smuzhiyun	and     t1, t1, t2
156*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_CPU_CONFIG_REG(t0)
157*4882a593Smuzhiyun	nop
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun	lw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
160*4882a593Smuzhiyun	li      t2, ~QCA953X_PLL_CONFIG_PWD
161*4882a593Smuzhiyun	and     t1, t1, t2
162*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_DDR_CONFIG_REG(t0)
163*4882a593Smuzhiyun	nop
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun	lw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
166*4882a593Smuzhiyun	li      t2, ~PLL_CLK_CTRL_PLL_BYPASS
167*4882a593Smuzhiyun	and     t1, t1, t2
168*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_CLK_CTRL_REG(t0)
169*4882a593Smuzhiyun	nop
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun	li      t1, PLL_DDR_DIT_FRAC_VAL
172*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_DDR_DIT_FRAC_REG(t0)
173*4882a593Smuzhiyun	nop
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun	li      t1, PLL_CPU_DIT_FRAC_VAL
176*4882a593Smuzhiyun	sw      t1, QCA953X_PLL_CPU_DIT_FRAC_REG(t0)
177*4882a593Smuzhiyun	nop
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun	li      t0, CKSEG1ADDR(AR71XX_RESET_BASE)
180*4882a593Smuzhiyun	lui     t1, 0x03fc
181*4882a593Smuzhiyun	sw      t1, 0xb4(t0)
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun	nop
184*4882a593Smuzhiyun	jr ra
185*4882a593Smuzhiyun	 nop
186*4882a593Smuzhiyun    END(lowlevel_init)
187