/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2020 MediaTek Inc. */ #ifndef _MD_COOLING_H #define _MD_COOLING_H #include /*=========================================================== * Macro Definitions *=========================================================== */ #define MAX_MD_COOLER_NAME_LEN (20) #define MAX_NUM_TX_PWR_STATE (3) #define MAX_NUM_SCG_OFF_STATE (1) #define MD_COOLING_UNLIMITED_STATE (0) #define DEFAULT_THROTTLE_TX_PWR_LV1 (4) #define DEFAULT_THROTTLE_TX_PWR_LV2 (6) #define DEFAULT_THROTTLE_TX_PWR_LV3 (8) #define is_scg_off_enabled(status) (status == MD_SCG_OFF) #define is_mutt_enabled(status) (status >= MD_LV_THROTTLE_ENABLED) #define is_md_inactive(status) (status == MD_OFF || status == MD_NO_IMS) #define is_md_off(status) (status == MD_OFF) enum md_cooling_status { MD_LV_THROTTLE_DISABLED, MD_SCG_OFF, MD_LV_THROTTLE_ENABLED, MD_IMS_ONLY, MD_NO_IMS, MD_OFF, }; enum md_cooling_type { MD_COOLING_TYPE_MUTT, MD_COOLING_TYPE_TX_PWR, MD_COOLING_TYPE_SCG_OFF, NR_MD_COOLING_TYPE }; /*=========================================================== * TMC message (must be align with MD site!) *=========================================================== */ enum tmc_ctrl_cmd { TMC_CTRL_CMD_THROTTLING = 0, TMC_CTRL_CMD_CA_CTRL, TMC_CTRL_CMD_PA_CTRL, TMC_CTRL_CMD_COOLER_LV, /* 4~7 are for MD internal use */ TMC_CTRL_CMD_SCG_OFF = 8, TMC_CTRL_CMD_SCG_ON, TMC_CTRL_CMD_TX_POWER, TMC_CTRL_CMD_DEFAULT, }; enum tmc_throttle_ctrl { TMC_THROTTLE_ENABLE_IMS_ENABLE = 0, TMC_THROTTLE_ENABLE_IMS_DISABLE, TMC_THROTTLE_DISABLE, }; enum tmc_ca_ctrl { TMC_CA_ON = 0, /* leave thermal control*/ TMC_CA_OFF, }; enum tmc_pa_ctrl { TMC_PA_ALL_ON = 0, /* leave thermal control*/ TMC_PA_OFF_1PA, }; enum tmc_cooler_lv_ctrl { TMC_COOLER_LV_ENABLE = 0, TMC_COOLER_LV_DISABLE }; enum tmc_overheated_rat { TMC_OVERHEATED_LTE = 0, TMC_OVERHEATED_NR, }; enum tmc_tx_pwr_event { TMC_TX_PWR_VOLTAGE_LOW_EVENT = 0, TMC_TX_PWR_LOW_BATTERY_EVENT, TMC_TX_PWR_OVER_CURRENT_EVENT, /* reserved for reduce 2G/3G/4G/C2K max TX power for certain value */ TMC_TX_PWR_REDUCE_OTHER_MAX_TX_EVENT, /* reserved for reduce 5G max TX power for certain value */ TMC_TX_PWR_REDUCE_NR_MAX_TX_EVENT, }; #define TMC_THROTTLE_DISABLE_MSG \ (TMC_CTRL_CMD_THROTTLING | TMC_THROTTLE_DISABLE << 8) #define TMC_IMS_ENABLE_MSG \ (TMC_CTRL_CMD_THROTTLING | TMC_THROTTLE_ENABLE_IMS_ENABLE << 8) #define TMC_IMS_DISABLE_MSG \ (TMC_CTRL_CMD_THROTTLING | TMC_THROTTLE_ENABLE_IMS_DISABLE << 8) #define TMC_CA_CTRL_CA_ON_MSG \ (TMC_CTRL_CMD_CA_CTRL | TMC_CA_ON << 8) #define TMC_CA_CTRL_CA_OFF_MSG \ (TMC_CTRL_CMD_CA_CTRL | TMC_CA_OFF << 8) #define TMC_PA_CTRL_PA_ALL_ON_MSG \ (TMC_CTRL_CMD_PA_CTRL | TMC_PA_ALL_ON << 8) #define TMC_PA_CTRL_PA_OFF_1PA_MSG \ (TMC_CTRL_CMD_PA_CTRL | TMC_PA_OFF_1PA << 8) #define TMC_COOLER_LV_ENABLE_MSG \ (TMC_CTRL_CMD_COOLER_LV | TMC_COOLER_LV_ENABLE << 8) #define TMC_COOLER_LV_DISABLE_MSG \ (TMC_CTRL_CMD_COOLER_LV | TMC_COOLER_LV_DISABLE << 8) #define mutt_lv_to_tmc_msg(id, lv) \ ((TMC_COOLER_LV_ENABLE_MSG | (lv) << 16) | ((id) << 24)) #define duty_ctrl_to_tmc_msg(active, suspend, ims) \ ((ims) \ ? ((active << 16) | (suspend << 24) | TMC_IMS_ENABLE_MSG) \ : ((1 << 16) | (255 << 24) | TMC_IMS_DISABLE_MSG) \ ) #define ca_ctrl_to_tmc_msg(ca_ctrl) \ ((ca_ctrl) ? TMC_CA_CTRL_CA_OFF_MSG : TMC_CA_CTRL_CA_ON_MSG) #define pa_ctrl_to_tmc_msg(pa_ctrl) \ ((pa_ctrl) ? TMC_PA_CTRL_PA_OFF_1PA_MSG : TMC_PA_CTRL_PA_ALL_ON_MSG) #define scg_off_to_tmc_msg(off) \ ((off) ? TMC_CTRL_CMD_SCG_OFF : TMC_CTRL_CMD_SCG_ON) #define reduce_tx_pwr_to_tmc_msg(id, pwr) \ (((id) == TMC_OVERHEATED_NR) \ ? (TMC_CTRL_CMD_TX_POWER | \ (TMC_TX_PWR_REDUCE_NR_MAX_TX_EVENT << 16) | \ ((pwr) << 24)) \ : (TMC_CTRL_CMD_TX_POWER | \ (TMC_TX_PWR_REDUCE_OTHER_MAX_TX_EVENT << 16) | \ ((pwr) << 24)) \ ) /*================================================== * Type Definitions *================================================== */ /** * struct md_cooling_device - data for MD cooling device * @name: naming string for this cooling device * @type: type of cooling device with different throttle method * @pa_id: hint to MD to know the heat source * @target_state: target cooling state which is set in set_cur_state() * callback. * @max_state: maximum state supported for this cooling device * @cdev: thermal_cooling_device pointer to keep track of the * registered cooling device. * @throttle_tx_power: array of throttle TX power from device tree. * @throttle: callback function to handle throttle request * @node: list_head to link all md_cooling_device. * @dev: device node pointer */ struct md_cooling_device { char name[MAX_MD_COOLER_NAME_LEN]; enum md_cooling_type type; unsigned int pa_id; unsigned long target_state; unsigned long max_state; struct thermal_cooling_device *cdev; unsigned int throttle_tx_power[MAX_NUM_TX_PWR_STATE]; int (*throttle)(struct md_cooling_device *md_cdev, unsigned long state); struct list_head node; struct device *dev; }; /** * struct md_cooling_platform_data - MD cooler platform dependent data * @state_to_mutt_lv: callback function to transfer cooling state * to mutt LV defined by MD * @max_lv: max cooler LV supported by MD */ struct md_cooling_platform_data { unsigned long (*state_to_mutt_lv)(unsigned long state); unsigned long max_lv; }; /** * struct md_cooling_data - data for MD cooling driver * @pa_num: number of PA from device tree * @mutt_lv: current MUTT state (maximum of all PA's target state) * @status: current MD throttle status * @pdata: platform data of MD cooling driver */ struct md_cooling_data { unsigned int pa_num; unsigned long mutt_state; enum md_cooling_status status; const struct md_cooling_platform_data *pdata; }; extern enum md_cooling_status get_md_cooling_status(void); extern int send_throttle_msg(unsigned int msg); extern void update_throttle_power(unsigned int pa_id, unsigned int *pwr); extern struct md_cooling_device *get_md_cdev(enum md_cooling_type type, unsigned int pa_id); extern unsigned int get_pa_num(void); #if IS_ENABLED(CONFIG_DEBUG_FS) extern int md_cooling_debugfs_init(void); extern void md_cooling_debugfs_exit(void); #endif #endif