xref: /rk3399_ARM-atf/plat/rockchip/rk3328/drivers/pmu/pmu.h (revision 0d5ec955b8f7900ca33abf88638d499742531159)
1*0d5ec955Stony.xie /*
2*0d5ec955Stony.xie  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*0d5ec955Stony.xie  *
4*0d5ec955Stony.xie  * Redistribution and use in source and binary forms, with or without
5*0d5ec955Stony.xie  * modification, are permitted provided that the following conditions are met:
6*0d5ec955Stony.xie  *
7*0d5ec955Stony.xie  * Redistributions of source code must retain the above copyright notice, this
8*0d5ec955Stony.xie  * list of conditions and the following disclaimer.
9*0d5ec955Stony.xie  *
10*0d5ec955Stony.xie  * Redistributions in binary form must reproduce the above copyright notice,
11*0d5ec955Stony.xie  * this list of conditions and the following disclaimer in the documentation
12*0d5ec955Stony.xie  * and/or other materials provided with the distribution.
13*0d5ec955Stony.xie  *
14*0d5ec955Stony.xie  * Neither the name of ARM nor the names of its contributors may be used
15*0d5ec955Stony.xie  * to endorse or promote products derived from this software without specific
16*0d5ec955Stony.xie  * prior written permission.
17*0d5ec955Stony.xie  *
18*0d5ec955Stony.xie  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*0d5ec955Stony.xie  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*0d5ec955Stony.xie  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*0d5ec955Stony.xie  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*0d5ec955Stony.xie  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*0d5ec955Stony.xie  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*0d5ec955Stony.xie  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*0d5ec955Stony.xie  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*0d5ec955Stony.xie  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*0d5ec955Stony.xie  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*0d5ec955Stony.xie  * POSSIBILITY OF SUCH DAMAGE.
29*0d5ec955Stony.xie  */
30*0d5ec955Stony.xie 
31*0d5ec955Stony.xie #ifndef __PMU_H__
32*0d5ec955Stony.xie #define __PMU_H__
33*0d5ec955Stony.xie 
34*0d5ec955Stony.xie #include <soc.h>
35*0d5ec955Stony.xie 
36*0d5ec955Stony.xie struct rk3328_sleep_ddr_data {
37*0d5ec955Stony.xie 	uint32_t pmu_debug_enable;
38*0d5ec955Stony.xie 	uint32_t debug_iomux_save;
39*0d5ec955Stony.xie 	uint32_t pmic_sleep_save;
40*0d5ec955Stony.xie 	uint32_t pmu_wakeup_conf0;
41*0d5ec955Stony.xie 	uint32_t pmu_pwrmd_com;
42*0d5ec955Stony.xie 	uint32_t cru_mode_save;
43*0d5ec955Stony.xie 	uint32_t clk_sel0, clk_sel1, clk_sel18,
44*0d5ec955Stony.xie 		 clk_sel20, clk_sel24, clk_sel38;
45*0d5ec955Stony.xie 	uint32_t clk_ungt_save[CRU_CLKGATE_NUMS];
46*0d5ec955Stony.xie 	uint32_t cru_plls_con_save[MAX_PLL][CRU_PLL_CON_NUMS];
47*0d5ec955Stony.xie };
48*0d5ec955Stony.xie 
49*0d5ec955Stony.xie struct rk3328_sleep_sram_data {
50*0d5ec955Stony.xie 	uint32_t pmic_sleep_save;
51*0d5ec955Stony.xie 	uint32_t pmic_sleep_gpio_save[2];
52*0d5ec955Stony.xie 	uint32_t ddr_grf_con0;
53*0d5ec955Stony.xie 	uint32_t dpll_con_save[CRU_PLL_CON_NUMS];
54*0d5ec955Stony.xie 	uint32_t pd_sr_idle_save;
55*0d5ec955Stony.xie 	uint32_t uart2_ier;
56*0d5ec955Stony.xie };
57*0d5ec955Stony.xie 
58*0d5ec955Stony.xie /*****************************************************************************
59*0d5ec955Stony.xie  * The ways of cores power domain contorlling
60*0d5ec955Stony.xie  *****************************************************************************/
61*0d5ec955Stony.xie enum cores_pm_ctr_mode {
62*0d5ec955Stony.xie 	core_pwr_pd = 0,
63*0d5ec955Stony.xie 	core_pwr_wfi = 1,
64*0d5ec955Stony.xie 	core_pwr_wfi_int = 2
65*0d5ec955Stony.xie };
66*0d5ec955Stony.xie 
67*0d5ec955Stony.xie enum pmu_cores_pm_by_wfi {
68*0d5ec955Stony.xie 	core_pm_en = 0,
69*0d5ec955Stony.xie 	core_pm_int_wakeup_en,
70*0d5ec955Stony.xie 	core_pm_dis_int,
71*0d5ec955Stony.xie 	core_pm_sft_wakeup_en
72*0d5ec955Stony.xie };
73*0d5ec955Stony.xie 
74*0d5ec955Stony.xie extern void *pmu_cpuson_entrypoint_start;
75*0d5ec955Stony.xie extern void *pmu_cpuson_entrypoint_end;
76*0d5ec955Stony.xie extern uint64_t cpuson_entry_point[PLATFORM_CORE_COUNT];
77*0d5ec955Stony.xie extern uint32_t cpuson_flags[PLATFORM_CORE_COUNT];
78*0d5ec955Stony.xie 
79*0d5ec955Stony.xie #define CORES_PM_DISABLE	0x0
80*0d5ec955Stony.xie 
81*0d5ec955Stony.xie /*****************************************************************************
82*0d5ec955Stony.xie  * pmu con,reg
83*0d5ec955Stony.xie  *****************************************************************************/
84*0d5ec955Stony.xie #define PMU_WAKEUP_CFG0		0x00
85*0d5ec955Stony.xie #define PMU_PWRDN_CON		0x0c
86*0d5ec955Stony.xie #define PMU_PWRDN_ST		0x10
87*0d5ec955Stony.xie #define PMU_PWRMD_COM		0x18
88*0d5ec955Stony.xie #define PMU_SFT_CON		0x1c
89*0d5ec955Stony.xie #define PMU_INT_CON		0x20
90*0d5ec955Stony.xie #define PMU_INT_ST		0x24
91*0d5ec955Stony.xie #define PMU_POWER_ST		0x44
92*0d5ec955Stony.xie #define PMU_CPUAPM_CON(n)	(0x80 + (n) * 4)
93*0d5ec955Stony.xie #define PMU_SYS_REG(n)		(0xa0 + (n) * 4)
94*0d5ec955Stony.xie 
95*0d5ec955Stony.xie #define CHECK_CPU_WFIE_BASE		(GRF_BASE + GRF_CPU_STATUS(1))
96*0d5ec955Stony.xie 
97*0d5ec955Stony.xie enum pmu_core_pwrst_shift {
98*0d5ec955Stony.xie 	clst_cpu_wfe = 0,
99*0d5ec955Stony.xie 	clst_cpu_wfi = 4,
100*0d5ec955Stony.xie };
101*0d5ec955Stony.xie 
102*0d5ec955Stony.xie #define clstl_cpu_wfe (clst_cpu_wfe)
103*0d5ec955Stony.xie #define clstb_cpu_wfe (clst_cpu_wfe)
104*0d5ec955Stony.xie 
105*0d5ec955Stony.xie enum pmu_pd_id {
106*0d5ec955Stony.xie 	PD_CPU0 = 0,
107*0d5ec955Stony.xie 	PD_CPU1,
108*0d5ec955Stony.xie 	PD_CPU2,
109*0d5ec955Stony.xie 	PD_CPU3,
110*0d5ec955Stony.xie };
111*0d5ec955Stony.xie 
112*0d5ec955Stony.xie enum pmu_power_mode_common {
113*0d5ec955Stony.xie 	pmu_mode_en = 0,
114*0d5ec955Stony.xie 	sref_enter_en,
115*0d5ec955Stony.xie 	global_int_disable_cfg,
116*0d5ec955Stony.xie 	cpu0_pd_en,
117*0d5ec955Stony.xie 	wait_wakeup_begin_cfg = 4,
118*0d5ec955Stony.xie 	l2_flush_en,
119*0d5ec955Stony.xie 	l2_idle_en,
120*0d5ec955Stony.xie 	ddrio_ret_de_req,
121*0d5ec955Stony.xie 	ddrio_ret_en = 8,
122*0d5ec955Stony.xie };
123*0d5ec955Stony.xie 
124*0d5ec955Stony.xie enum pmu_sft_con {
125*0d5ec955Stony.xie 	upctl_c_sysreq_cfg = 0,
126*0d5ec955Stony.xie 	l2flushreq_req,
127*0d5ec955Stony.xie 	ddr_io_ret_cfg,
128*0d5ec955Stony.xie 	pmu_sft_ret_cfg,
129*0d5ec955Stony.xie };
130*0d5ec955Stony.xie 
131*0d5ec955Stony.xie #define CKECK_WFE_MSK		0x1
132*0d5ec955Stony.xie #define CKECK_WFI_MSK		0x10
133*0d5ec955Stony.xie #define CKECK_WFEI_MSK		0x11
134*0d5ec955Stony.xie 
135*0d5ec955Stony.xie #define PD_CTR_LOOP		500
136*0d5ec955Stony.xie #define CHK_CPU_LOOP		500
137*0d5ec955Stony.xie #define MAX_WAIT_CONUT		1000
138*0d5ec955Stony.xie 
139*0d5ec955Stony.xie #define WAKEUP_INT_CLUSTER_EN	0x1
140*0d5ec955Stony.xie #define PMIC_SLEEP_REG		0x34
141*0d5ec955Stony.xie 
142*0d5ec955Stony.xie #define PLL_IS_NORM_MODE(mode, pll_id)	\
143*0d5ec955Stony.xie 		((mode & (PLL_NORM_MODE(pll_id)) & 0xffff) != 0)
144*0d5ec955Stony.xie 
145*0d5ec955Stony.xie #define CTLR_ENABLE_G1_BIT	BIT(1)
146*0d5ec955Stony.xie #define UART_FIFO_EMPTY		BIT(6)
147*0d5ec955Stony.xie 
148*0d5ec955Stony.xie #define UART_IER		0x04
149*0d5ec955Stony.xie #define UART_FCR		0x08
150*0d5ec955Stony.xie #define UART_LSR		0x14
151*0d5ec955Stony.xie 
152*0d5ec955Stony.xie #define UART_INT_DISABLE	0x00
153*0d5ec955Stony.xie #define UART_FIFO_RESET		0x07
154*0d5ec955Stony.xie 
155*0d5ec955Stony.xie #endif /* __PMU_H__ */
156