unplugged-kernel/drivers/misc/mediatek/video/mt6739/videox/mtk_spm_idle.h

111 lines
2.9 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#ifndef __MTK_SPM_IDLE_H__
#define __MTK_SPM_IDLE_H__
#include <linux/kernel.h>
#include "mtk_spm.h"
#include "mtk_spm_sleep.h"
#define TAG "[name:spm&]SPM-Idle"
#define spm_idle_err(fmt, args...) printk_deferred(TAG fmt, ##args)
#define spm_idle_warn(fmt, args...) printk_deferred(TAG fmt, ##args)
/* pr_debug show nothing */
#define spm_idle_dbg(fmt, args...) printk_deferred(TAG fmt, ##args)
#define spm_idle_info(fmt, args...) printk_deferred(TAG fmt, ##args)
#define spm_idle_ver(fmt, args...) printk_deferred(TAG fmt, ##args)
/*
* for SPM common part
*/
#define CPU_0 (1U << 0)
#define CPU_1 (1U << 1)
#define CPU_2 (1U << 2)
#define CPU_3 (1U << 3)
#define CPU_4 (1U << 4)
#define CPU_5 (1U << 5)
#define CPU_6 (1U << 6)
#define CPU_7 (1U << 7)
#define CPU_8 (1U << 8)
#define CPU_9 (1U << 9)
extern long int spm_get_current_time_ms(void);
/*
* for Deep Idle
*/
void spm_deepidle_init(void);
/* can be redefined */
void spm_dpidle_before_wfi(int cpu);
/* can be redefined */
void spm_dpidle_after_wfi(int cpu, u32 spm_debug_flag);
unsigned int spm_go_to_dpidle(
u32 spm_flags, u32 spm_data, u32 log_cond, u32 operation_cond);
unsigned int spm_go_to_sleep_dpidle(u32 spm_flags, u32 spm_data);
int spm_set_dpidle_wakesrc(u32 wakesrc, bool enable, bool replace);
bool spm_set_dpidle_pcm_init_flag(void);
#define DEEPIDLE_LOG_REDUCED (1 << 0)
#define DEEPIDLE_LOG_FULL (1 << 1)
#define DEEPIDLE_LOG_RESOURCE_USAGE (1 << 2)
#define DEEPIDLE_OPT_VCORE_LP_MODE (1 << 0)
#define DEEPIDLE_OPT_DUMP_LP_GOLDEN (1 << 1)
#define DEEPIDLE_OPT_XO_UFS_ON_OFF (1 << 2)
#define DEEPIDLE_OPT_CLKBUF_BBLPM (1 << 3)
#define DEEPIDLE_OPT_VCORE_LOW_VOLT (1 << 4)
/*
* for Screen On Deep Idle 3.0
*/
void spm_sodi3_init(void);
unsigned int spm_go_to_sodi3(u32 spm_flags, u32 spm_data, u32 sodi_flags);
void spm_enable_sodi3(bool en);
bool spm_get_sodi3_en(void);
/*
* for Screen On Deep Idle
*/
void spm_sodi_init(void);
unsigned int spm_go_to_sodi(u32 spm_flags, u32 spm_data, u32 sodi_flags);
void spm_enable_sodi(bool en);
bool spm_get_sodi_en(void);
void spm_sodi_set_vdo_mode(bool vdo_mode);
void spm_sodi_mempll_pwr_mode(bool pwr_mode);
bool spm_get_sodi_mempll(void);
enum mt_sodi_flag {
SODI_FLAG_REDUCE_LOG = (1 << 0),
SODI_FLAG_RESIDENCY = (1 << 1),
SODI_FLAG_RESOURCE_USAGE = (1 << 2),
SODI_FLAG_DUMP_LP_GS = (1 << 3),
SODI_FLAG_3P0 = (1 << 8),
};
/*
* for Multi Core Deep Idle
*/
enum spm_mcdi_lock_id {
SPM_MCDI_IDLE = 0,
SPM_MCDI_VCORE_DVFS = 1,
SPM_MCDI_EARLY_SUSPEND = 2,
};
void mcidle_before_wfi(int cpu);
void mcidle_after_wfi(int cpu);
void spm_mcdi_init(void);
void spm_mcdi_switch_on_off(enum spm_mcdi_lock_id id, int mcdi_en);
bool spm_mcdi_wfi(int core_id);
bool spm_mcdi_can_enter(void);
bool spm_is_cpu_irq_occur(int core_id);
bool go_to_mcidle(int cpu);
#endif