/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2019 MediaTek Inc. */ #ifndef __SPMTWAM_H__ #define __SPMTWAM_H__ #define MONTYPE_RISING (0) #define MONTYPE_FALLING (1) #define MONTYPE_HIGH_LEVEL (2) #define MONITPE_LOW_LEVEL (3) #define SPEED_MODE_NORMAL (0) #define SPEED_MODE_SPEED (1) #define DEFAULT_MONTYPE MONTYPE_HIGH_LEVEL #define DEFAULT_SPEED_MODE SPEED_MODE_SPEED #define TWAM_PERIOD_MS (1000) #define WINDOW_LEN_SPEED (TWAM_PERIOD_MS * 0x65B8) #define WINDOW_LEN_NORMAL (TWAM_PERIOD_MS * 0xD) #define GET_EVENT_RATIO_SPEED(x) ((x)/(WINDOW_LEN_SPEED/1000)) #define GET_EVENT_RATIO_NORMAL(x) ((x)/(WINDOW_LEN_NORMAL/1000)) struct spmtwam_channel { u32 signal; /* 2 bits, signal A~D */ u32 id; /* 5 bits, id 0~31 */ u32 montype; /* 2 bits, monitor type */ }; struct spmtwam_cfg { struct spmtwam_channel ch[4]; /* channel 0~3 config */ u32 spmtwam_speed_mode; /* 0: normal, 1: high speed */ u32 spmtwam_window_len; /* spmtwam_window_len * 0: will be automatically updated for current speed mode * for normal speed mode, set to WINDOW_LEN_NORMAL. * for high speed mode, set to WINDOW_LEN_SPEED. */ }; /* definitions for return result */ struct spmtwam_result { struct spmtwam_cfg cfg; u32 value[4]; }; /* callback function return result stored in 'result', which also contains * corresponding spmtwam configs */ typedef void (*spmtwam_handler_t)(struct spmtwam_result *result); /* spmtwam enable/disable api: * parameters: * enable - true: start twam monitor, false: stop monitor * cfg - configs to setup spmtwam * handler - register callback function to receive results * return value: * 0 - success * -EINVAL - invalid parameter(s) * -EAGAIN - resource temporarily unavailable, already enabled ? * -ENODEV - no such device or driver is not initialized. */ int spmtwam_monitor(bool enable, struct spmtwam_cfg *cfg, spmtwam_handler_t handler); #endif /* __SPMTWAM_H__ */