1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2023, MediaTek Inc. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef MT_SPM_H 8*91f16700Schasinglulu #define MT_SPM_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <stdint.h> 11*91f16700Schasinglulu #include <stdio.h> 12*91f16700Schasinglulu #include <lib/spinlock.h> 13*91f16700Schasinglulu #include <lib/pm/mtk_pm.h> 14*91f16700Schasinglulu #include <lpm/mt_lp_rq.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu /* 17*91f16700Schasinglulu * ARM v8.2, the cache will turn off automatically when cpu 18*91f16700Schasinglulu * power down. Therefore, there is no doubt to use the spin_lock here. 19*91f16700Schasinglulu */ 20*91f16700Schasinglulu extern spinlock_t spm_lock; 21*91f16700Schasinglulu 22*91f16700Schasinglulu #ifdef __GNUC__ 23*91f16700Schasinglulu #define spm_likely(x) __builtin_expect(!!(x), 1) 24*91f16700Schasinglulu #define spm_unlikely(x) __builtin_expect(!!(x), 0) 25*91f16700Schasinglulu #else 26*91f16700Schasinglulu #define spm_likely(x) (x) 27*91f16700Schasinglulu #define spm_unlikely(x) (x) 28*91f16700Schasinglulu #endif 29*91f16700Schasinglulu 30*91f16700Schasinglulu #define MT_SPM_USING_SRCLKEN_RC 31*91f16700Schasinglulu /* spm extern operand definition */ 32*91f16700Schasinglulu #define MT_SPM_EX_OP_CLR_26M_RECORD BIT(0) 33*91f16700Schasinglulu #define MT_SPM_EX_OP_SET_WDT BIT(1) 34*91f16700Schasinglulu #define MT_SPM_EX_OP_NON_GENERIC_RESOURCE_REQ BIT(2) 35*91f16700Schasinglulu #define MT_SPM_EX_OP_SET_SUSPEND_MODE BIT(3) 36*91f16700Schasinglulu #define MT_SPM_EX_OP_SET_IS_ADSP BIT(4) 37*91f16700Schasinglulu #define MT_SPM_EX_OP_SRCLKEN_RC_BBLPM BIT(5) 38*91f16700Schasinglulu #define MT_SPM_EX_OP_HW_S1_DETECT BIT(6) 39*91f16700Schasinglulu #define MT_SPM_EX_OP_TRACE_LP BIT(7) 40*91f16700Schasinglulu #define MT_SPM_EX_OP_TRACE_SUSPEND BIT(8) 41*91f16700Schasinglulu #define MT_SPM_EX_OP_TRACE_TIMESTAMP_EN BIT(9) 42*91f16700Schasinglulu #define MT_SPM_EX_OP_TIME_CHECK BIT(10) 43*91f16700Schasinglulu #define MT_SPM_EX_OP_TIME_OBS BIT(11) 44*91f16700Schasinglulu #define MT_SPM_EX_OP_PERI_ON BIT(12) 45*91f16700Schasinglulu #define MT_SPM_EX_OP_INFRA_ON BIT(13) 46*91f16700Schasinglulu 47*91f16700Schasinglulu typedef enum { 48*91f16700Schasinglulu WR_NONE = 0, 49*91f16700Schasinglulu WR_UART_BUSY = 1, 50*91f16700Schasinglulu WR_ABORT = 2, 51*91f16700Schasinglulu WR_PCM_TIMER = 3, 52*91f16700Schasinglulu WR_WAKE_SRC = 4, 53*91f16700Schasinglulu WR_DVFSRC = 5, 54*91f16700Schasinglulu WR_TWAM = 6, 55*91f16700Schasinglulu WR_PMSR = 7, 56*91f16700Schasinglulu WR_SPM_ACK_CHK = 8, 57*91f16700Schasinglulu WR_UNKNOWN = 9, 58*91f16700Schasinglulu } wake_reason_t; 59*91f16700Schasinglulu 60*91f16700Schasinglulu struct mt_lp_resource_user *get_spm_res_user(void); 61*91f16700Schasinglulu int spm_boot_init(void); 62*91f16700Schasinglulu 63*91f16700Schasinglulu #endif /* MT_SPM_H */ 64