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