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