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