xref: /rk3399_ARM-atf/plat/mediatek/mt8192/drivers/spm/mt_spm.c (revision 258f6a2d40ede90127abfefa9af594a4943789d7)
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 
spm_boot_init(void)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