10781f780SKarl Li /*
2*823a57e1SKarl Li * Copyright (c) 2024-2025, MediaTek Inc. All rights reserved.
30781f780SKarl Li *
40781f780SKarl Li * SPDX-License-Identifier: BSD-3-Clause
50781f780SKarl Li */
60781f780SKarl Li
70781f780SKarl Li #include <inttypes.h>
80781f780SKarl Li
90781f780SKarl Li #include <include/drivers/spmi_api.h>
100781f780SKarl Li
110781f780SKarl Li #include <common/debug.h>
120781f780SKarl Li #include <drivers/delay_timer.h>
130781f780SKarl Li #include <lib/mmio.h>
140781f780SKarl Li #include <lib/spinlock.h>
150781f780SKarl Li #include <lib/utils_def.h>
160781f780SKarl Li #include <lib/xlat_tables/xlat_tables_v2.h>
170781f780SKarl Li
180781f780SKarl Li #include "apusys_power.h"
190781f780SKarl Li
apu_w_are(int entry,uint32_t reg,uint32_t data)200781f780SKarl Li static void apu_w_are(int entry, uint32_t reg, uint32_t data)
210781f780SKarl Li {
220781f780SKarl Li uint32_t are_entry_addr;
230781f780SKarl Li
240781f780SKarl Li are_entry_addr = APUSYS_BASE + APU_ARE + ARE_REG_SIZE * ARE_ENTRY(entry);
250781f780SKarl Li mmio_write_32(are_entry_addr, reg);
260781f780SKarl Li mmio_write_32((are_entry_addr + ARE_REG_SIZE), data);
270781f780SKarl Li }
280781f780SKarl Li
get_pll_pcw(uint32_t clk_rate,uint32_t * r1,uint32_t * r2)290781f780SKarl Li static void get_pll_pcw(uint32_t clk_rate, uint32_t *r1, uint32_t *r2)
300781f780SKarl Li {
310781f780SKarl Li unsigned int fvco = clk_rate;
320781f780SKarl Li unsigned int pcw_val;
330781f780SKarl Li unsigned int postdiv_val = 1;
340781f780SKarl Li unsigned int postdiv_reg = 0;
350781f780SKarl Li
360781f780SKarl Li while (fvco <= OUT_CLK_FREQ_MIN) {
370781f780SKarl Li postdiv_val = postdiv_val << 1;
380781f780SKarl Li postdiv_reg = postdiv_reg + 1;
390781f780SKarl Li fvco = fvco << 1;
400781f780SKarl Li }
410781f780SKarl Li
420781f780SKarl Li pcw_val = (fvco * (1 << DDS_SHIFT)) / BASIC_CLK_FREQ;
430781f780SKarl Li
440781f780SKarl Li if (postdiv_reg == 0) {
450781f780SKarl Li pcw_val = pcw_val * 2;
460781f780SKarl Li postdiv_val = postdiv_val << 1;
470781f780SKarl Li postdiv_reg = postdiv_reg + 1;
480781f780SKarl Li }
490781f780SKarl Li
500781f780SKarl Li *r1 = postdiv_reg;
510781f780SKarl Li *r2 = pcw_val;
520781f780SKarl Li }
530781f780SKarl Li
buck_off_by_pcu(uint32_t ofs,uint32_t shift,uint32_t slv_id)540781f780SKarl Li static void buck_off_by_pcu(uint32_t ofs, uint32_t shift, uint32_t slv_id)
550781f780SKarl Li {
560781f780SKarl Li uint32_t pmif_id = 0x0;
570781f780SKarl Li int retry = 10;
580781f780SKarl Li
590781f780SKarl Li mmio_setbits_32(APUSYS_PCU + APU_PCUTOP_CTRL_SET, PMIC_IRQ_EN);
600781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_PMIC_TAR_BUF1,
610781f780SKarl Li (ofs << PMIC_OFF_ADDR_OFF) | BIT(shift));
620781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_PMIC_TAR_BUF2,
630781f780SKarl Li (slv_id << PMIC_SLVID_OFF) | (pmif_id << PMIC_PMIFID_OFF) | PCU_BUCK_OFF_CMD);
640781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_PMIC_CMD, PMIC_CMD_EN);
650781f780SKarl Li
660781f780SKarl Li while ((mmio_read_32(APUSYS_PCU + APU_PCU_PMIC_IRQ) & PMIC_CMD_IRQ) == 0) {
670781f780SKarl Li udelay(10);
680781f780SKarl Li if (--retry < 0)
690781f780SKarl Li ERROR("%s wait APU_PCU_PMIC_IRQ timeout !\n", __func__);
700781f780SKarl Li }
710781f780SKarl Li
720781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_PMIC_IRQ, PMIC_CMD_IRQ);
730781f780SKarl Li }
740781f780SKarl Li
apu_buck_off_cfg(void)750781f780SKarl Li static void apu_buck_off_cfg(void)
760781f780SKarl Li {
770781f780SKarl Li mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(10));
780781f780SKarl Li mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(9));
790781f780SKarl Li mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(12));
800781f780SKarl Li mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(14));
810781f780SKarl Li
820781f780SKarl Li mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(10));
830781f780SKarl Li mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(9));
840781f780SKarl Li mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(12));
850781f780SKarl Li mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CLR, BIT(14));
860781f780SKarl Li udelay(1);
870781f780SKarl Li
880781f780SKarl Li mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, BUCK_PROT_REQ_SET);
890781f780SKarl Li udelay(1);
900781f780SKarl Li
910781f780SKarl Li mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, SRAM_AOC_LHENB_SET);
920781f780SKarl Li udelay(1);
930781f780SKarl Li
940781f780SKarl Li mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, SRAM_AOC_ISO_SET);
950781f780SKarl Li udelay(1);
960781f780SKarl Li
970781f780SKarl Li mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, PLL_AOC_ISO_EN_SET);
980781f780SKarl Li udelay(1);
990781f780SKarl Li
1000781f780SKarl Li mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, BUCK_ELS_EN_SET);
1010781f780SKarl Li udelay(1);
1020781f780SKarl Li
1030781f780SKarl Li mmio_write_32(APUSYS_RPC + APU_RPC_HW_CON, BUCK_AO_RST_B_CLR);
1040781f780SKarl Li udelay(1);
1050781f780SKarl Li
1060781f780SKarl Li buck_off_by_pcu(BUCK_VAPU_PMIC_REG_EN_CLR_ADDR, BUCK_VAPU_PMIC_REG_EN_SHIFT,
1070781f780SKarl Li BUCK_VAPU_PMIC_ID);
1080781f780SKarl Li
1090781f780SKarl Li mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(6));
1100781f780SKarl Li udelay(1);
1110781f780SKarl Li mmio_setbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(7));
1120781f780SKarl Li udelay(1);
1130781f780SKarl Li mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(6));
1140781f780SKarl Li udelay(1);
1150781f780SKarl Li mmio_clrbits_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_SET, BIT(7));
1160781f780SKarl Li udelay(1);
1170781f780SKarl Li }
1180781f780SKarl Li
apu_acc_init(void)1190781f780SKarl Li static void apu_acc_init(void)
1200781f780SKarl Li {
1210781f780SKarl Li uint32_t top_acc_base_arr[] = {MNOC_ACC_BASE, UP_ACC_BASE};
1220781f780SKarl Li uint32_t eng_acc_base_arr[] = {MVPU_ACC_BASE, MDLA_ACC_BASE};
1230781f780SKarl Li int acc_idx;
1240781f780SKarl Li int are_idx = ACC_ENTRY_BEGIN;
1250781f780SKarl Li uint32_t base_reg;
1260781f780SKarl Li
1270781f780SKarl Li for (acc_idx = 0 ; acc_idx < ARRAY_SIZE(top_acc_base_arr) ; acc_idx++) {
1280781f780SKarl Li base_reg = APUSYS_ACC + top_acc_base_arr[acc_idx];
1290781f780SKarl Li #if CFG_APU_ARDCM_ENABLE
1300781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL1, APU_ARDCM_CTRL1_VAL_0);
1310781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL0, APU_ARDCM_CTRL0_VAL_0);
1320781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL1, APU_ARDCM_CTRL1_VAL_1);
1330781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL0, APU_ARDCM_CTRL0_VAL_1);
1340781f780SKarl Li #endif
1350781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ACC_CONFG_CLR0, CGEN_SOC);
1360781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ACC_CONFG_SET0, HW_CTRL_EN);
1370781f780SKarl Li }
1380781f780SKarl Li
1390781f780SKarl Li for (acc_idx = 0 ; acc_idx < ARRAY_SIZE(eng_acc_base_arr) ; acc_idx++) {
1400781f780SKarl Li base_reg = APUSYS_ACC + eng_acc_base_arr[acc_idx];
1410781f780SKarl Li #if CFG_APU_ARDCM_ENABLE
1420781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL1, APU_ARDCM_CTRL1_VAL_0);
1430781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL0, APU_ARDCM_CTRL0_VAL_0);
1440781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL1, APU_ARDCM_CTRL1_VAL_1);
1450781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ARDCM_CTRL0, APU_ARDCM_CTRL0_VAL_1);
1460781f780SKarl Li #endif
1470781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ACC_CONFG_CLR0, CGEN_SOC);
1480781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ACC_CONFG_SET0, HW_CTRL_EN);
1490781f780SKarl Li apu_w_are(are_idx++, base_reg + APU_ACC_AUTO_CTRL_SET0, CLK_REQ_SW_EN);
1500781f780SKarl Li }
1510781f780SKarl Li }
1520781f780SKarl Li
apu_pll_init(void)1530781f780SKarl Li static void apu_pll_init(void)
1540781f780SKarl Li {
1550781f780SKarl Li uint32_t pll_base_arr[] = {MNOC_PLL_BASE, UP_PLL_BASE, MVPU_PLL_BASE, MDLA_PLL_BASE};
1560781f780SKarl Li int32_t pll_freq_out[] = {
1570781f780SKarl Li APUPLL0_DEFAULT_FREQ,
1580781f780SKarl Li APUPLL1_DEFAULT_FREQ,
1590781f780SKarl Li APUPLL2_DEFAULT_FREQ,
1600781f780SKarl Li APUPLL3_DEFAULT_FREQ
1610781f780SKarl Li };
1620781f780SKarl Li uint32_t pcw_val, posdiv_val;
1630781f780SKarl Li int pll_idx, are_idx;
1640781f780SKarl Li uint32_t base_reg;
1650781f780SKarl Li
1660781f780SKarl Li mmio_setbits_32(APUSYS_BASE + APU_ARE, ARE_RCX_AO_EN);
1670781f780SKarl Li mmio_setbits_32(APUSYS_BASE + APU_ARE_REG, ARE_RCX_AO_EN);
1680781f780SKarl Li
1690781f780SKarl Li mmio_write_32(APUSYS_BASE + APU_ARE + ARE_RCX_AO_CONFIG, ARE_ENTRY(RCX_AO_BEGIN) |
1700781f780SKarl Li (ARE_ENTRIES(RCX_AO_BEGIN, RCX_AO_END) << ARE_RCX_AO_CONFIG_HIGH_OFF));
1710781f780SKarl Li
1720781f780SKarl Li are_idx = PLL_ENTRY_BEGIN;
1730781f780SKarl Li for (pll_idx = 0 ; pll_idx < ARRAY_SIZE(pll_base_arr) ; pll_idx++) {
1740781f780SKarl Li base_reg = APUSYS_PLL + pll_base_arr[pll_idx];
1750781f780SKarl Li
1760781f780SKarl Li apu_w_are(are_idx++, base_reg + RG_PLLGP_LVR_REFSEL, RG_PLLGP_LVR_REFSEL_VAL);
1770781f780SKarl Li apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL_HP_EN, FHCTL_CTRL);
1780781f780SKarl Li apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL_RST_CON, FHCTL_NO_RESET);
1790781f780SKarl Li apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL_CLK_CON, FHCTL_CLKEN);
1800781f780SKarl Li apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL0_CFG,
1810781f780SKarl Li FHCTL_HOPPING_EN | FHCTL_SFSTR0_EN);
1820781f780SKarl Li
1830781f780SKarl Li posdiv_val = 0;
1840781f780SKarl Li pcw_val = 0;
1850781f780SKarl Li get_pll_pcw(pll_freq_out[pll_idx], &posdiv_val, &pcw_val);
1860781f780SKarl Li
1870781f780SKarl Li apu_w_are(are_idx++, base_reg + PLL1C_PLL1_CON1,
1880781f780SKarl Li ((0x1U << RG_PLL_SDM_PCW_CHG_OFF) |
1890781f780SKarl Li (posdiv_val << RG_PLL_POSDIV_OFF) | pcw_val));
1900781f780SKarl Li
1910781f780SKarl Li apu_w_are(are_idx++, base_reg + PLL1CPLL_FHCTL0_DDS,
1920781f780SKarl Li ((0x1U << FHCTL0_PLL_TGL_ORG) | pcw_val));
1930781f780SKarl Li }
1940781f780SKarl Li }
1950781f780SKarl Li
apu_are_init(void)1960781f780SKarl Li static void apu_are_init(void)
1970781f780SKarl Li {
1980781f780SKarl Li int entry = 0;
1990781f780SKarl Li
2000781f780SKarl Li mmio_clrbits_32(APUSYS_BASE + APU_ARE, 0xFFFU << ARE_VCORE_OFF);
2010781f780SKarl Li
2020781f780SKarl Li mmio_setbits_32(APUSYS_BASE + APU_ARE, ARE_VCORE_EN);
2030781f780SKarl Li mmio_setbits_32(APUSYS_BASE + APU_ARE_REG, ARE_VCORE_EN);
2040781f780SKarl Li
2050781f780SKarl Li for (entry = ARE_CONF_START; entry < ARE_CONF_END; entry += 4)
2060781f780SKarl Li mmio_write_32(APUSYS_BASE + APU_ARE + entry, 0);
2070781f780SKarl Li }
2080781f780SKarl Li
apu_rpclite_init(void)2090781f780SKarl Li static void apu_rpclite_init(void)
2100781f780SKarl Li {
2110781f780SKarl Li uint32_t sleep_type_offset[] = {
2120781f780SKarl Li APU_RPC_SW_TYPE1_OFF,
2130781f780SKarl Li APU_RPC_SW_TYPE2_OFF,
2140781f780SKarl Li APU_RPC_SW_TYPE3_OFF,
2150781f780SKarl Li APU_RPC_SW_TYPE4_OFF
2160781f780SKarl Li };
2170781f780SKarl Li uint32_t rpc_lite_base[] = {
2180781f780SKarl Li APU_ACX0_RPC_LITE,
2190781f780SKarl Li APU_ACX1_RPC_LITE,
2200781f780SKarl Li APU_ACX2_RPC_LITE,
2210781f780SKarl Li };
2220781f780SKarl Li int ofs_idx, rpc_lite_idx;
2230781f780SKarl Li uint32_t base;
2240781f780SKarl Li
2250781f780SKarl Li for (rpc_lite_idx = 0; rpc_lite_idx < ARRAY_SIZE(rpc_lite_base); rpc_lite_idx++) {
2260781f780SKarl Li base = APUSYS_BASE + rpc_lite_base[rpc_lite_idx];
2270781f780SKarl Li for (ofs_idx = 0; ofs_idx < ARRAY_SIZE(sleep_type_offset); ofs_idx++)
2280781f780SKarl Li mmio_clrbits_32(base + sleep_type_offset[ofs_idx],
2290781f780SKarl Li SW_TYPE_MVPU_MDLA_RV);
2300781f780SKarl Li mmio_setbits_32(base + APU_RPC_TOP_SEL, TOP_SEL_VAL);
2310781f780SKarl Li }
2320781f780SKarl Li }
2330781f780SKarl Li
apu_rpc_mdla_init(void)2340781f780SKarl Li static void apu_rpc_mdla_init(void)
2350781f780SKarl Li {
2360781f780SKarl Li mmio_clrbits_32(APUSYS_BASE + APU_RPCTOP_MDLA + APU_RPC_SW_TYPE0_OFF, SW_TYPE_MVPU_MDLA_RV);
2370781f780SKarl Li }
2380781f780SKarl Li
apu_rpc_init(void)2390781f780SKarl Li static void apu_rpc_init(void)
2400781f780SKarl Li {
2410781f780SKarl Li mmio_write_32(APUSYS_RPC + APU_RPC_SW_TYPE0_OFF, RPC_TYPE_INIT_VAL);
2420781f780SKarl Li mmio_setbits_32(APUSYS_RPC + APU_RPC_TOP_SEL, RPC_TOP_SEL_VAL);
2430781f780SKarl Li
2440781f780SKarl Li #if !CFG_CTL_RPC_BY_CE
2450781f780SKarl Li mmio_clrbits_32(APUSYS_RPC + APU_RPC_TOP_SEL, CE_ENABLE);
2460781f780SKarl Li #endif
2470781f780SKarl Li
2480781f780SKarl Li mmio_setbits_32(APUSYS_RPC + APU_RPC_TOP_SEL_1, BUCK_PROT_SEL);
2490781f780SKarl Li }
2500781f780SKarl Li
apu_pcu_init(void)2510781f780SKarl Li static int apu_pcu_init(void)
2520781f780SKarl Li {
2530781f780SKarl Li uint32_t pmif_id = 0x0;
2540781f780SKarl Li uint32_t slave_id = BUCK_VAPU_PMIC_ID;
2550781f780SKarl Li uint32_t en_set_offset = BUCK_VAPU_PMIC_REG_EN_SET_ADDR;
2560781f780SKarl Li uint32_t en_clr_offset = BUCK_VAPU_PMIC_REG_EN_CLR_ADDR;
2570781f780SKarl Li uint32_t en_shift = BUCK_VAPU_PMIC_REG_EN_SHIFT;
2580781f780SKarl Li struct spmi_device *vsram_sdev;
2590781f780SKarl Li unsigned char vsram = 0;
2600781f780SKarl Li
2610781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCUTOP_CTRL_SET, AUTO_BUCK_EN);
2620781f780SKarl Li
2630781f780SKarl Li mmio_write_32((APUSYS_PCU + APU_PCU_BUCK_STEP_SEL), BUCK_STEP_SEL_VAL);
2640781f780SKarl Li
2650781f780SKarl Li vsram_sdev = get_spmi_device(SPMI_MASTER_1, SPMI_SLAVE_4);
2660781f780SKarl Li if (!vsram_sdev) {
2670781f780SKarl Li ERROR("[APUPW] VSRAM BUCK4 get device fail\n");
2680781f780SKarl Li return -1;
2690781f780SKarl Li }
2700781f780SKarl Li
2710781f780SKarl Li if (spmi_ext_register_readl(vsram_sdev, MT6363_RG_BUCK_VBUCK4_VOSEL_ADDR, &vsram, 1)) {
2720781f780SKarl Li ERROR("[APUPW] VSRAM BUCK4 read fail\n");
2730781f780SKarl Li return -1;
2740781f780SKarl Li }
2750781f780SKarl Li
2760781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_DAT0_L,
2770781f780SKarl Li (BUCK_VAPU_PMIC_REG_VOSEL_ADDR << PMIC_OFF_ADDR_OFF) | vsram);
2780781f780SKarl Li
2790781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_DAT0_H,
2800781f780SKarl Li (slave_id << PMIC_SLVID_OFF) | (pmif_id << PMIC_PMIFID_OFF) | PCU_CMD_OP_W);
2810781f780SKarl Li
2820781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_DAT1_L,
2830781f780SKarl Li (en_set_offset << PMIC_OFF_ADDR_OFF) | (0x1U << en_shift));
2840781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_DAT1_H,
2850781f780SKarl Li (slave_id << PMIC_SLVID_OFF) | (pmif_id << PMIC_PMIFID_OFF) | PCU_CMD_OP_W);
2860781f780SKarl Li
2870781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_OFF_DAT0_L,
2880781f780SKarl Li (en_clr_offset << PMIC_OFF_ADDR_OFF) | (0x1U << en_shift));
2890781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_OFF_DAT0_H,
2900781f780SKarl Li (slave_id << PMIC_SLVID_OFF) | (pmif_id << PMIC_PMIFID_OFF) | PCU_CMD_OP_W);
2910781f780SKarl Li
2920781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_SLE0, 0);
2930781f780SKarl Li mmio_write_32(APUSYS_PCU + APU_PCU_BUCK_ON_SLE1, VAPU_BUCK_ON_SETTLE_TIME);
2940781f780SKarl Li
2950781f780SKarl Li return 0;
2960781f780SKarl Li }
2970781f780SKarl Li
apu_aoc_init(void)2980781f780SKarl Li static void apu_aoc_init(void)
2990781f780SKarl Li {
3000781f780SKarl Li uint32_t reg;
3010781f780SKarl Li
3020781f780SKarl Li mmio_setbits_32(SPM_BASE + 0xF6C, BIT(4));
3030781f780SKarl Li mmio_clrbits_32(SPM_BASE + 0x414, BIT(1));
3040781f780SKarl Li
3050781f780SKarl Li mmio_write_32(APUSYS_AO_CTL + APUSYS_AO_SRAM_CONFIG, APUSYS_AO_SRAM_EN);
3060781f780SKarl Li udelay(1);
3070781f780SKarl Li
3080781f780SKarl Li reg = APUSYS_AO_CTL + APUSYS_AO_SRAM_SET;
3090781f780SKarl Li
3100781f780SKarl Li #if !CFG_CTL_RPC_BY_CE
3110781f780SKarl Li mmio_setbits_32(reg, BIT(8));
3120781f780SKarl Li udelay(1);
3130781f780SKarl Li mmio_setbits_32(reg, BIT(11));
3140781f780SKarl Li udelay(1);
3150781f780SKarl Li mmio_setbits_32(reg, BIT(13));
3160781f780SKarl Li udelay(1);
3170781f780SKarl Li
3180781f780SKarl Li mmio_clrbits_32(reg, BIT(8));
3190781f780SKarl Li udelay(1);
3200781f780SKarl Li mmio_clrbits_32(reg, BIT(11));
3210781f780SKarl Li udelay(1);
3220781f780SKarl Li mmio_clrbits_32(reg, BIT(13));
3230781f780SKarl Li #else
3240781f780SKarl Li mmio_setbits_32(reg, BIT(9));
3250781f780SKarl Li mmio_setbits_32(reg, BIT(12));
3260781f780SKarl Li mmio_setbits_32(reg, BIT(14));
3270781f780SKarl Li
3280781f780SKarl Li mmio_clrbits_32(reg, BIT(9));
3290781f780SKarl Li mmio_clrbits_32(reg, BIT(12));
3300781f780SKarl Li mmio_clrbits_32(reg, BIT(14));
3310781f780SKarl Li udelay(1);
3320781f780SKarl Li #endif
3330781f780SKarl Li
3340781f780SKarl Li reg = APUSYS_RPC + APU_RPC_HW_CON;
3350781f780SKarl Li
3360781f780SKarl Li mmio_write_32(reg, BUCK_ELS_EN_CLR);
3370781f780SKarl Li udelay(1);
3380781f780SKarl Li
3390781f780SKarl Li mmio_write_32(reg, BUCK_AO_RST_B_SET);
3400781f780SKarl Li udelay(1);
3410781f780SKarl Li
3420781f780SKarl Li mmio_write_32(reg, BUCK_PROT_REQ_CLR);
3430781f780SKarl Li udelay(1);
3440781f780SKarl Li
3450781f780SKarl Li mmio_write_32(reg, SRAM_AOC_ISO_CLR);
3460781f780SKarl Li udelay(1);
3470781f780SKarl Li
3480781f780SKarl Li mmio_write_32(reg, PLL_AOC_ISO_EN_CLR);
3490781f780SKarl Li udelay(1);
3500781f780SKarl Li }
3510781f780SKarl Li
init_hw_setting(void)3520781f780SKarl Li static int init_hw_setting(void)
3530781f780SKarl Li {
3540781f780SKarl Li int ret;
3550781f780SKarl Li
3560781f780SKarl Li apu_aoc_init();
3570781f780SKarl Li ret = apu_pcu_init();
3580781f780SKarl Li apu_rpc_init();
3590781f780SKarl Li apu_rpc_mdla_init();
3600781f780SKarl Li apu_rpclite_init();
3610781f780SKarl Li apu_are_init();
3620781f780SKarl Li apu_pll_init();
3630781f780SKarl Li apu_acc_init();
3640781f780SKarl Li apu_buck_off_cfg();
3650781f780SKarl Li
3660781f780SKarl Li return ret;
3670781f780SKarl Li }
3680781f780SKarl Li
apusys_power_init(void)3690781f780SKarl Li int apusys_power_init(void)
3700781f780SKarl Li {
3710781f780SKarl Li int ret;
3720781f780SKarl Li
3730781f780SKarl Li ret = init_hw_setting();
3740781f780SKarl Li if (ret != 0)
3750781f780SKarl Li ERROR("%s init HW failed\n", __func__);
3760781f780SKarl Li else
3770781f780SKarl Li INFO("%s init HW done\n", __func__);
3780781f780SKarl Li
3790781f780SKarl Li mmio_write_32(APU_ACE_HW_FLAG_DIS, APU_ACE_DIS_FLAG_VAL);
3800781f780SKarl Li
3810781f780SKarl Li return ret;
3820781f780SKarl Li }
383