xref: /OK3568_Linux_fs/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3328.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2016 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:     GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef __ASM_ARCH_CRU_RK3328_H_
8*4882a593Smuzhiyun #define __ASM_ARCH_CRU_RK3328_H_
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <common.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun struct rk3328_clk_priv {
13*4882a593Smuzhiyun 	struct rk3328_cru *cru;
14*4882a593Smuzhiyun 	ulong rate;
15*4882a593Smuzhiyun 	ulong cpll_hz;
16*4882a593Smuzhiyun 	ulong gpll_hz;
17*4882a593Smuzhiyun 	ulong armclk_hz;
18*4882a593Smuzhiyun 	ulong armclk_enter_hz;
19*4882a593Smuzhiyun 	ulong armclk_init_hz;
20*4882a593Smuzhiyun 	bool sync_kernel;
21*4882a593Smuzhiyun 	bool set_armclk_rate;
22*4882a593Smuzhiyun };
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun struct rk3328_cru {
25*4882a593Smuzhiyun 	u32 apll_con[5];
26*4882a593Smuzhiyun 	u32 reserved1[3];
27*4882a593Smuzhiyun 	u32 dpll_con[5];
28*4882a593Smuzhiyun 	u32 reserved2[3];
29*4882a593Smuzhiyun 	u32 cpll_con[5];
30*4882a593Smuzhiyun 	u32 reserved3[3];
31*4882a593Smuzhiyun 	u32 gpll_con[5];
32*4882a593Smuzhiyun 	u32 reserved4[3];
33*4882a593Smuzhiyun 	u32 mode_con;
34*4882a593Smuzhiyun 	u32 misc;
35*4882a593Smuzhiyun 	u32 reserved5[2];
36*4882a593Smuzhiyun 	u32 glb_cnt_th;
37*4882a593Smuzhiyun 	u32 glb_rst_st;
38*4882a593Smuzhiyun 	u32 glb_srst_snd_value;
39*4882a593Smuzhiyun 	u32 glb_srst_fst_value;
40*4882a593Smuzhiyun 	u32 npll_con[5];
41*4882a593Smuzhiyun 	u32 reserved6[(0x100 - 0xb4) / 4];
42*4882a593Smuzhiyun 	u32 clksel_con[53];
43*4882a593Smuzhiyun 	u32 reserved7[(0x200 - 0x1d4) / 4];
44*4882a593Smuzhiyun 	u32 clkgate_con[29];
45*4882a593Smuzhiyun 	u32 reserved8[3];
46*4882a593Smuzhiyun 	u32 ssgtbl[32];
47*4882a593Smuzhiyun 	u32 softrst_con[12];
48*4882a593Smuzhiyun 	u32 reserved9[(0x380 - 0x330) / 4];
49*4882a593Smuzhiyun 	u32 sdmmc_con[2];
50*4882a593Smuzhiyun 	u32 sdio_con[2];
51*4882a593Smuzhiyun 	u32 emmc_con[2];
52*4882a593Smuzhiyun 	u32 sdmmc_ext_con[2];
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun check_member(rk3328_cru, sdmmc_ext_con[1], 0x39c);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /* PX30 pll id */
57*4882a593Smuzhiyun enum rk3328_pll_id {
58*4882a593Smuzhiyun 	APLL,
59*4882a593Smuzhiyun 	DPLL,
60*4882a593Smuzhiyun 	CPLL,
61*4882a593Smuzhiyun 	GPLL,
62*4882a593Smuzhiyun 	NPLL,
63*4882a593Smuzhiyun 	PLL_COUNT,
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun struct rk3328_clk_info {
67*4882a593Smuzhiyun 	unsigned long id;
68*4882a593Smuzhiyun 	char *name;
69*4882a593Smuzhiyun 	bool is_cru;
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #define MHz				1000 * 1000
73*4882a593Smuzhiyun #define OSC_HZ				(24 * MHz)
74*4882a593Smuzhiyun #define APLL_HZ				(600 * MHz)
75*4882a593Smuzhiyun #define GPLL_HZ				491520000
76*4882a593Smuzhiyun #define CPLL_HZ				(1200 * MHz)
77*4882a593Smuzhiyun #define ACLK_BUS_HZ			(150 * MHz)
78*4882a593Smuzhiyun #define ACLK_PERI_HZ			(150 * MHz)
79*4882a593Smuzhiyun #define PWM_CLOCK_HZ			(74 * MHz)
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define RK3328_PLL_CON(x)		((x) * 0x4)
82*4882a593Smuzhiyun #define RK3328_CLKSEL_CON(x)		((x) * 0x4 + 0x100)
83*4882a593Smuzhiyun #define RK3328_CLKGATE_CON(x)		((x) * 0x4 + 0x200)
84*4882a593Smuzhiyun #define RK3328_MODE_CON			0x80
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun enum {
87*4882a593Smuzhiyun 	/* CLKSEL_CON0 */
88*4882a593Smuzhiyun 	CLK_BUS_PLL_SEL_CPLL		= 0,
89*4882a593Smuzhiyun 	CLK_BUS_PLL_SEL_GPLL		= 1,
90*4882a593Smuzhiyun 	CLK_BUS_PLL_SEL_SHIFT		= 13,
91*4882a593Smuzhiyun 	CLK_BUS_PLL_SEL_MASK		= 3 << CLK_BUS_PLL_SEL_SHIFT,
92*4882a593Smuzhiyun 	ACLK_BUS_DIV_CON_SHIFT		= 8,
93*4882a593Smuzhiyun 	ACLK_BUS_DIV_CON_MASK		= 0x1f << ACLK_BUS_DIV_CON_SHIFT,
94*4882a593Smuzhiyun 	CORE_CLK_PLL_SEL_SHIFT		= 6,
95*4882a593Smuzhiyun 	CORE_CLK_PLL_SEL_MASK		= 3 << CORE_CLK_PLL_SEL_SHIFT,
96*4882a593Smuzhiyun 	CORE_CLK_PLL_SEL_APLL		= 0,
97*4882a593Smuzhiyun 	CORE_CLK_PLL_SEL_GPLL,
98*4882a593Smuzhiyun 	CORE_CLK_PLL_SEL_NPLL		= 3,
99*4882a593Smuzhiyun 	CORE_DIV_CON_SHIFT		= 0,
100*4882a593Smuzhiyun 	CORE_DIV_CON_MASK		= 0x1f << CORE_DIV_CON_SHIFT,
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	/* CLKSEL_CON1 */
103*4882a593Smuzhiyun 	PCLK_BUS_DIV_CON_SHIFT		= 12,
104*4882a593Smuzhiyun 	PCLK_BUS_DIV_CON_MASK		= 0x7 << PCLK_BUS_DIV_CON_SHIFT,
105*4882a593Smuzhiyun 	HCLK_BUS_DIV_CON_SHIFT		= 8,
106*4882a593Smuzhiyun 	HCLK_BUS_DIV_CON_MASK		= 0x3 << HCLK_BUS_DIV_CON_SHIFT,
107*4882a593Smuzhiyun 	CORE_ACLK_DIV_SHIFT		= 4,
108*4882a593Smuzhiyun 	CORE_ACLK_DIV_MASK		= 0x07 << CORE_ACLK_DIV_SHIFT,
109*4882a593Smuzhiyun 	CORE_DBG_DIV_SHIFT		= 0,
110*4882a593Smuzhiyun 	CORE_DBG_DIV_MASK		= 0x0f << CORE_DBG_DIV_SHIFT,
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	/* CLKSEL_CON26 */
113*4882a593Smuzhiyun 	GMAC2PHY_PLL_SEL_SHIFT          = 7,
114*4882a593Smuzhiyun 	GMAC2PHY_PLL_SEL_MASK           = 1 << GMAC2PHY_PLL_SEL_SHIFT,
115*4882a593Smuzhiyun 	GMAC2PHY_PLL_SEL_CPLL           = 0,
116*4882a593Smuzhiyun 	GMAC2PHY_PLL_SEL_GPLL           = 1,
117*4882a593Smuzhiyun 	GMAC2PHY_CLK_DIV_MASK           = 0x1f,
118*4882a593Smuzhiyun 	GMAC2PHY_CLK_DIV_SHIFT          = 0,
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	/* CLKSEL_CON27 */
121*4882a593Smuzhiyun 	GMAC2IO_PLL_SEL_SHIFT		= 7,
122*4882a593Smuzhiyun 	GMAC2IO_PLL_SEL_MASK		= 1 << GMAC2IO_PLL_SEL_SHIFT,
123*4882a593Smuzhiyun 	GMAC2IO_PLL_SEL_CPLL		= 0,
124*4882a593Smuzhiyun 	GMAC2IO_PLL_SEL_GPLL		= 1,
125*4882a593Smuzhiyun 	GMAC2IO_CLK_DIV_MASK		= 0x1f,
126*4882a593Smuzhiyun 	GMAC2IO_CLK_DIV_SHIFT		= 0,
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	/* CLKSEL_CON28 */
129*4882a593Smuzhiyun 	CLK_PERI_PLL_SEL_CPLL		= 0,
130*4882a593Smuzhiyun 	CLK_PERI_PLL_SEL_GPLL,
131*4882a593Smuzhiyun 	CLK_PERI_PLL_SEL_HDMIPHY,
132*4882a593Smuzhiyun 	CLK_PERI_PLL_SEL_SHIFT		= 6,
133*4882a593Smuzhiyun 	CLK_PERI_PLL_SEL_MASK		= 3 << CLK_PERI_PLL_SEL_SHIFT,
134*4882a593Smuzhiyun 	ACLK_PERI_DIV_CON_SHIFT		= 0,
135*4882a593Smuzhiyun 	ACLK_PERI_DIV_CON_MASK		= 0x1f,
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	/* CLKSEL_CON29 */
138*4882a593Smuzhiyun 	PCLK_PERI_DIV_CON_SHIFT		= 4,
139*4882a593Smuzhiyun 	PCLK_PERI_DIV_CON_MASK		= 0x7 << PCLK_PERI_DIV_CON_SHIFT,
140*4882a593Smuzhiyun 	HCLK_PERI_DIV_CON_SHIFT		= 0,
141*4882a593Smuzhiyun 	HCLK_PERI_DIV_CON_MASK		= 3 << HCLK_PERI_DIV_CON_SHIFT,
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	/* CLKSEL_CON20 */
144*4882a593Smuzhiyun 	CRYPTO_PLL_SEL_SHIFT		= 7,
145*4882a593Smuzhiyun 	CRYPTO_PLL_SEL_MASK		= 0x1 << CRYPTO_PLL_SEL_SHIFT,
146*4882a593Smuzhiyun 	CRYPTO_PLL_SEL_CPLL		= 0,
147*4882a593Smuzhiyun 	CRYPTO_PLL_SEL_GPLL,
148*4882a593Smuzhiyun 	CRYPTO_DIV_SHIFT		= 0,
149*4882a593Smuzhiyun 	CRYPTO_DIV_MASK			= 0x7f << CRYPTO_DIV_SHIFT,
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	/* CLKSEL_CON22 */
152*4882a593Smuzhiyun 	CLK_TSADC_DIV_CON_SHIFT		= 0,
153*4882a593Smuzhiyun 	CLK_TSADC_DIV_CON_MASK		= 0x3ff,
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	/* CLKSEL_CON23 */
156*4882a593Smuzhiyun 	CLK_SARADC_DIV_CON_SHIFT	= 0,
157*4882a593Smuzhiyun 	CLK_SARADC_DIV_CON_MASK		= GENMASK(9, 0),
158*4882a593Smuzhiyun 	CLK_SARADC_DIV_CON_WIDTH	= 10,
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	/* CLKSEL_CON24 */
161*4882a593Smuzhiyun 	CLK_PWM_PLL_SEL_CPLL		= 0,
162*4882a593Smuzhiyun 	CLK_PWM_PLL_SEL_GPLL,
163*4882a593Smuzhiyun 	CLK_PWM_PLL_SEL_SHIFT		= 15,
164*4882a593Smuzhiyun 	CLK_PWM_PLL_SEL_MASK		= 1 << CLK_PWM_PLL_SEL_SHIFT,
165*4882a593Smuzhiyun 	CLK_PWM_DIV_CON_SHIFT		= 8,
166*4882a593Smuzhiyun 	CLK_PWM_DIV_CON_MASK		= 0x7f << CLK_PWM_DIV_CON_SHIFT,
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	CLK_SPI_PLL_SEL_CPLL		= 0,
169*4882a593Smuzhiyun 	CLK_SPI_PLL_SEL_GPLL,
170*4882a593Smuzhiyun 	CLK_SPI_PLL_SEL_SHIFT		= 7,
171*4882a593Smuzhiyun 	CLK_SPI_PLL_SEL_MASK		= 1 << CLK_SPI_PLL_SEL_SHIFT,
172*4882a593Smuzhiyun 	CLK_SPI_DIV_CON_SHIFT		= 0,
173*4882a593Smuzhiyun 	CLK_SPI_DIV_CON_MASK		= 0x7f << CLK_SPI_DIV_CON_SHIFT,
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	/* CLKSEL_CON30 */
176*4882a593Smuzhiyun 	CLK_SDMMC_PLL_SEL_CPLL		= 0,
177*4882a593Smuzhiyun 	CLK_SDMMC_PLL_SEL_GPLL,
178*4882a593Smuzhiyun 	CLK_SDMMC_PLL_SEL_24M,
179*4882a593Smuzhiyun 	CLK_SDMMC_PLL_SEL_USBPHY,
180*4882a593Smuzhiyun 	CLK_SDMMC_PLL_SHIFT		= 8,
181*4882a593Smuzhiyun 	CLK_SDMMC_PLL_MASK		= 0x3 << CLK_SDMMC_PLL_SHIFT,
182*4882a593Smuzhiyun 	CLK_SDMMC_DIV_CON_SHIFT          = 0,
183*4882a593Smuzhiyun 	CLK_SDMMC_DIV_CON_MASK           = 0xff << CLK_SDMMC_DIV_CON_SHIFT,
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	/* CLKSEL_CON32 */
186*4882a593Smuzhiyun 	CLK_EMMC_PLL_SEL_CPLL		= 0,
187*4882a593Smuzhiyun 	CLK_EMMC_PLL_SEL_GPLL,
188*4882a593Smuzhiyun 	CLK_EMMC_PLL_SEL_24M,
189*4882a593Smuzhiyun 	CLK_EMMC_PLL_SEL_USBPHY,
190*4882a593Smuzhiyun 	CLK_EMMC_PLL_SHIFT		= 8,
191*4882a593Smuzhiyun 	CLK_EMMC_PLL_MASK		= 0x3 << CLK_EMMC_PLL_SHIFT,
192*4882a593Smuzhiyun 	CLK_EMMC_DIV_CON_SHIFT          = 0,
193*4882a593Smuzhiyun 	CLK_EMMC_DIV_CON_MASK           = 0xff << CLK_EMMC_DIV_CON_SHIFT,
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	/* CLKSEL_CON34 */
196*4882a593Smuzhiyun 	CLK_I2C_PLL_SEL_CPLL		= 0,
197*4882a593Smuzhiyun 	CLK_I2C_PLL_SEL_GPLL,
198*4882a593Smuzhiyun 	CLK_I2C_DIV_CON_MASK		= 0x7f,
199*4882a593Smuzhiyun 	CLK_I2C_PLL_SEL_MASK		= 1,
200*4882a593Smuzhiyun 	CLK_I2C1_PLL_SEL_SHIFT		= 15,
201*4882a593Smuzhiyun 	CLK_I2C1_DIV_CON_SHIFT		= 8,
202*4882a593Smuzhiyun 	CLK_I2C0_PLL_SEL_SHIFT		= 7,
203*4882a593Smuzhiyun 	CLK_I2C0_DIV_CON_SHIFT		= 0,
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	/* CLKSEL_CON35 */
206*4882a593Smuzhiyun 	CLK_I2C3_PLL_SEL_SHIFT		= 15,
207*4882a593Smuzhiyun 	CLK_I2C3_DIV_CON_SHIFT		= 8,
208*4882a593Smuzhiyun 	CLK_I2C2_PLL_SEL_SHIFT		= 7,
209*4882a593Smuzhiyun 	CLK_I2C2_DIV_CON_SHIFT		= 0,
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	/* CRU_CLK_SEL37_CON */
212*4882a593Smuzhiyun 	ACLK_VIO_PLL_SEL_CPLL		= 0,
213*4882a593Smuzhiyun 	ACLK_VIO_PLL_SEL_GPLL		= 1,
214*4882a593Smuzhiyun 	ACLK_VIO_PLL_SEL_HDMIPHY	= 2,
215*4882a593Smuzhiyun 	ACLK_VIO_PLL_SEL_USB480M	= 3,
216*4882a593Smuzhiyun 	ACLK_VIO_PLL_SEL_SHIFT		= 6,
217*4882a593Smuzhiyun 	ACLK_VIO_PLL_SEL_MASK		= 3 << ACLK_VIO_PLL_SEL_SHIFT,
218*4882a593Smuzhiyun 	ACLK_VIO_DIV_CON_SHIFT		= 0,
219*4882a593Smuzhiyun 	ACLK_VIO_DIV_CON_MASK		= 0x1f << ACLK_VIO_DIV_CON_SHIFT,
220*4882a593Smuzhiyun 	HCLK_VIO_DIV_CON_SHIFT		= 8,
221*4882a593Smuzhiyun 	HCLK_VIO_DIV_CON_MASK		= 0x1f << HCLK_VIO_DIV_CON_SHIFT,
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	/* CRU_CLK_SEL39_CON */
224*4882a593Smuzhiyun 	ACLK_VOP_PLL_SEL_CPLL		= 0,
225*4882a593Smuzhiyun 	ACLK_VOP_PLL_SEL_GPLL		= 1,
226*4882a593Smuzhiyun 	ACLK_VOP_PLL_SEL_HDMIPHY	= 2,
227*4882a593Smuzhiyun 	ACLK_VOP_PLL_SEL_USB480M	= 3,
228*4882a593Smuzhiyun 	ACLK_VOP_PLL_SEL_SHIFT		= 6,
229*4882a593Smuzhiyun 	ACLK_VOP_PLL_SEL_MASK		= 3 << ACLK_VOP_PLL_SEL_SHIFT,
230*4882a593Smuzhiyun 	ACLK_VOP_DIV_CON_SHIFT		= 0,
231*4882a593Smuzhiyun 	ACLK_VOP_DIV_CON_MASK		= 0x1f << ACLK_VOP_DIV_CON_SHIFT,
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	/* CRU_CLK_SEL40_CON */
234*4882a593Smuzhiyun 	DCLK_LCDC_PLL_SEL_GPLL		= 0,
235*4882a593Smuzhiyun 	DCLK_LCDC_PLL_SEL_CPLL		= 1,
236*4882a593Smuzhiyun 	DCLK_LCDC_PLL_SEL_SHIFT		= 0,
237*4882a593Smuzhiyun 	DCLK_LCDC_PLL_SEL_MASK		= 1 << DCLK_LCDC_PLL_SEL_SHIFT,
238*4882a593Smuzhiyun 	DCLK_LCDC_SEL_HDMIPHY		= 0,
239*4882a593Smuzhiyun 	DCLK_LCDC_SEL_PLL		= 1,
240*4882a593Smuzhiyun 	DCLK_LCDC_SEL_SHIFT		= 1,
241*4882a593Smuzhiyun 	DCLK_LCDC_SEL_MASK		= 1 << DCLK_LCDC_SEL_SHIFT,
242*4882a593Smuzhiyun 	DCLK_LCDC_DIV_CON_SHIFT		= 8,
243*4882a593Smuzhiyun 	DCLK_LCDC_DIV_CON_MASK		= 0xFf << DCLK_LCDC_DIV_CON_SHIFT,
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun #endif	/* __ASM_ARCH_CRU_RK3328_H_ */
247