xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-rockchip/cru_rk3188.h (revision 441bfb788af845e63093d2b1e52e45dd84393df6)
1dcdd3278SHeiko Stübner /*
2dcdd3278SHeiko Stübner  * (C) Copyright 2016 Heiko Stuebner <heiko@sntech.de>
3dcdd3278SHeiko Stübner  *
4dcdd3278SHeiko Stübner  * SPDX-License-Identifier:     GPL-2.0+
5dcdd3278SHeiko Stübner  */
6dcdd3278SHeiko Stübner #ifndef _ASM_ARCH_CRU_RK3188_H
7dcdd3278SHeiko Stübner #define _ASM_ARCH_CRU_RK3188_H
8dcdd3278SHeiko Stübner 
9dcdd3278SHeiko Stübner #define OSC_HZ		(24 * 1000 * 1000)
10dcdd3278SHeiko Stübner 
11dcdd3278SHeiko Stübner #define APLL_HZ		(1608 * 1000000)
12f7853570SHeiko Stübner #define APLL_SAFE_HZ	(600 * 1000000)
13dcdd3278SHeiko Stübner #define GPLL_HZ		(594 * 1000000)
14dcdd3278SHeiko Stübner #define CPLL_HZ		(384 * 1000000)
15dcdd3278SHeiko Stübner 
16dcdd3278SHeiko Stübner /* The SRAM is clocked off aclk_cpu, so we want to max it out for boot speed */
17dcdd3278SHeiko Stübner #define CPU_ACLK_HZ	297000000
18dcdd3278SHeiko Stübner #define CPU_HCLK_HZ	148500000
19dcdd3278SHeiko Stübner #define CPU_PCLK_HZ	74250000
20dcdd3278SHeiko Stübner #define CPU_H2P_HZ	74250000
21dcdd3278SHeiko Stübner 
22dcdd3278SHeiko Stübner #define PERI_ACLK_HZ	148500000
23dcdd3278SHeiko Stübner #define PERI_HCLK_HZ	148500000
24dcdd3278SHeiko Stübner #define PERI_PCLK_HZ	74250000
25dcdd3278SHeiko Stübner 
26dcdd3278SHeiko Stübner /* Private data for the clock driver - used by rockchip_get_cru() */
27dcdd3278SHeiko Stübner struct rk3188_clk_priv {
28dcdd3278SHeiko Stübner 	struct rk3188_grf *grf;
29dcdd3278SHeiko Stübner 	struct rk3188_cru *cru;
30dcdd3278SHeiko Stübner 	ulong rate;
31dcdd3278SHeiko Stübner 	bool has_bwadj;
32*441bfb78SElaine Zhang 	ulong armclk_hz;
33*441bfb78SElaine Zhang 	ulong armclk_enter_hz;
34*441bfb78SElaine Zhang 	ulong armclk_init_hz;
35*441bfb78SElaine Zhang 	bool sync_kernel;
36*441bfb78SElaine Zhang 	bool set_armclk_rate;
37dcdd3278SHeiko Stübner };
38dcdd3278SHeiko Stübner 
39dcdd3278SHeiko Stübner struct rk3188_cru {
40dcdd3278SHeiko Stübner 	struct rk3188_pll {
41dcdd3278SHeiko Stübner 		u32 con0;
42dcdd3278SHeiko Stübner 		u32 con1;
43dcdd3278SHeiko Stübner 		u32 con2;
44dcdd3278SHeiko Stübner 		u32 con3;
45dcdd3278SHeiko Stübner 	} pll[4];
46dcdd3278SHeiko Stübner 	u32 cru_mode_con;
47dcdd3278SHeiko Stübner 	u32 cru_clksel_con[35];
48dcdd3278SHeiko Stübner 	u32 cru_clkgate_con[10];
49dcdd3278SHeiko Stübner 	u32 reserved1[2];
50dcdd3278SHeiko Stübner 	u32 cru_glb_srst_fst_value;
51dcdd3278SHeiko Stübner 	u32 cru_glb_srst_snd_value;
52dcdd3278SHeiko Stübner 	u32 reserved2[2];
53dcdd3278SHeiko Stübner 	u32 cru_softrst_con[9];
54dcdd3278SHeiko Stübner 	u32 cru_misc_con;
55dcdd3278SHeiko Stübner 	u32 reserved3[2];
56dcdd3278SHeiko Stübner 	u32 cru_glb_cnt_th;
57dcdd3278SHeiko Stübner };
58dcdd3278SHeiko Stübner check_member(rk3188_cru, cru_glb_cnt_th, 0x0140);
59dcdd3278SHeiko Stübner 
60*441bfb78SElaine Zhang struct rk3188_clk_info {
61*441bfb78SElaine Zhang 	unsigned long id;
62*441bfb78SElaine Zhang 	char *name;
63*441bfb78SElaine Zhang 	bool is_cru;
64*441bfb78SElaine Zhang };
65*441bfb78SElaine Zhang 
66dcdd3278SHeiko Stübner /* CRU_CLKSEL0_CON */
67dcdd3278SHeiko Stübner enum {
68dcdd3278SHeiko Stübner 	/* a9_core_div: core = core_src / (a9_core_div + 1) */
69dcdd3278SHeiko Stübner 	A9_CORE_DIV_SHIFT	= 9,
70dcdd3278SHeiko Stübner 	A9_CORE_DIV_MASK	= 0x1f,
71dcdd3278SHeiko Stübner 	CORE_PLL_SHIFT		= 8,
72dcdd3278SHeiko Stübner 	CORE_PLL_MASK		= 1,
73dcdd3278SHeiko Stübner 	CORE_PLL_SELECT_APLL	= 0,
74dcdd3278SHeiko Stübner 	CORE_PLL_SELECT_GPLL,
75dcdd3278SHeiko Stübner 
76dcdd3278SHeiko Stübner 	/* core peri div: core:core_peri = 2:1, 4:1, 8:1 or 16:1 */
77dcdd3278SHeiko Stübner 	CORE_PERI_DIV_SHIFT	= 6,
78dcdd3278SHeiko Stübner 	CORE_PERI_DIV_MASK	= 3,
79dcdd3278SHeiko Stübner 
80dcdd3278SHeiko Stübner 	/* aclk_cpu pll selection */
81dcdd3278SHeiko Stübner 	CPU_ACLK_PLL_SHIFT	= 5,
82dcdd3278SHeiko Stübner 	CPU_ACLK_PLL_MASK	= 1,
83dcdd3278SHeiko Stübner 	CPU_ACLK_PLL_SELECT_APLL	= 0,
84dcdd3278SHeiko Stübner 	CPU_ACLK_PLL_SELECT_GPLL,
85dcdd3278SHeiko Stübner 
86dcdd3278SHeiko Stübner 	/* a9_cpu_div: aclk_cpu = cpu_src / (a9_cpu_div + 1) */
87dcdd3278SHeiko Stübner 	A9_CPU_DIV_SHIFT	= 0,
88dcdd3278SHeiko Stübner 	A9_CPU_DIV_MASK		= 0x1f,
89dcdd3278SHeiko Stübner };
90dcdd3278SHeiko Stübner 
91dcdd3278SHeiko Stübner /* CRU_CLKSEL1_CON */
92dcdd3278SHeiko Stübner enum {
93dcdd3278SHeiko Stübner 	/* ahb2apb_pclk_div: hclk_cpu:pclk_cpu = 1:1, 2:1 or 4:1 */
94dcdd3278SHeiko Stübner 	AHB2APB_DIV_SHIFT	= 14,
95dcdd3278SHeiko Stübner 	AHB2APB_DIV_MASK	= 3,
96dcdd3278SHeiko Stübner 
97dcdd3278SHeiko Stübner 	/* cpu_pclk_div: aclk_cpu:pclk_cpu = 1:1, 2:1, 4:1 or 8:1 */
98dcdd3278SHeiko Stübner 	CPU_PCLK_DIV_SHIFT	= 12,
99dcdd3278SHeiko Stübner 	CPU_PCLK_DIV_MASK	= 3,
100dcdd3278SHeiko Stübner 
101dcdd3278SHeiko Stübner 	/* cpu_hclk_div: aclk_cpu:hclk_cpu = 1:1, 2:1 or 4:1 */
102dcdd3278SHeiko Stübner 	CPU_HCLK_DIV_SHIFT	= 8,
103dcdd3278SHeiko Stübner 	CPU_HCLK_DIV_MASK	= 3,
104dcdd3278SHeiko Stübner 
105dcdd3278SHeiko Stübner 	/* core_aclk_div: cire:aclk_core = 1:1, 2:1, 3:1, 4:1 or 8:1 */
106dcdd3278SHeiko Stübner 	CORE_ACLK_DIV_SHIFT	= 3,
107dcdd3278SHeiko Stübner 	CORE_ACLK_DIV_MASK	= 7,
108dcdd3278SHeiko Stübner };
109dcdd3278SHeiko Stübner 
110dcdd3278SHeiko Stübner /* CRU_CLKSEL10_CON */
111dcdd3278SHeiko Stübner enum {
112dcdd3278SHeiko Stübner 	PERI_SEL_PLL_MASK	= 1,
113dcdd3278SHeiko Stübner 	PERI_SEL_PLL_SHIFT	= 15,
114dcdd3278SHeiko Stübner 	PERI_SEL_CPLL		= 0,
115dcdd3278SHeiko Stübner 	PERI_SEL_GPLL,
116dcdd3278SHeiko Stübner 
117dcdd3278SHeiko Stübner 	/* peri pclk div: aclk_bus:pclk_bus = 1:1, 2:1, 4:1 or 8:1 */
118dcdd3278SHeiko Stübner 	PERI_PCLK_DIV_SHIFT	= 12,
119dcdd3278SHeiko Stübner 	PERI_PCLK_DIV_MASK	= 3,
120dcdd3278SHeiko Stübner 
121dcdd3278SHeiko Stübner 	/* peripheral bus hclk div:aclk_bus: hclk_bus = 1:1, 2:1 or 4:1 */
122dcdd3278SHeiko Stübner 	PERI_HCLK_DIV_SHIFT	= 8,
123dcdd3278SHeiko Stübner 	PERI_HCLK_DIV_MASK	= 3,
124dcdd3278SHeiko Stübner 
125dcdd3278SHeiko Stübner 	/* peri aclk div: aclk_peri = periph_src / (peri_aclk_div + 1) */
126dcdd3278SHeiko Stübner 	PERI_ACLK_DIV_SHIFT	= 0,
127dcdd3278SHeiko Stübner 	PERI_ACLK_DIV_MASK	= 0x1f,
128dcdd3278SHeiko Stübner };
129dcdd3278SHeiko Stübner /* CRU_CLKSEL11_CON */
130dcdd3278SHeiko Stübner enum {
131dcdd3278SHeiko Stübner 	HSICPHY_DIV_SHIFT	= 8,
132dcdd3278SHeiko Stübner 	HSICPHY_DIV_MASK	= 0x3f,
133dcdd3278SHeiko Stübner 
134dcdd3278SHeiko Stübner 	MMC0_DIV_SHIFT		= 0,
135dcdd3278SHeiko Stübner 	MMC0_DIV_MASK		= 0x3f,
136dcdd3278SHeiko Stübner };
137dcdd3278SHeiko Stübner 
138dcdd3278SHeiko Stübner /* CRU_CLKSEL12_CON */
139dcdd3278SHeiko Stübner enum {
140dcdd3278SHeiko Stübner 	UART_PLL_SHIFT		= 15,
141dcdd3278SHeiko Stübner 	UART_PLL_MASK		= 1,
142dcdd3278SHeiko Stübner 	UART_PLL_SELECT_GENERAL	= 0,
143dcdd3278SHeiko Stübner 	UART_PLL_SELECT_CODEC,
144dcdd3278SHeiko Stübner 
145dcdd3278SHeiko Stübner 	EMMC_DIV_SHIFT		= 8,
146dcdd3278SHeiko Stübner 	EMMC_DIV_MASK		= 0x3f,
147dcdd3278SHeiko Stübner 
148dcdd3278SHeiko Stübner 	SDIO_DIV_SHIFT		= 0,
149dcdd3278SHeiko Stübner 	SDIO_DIV_MASK		= 0x3f,
150dcdd3278SHeiko Stübner };
151dcdd3278SHeiko Stübner 
152dcb51bfeSDavid Wu /* CRU_CLKSEL24_CON */
153dcb51bfeSDavid Wu enum {
154dcb51bfeSDavid Wu 	SARADC_DIV_SHIFT	= 8,
155dcb51bfeSDavid Wu 	SARADC_DIV_MASK		=GENMASK(15, 8),
156dcb51bfeSDavid Wu 	SARADC_DIV_WIDTH	= 8,
157dcb51bfeSDavid Wu };
158dcb51bfeSDavid Wu 
159dcdd3278SHeiko Stübner /* CRU_CLKSEL25_CON */
160dcdd3278SHeiko Stübner enum {
161dcdd3278SHeiko Stübner 	SPI1_DIV_SHIFT		= 8,
162dcdd3278SHeiko Stübner 	SPI1_DIV_MASK		= 0x7f,
163dcdd3278SHeiko Stübner 
164dcdd3278SHeiko Stübner 	SPI0_DIV_SHIFT		= 0,
165dcdd3278SHeiko Stübner 	SPI0_DIV_MASK		= 0x7f,
166dcdd3278SHeiko Stübner };
167dcdd3278SHeiko Stübner 
168dcdd3278SHeiko Stübner /* CRU_MODE_CON */
169dcdd3278SHeiko Stübner enum {
170dcdd3278SHeiko Stübner 	GPLL_MODE_SHIFT		= 12,
171dcdd3278SHeiko Stübner 	GPLL_MODE_MASK		= 3,
172dcdd3278SHeiko Stübner 	GPLL_MODE_SLOW		= 0,
173dcdd3278SHeiko Stübner 	GPLL_MODE_NORMAL,
174dcdd3278SHeiko Stübner 	GPLL_MODE_DEEP,
175dcdd3278SHeiko Stübner 
176dcdd3278SHeiko Stübner 	CPLL_MODE_SHIFT		= 8,
177dcdd3278SHeiko Stübner 	CPLL_MODE_MASK		= 3,
178dcdd3278SHeiko Stübner 	CPLL_MODE_SLOW		= 0,
179dcdd3278SHeiko Stübner 	CPLL_MODE_NORMAL,
180dcdd3278SHeiko Stübner 	CPLL_MODE_DEEP,
181dcdd3278SHeiko Stübner 
182dcdd3278SHeiko Stübner 	DPLL_MODE_SHIFT		= 4,
183dcdd3278SHeiko Stübner 	DPLL_MODE_MASK		= 3,
184dcdd3278SHeiko Stübner 	DPLL_MODE_SLOW		= 0,
185dcdd3278SHeiko Stübner 	DPLL_MODE_NORMAL,
186dcdd3278SHeiko Stübner 	DPLL_MODE_DEEP,
187dcdd3278SHeiko Stübner 
188dcdd3278SHeiko Stübner 	APLL_MODE_SHIFT		= 0,
189dcdd3278SHeiko Stübner 	APLL_MODE_MASK		= 3,
190dcdd3278SHeiko Stübner 	APLL_MODE_SLOW		= 0,
191dcdd3278SHeiko Stübner 	APLL_MODE_NORMAL,
192dcdd3278SHeiko Stübner 	APLL_MODE_DEEP,
193dcdd3278SHeiko Stübner };
194dcdd3278SHeiko Stübner 
195dcdd3278SHeiko Stübner /* CRU_APLL_CON0 */
196dcdd3278SHeiko Stübner enum {
197dcdd3278SHeiko Stübner 	CLKR_SHIFT		= 8,
198dcdd3278SHeiko Stübner 	CLKR_MASK		= 0x3f,
199dcdd3278SHeiko Stübner 
200dcdd3278SHeiko Stübner 	CLKOD_SHIFT		= 0,
201dcdd3278SHeiko Stübner 	CLKOD_MASK		= 0x3f,
202dcdd3278SHeiko Stübner };
203dcdd3278SHeiko Stübner 
204dcdd3278SHeiko Stübner /* CRU_APLL_CON1 */
205dcdd3278SHeiko Stübner enum {
206dcdd3278SHeiko Stübner 	CLKF_SHIFT		= 0,
207dcdd3278SHeiko Stübner 	CLKF_MASK		= 0x1fff,
208dcdd3278SHeiko Stübner };
209dcdd3278SHeiko Stübner 
210dcdd3278SHeiko Stübner #endif
211