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 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 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 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 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 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 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 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 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 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 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 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 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 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 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