xref: /rk3399_ARM-atf/plat/rockchip/rk3328/drivers/pmu/pmu.h (revision c3e70be1c1ad2a9d1d3aee187231f5088a880ae1)
10d5ec955Stony.xie /*
20d5ec955Stony.xie  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
30d5ec955Stony.xie  *
4*c3e70be1Sdp-arm  * SPDX-License-Identifier: BSD-3-Clause
50d5ec955Stony.xie  */
60d5ec955Stony.xie 
70d5ec955Stony.xie #ifndef __PMU_H__
80d5ec955Stony.xie #define __PMU_H__
90d5ec955Stony.xie 
100d5ec955Stony.xie #include <soc.h>
110d5ec955Stony.xie 
120d5ec955Stony.xie struct rk3328_sleep_ddr_data {
130d5ec955Stony.xie 	uint32_t pmu_debug_enable;
140d5ec955Stony.xie 	uint32_t debug_iomux_save;
150d5ec955Stony.xie 	uint32_t pmic_sleep_save;
160d5ec955Stony.xie 	uint32_t pmu_wakeup_conf0;
170d5ec955Stony.xie 	uint32_t pmu_pwrmd_com;
180d5ec955Stony.xie 	uint32_t cru_mode_save;
190d5ec955Stony.xie 	uint32_t clk_sel0, clk_sel1, clk_sel18,
200d5ec955Stony.xie 		 clk_sel20, clk_sel24, clk_sel38;
210d5ec955Stony.xie 	uint32_t clk_ungt_save[CRU_CLKGATE_NUMS];
220d5ec955Stony.xie 	uint32_t cru_plls_con_save[MAX_PLL][CRU_PLL_CON_NUMS];
230d5ec955Stony.xie };
240d5ec955Stony.xie 
250d5ec955Stony.xie struct rk3328_sleep_sram_data {
260d5ec955Stony.xie 	uint32_t pmic_sleep_save;
270d5ec955Stony.xie 	uint32_t pmic_sleep_gpio_save[2];
280d5ec955Stony.xie 	uint32_t ddr_grf_con0;
290d5ec955Stony.xie 	uint32_t dpll_con_save[CRU_PLL_CON_NUMS];
300d5ec955Stony.xie 	uint32_t pd_sr_idle_save;
310d5ec955Stony.xie 	uint32_t uart2_ier;
320d5ec955Stony.xie };
330d5ec955Stony.xie 
340d5ec955Stony.xie /*****************************************************************************
350d5ec955Stony.xie  * The ways of cores power domain contorlling
360d5ec955Stony.xie  *****************************************************************************/
370d5ec955Stony.xie enum cores_pm_ctr_mode {
380d5ec955Stony.xie 	core_pwr_pd = 0,
390d5ec955Stony.xie 	core_pwr_wfi = 1,
400d5ec955Stony.xie 	core_pwr_wfi_int = 2
410d5ec955Stony.xie };
420d5ec955Stony.xie 
430d5ec955Stony.xie enum pmu_cores_pm_by_wfi {
440d5ec955Stony.xie 	core_pm_en = 0,
450d5ec955Stony.xie 	core_pm_int_wakeup_en,
460d5ec955Stony.xie 	core_pm_dis_int,
470d5ec955Stony.xie 	core_pm_sft_wakeup_en
480d5ec955Stony.xie };
490d5ec955Stony.xie 
500d5ec955Stony.xie extern void *pmu_cpuson_entrypoint_start;
510d5ec955Stony.xie extern void *pmu_cpuson_entrypoint_end;
520d5ec955Stony.xie extern uint64_t cpuson_entry_point[PLATFORM_CORE_COUNT];
530d5ec955Stony.xie extern uint32_t cpuson_flags[PLATFORM_CORE_COUNT];
540d5ec955Stony.xie 
550d5ec955Stony.xie #define CORES_PM_DISABLE	0x0
560d5ec955Stony.xie 
570d5ec955Stony.xie /*****************************************************************************
580d5ec955Stony.xie  * pmu con,reg
590d5ec955Stony.xie  *****************************************************************************/
600d5ec955Stony.xie #define PMU_WAKEUP_CFG0		0x00
610d5ec955Stony.xie #define PMU_PWRDN_CON		0x0c
620d5ec955Stony.xie #define PMU_PWRDN_ST		0x10
630d5ec955Stony.xie #define PMU_PWRMD_COM		0x18
640d5ec955Stony.xie #define PMU_SFT_CON		0x1c
650d5ec955Stony.xie #define PMU_INT_CON		0x20
660d5ec955Stony.xie #define PMU_INT_ST		0x24
670d5ec955Stony.xie #define PMU_POWER_ST		0x44
680d5ec955Stony.xie #define PMU_CPUAPM_CON(n)	(0x80 + (n) * 4)
690d5ec955Stony.xie #define PMU_SYS_REG(n)		(0xa0 + (n) * 4)
700d5ec955Stony.xie 
710d5ec955Stony.xie #define CHECK_CPU_WFIE_BASE		(GRF_BASE + GRF_CPU_STATUS(1))
720d5ec955Stony.xie 
730d5ec955Stony.xie enum pmu_core_pwrst_shift {
740d5ec955Stony.xie 	clst_cpu_wfe = 0,
750d5ec955Stony.xie 	clst_cpu_wfi = 4,
760d5ec955Stony.xie };
770d5ec955Stony.xie 
780d5ec955Stony.xie #define clstl_cpu_wfe (clst_cpu_wfe)
790d5ec955Stony.xie #define clstb_cpu_wfe (clst_cpu_wfe)
800d5ec955Stony.xie 
810d5ec955Stony.xie enum pmu_pd_id {
820d5ec955Stony.xie 	PD_CPU0 = 0,
830d5ec955Stony.xie 	PD_CPU1,
840d5ec955Stony.xie 	PD_CPU2,
850d5ec955Stony.xie 	PD_CPU3,
860d5ec955Stony.xie };
870d5ec955Stony.xie 
880d5ec955Stony.xie enum pmu_power_mode_common {
890d5ec955Stony.xie 	pmu_mode_en = 0,
900d5ec955Stony.xie 	sref_enter_en,
910d5ec955Stony.xie 	global_int_disable_cfg,
920d5ec955Stony.xie 	cpu0_pd_en,
930d5ec955Stony.xie 	wait_wakeup_begin_cfg = 4,
940d5ec955Stony.xie 	l2_flush_en,
950d5ec955Stony.xie 	l2_idle_en,
960d5ec955Stony.xie 	ddrio_ret_de_req,
970d5ec955Stony.xie 	ddrio_ret_en = 8,
980d5ec955Stony.xie };
990d5ec955Stony.xie 
1000d5ec955Stony.xie enum pmu_sft_con {
1010d5ec955Stony.xie 	upctl_c_sysreq_cfg = 0,
1020d5ec955Stony.xie 	l2flushreq_req,
1030d5ec955Stony.xie 	ddr_io_ret_cfg,
1040d5ec955Stony.xie 	pmu_sft_ret_cfg,
1050d5ec955Stony.xie };
1060d5ec955Stony.xie 
1070d5ec955Stony.xie #define CKECK_WFE_MSK		0x1
1080d5ec955Stony.xie #define CKECK_WFI_MSK		0x10
1090d5ec955Stony.xie #define CKECK_WFEI_MSK		0x11
1100d5ec955Stony.xie 
1110d5ec955Stony.xie #define PD_CTR_LOOP		500
1120d5ec955Stony.xie #define CHK_CPU_LOOP		500
1130d5ec955Stony.xie #define MAX_WAIT_CONUT		1000
1140d5ec955Stony.xie 
1150d5ec955Stony.xie #define WAKEUP_INT_CLUSTER_EN	0x1
1160d5ec955Stony.xie #define PMIC_SLEEP_REG		0x34
1170d5ec955Stony.xie 
1180d5ec955Stony.xie #define PLL_IS_NORM_MODE(mode, pll_id)	\
1190d5ec955Stony.xie 		((mode & (PLL_NORM_MODE(pll_id)) & 0xffff) != 0)
1200d5ec955Stony.xie 
1210d5ec955Stony.xie #define CTLR_ENABLE_G1_BIT	BIT(1)
1220d5ec955Stony.xie #define UART_FIFO_EMPTY		BIT(6)
1230d5ec955Stony.xie 
1240d5ec955Stony.xie #define UART_IER		0x04
1250d5ec955Stony.xie #define UART_FCR		0x08
1260d5ec955Stony.xie #define UART_LSR		0x14
1270d5ec955Stony.xie 
1280d5ec955Stony.xie #define UART_INT_DISABLE	0x00
1290d5ec955Stony.xie #define UART_FIFO_RESET		0x07
1300d5ec955Stony.xie 
1310d5ec955Stony.xie #endif /* __PMU_H__ */
132