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