xref: /rk3399_ARM-atf/plat/rockchip/rk3288/drivers/soc/soc.h (revision 8742f8574bcbb513480c53645dbc5b72ea5f451e)
1*780e3f24SHeiko Stuebner /*
2*780e3f24SHeiko Stuebner  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3*780e3f24SHeiko Stuebner  *
4*780e3f24SHeiko Stuebner  * SPDX-License-Identifier: BSD-3-Clause
5*780e3f24SHeiko Stuebner  */
6*780e3f24SHeiko Stuebner 
7*780e3f24SHeiko Stuebner #ifndef SOC_H
8*780e3f24SHeiko Stuebner #define SOC_H
9*780e3f24SHeiko Stuebner 
10*780e3f24SHeiko Stuebner enum plls_id {
11*780e3f24SHeiko Stuebner 	APLL_ID = 0,
12*780e3f24SHeiko Stuebner 	DPLL_ID,
13*780e3f24SHeiko Stuebner 	CPLL_ID,
14*780e3f24SHeiko Stuebner 	GPLL_ID,
15*780e3f24SHeiko Stuebner 	NPLL_ID,
16*780e3f24SHeiko Stuebner 	END_PLL_ID,
17*780e3f24SHeiko Stuebner };
18*780e3f24SHeiko Stuebner 
19*780e3f24SHeiko Stuebner 
20*780e3f24SHeiko Stuebner #define CYCL_24M_CNT_US(us)	(24 * (us))
21*780e3f24SHeiko Stuebner #define CYCL_24M_CNT_MS(ms)	((ms) * CYCL_24M_CNT_US(1000))
22*780e3f24SHeiko Stuebner 
23*780e3f24SHeiko Stuebner /*****************************************************************************
24*780e3f24SHeiko Stuebner  * grf regs
25*780e3f24SHeiko Stuebner  *****************************************************************************/
26*780e3f24SHeiko Stuebner #define GRF_UOC0_CON0		0x320
27*780e3f24SHeiko Stuebner #define GRF_UOC1_CON0		0x334
28*780e3f24SHeiko Stuebner #define GRF_UOC2_CON0		0x348
29*780e3f24SHeiko Stuebner #define GRF_SIDDQ		BIT(13)
30*780e3f24SHeiko Stuebner 
31*780e3f24SHeiko Stuebner /*****************************************************************************
32*780e3f24SHeiko Stuebner  * cru reg, offset
33*780e3f24SHeiko Stuebner  *****************************************************************************/
34*780e3f24SHeiko Stuebner #define CRU_SOFTRST_CON		0x1b8
35*780e3f24SHeiko Stuebner #define CRU_SOFTRSTS_CON(n)	(CRU_SOFTRST_CON + ((n) * 4))
36*780e3f24SHeiko Stuebner #define CRU_SOFTRSTS_CON_CNT	11
37*780e3f24SHeiko Stuebner 
38*780e3f24SHeiko Stuebner #define RST_DMA1_MSK		0x4
39*780e3f24SHeiko Stuebner #define RST_DMA2_MSK		0x1
40*780e3f24SHeiko Stuebner 
41*780e3f24SHeiko Stuebner #define CRU_CLKSEL_CON		0x60
42*780e3f24SHeiko Stuebner #define CRU_CLKSELS_CON(i)	(CRU_CLKSEL_CON + ((i) * 4))
43*780e3f24SHeiko Stuebner #define CRU_CLKSELS_CON_CNT	42
44*780e3f24SHeiko Stuebner 
45*780e3f24SHeiko Stuebner #define CRU_CLKGATE_CON		0x160
46*780e3f24SHeiko Stuebner #define CRU_CLKGATES_CON(i)	(CRU_CLKGATE_CON + ((i) * 4))
47*780e3f24SHeiko Stuebner #define CRU_CLKGATES_CON_CNT	18
48*780e3f24SHeiko Stuebner 
49*780e3f24SHeiko Stuebner #define CRU_GLB_SRST_FST	0x1b0
50*780e3f24SHeiko Stuebner #define CRU_GLB_SRST_SND	0x1b4
51*780e3f24SHeiko Stuebner #define CRU_GLB_RST_CON		0x1f0
52*780e3f24SHeiko Stuebner 
53*780e3f24SHeiko Stuebner #define CRU_CONS_GATEID(i)	(16 * (i))
54*780e3f24SHeiko Stuebner #define GATE_ID(reg, bit)	(((reg) * 16) + (bit))
55*780e3f24SHeiko Stuebner 
56*780e3f24SHeiko Stuebner #define PMU_RST_MASK		0x3
57*780e3f24SHeiko Stuebner #define PMU_RST_BY_FIRST_SFT	(0 << 2)
58*780e3f24SHeiko Stuebner #define PMU_RST_BY_SECOND_SFT	(1 << 2)
59*780e3f24SHeiko Stuebner #define PMU_RST_NOT_BY_SFT	(2 << 2)
60*780e3f24SHeiko Stuebner 
61*780e3f24SHeiko Stuebner /***************************************************************************
62*780e3f24SHeiko Stuebner  * pll
63*780e3f24SHeiko Stuebner  ***************************************************************************/
64*780e3f24SHeiko Stuebner #define PLL_CON_COUNT		4
65*780e3f24SHeiko Stuebner #define PLL_CONS(id, i)		((id) * 0x10 + ((i) * 4))
66*780e3f24SHeiko Stuebner #define PLL_PWR_DN_MSK		BIT(1)
67*780e3f24SHeiko Stuebner #define PLL_PWR_DN		REG_WMSK_BITS(1, 1, 0x1)
68*780e3f24SHeiko Stuebner #define PLL_PWR_ON		REG_WMSK_BITS(0, 1, 0x1)
69*780e3f24SHeiko Stuebner #define PLL_RESET		REG_WMSK_BITS(1, 5, 0x1)
70*780e3f24SHeiko Stuebner #define PLL_RESET_RESUME	REG_WMSK_BITS(0, 5, 0x1)
71*780e3f24SHeiko Stuebner #define PLL_BYPASS_MSK		BIT(0)
72*780e3f24SHeiko Stuebner #define PLL_BYPASS_W_MSK	(PLL_BYPASS_MSK << 16)
73*780e3f24SHeiko Stuebner #define PLL_BYPASS		REG_WMSK_BITS(1, 0, 0x1)
74*780e3f24SHeiko Stuebner #define PLL_NO_BYPASS		REG_WMSK_BITS(0, 0, 0x1)
75*780e3f24SHeiko Stuebner 
76*780e3f24SHeiko Stuebner #define PLL_MODE_CON		0x50
77*780e3f24SHeiko Stuebner 
78*780e3f24SHeiko Stuebner struct deepsleep_data_s {
79*780e3f24SHeiko Stuebner 	uint32_t pll_con[END_PLL_ID][PLL_CON_COUNT];
80*780e3f24SHeiko Stuebner 	uint32_t pll_mode;
81*780e3f24SHeiko Stuebner 	uint32_t cru_sel_con[CRU_CLKSELS_CON_CNT];
82*780e3f24SHeiko Stuebner 	uint32_t cru_gate_con[CRU_CLKGATES_CON_CNT];
83*780e3f24SHeiko Stuebner };
84*780e3f24SHeiko Stuebner 
85*780e3f24SHeiko Stuebner #define REG_W_MSK(bits_shift, msk) \
86*780e3f24SHeiko Stuebner 		((msk) << ((bits_shift) + 16))
87*780e3f24SHeiko Stuebner #define REG_VAL_CLRBITS(val, bits_shift, msk) \
88*780e3f24SHeiko Stuebner 		((val) & (~((msk) << bits_shift)))
89*780e3f24SHeiko Stuebner #define REG_SET_BITS(bits, bits_shift, msk) \
90*780e3f24SHeiko Stuebner 		(((bits) & (msk)) << (bits_shift))
91*780e3f24SHeiko Stuebner #define REG_WMSK_BITS(bits, bits_shift, msk) \
92*780e3f24SHeiko Stuebner 		(REG_W_MSK(bits_shift, msk) | \
93*780e3f24SHeiko Stuebner 		REG_SET_BITS(bits, bits_shift, msk))
94*780e3f24SHeiko Stuebner #define REG_SOC_WMSK		0xffff0000
95*780e3f24SHeiko Stuebner 
96*780e3f24SHeiko Stuebner #define regs_update_bit_set(addr, shift) \
97*780e3f24SHeiko Stuebner 		regs_update_bits((addr), 0x1, 0x1, (shift))
98*780e3f24SHeiko Stuebner #define regs_update_bit_clr(addr, shift) \
99*780e3f24SHeiko Stuebner 		regs_update_bits((addr), 0x0, 0x1, (shift))
100*780e3f24SHeiko Stuebner 
101*780e3f24SHeiko Stuebner void regs_update_bits(uintptr_t addr, uint32_t val,
102*780e3f24SHeiko Stuebner 		      uint32_t mask, uint32_t shift);
103*780e3f24SHeiko Stuebner void clk_plls_suspend(void);
104*780e3f24SHeiko Stuebner void clk_plls_resume(void);
105*780e3f24SHeiko Stuebner void clk_gate_con_save(void);
106*780e3f24SHeiko Stuebner void clk_gate_con_disable(void);
107*780e3f24SHeiko Stuebner void clk_gate_con_restore(void);
108*780e3f24SHeiko Stuebner void clk_sel_con_save(void);
109*780e3f24SHeiko Stuebner void clk_sel_con_restore(void);
110*780e3f24SHeiko Stuebner #endif /* SOC_H */
111