xref: /OK3568_Linux_fs/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3288.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2015 Google, Inc
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * (C) Copyright 2008-2014 Rockchip Electronics
5*4882a593Smuzhiyun  * Peter, Software Engineering, <superpeter.cai@gmail.com>.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * SPDX-License-Identifier:     GPL-2.0+
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun #ifndef _ASM_ARCH_CRU_RK3288_H
10*4882a593Smuzhiyun #define _ASM_ARCH_CRU_RK3288_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define OSC_HZ		(24 * 1000 * 1000)
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define APLL_HZ		(1800 * 1000000)
15*4882a593Smuzhiyun #define GPLL_HZ		(594 * 1000000)
16*4882a593Smuzhiyun #define CPLL_HZ		(384 * 1000000)
17*4882a593Smuzhiyun #define NPLL_HZ		(384 * 1000000)
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* The SRAM is clocked off aclk_bus, so we want to max it out for boot speed */
20*4882a593Smuzhiyun #define PD_BUS_ACLK_HZ	297000000
21*4882a593Smuzhiyun #define PD_BUS_HCLK_HZ	148500000
22*4882a593Smuzhiyun #define PD_BUS_PCLK_HZ	74250000
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define PERI_ACLK_HZ	148500000
25*4882a593Smuzhiyun #define PERI_HCLK_HZ	148500000
26*4882a593Smuzhiyun #define PERI_PCLK_HZ	74250000
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define HCLK_VIO_HZ	100000000
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* Private data for the clock driver - used by rockchip_get_cru() */
31*4882a593Smuzhiyun struct rk3288_clk_priv {
32*4882a593Smuzhiyun 	struct rk3288_grf *grf;
33*4882a593Smuzhiyun 	struct rk3288_cru *cru;
34*4882a593Smuzhiyun 	ulong rate;
35*4882a593Smuzhiyun 	ulong armclk_hz;
36*4882a593Smuzhiyun 	ulong armclk_enter_hz;
37*4882a593Smuzhiyun 	ulong armclk_init_hz;
38*4882a593Smuzhiyun 	bool sync_kernel;
39*4882a593Smuzhiyun 	bool set_armclk_rate;
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun struct rk3288_cru {
43*4882a593Smuzhiyun 	struct rk3288_pll {
44*4882a593Smuzhiyun 		u32 con0;
45*4882a593Smuzhiyun 		u32 con1;
46*4882a593Smuzhiyun 		u32 con2;
47*4882a593Smuzhiyun 		u32 con3;
48*4882a593Smuzhiyun 	} pll[5];
49*4882a593Smuzhiyun 	u32 cru_mode_con;
50*4882a593Smuzhiyun 	u32 reserved0[3];
51*4882a593Smuzhiyun 	u32 cru_clksel_con[43];
52*4882a593Smuzhiyun 	u32 reserved1[21];
53*4882a593Smuzhiyun 	u32 cru_clkgate_con[19];
54*4882a593Smuzhiyun 	u32 reserved2;
55*4882a593Smuzhiyun 	u32 cru_glb_srst_fst_value;
56*4882a593Smuzhiyun 	u32 cru_glb_srst_snd_value;
57*4882a593Smuzhiyun 	u32 cru_softrst_con[12];
58*4882a593Smuzhiyun 	u32 cru_misc_con;
59*4882a593Smuzhiyun 	u32 cru_glb_cnt_th;
60*4882a593Smuzhiyun 	u32 cru_glb_rst_con;
61*4882a593Smuzhiyun 	u32 reserved3;
62*4882a593Smuzhiyun 	u32 cru_glb_rst_st;
63*4882a593Smuzhiyun 	u32 reserved4;
64*4882a593Smuzhiyun 	u32 cru_sdmmc_con[2];
65*4882a593Smuzhiyun 	u32 cru_sdio0_con[2];
66*4882a593Smuzhiyun 	u32 cru_sdio1_con[2];
67*4882a593Smuzhiyun 	u32 cru_emmc_con[2];
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun check_member(rk3288_cru, cru_emmc_con[1], 0x021c);
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun struct rk3288_clk_info {
72*4882a593Smuzhiyun 	unsigned long id;
73*4882a593Smuzhiyun 	char *name;
74*4882a593Smuzhiyun 	bool is_cru;
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun /* CRU_CLKSEL11_CON */
78*4882a593Smuzhiyun enum {
79*4882a593Smuzhiyun 	HSICPHY_DIV_SHIFT	= 8,
80*4882a593Smuzhiyun 	HSICPHY_DIV_MASK	= 0x3f << HSICPHY_DIV_SHIFT,
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	MMC0_PLL_SHIFT		= 6,
83*4882a593Smuzhiyun 	MMC0_PLL_MASK		= 3 << MMC0_PLL_SHIFT,
84*4882a593Smuzhiyun 	MMC0_PLL_SELECT_CODEC	= 0,
85*4882a593Smuzhiyun 	MMC0_PLL_SELECT_GENERAL,
86*4882a593Smuzhiyun 	MMC0_PLL_SELECT_24MHZ,
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	MMC0_DIV_SHIFT		= 0,
89*4882a593Smuzhiyun 	MMC0_DIV_MASK		= 0x3f << MMC0_DIV_SHIFT,
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun /* CRU_CLKSEL12_CON */
93*4882a593Smuzhiyun enum {
94*4882a593Smuzhiyun 	EMMC_PLL_SHIFT		= 0xe,
95*4882a593Smuzhiyun 	EMMC_PLL_MASK		= 3 << EMMC_PLL_SHIFT,
96*4882a593Smuzhiyun 	EMMC_PLL_SELECT_CODEC	= 0,
97*4882a593Smuzhiyun 	EMMC_PLL_SELECT_GENERAL,
98*4882a593Smuzhiyun 	EMMC_PLL_SELECT_24MHZ,
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	EMMC_DIV_SHIFT		= 8,
101*4882a593Smuzhiyun 	EMMC_DIV_MASK		= 0x3f << EMMC_DIV_SHIFT,
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	SDIO0_PLL_SHIFT		= 6,
104*4882a593Smuzhiyun 	SDIO0_PLL_MASK		= 3 << SDIO0_PLL_SHIFT,
105*4882a593Smuzhiyun 	SDIO0_PLL_SELECT_CODEC	= 0,
106*4882a593Smuzhiyun 	SDIO0_PLL_SELECT_GENERAL,
107*4882a593Smuzhiyun 	SDIO0_PLL_SELECT_24MHZ,
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	SDIO0_DIV_SHIFT		= 0,
110*4882a593Smuzhiyun 	SDIO0_DIV_MASK		= 0x3f << SDIO0_DIV_SHIFT,
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun /* CRU_CLKSEL21_CON */
114*4882a593Smuzhiyun enum {
115*4882a593Smuzhiyun 	MAC_DIV_CON_SHIFT	= 0xf,
116*4882a593Smuzhiyun 	MAC_DIV_CON_MASK	= 0x1f << MAC_DIV_CON_SHIFT,
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	RMII_EXTCLK_SHIFT	= 4,
119*4882a593Smuzhiyun 	RMII_EXTCLK_MASK	= 1 << RMII_EXTCLK_SHIFT,
120*4882a593Smuzhiyun 	RMII_EXTCLK_SELECT_INT_DIV_CLK = 0,
121*4882a593Smuzhiyun 	RMII_EXTCLK_SELECT_EXT_CLK = 1,
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	EMAC_PLL_SHIFT		= 0,
124*4882a593Smuzhiyun 	EMAC_PLL_MASK		= 0x3 << EMAC_PLL_SHIFT,
125*4882a593Smuzhiyun 	EMAC_PLL_SELECT_NEW	= 0x0,
126*4882a593Smuzhiyun 	EMAC_PLL_SELECT_CODEC	= 0x1,
127*4882a593Smuzhiyun 	EMAC_PLL_SELECT_GENERAL	= 0x2,
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* CRU_CLKSEL25_CON */
131*4882a593Smuzhiyun enum {
132*4882a593Smuzhiyun 	SPI1_PLL_SHIFT		= 0xf,
133*4882a593Smuzhiyun 	SPI1_PLL_MASK		= 1 << SPI1_PLL_SHIFT,
134*4882a593Smuzhiyun 	SPI1_PLL_SELECT_CODEC	= 0,
135*4882a593Smuzhiyun 	SPI1_PLL_SELECT_GENERAL,
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	SPI1_DIV_SHIFT		= 8,
138*4882a593Smuzhiyun 	SPI1_DIV_MASK		= 0x7f << SPI1_DIV_SHIFT,
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	SPI0_PLL_SHIFT		= 7,
141*4882a593Smuzhiyun 	SPI0_PLL_MASK		= 1 << SPI0_PLL_SHIFT,
142*4882a593Smuzhiyun 	SPI0_PLL_SELECT_CODEC	= 0,
143*4882a593Smuzhiyun 	SPI0_PLL_SELECT_GENERAL,
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	SPI0_DIV_SHIFT		= 0,
146*4882a593Smuzhiyun 	SPI0_DIV_MASK		= 0x7f << SPI0_DIV_SHIFT,
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /* CRU_CLKSEL27_CON */
150*4882a593Smuzhiyun enum {
151*4882a593Smuzhiyun 	DCLK_VOP0_DIV_SHIFT	= 8,
152*4882a593Smuzhiyun 	DCLK_VOP0_DIV_MASK	= 0xff << DCLK_VOP0_DIV_SHIFT,
153*4882a593Smuzhiyun 	DCLK_VOP0_PLL_SHIFT	= 0,
154*4882a593Smuzhiyun 	DCLK_VOP0_PLL_MASK	= 3 << DCLK_VOP0_PLL_SHIFT,
155*4882a593Smuzhiyun 	DCLK_VOP0_SELECT_CPLL	= 0,
156*4882a593Smuzhiyun 	DCLK_VOP0_SELECT_GPLL	= 1,
157*4882a593Smuzhiyun 	DCLK_VOP0_SELECT_NPLL	= 2,
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /* CRU_CLKSEL28_CON */
161*4882a593Smuzhiyun enum {
162*4882a593Smuzhiyun 	HCLK_VIO_DIV_SHIFT	= 8,
163*4882a593Smuzhiyun 	HCLK_VIO_DIV_MASK	= 0x1f << HCLK_VIO_DIV_SHIFT,
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /* CRU_CLKSEL29_CON */
167*4882a593Smuzhiyun enum {
168*4882a593Smuzhiyun 	DCLK_VOP1_DIV_SHIFT	= 8,
169*4882a593Smuzhiyun 	DCLK_VOP1_DIV_MASK	= 0xff << DCLK_VOP1_DIV_SHIFT,
170*4882a593Smuzhiyun 	DCLK_VOP1_PLL_SHIFT	= 6,
171*4882a593Smuzhiyun 	DCLK_VOP1_PLL_MASK	= 3 << DCLK_VOP1_PLL_SHIFT,
172*4882a593Smuzhiyun 	DCLK_VOP1_SELECT_CPLL	= 0,
173*4882a593Smuzhiyun 	DCLK_VOP1_SELECT_GPLL	= 1,
174*4882a593Smuzhiyun 	DCLK_VOP1_SELECT_NPLL	= 2,
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /* CRU_CLKSEL31_CON */
178*4882a593Smuzhiyun enum {
179*4882a593Smuzhiyun 	ACLK_VIO_SELECT_CPLL	= 0,
180*4882a593Smuzhiyun 	ACLK_VIO_SELECT_GPLL	= 1,
181*4882a593Smuzhiyun 	ACLK_VIO_SELECT_USB480	= 2,
182*4882a593Smuzhiyun 	ACLK_VIO1_PLL_SHIFT	= 14,
183*4882a593Smuzhiyun 	ACLK_VIO1_PLL_MASK	= 3 << ACLK_VIO1_PLL_SHIFT,
184*4882a593Smuzhiyun 	ACLK_VIO1_DIV_SHIFT	= 8,
185*4882a593Smuzhiyun 	ACLK_VIO1_DIV_MASK	= 0x1f << ACLK_VIO1_DIV_SHIFT,
186*4882a593Smuzhiyun 	ACLK_VIO0_PLL_SHIFT	= 6,
187*4882a593Smuzhiyun 	ACLK_VIO0_PLL_MASK	= 3 << ACLK_VIO0_PLL_SHIFT,
188*4882a593Smuzhiyun 	ACLK_VIO0_DIV_SHIFT	= 0,
189*4882a593Smuzhiyun 	ACLK_VIO0_DIV_MASK	= 0x1f << ACLK_VIO0_DIV_SHIFT,
190*4882a593Smuzhiyun };
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun /* CRU_CLKSEL37_CON */
193*4882a593Smuzhiyun enum {
194*4882a593Smuzhiyun 	PCLK_CORE_DBG_DIV_SHIFT	= 9,
195*4882a593Smuzhiyun 	PCLK_CORE_DBG_DIV_MASK	= 0x1f << PCLK_CORE_DBG_DIV_SHIFT,
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	ATCLK_CORE_DIV_CON_SHIFT = 4,
198*4882a593Smuzhiyun 	ATCLK_CORE_DIV_CON_MASK	= 0x1f << ATCLK_CORE_DIV_CON_SHIFT,
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	CLK_L2RAM_DIV_SHIFT	= 0,
201*4882a593Smuzhiyun 	CLK_L2RAM_DIV_MASK	= 7 << CLK_L2RAM_DIV_SHIFT,
202*4882a593Smuzhiyun };
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /* CRU_CLKSEL39_CON */
205*4882a593Smuzhiyun enum {
206*4882a593Smuzhiyun 	ACLK_HEVC_PLL_SHIFT	= 0xe,
207*4882a593Smuzhiyun 	ACLK_HEVC_PLL_MASK	= 3 << ACLK_HEVC_PLL_SHIFT,
208*4882a593Smuzhiyun 	ACLK_HEVC_PLL_SELECT_CODEC = 0,
209*4882a593Smuzhiyun 	ACLK_HEVC_PLL_SELECT_GENERAL,
210*4882a593Smuzhiyun 	ACLK_HEVC_PLL_SELECT_NEW,
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	ACLK_HEVC_DIV_SHIFT	= 8,
213*4882a593Smuzhiyun 	ACLK_HEVC_DIV_MASK	= 0x1f << ACLK_HEVC_DIV_SHIFT,
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	SPI2_PLL_SHIFT		= 7,
216*4882a593Smuzhiyun 	SPI2_PLL_MASK		= 1 << SPI2_PLL_SHIFT,
217*4882a593Smuzhiyun 	SPI2_PLL_SELECT_CODEC	= 0,
218*4882a593Smuzhiyun 	SPI2_PLL_SELECT_GENERAL,
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	SPI2_DIV_SHIFT		= 0,
221*4882a593Smuzhiyun 	SPI2_DIV_MASK		= 0x7f << SPI2_DIV_SHIFT,
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /* CRU_MODE_CON */
225*4882a593Smuzhiyun enum {
226*4882a593Smuzhiyun 	CRU_MODE_MASK		= 3,
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	NPLL_MODE_SHIFT		= 0xe,
229*4882a593Smuzhiyun 	NPLL_MODE_MASK		= CRU_MODE_MASK << NPLL_MODE_SHIFT,
230*4882a593Smuzhiyun 	NPLL_MODE_SLOW		= 0,
231*4882a593Smuzhiyun 	NPLL_MODE_NORMAL,
232*4882a593Smuzhiyun 	NPLL_MODE_DEEP,
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	GPLL_MODE_SHIFT		= 0xc,
235*4882a593Smuzhiyun 	GPLL_MODE_MASK		= CRU_MODE_MASK << GPLL_MODE_SHIFT,
236*4882a593Smuzhiyun 	GPLL_MODE_SLOW		= 0,
237*4882a593Smuzhiyun 	GPLL_MODE_NORMAL,
238*4882a593Smuzhiyun 	GPLL_MODE_DEEP,
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	CPLL_MODE_SHIFT		= 8,
241*4882a593Smuzhiyun 	CPLL_MODE_MASK		= CRU_MODE_MASK << CPLL_MODE_SHIFT,
242*4882a593Smuzhiyun 	CPLL_MODE_SLOW		= 0,
243*4882a593Smuzhiyun 	CPLL_MODE_NORMAL,
244*4882a593Smuzhiyun 	CPLL_MODE_DEEP,
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	DPLL_MODE_SHIFT		= 4,
247*4882a593Smuzhiyun 	DPLL_MODE_MASK		= CRU_MODE_MASK << DPLL_MODE_SHIFT,
248*4882a593Smuzhiyun 	DPLL_MODE_SLOW		= 0,
249*4882a593Smuzhiyun 	DPLL_MODE_NORMAL,
250*4882a593Smuzhiyun 	DPLL_MODE_DEEP,
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	APLL_MODE_SHIFT		= 0,
253*4882a593Smuzhiyun 	APLL_MODE_MASK		= CRU_MODE_MASK << APLL_MODE_SHIFT,
254*4882a593Smuzhiyun 	APLL_MODE_SLOW		= 0,
255*4882a593Smuzhiyun 	APLL_MODE_NORMAL,
256*4882a593Smuzhiyun 	APLL_MODE_DEEP,
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun /* CRU_APLL_CON0 */
260*4882a593Smuzhiyun enum {
261*4882a593Smuzhiyun 	CLKR_SHIFT		= 8,
262*4882a593Smuzhiyun 	CLKR_MASK		= 0x3f << CLKR_SHIFT,
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	CLKOD_SHIFT		= 0,
265*4882a593Smuzhiyun 	CLKOD_MASK		= 0xf << CLKOD_SHIFT,
266*4882a593Smuzhiyun };
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun /* CRU_APLL_CON1 */
269*4882a593Smuzhiyun enum {
270*4882a593Smuzhiyun 	LOCK_SHIFT		= 0x1f,
271*4882a593Smuzhiyun 	LOCK_MASK		= 1 << LOCK_SHIFT,
272*4882a593Smuzhiyun 	LOCK_UNLOCK		= 0,
273*4882a593Smuzhiyun 	LOCK_LOCK,
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 	CLKF_SHIFT		= 0,
276*4882a593Smuzhiyun 	CLKF_MASK		= 0x1fff << CLKF_SHIFT,
277*4882a593Smuzhiyun };
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun /* CRU_GLB_RST_ST */
280*4882a593Smuzhiyun enum {
281*4882a593Smuzhiyun 	GLB_POR_RST,
282*4882a593Smuzhiyun 	FST_GLB_RST_ST		= BIT(0),
283*4882a593Smuzhiyun 	SND_GLB_RST_ST		= BIT(1),
284*4882a593Smuzhiyun 	FST_GLB_TSADC_RST_ST	= BIT(2),
285*4882a593Smuzhiyun 	SND_GLB_TSADC_RST_ST	= BIT(3),
286*4882a593Smuzhiyun 	FST_GLB_WDT_RST_ST	= BIT(4),
287*4882a593Smuzhiyun 	SND_GLB_WDT_RST_ST	= BIT(5),
288*4882a593Smuzhiyun 	GLB_RST_ST_MASK		= GENMASK(5, 0),
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun #endif
292