1*859e346bSEdward-JW Yang /* 2*859e346bSEdward-JW Yang * Copyright (c) 2021, MediaTek Inc. All rights reserved. 3*859e346bSEdward-JW Yang * 4*859e346bSEdward-JW Yang * SPDX-License-Identifier: BSD-3-Clause 5*859e346bSEdward-JW Yang */ 6*859e346bSEdward-JW Yang 7*859e346bSEdward-JW Yang #include <stddef.h> 8*859e346bSEdward-JW Yang #include <string.h> 9*859e346bSEdward-JW Yang #include <common/debug.h> 10*859e346bSEdward-JW Yang #include <lib/bakery_lock.h> 11*859e346bSEdward-JW Yang #include <lib/mmio.h> 12*859e346bSEdward-JW Yang #include <mt_lp_rm.h> 13*859e346bSEdward-JW Yang #include <mt_spm.h> 14*859e346bSEdward-JW Yang #include <mt_spm_cond.h> 15*859e346bSEdward-JW Yang #include <mt_spm_conservation.h> 16*859e346bSEdward-JW Yang #include <mt_spm_constraint.h> 17*859e346bSEdward-JW Yang #include <mt_spm_idle.h> 18*859e346bSEdward-JW Yang #include <mt_spm_internal.h> 19*859e346bSEdward-JW Yang #include <mt_spm_pmic_wrap.h> 20*859e346bSEdward-JW Yang #include <mt_spm_rc_internal.h> 21*859e346bSEdward-JW Yang #include <mt_spm_reg.h> 22*859e346bSEdward-JW Yang #include <mt_spm_resource_req.h> 23*859e346bSEdward-JW Yang #include <mt_spm_suspend.h> 24*859e346bSEdward-JW Yang #include <mtk_plat_common.h> 25*859e346bSEdward-JW Yang #include <plat_mtk_lpm.h> 26*859e346bSEdward-JW Yang #include <plat_pm.h> 27*859e346bSEdward-JW Yang #include <platform_def.h> 28*859e346bSEdward-JW Yang #include <sleep_def.h> 29*859e346bSEdward-JW Yang 30*859e346bSEdward-JW Yang #ifdef MT_SPM_USING_BAKERY_LOCK 31*859e346bSEdward-JW Yang DEFINE_BAKERY_LOCK(spm_lock); 32*859e346bSEdward-JW Yang #define plat_spm_lock_init() bakery_lock_init(&spm_lock) 33*859e346bSEdward-JW Yang #else 34*859e346bSEdward-JW Yang spinlock_t spm_lock; 35*859e346bSEdward-JW Yang #define plat_spm_lock_init() 36*859e346bSEdward-JW Yang #endif 37*859e346bSEdward-JW Yang 38*859e346bSEdward-JW Yang /* CLK_SCP_CFG_0 */ 39*859e346bSEdward-JW Yang #define CLK_SCP_CFG_0 (TOPCKGEN_BASE + 0x264) 40*859e346bSEdward-JW Yang #define SPM_CK_CONTROL_EN 0x7FF 41*859e346bSEdward-JW Yang 42*859e346bSEdward-JW Yang struct mt_resource_constraint plat_constraint_bus26m = { 43*859e346bSEdward-JW Yang .is_valid = spm_is_valid_rc_bus26m, 44*859e346bSEdward-JW Yang .update = spm_update_rc_bus26m, 45*859e346bSEdward-JW Yang .allow = spm_allow_rc_bus26m, 46*859e346bSEdward-JW Yang .run = spm_run_rc_bus26m, 47*859e346bSEdward-JW Yang .reset = spm_reset_rc_bus26m, 48*859e346bSEdward-JW Yang }; 49*859e346bSEdward-JW Yang 50*859e346bSEdward-JW Yang struct mt_resource_constraint plat_constraint_syspll = { 51*859e346bSEdward-JW Yang .is_valid = spm_is_valid_rc_syspll, 52*859e346bSEdward-JW Yang .update = spm_update_rc_syspll, 53*859e346bSEdward-JW Yang .allow = spm_allow_rc_syspll, 54*859e346bSEdward-JW Yang .run = spm_run_rc_syspll, 55*859e346bSEdward-JW Yang .reset = spm_reset_rc_syspll, 56*859e346bSEdward-JW Yang }; 57*859e346bSEdward-JW Yang 58*859e346bSEdward-JW Yang struct mt_resource_constraint plat_constraint_dram = { 59*859e346bSEdward-JW Yang .is_valid = spm_is_valid_rc_dram, 60*859e346bSEdward-JW Yang .update = spm_update_rc_dram, 61*859e346bSEdward-JW Yang .allow = spm_allow_rc_dram, 62*859e346bSEdward-JW Yang .run = spm_run_rc_dram, 63*859e346bSEdward-JW Yang .reset = spm_reset_rc_dram, 64*859e346bSEdward-JW Yang }; 65*859e346bSEdward-JW Yang 66*859e346bSEdward-JW Yang struct mt_resource_constraint plat_constraint_cpu = { 67*859e346bSEdward-JW Yang .is_valid = spm_is_valid_rc_cpu_buck_ldo, 68*859e346bSEdward-JW Yang .update = NULL, 69*859e346bSEdward-JW Yang .allow = spm_allow_rc_cpu_buck_ldo, 70*859e346bSEdward-JW Yang .run = spm_run_rc_cpu_buck_ldo, 71*859e346bSEdward-JW Yang .reset = spm_reset_rc_cpu_buck_ldo, 72*859e346bSEdward-JW Yang }; 73*859e346bSEdward-JW Yang 74*859e346bSEdward-JW Yang struct mt_resource_constraint *plat_constraints[] = { 75*859e346bSEdward-JW Yang &plat_constraint_bus26m, 76*859e346bSEdward-JW Yang &plat_constraint_syspll, 77*859e346bSEdward-JW Yang &plat_constraint_dram, 78*859e346bSEdward-JW Yang &plat_constraint_cpu, 79*859e346bSEdward-JW Yang NULL, 80*859e346bSEdward-JW Yang }; 81*859e346bSEdward-JW Yang 82*859e346bSEdward-JW Yang struct mt_resource_manager plat_mt8195_rm = { 83*859e346bSEdward-JW Yang .update = mt_spm_cond_update, 84*859e346bSEdward-JW Yang .consts = plat_constraints, 85*859e346bSEdward-JW Yang }; 86*859e346bSEdward-JW Yang 87*859e346bSEdward-JW Yang void spm_boot_init(void) 88*859e346bSEdward-JW Yang { 89*859e346bSEdward-JW Yang NOTICE("MT8195 %s\n", __func__); 90*859e346bSEdward-JW Yang /* switch ck_off/axi_26m control to SPM */ 91*859e346bSEdward-JW Yang mmio_setbits_32(CLK_SCP_CFG_0, SPM_CK_CONTROL_EN); 92*859e346bSEdward-JW Yang 93*859e346bSEdward-JW Yang plat_spm_lock_init(); 94*859e346bSEdward-JW Yang mt_spm_pmic_wrap_set_phase(PMIC_WRAP_PHASE_ALLINONE); 95*859e346bSEdward-JW Yang mt_lp_rm_register(&plat_mt8195_rm); 96*859e346bSEdward-JW Yang mt_spm_idle_generic_init(); 97*859e346bSEdward-JW Yang mt_spm_suspend_init(); 98*859e346bSEdward-JW Yang } 99