xref: /rk3399_ARM-atf/plat/mediatek/drivers/apusys/mt8196/apusys_power.c (revision 0781f7804a6922b3bb40f2b50880a9563e8ccd84)
1*0781f780SKarl Li /*
2*0781f780SKarl Li  * Copyright (c) 2024, MediaTek Inc. All rights reserved.
3*0781f780SKarl Li  *
4*0781f780SKarl Li  * SPDX-License-Identifier: BSD-3-Clause
5*0781f780SKarl Li  */
6*0781f780SKarl Li 
7*0781f780SKarl Li #include <inttypes.h>
8*0781f780SKarl Li 
9*0781f780SKarl Li #define SPMI_ENABLE	(0)
10*0781f780SKarl Li 
11*0781f780SKarl Li #if SPMI_ENABLE
12*0781f780SKarl Li #include <include/drivers/spmi_api.h>
13*0781f780SKarl Li #endif
14*0781f780SKarl Li 
15*0781f780SKarl Li #include <common/debug.h>
16*0781f780SKarl Li #include <drivers/delay_timer.h>
17*0781f780SKarl Li #include <lib/mmio.h>
18*0781f780SKarl Li #include <lib/spinlock.h>
19*0781f780SKarl Li #include <lib/utils_def.h>
20*0781f780SKarl Li #include <lib/xlat_tables/xlat_tables_v2.h>
21*0781f780SKarl Li 
22*0781f780SKarl Li #include "apusys_power.h"
23*0781f780SKarl Li 
24*0781f780SKarl Li static void apu_w_are(int entry, uint32_t reg, uint32_t data)
25*0781f780SKarl Li {
26*0781f780SKarl Li 	uint32_t are_entry_addr;
27*0781f780SKarl Li 
28*0781f780SKarl Li 	are_entry_addr = APUSYS_BASE + APU_ARE + ARE_REG_SIZE * ARE_ENTRY(entry);
29*0781f780SKarl Li 	mmio_write_32(are_entry_addr, reg);
30*0781f780SKarl Li 	mmio_write_32((are_entry_addr + ARE_REG_SIZE), data);
31*0781f780SKarl Li }
32*0781f780SKarl Li 
33*0781f780SKarl Li static void get_pll_pcw(uint32_t clk_rate, uint32_t *r1, uint32_t *r2)
34*0781f780SKarl Li {
35*0781f780SKarl Li 	unsigned int fvco = clk_rate;
36*0781f780SKarl Li 	unsigned int pcw_val;
37*0781f780SKarl Li 	unsigned int postdiv_val = 1;
38*0781f780SKarl Li 	unsigned int postdiv_reg = 0;
39*0781f780SKarl Li 
40*0781f780SKarl Li 	while (fvco <= OUT_CLK_FREQ_MIN) {
41*0781f780SKarl Li 		postdiv_val = postdiv_val << 1;
42*0781f780SKarl Li 		postdiv_reg = postdiv_reg + 1;
43*0781f780SKarl Li 		fvco = fvco << 1;
44*0781f780SKarl Li 	}
45*0781f780SKarl Li 
46*0781f780SKarl Li 	pcw_val = (fvco * (1 << DDS_SHIFT)) / BASIC_CLK_FREQ;
47*0781f780SKarl Li 
48*0781f780SKarl Li 	if (postdiv_reg == 0) {
49*0781f780SKarl Li 		pcw_val = pcw_val * 2;
50*0781f780SKarl Li 		postdiv_val = postdiv_val << 1;
51*0781f780SKarl Li 		postdiv_reg = postdiv_reg + 1;
52*0781f780SKarl Li 	}
53*0781f780SKarl Li 
54*0781f780SKarl Li 	*r1 = postdiv_reg;
55*0781f780SKarl Li 	*r2 = pcw_val;
56*0781f780SKarl Li }
57*0781f780SKarl Li 
58*0781f780SKarl Li static void buck_off_by_pcu(uint32_t ofs, uint32_t shift, uint32_t slv_id)
59*0781f780SKarl Li {
60*0781f780SKarl Li 	uint32_t pmif_id = 0x0;
61*0781f780SKarl Li 	int retry = 10;
62*0781f780SKarl Li 
63*0781f780SKarl Li 	mmio_setbits_32(APUSYS_PCU + APU_PCUTOP_CTRL_SET, PMIC_IRQ_EN);
64*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_PMIC_TAR_BUF1,
65*0781f780SKarl Li 		      (ofs << PMIC_OFF_ADDR_OFF) | BIT(shift));
66*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_PMIC_TAR_BUF2,
67*0781f780SKarl Li 		      (slv_id << PMIC_SLVID_OFF) | (pmif_id << PMIC_PMIFID_OFF) | PCU_BUCK_OFF_CMD);
68*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_PMIC_CMD, PMIC_CMD_EN);
69*0781f780SKarl Li 
70*0781f780SKarl Li 	while ((mmio_read_32(APUSYS_PCU + APU_PCU_PMIC_IRQ) & PMIC_CMD_IRQ) == 0) {
71*0781f780SKarl Li 		udelay(10);
72*0781f780SKarl Li 		if (--retry < 0)
73*0781f780SKarl Li 			ERROR("%s wait APU_PCU_PMIC_IRQ timeout !\n", __func__);
74*0781f780SKarl Li 	}
75*0781f780SKarl Li 
76*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_PMIC_IRQ, PMIC_CMD_IRQ);
77*0781f780SKarl Li }
78*0781f780SKarl Li 
79*0781f780SKarl Li static void apu_buck_off_cfg(void)
80*0781f780SKarl Li {
81*0781f780SKarl Li 	mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(10));
82*0781f780SKarl Li 	mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(9));
83*0781f780SKarl Li 	mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(12));
84*0781f780SKarl Li 	mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(14));
85*0781f780SKarl Li 
86*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(10));
87*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(9));
88*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(12));
89*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(14));
90*0781f780SKarl Li 	udelay(1);
91*0781f780SKarl Li 
92*0781f780SKarl Li 	mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, BUCK_PROT_REQ_SET);
93*0781f780SKarl Li 	udelay(1);
94*0781f780SKarl Li 
95*0781f780SKarl Li 	mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, SRAM_AOC_LHENB_SET);
96*0781f780SKarl Li 	udelay(1);
97*0781f780SKarl Li 
98*0781f780SKarl Li 	mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, SRAM_AOC_ISO_SET);
99*0781f780SKarl Li 	udelay(1);
100*0781f780SKarl Li 
101*0781f780SKarl Li 	mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, PLL_AOC_ISO_EN_SET);
102*0781f780SKarl Li 	udelay(1);
103*0781f780SKarl Li 
104*0781f780SKarl Li 	mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, BUCK_ELS_EN_SET);
105*0781f780SKarl Li 	udelay(1);
106*0781f780SKarl Li 
107*0781f780SKarl Li 	mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, BUCK_AO_RST_B_CLR);
108*0781f780SKarl Li 	udelay(1);
109*0781f780SKarl Li 
110*0781f780SKarl Li 	buck_off_by_pcu(BUCK_VAPU_PMIC_REG_EN_CLR_ADDR, BUCK_VAPU_PMIC_REG_EN_SHIFT,
111*0781f780SKarl Li 			BUCK_VAPU_PMIC_ID);
112*0781f780SKarl Li 
113*0781f780SKarl Li 	mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(6));
114*0781f780SKarl Li 	udelay(1);
115*0781f780SKarl Li 	mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(7));
116*0781f780SKarl Li 	udelay(1);
117*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(6));
118*0781f780SKarl Li 	udelay(1);
119*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(7));
120*0781f780SKarl Li 	udelay(1);
121*0781f780SKarl Li }
122*0781f780SKarl Li 
123*0781f780SKarl Li static void apu_acc_init(void)
124*0781f780SKarl Li {
125*0781f780SKarl Li 	uint32_t top_acc_base_arr[] = {MNOC_ACC_BASE, UP_ACC_BASE};
126*0781f780SKarl Li 	uint32_t eng_acc_base_arr[] = {MVPU_ACC_BASE, MDLA_ACC_BASE};
127*0781f780SKarl Li 	int acc_idx;
128*0781f780SKarl Li 	int are_idx = ACC_ENTRY_BEGIN;
129*0781f780SKarl Li 	uint32_t base_reg;
130*0781f780SKarl Li 
131*0781f780SKarl Li 	for (acc_idx = 0 ; acc_idx < ARRAY_SIZE(top_acc_base_arr) ; acc_idx++) {
132*0781f780SKarl Li 		base_reg = APUSYS_ACC + top_acc_base_arr[acc_idx];
133*0781f780SKarl Li #if CFG_APU_ARDCM_ENABLE
134*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL1, APU_ARDCM_CTRL1_VAL_0);
135*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL0, APU_ARDCM_CTRL0_VAL_0);
136*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL1, APU_ARDCM_CTRL1_VAL_1);
137*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL0, APU_ARDCM_CTRL0_VAL_1);
138*0781f780SKarl Li #endif
139*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ACC_CONFG_CLR0, CGEN_SOC);
140*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ACC_CONFG_SET0, HW_CTRL_EN);
141*0781f780SKarl Li 	}
142*0781f780SKarl Li 
143*0781f780SKarl Li 	for (acc_idx = 0 ; acc_idx < ARRAY_SIZE(eng_acc_base_arr) ; acc_idx++) {
144*0781f780SKarl Li 		base_reg = APUSYS_ACC + eng_acc_base_arr[acc_idx];
145*0781f780SKarl Li #if CFG_APU_ARDCM_ENABLE
146*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL1, APU_ARDCM_CTRL1_VAL_0);
147*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL0, APU_ARDCM_CTRL0_VAL_0);
148*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL1, APU_ARDCM_CTRL1_VAL_1);
149*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL0, APU_ARDCM_CTRL0_VAL_1);
150*0781f780SKarl Li #endif
151*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ACC_CONFG_CLR0, CGEN_SOC);
152*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ACC_CONFG_SET0, HW_CTRL_EN);
153*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + APU_ACC_AUTO_CTRL_SET0, CLK_REQ_SW_EN);
154*0781f780SKarl Li 	}
155*0781f780SKarl Li }
156*0781f780SKarl Li 
157*0781f780SKarl Li static void apu_pll_init(void)
158*0781f780SKarl Li {
159*0781f780SKarl Li 	uint32_t pll_base_arr[] = {MNOC_PLL_BASE, UP_PLL_BASE, MVPU_PLL_BASE, MDLA_PLL_BASE};
160*0781f780SKarl Li 	int32_t pll_freq_out[] = {
161*0781f780SKarl Li 		APUPLL0_DEFAULT_FREQ,
162*0781f780SKarl Li 		APUPLL1_DEFAULT_FREQ,
163*0781f780SKarl Li 		APUPLL2_DEFAULT_FREQ,
164*0781f780SKarl Li 		APUPLL3_DEFAULT_FREQ
165*0781f780SKarl Li 	};
166*0781f780SKarl Li 	uint32_t pcw_val, posdiv_val;
167*0781f780SKarl Li 	int pll_idx, are_idx;
168*0781f780SKarl Li 	uint32_t base_reg;
169*0781f780SKarl Li 
170*0781f780SKarl Li 	mmio_setbits_32(APUSYS_BASE + APU_ARE, ARE_RCX_AO_EN);
171*0781f780SKarl Li 	mmio_setbits_32(APUSYS_BASE + APU_ARE_REG, ARE_RCX_AO_EN);
172*0781f780SKarl Li 
173*0781f780SKarl Li 	mmio_write_32(APUSYS_BASE + APU_ARE + ARE_RCX_AO_CONFIG, ARE_ENTRY(RCX_AO_BEGIN) |
174*0781f780SKarl Li 		      (ARE_ENTRIES(RCX_AO_BEGIN, RCX_AO_END) << ARE_RCX_AO_CONFIG_HIGH_OFF));
175*0781f780SKarl Li 
176*0781f780SKarl Li 	are_idx = PLL_ENTRY_BEGIN;
177*0781f780SKarl Li 	for (pll_idx = 0 ; pll_idx < ARRAY_SIZE(pll_base_arr) ; pll_idx++) {
178*0781f780SKarl Li 		base_reg = APUSYS_PLL + pll_base_arr[pll_idx];
179*0781f780SKarl Li 
180*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + RG_PLLGP_LVR_REFSEL, RG_PLLGP_LVR_REFSEL_VAL);
181*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL_HP_EN, FHCTL_CTRL);
182*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL_RST_CON, FHCTL_NO_RESET);
183*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL_CLK_CON, FHCTL_CLKEN);
184*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL0_CFG,
185*0781f780SKarl Li 			  FHCTL_HOPPING_EN | FHCTL_SFSTR0_EN);
186*0781f780SKarl Li 
187*0781f780SKarl Li 		posdiv_val = 0;
188*0781f780SKarl Li 		pcw_val = 0;
189*0781f780SKarl Li 		get_pll_pcw(pll_freq_out[pll_idx], &posdiv_val, &pcw_val);
190*0781f780SKarl Li 
191*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + PLL1C_PLL1_CON1,
192*0781f780SKarl Li 			  ((0x1U << RG_PLL_SDM_PCW_CHG_OFF) |
193*0781f780SKarl Li 			   (posdiv_val << RG_PLL_POSDIV_OFF) | pcw_val));
194*0781f780SKarl Li 
195*0781f780SKarl Li 		apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL0_DDS,
196*0781f780SKarl Li 			  ((0x1U << FHCTL0_PLL_TGL_ORG) | pcw_val));
197*0781f780SKarl Li 	}
198*0781f780SKarl Li }
199*0781f780SKarl Li 
200*0781f780SKarl Li static void apu_are_init(void)
201*0781f780SKarl Li {
202*0781f780SKarl Li 	int entry = 0;
203*0781f780SKarl Li 
204*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_BASE + APU_ARE, 0xFFFU << ARE_VCORE_OFF);
205*0781f780SKarl Li 
206*0781f780SKarl Li 	mmio_setbits_32(APUSYS_BASE + APU_ARE, ARE_VCORE_EN);
207*0781f780SKarl Li 	mmio_setbits_32(APUSYS_BASE + APU_ARE_REG, ARE_VCORE_EN);
208*0781f780SKarl Li 
209*0781f780SKarl Li 	for (entry = ARE_CONF_START; entry < ARE_CONF_END; entry += 4)
210*0781f780SKarl Li 		mmio_write_32(APUSYS_BASE + APU_ARE + entry, 0);
211*0781f780SKarl Li }
212*0781f780SKarl Li 
213*0781f780SKarl Li static void apu_rpclite_init(void)
214*0781f780SKarl Li {
215*0781f780SKarl Li 	uint32_t sleep_type_offset[] = {
216*0781f780SKarl Li 		APU_RPC_SW_TYPE1_OFF,
217*0781f780SKarl Li 		APU_RPC_SW_TYPE2_OFF,
218*0781f780SKarl Li 		APU_RPC_SW_TYPE3_OFF,
219*0781f780SKarl Li 		APU_RPC_SW_TYPE4_OFF
220*0781f780SKarl Li 	};
221*0781f780SKarl Li 	uint32_t rpc_lite_base[] = {
222*0781f780SKarl Li 		APU_ACX0_RPC_LITE,
223*0781f780SKarl Li 		APU_ACX1_RPC_LITE,
224*0781f780SKarl Li 		APU_ACX2_RPC_LITE,
225*0781f780SKarl Li 	};
226*0781f780SKarl Li 	int ofs_idx, rpc_lite_idx;
227*0781f780SKarl Li 	uint32_t base;
228*0781f780SKarl Li 
229*0781f780SKarl Li 	for (rpc_lite_idx = 0; rpc_lite_idx < ARRAY_SIZE(rpc_lite_base); rpc_lite_idx++) {
230*0781f780SKarl Li 		base = APUSYS_BASE + rpc_lite_base[rpc_lite_idx];
231*0781f780SKarl Li 		for (ofs_idx = 0; ofs_idx < ARRAY_SIZE(sleep_type_offset); ofs_idx++)
232*0781f780SKarl Li 			mmio_clrbits_32(base + sleep_type_offset[ofs_idx],
233*0781f780SKarl Li 					SW_TYPE_MVPU_MDLA_RV);
234*0781f780SKarl Li 		mmio_setbits_32(base + APU_RPC_TOP_SEL, TOP_SEL_VAL);
235*0781f780SKarl Li 	}
236*0781f780SKarl Li }
237*0781f780SKarl Li 
238*0781f780SKarl Li static void apu_rpc_mdla_init(void)
239*0781f780SKarl Li {
240*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_BASE + APU_RPCTOP_MDLA + APU_RPC_SW_TYPE0_OFF, SW_TYPE_MVPU_MDLA_RV);
241*0781f780SKarl Li }
242*0781f780SKarl Li 
243*0781f780SKarl Li static void apu_rpc_init(void)
244*0781f780SKarl Li {
245*0781f780SKarl Li 	mmio_write_32(APUSYS_RPC + APU_RPC_SW_TYPE0_OFF, RPC_TYPE_INIT_VAL);
246*0781f780SKarl Li 	mmio_setbits_32(APUSYS_RPC + APU_RPC_TOP_SEL, RPC_TOP_SEL_VAL);
247*0781f780SKarl Li 
248*0781f780SKarl Li #if !CFG_CTL_RPC_BY_CE
249*0781f780SKarl Li 	mmio_clrbits_32(APUSYS_RPC + APU_RPC_TOP_SEL, CE_ENABLE);
250*0781f780SKarl Li #endif
251*0781f780SKarl Li 
252*0781f780SKarl Li 	mmio_setbits_32(APUSYS_RPC + APU_RPC_TOP_SEL_1, BUCK_PROT_SEL);
253*0781f780SKarl Li }
254*0781f780SKarl Li 
255*0781f780SKarl Li static int apu_pcu_init(void)
256*0781f780SKarl Li {
257*0781f780SKarl Li 	uint32_t pmif_id = 0x0;
258*0781f780SKarl Li 	uint32_t slave_id = BUCK_VAPU_PMIC_ID;
259*0781f780SKarl Li 	uint32_t en_set_offset = BUCK_VAPU_PMIC_REG_EN_SET_ADDR;
260*0781f780SKarl Li 	uint32_t en_clr_offset = BUCK_VAPU_PMIC_REG_EN_CLR_ADDR;
261*0781f780SKarl Li 	uint32_t en_shift = BUCK_VAPU_PMIC_REG_EN_SHIFT;
262*0781f780SKarl Li #if SPMI_ENABLE
263*0781f780SKarl Li 	struct spmi_device *vsram_sdev;
264*0781f780SKarl Li #endif
265*0781f780SKarl Li 	unsigned char vsram = 0;
266*0781f780SKarl Li 
267*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCUTOP_CTRL_SET, AUTO_BUCK_EN);
268*0781f780SKarl Li 
269*0781f780SKarl Li 	mmio_write_32((APUSYS_PCU + APU_PCU_BUCK_STEP_SEL), BUCK_STEP_SEL_VAL);
270*0781f780SKarl Li 
271*0781f780SKarl Li #if SPMI_ENABLE
272*0781f780SKarl Li 	vsram_sdev = get_spmi_device(SPMI_MASTER_1, SPMI_SLAVE_4);
273*0781f780SKarl Li 	if (!vsram_sdev) {
274*0781f780SKarl Li 		ERROR("[APUPW] VSRAM BUCK4 get device fail\n");
275*0781f780SKarl Li 		return -1;
276*0781f780SKarl Li 	}
277*0781f780SKarl Li 
278*0781f780SKarl Li 	if (spmi_ext_register_readl(vsram_sdev, MT6363_RG_BUCK_VBUCK4_VOSEL_ADDR, &vsram, 1)) {
279*0781f780SKarl Li 		ERROR("[APUPW] VSRAM BUCK4 read fail\n");
280*0781f780SKarl Li 		return -1;
281*0781f780SKarl Li 	}
282*0781f780SKarl Li #endif
283*0781f780SKarl Li 
284*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_DAT0_L,
285*0781f780SKarl Li 		      (BUCK_VAPU_PMIC_REG_VOSEL_ADDR << PMIC_OFF_ADDR_OFF) | vsram);
286*0781f780SKarl Li 
287*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_DAT0_H,
288*0781f780SKarl Li 		      (slave_id << PMIC_SLVID_OFF) | (pmif_id << PMIC_PMIFID_OFF) | PCU_CMD_OP_W);
289*0781f780SKarl Li 
290*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_DAT1_L,
291*0781f780SKarl Li 		      (en_set_offset << PMIC_OFF_ADDR_OFF) | (0x1U << en_shift));
292*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_DAT1_H,
293*0781f780SKarl Li 		      (slave_id << PMIC_SLVID_OFF) | (pmif_id << PMIC_PMIFID_OFF) | PCU_CMD_OP_W);
294*0781f780SKarl Li 
295*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_OFF_DAT0_L,
296*0781f780SKarl Li 		      (en_clr_offset << PMIC_OFF_ADDR_OFF) | (0x1U << en_shift));
297*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_OFF_DAT0_H,
298*0781f780SKarl Li 		      (slave_id << PMIC_SLVID_OFF) | (pmif_id << PMIC_PMIFID_OFF) | PCU_CMD_OP_W);
299*0781f780SKarl Li 
300*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_SLE0, 0);
301*0781f780SKarl Li 	mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_SLE1, VAPU_BUCK_ON_SETTLE_TIME);
302*0781f780SKarl Li 
303*0781f780SKarl Li 	return 0;
304*0781f780SKarl Li }
305*0781f780SKarl Li 
306*0781f780SKarl Li static void apu_aoc_init(void)
307*0781f780SKarl Li {
308*0781f780SKarl Li 	uint32_t reg;
309*0781f780SKarl Li 
310*0781f780SKarl Li 	mmio_setbits_32(SPM_BASE + 0xF6C, BIT(4));
311*0781f780SKarl Li 	mmio_clrbits_32(SPM_BASE + 0x414, BIT(1));
312*0781f780SKarl Li 
313*0781f780SKarl Li 	mmio_write_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CONFIG, APUSYS_AO_SRAM_EN);
314*0781f780SKarl Li 	udelay(1);
315*0781f780SKarl Li 
316*0781f780SKarl Li 	reg = APUSYS_AO_CTL + APUSYS_AO_SRAM_SET;
317*0781f780SKarl Li 
318*0781f780SKarl Li #if !CFG_CTL_RPC_BY_CE
319*0781f780SKarl Li 	mmio_setbits_32(reg, BIT(8));
320*0781f780SKarl Li 	udelay(1);
321*0781f780SKarl Li 	mmio_setbits_32(reg, BIT(11));
322*0781f780SKarl Li 	udelay(1);
323*0781f780SKarl Li 	mmio_setbits_32(reg, BIT(13));
324*0781f780SKarl Li 	udelay(1);
325*0781f780SKarl Li 
326*0781f780SKarl Li 	mmio_clrbits_32(reg, BIT(8));
327*0781f780SKarl Li 	udelay(1);
328*0781f780SKarl Li 	mmio_clrbits_32(reg, BIT(11));
329*0781f780SKarl Li 	udelay(1);
330*0781f780SKarl Li 	mmio_clrbits_32(reg, BIT(13));
331*0781f780SKarl Li #else
332*0781f780SKarl Li 	mmio_setbits_32(reg, BIT(9));
333*0781f780SKarl Li 	mmio_setbits_32(reg, BIT(12));
334*0781f780SKarl Li 	mmio_setbits_32(reg, BIT(14));
335*0781f780SKarl Li 
336*0781f780SKarl Li 	mmio_clrbits_32(reg, BIT(9));
337*0781f780SKarl Li 	mmio_clrbits_32(reg, BIT(12));
338*0781f780SKarl Li 	mmio_clrbits_32(reg, BIT(14));
339*0781f780SKarl Li 	udelay(1);
340*0781f780SKarl Li #endif
341*0781f780SKarl Li 
342*0781f780SKarl Li 	reg = APUSYS_RPC + APU_RPC_HW_CON;
343*0781f780SKarl Li 
344*0781f780SKarl Li 	mmio_write_32(reg, BUCK_ELS_EN_CLR);
345*0781f780SKarl Li 	udelay(1);
346*0781f780SKarl Li 
347*0781f780SKarl Li 	mmio_write_32(reg, BUCK_AO_RST_B_SET);
348*0781f780SKarl Li 	udelay(1);
349*0781f780SKarl Li 
350*0781f780SKarl Li 	mmio_write_32(reg, BUCK_PROT_REQ_CLR);
351*0781f780SKarl Li 	udelay(1);
352*0781f780SKarl Li 
353*0781f780SKarl Li 	mmio_write_32(reg, SRAM_AOC_ISO_CLR);
354*0781f780SKarl Li 	udelay(1);
355*0781f780SKarl Li 
356*0781f780SKarl Li 	mmio_write_32(reg, PLL_AOC_ISO_EN_CLR);
357*0781f780SKarl Li 	udelay(1);
358*0781f780SKarl Li }
359*0781f780SKarl Li 
360*0781f780SKarl Li static int init_hw_setting(void)
361*0781f780SKarl Li {
362*0781f780SKarl Li 	int ret;
363*0781f780SKarl Li 
364*0781f780SKarl Li 	apu_aoc_init();
365*0781f780SKarl Li 	ret = apu_pcu_init();
366*0781f780SKarl Li 	apu_rpc_init();
367*0781f780SKarl Li 	apu_rpc_mdla_init();
368*0781f780SKarl Li 	apu_rpclite_init();
369*0781f780SKarl Li 	apu_are_init();
370*0781f780SKarl Li 	apu_pll_init();
371*0781f780SKarl Li 	apu_acc_init();
372*0781f780SKarl Li 	apu_buck_off_cfg();
373*0781f780SKarl Li 
374*0781f780SKarl Li 	return ret;
375*0781f780SKarl Li }
376*0781f780SKarl Li 
377*0781f780SKarl Li int apusys_power_init(void)
378*0781f780SKarl Li {
379*0781f780SKarl Li 	int ret;
380*0781f780SKarl Li 
381*0781f780SKarl Li 	ret = init_hw_setting();
382*0781f780SKarl Li 	if (ret != 0)
383*0781f780SKarl Li 		ERROR("%s init HW failed\n", __func__);
384*0781f780SKarl Li 	else
385*0781f780SKarl Li 		INFO("%s init HW done\n", __func__);
386*0781f780SKarl Li 
387*0781f780SKarl Li 	mmio_write_32(APU_ACE_HW_FLAG_DIS, APU_ACE_DIS_FLAG_VAL);
388*0781f780SKarl Li 
389*0781f780SKarl Li 	return ret;
390*0781f780SKarl Li }
391