blob: ed3d05876d4894d8f27865b4a85cf7f005efb929 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2020 MediaTek Inc.
*/
#ifndef __MTK_SOC_TEMP_LVTS_H__
#define __MTK_SOC_TEMP_LVTS_H__
/* LVTS HW filter settings
* 000: Get one sample
* 001: Get 2 samples and average them
* 010: Get 4 samples, drop max and min, then average the rest of 2 samples
* 011: Get 6 samples, drop max and min, then average the rest of 4 samples
* 100: Get 10 samples, drop max and min, then average the rest of 8 samples
* 101: Get 18 samples, drop max and min, then average the rest of 16 samples
*/
enum lvts_hw_filter {
LVTS_FILTER_1,
LVTS_FILTER_2,
LVTS_FILTER_2_OF_4,
LVTS_FILTER_4_OF_6,
LVTS_FILTER_8_OF_10,
LVTS_FILTER_16_OF_18
};
enum lvts_sensing_point {
SENSING_POINT0,
SENSING_POINT1,
SENSING_POINT2,
SENSING_POINT3,
ALL_SENSING_POINTS
};
/*
* Data structure
*/
struct lvts_data;
struct speed_settings {
unsigned int period_unit;
unsigned int group_interval_delay;
unsigned int filter_interval_delay;
unsigned int sensor_interval_delay;
};
struct tc_settings {
unsigned int domain_index;
unsigned int addr_offset;
unsigned int num_sensor;
unsigned int sensor_map[ALL_SENSING_POINTS]; /* In sensor ID */
struct speed_settings tc_speed;
/* HW filter setting
* 000: Get one sample
* 001: Get 2 samples and average them
* 010: Get 4 samples, drop max and min, then average the rest of 2
* samples
* 011: Get 6 samples, drop max and min, then average the rest of 4
* samples
* 100: Get 10 samples, drop max and min, then average the rest of 8
* samples
* 101: Get 18 samples, drop max and min, then average the rest of 16
* samples
*/
unsigned int hw_filter;
/* Dominator_sensing point is used to select a sensing point
* and reference its temperature to trigger Thermal HW Reboot
* When it is ALL_SENSING_POINTS, it will select all sensing points
*/
int dominator_sensing_point;
int hw_reboot_trip_point; /* -274000: Disable HW reboot */
unsigned int irq_bit;
};
struct formula_coeff {
int a;
int b;
unsigned int golden_temp;
};
struct sensor_cal_data {
int use_fake_efuse; /* 1: Use fake efuse, 0: Use real efuse */
unsigned int golden_temp;
unsigned int *count_r;
unsigned int *count_rc;
unsigned int *count_rc_now;
unsigned int default_golden_temp;
unsigned int default_count_r;
unsigned int default_count_rc;
};
struct platform_ops {
void (*efuse_to_cal_data)(struct lvts_data *lvts_data);
void (*device_enable_and_init)(struct lvts_data *lvts_data);
void (*device_enable_auto_rck)(struct lvts_data *lvts_data);
int (*device_read_count_rc_n)(struct lvts_data *lvts_data);
void (*set_cal_data)(struct lvts_data *lvts_data);
void (*init_controller)(struct lvts_data *lvts_data);
};
struct power_domain {
void __iomem *base; /* LVTS base addresses */
unsigned int irq_num; /* LVTS interrupt numbers */
struct reset_control *reset;
};
struct sensor_data {
int temp; /* Current temperature */
unsigned int msr_raw; /* MSR raw data from LVTS */
};
struct lvts_data {
struct device *dev;
struct clk *clk;
unsigned int num_domain;
struct power_domain *domain;
int num_tc; /* Number of LVTS thermal controllers */
struct tc_settings *tc;
int counting_window_us; /* LVTS device counting window */
int num_sensor; /* Number of sensors in this platform */
struct sensor_data *sen_data;
struct platform_ops ops;
int feature_bitmap; /* Show what features are enabled */
unsigned int num_efuse_addr;
unsigned int *efuse;
unsigned int num_efuse_block; /* Number of contiguous efuse indexes */
struct sensor_cal_data cal_data;
struct formula_coeff coeff;
};
struct soc_temp_tz {
unsigned int id; /* if id is 0, get max temperature of all sensors */
struct lvts_data *lvts_data;
};
struct match_entry {
char chip[32];
struct lvts_data *lvts_data;
};
struct lvts_match_data {
unsigned int hw_version;
struct match_entry *table;
void (*set_up_common_callbacks)(struct lvts_data *lvts_data);
struct list_head node;
};
struct lvts_id {
unsigned int hw_version;
char chip[32];
};
/*
* LVTS device register
*/
#define RG_TSFM_DATA_0 0x00
#define RG_TSFM_DATA_1 0x01
#define RG_TSFM_DATA_2 0x02
#define RG_TSFM_CTRL_0 0x03
#define RG_TSFM_CTRL_1 0x04
#define RG_TSFM_CTRL_2 0x05
#define RG_TSFM_CTRL_3 0x06
#define RG_TSFM_CTRL_4 0x07
#define RG_TSV2F_CTRL_0 0x08
#define RG_TSV2F_CTRL_1 0x09
#define RG_TSV2F_CTRL_2 0x0A
#define RG_TSV2F_CTRL_3 0x0B
#define RG_TSV2F_CTRL_4 0x0C
#define RG_TSV2F_CTRL_5 0x0D
#define RG_TSV2F_CTRL_6 0x0E
#define RG_TEMP_DATA_0 0x10
#define RG_TEMP_DATA_1 0x11
#define RG_TEMP_DATA_2 0x12
#define RG_TEMP_DATA_3 0x13
#define RG_RC_DATA_0 0x14
#define RG_RC_DATA_1 0x15
#define RG_RC_DATA_2 0x16
#define RG_RC_DATA_3 0x17
#define RG_DIV_DATA_0 0x18
#define RG_DIV_DATA_1 0x19
#define RG_DIV_DATA_2 0x1A
#define RG_DIV_DATA_3 0x1B
#define RG_TST_DATA_0 0x70
#define RG_TST_DATA_1 0x71
#define RG_TST_DATA_2 0x72
#define RG_TST_CTRL 0x73
#define RG_DBG_FQMTR 0xF0
#define RG_DBG_LPSEQ 0xF1
#define RG_DBG_STATE 0xF2
#define RG_DBG_CHKSUM 0xF3
#define RG_DID_LVTS 0xFC
#define RG_DID_REV 0xFD
#define RG_TSFM_RST 0xFF
/*
* LVTS controller register
*/
#define LVTSMONCTL0_0 0x000
#define LVTS_SINGLE_SENSE BIT(9)
#define ENABLE_SENSING_POINT(num) (LVTS_SINGLE_SENSE | GENMASK(((num)-1), 0))
#define DISABLE_SENSING_POINT (LVTS_SINGLE_SENSE | 0x0)
#define LVTSMONCTL1_0 0x004
#define LVTSMONCTL2_0 0x008
#define LVTSMONINT_0 0x00C
#define STAGE3_INT_EN BIT(31)
#define LVTSMONINTSTS_0 0x010
#define LVTSMONIDET0_0 0x014
#define LVTSMONIDET1_0 0x018
#define LVTSMONIDET2_0 0x01C
#define LVTSMONIDET3_0 0x020
#define LVTSH2NTHRE_0 0x024
#define LVTSHTHRE_0 0x028
#define LVTSCTHRE_0 0x02C
#define LVTSOFFSETH_0 0x030
#define LVTSOFFSETL_0 0x034
#define LVTSMSRCTL0_0 0x038
#define LVTSMSRCTL1_0 0x03C
#define LVTSTSSEL_0 0x040
#define SET_SENSOR_INDEX 0x13121110
#define LVTSDEVICETO_0 0x044
#define LVTSCALSCALE_0 0x048
#define SET_CALC_SCALE_RULES 0x00000300
#define LVTS_ID_0 0x04C
#define LVTS_CONFIG_0 0x050
#define BROADCAST_ID_UPDATE BIT(26)
#define DEVICE_SENSING_STATUS BIT(25)
#define DEVICE_ACCESS_STARTUS BIT(24)
#define WRITE_ACCESS BIT(16)
#define DEVICE_WRITE \
(BIT(31) | CK26M_ACTIVE | DEVICE_ACCESS_STARTUS | BIT(17) | \
WRITE_ACCESS)
#define DEVICE_READ \
(BIT(31) | CK26M_ACTIVE | DEVICE_ACCESS_STARTUS | 1 << 17)
#define RESET_ALL_DEVICES \
(DEVICE_WRITE | RG_TSFM_RST << 8 | 0xFF)
#define READ_BACK_DEVICE_ID \
(BIT(31) | CK26M_ACTIVE | BROADCAST_ID_UPDATE | \
DEVICE_ACCESS_STARTUS | BIT(17) | RG_DID_LVTS << 8)
#define READ_DEVICE_REG(reg_idx) (DEVICE_READ | (reg_idx) << 8 | 0x00)
#define LVTSEDATA00_0 0x054
#define LVTSEDATA01_0 0x058
#define LVTSEDATA02_0 0x05C
#define LVTSEDATA03_0 0x060
#define LVTSMSR0_0 0x090
#define MRS_RAW_MASK GENMASK(15, 0)
#define MRS_RAW_VALID_BIT BIT(16)
#define LVTSMSR1_0 0x094
#define LVTSMSR2_0 0x098
#define LVTSMSR3_0 0x09C
#define LVTSIMMD0_0 0x0A0
#define LVTSIMMD1_0 0x0A4
#define LVTSIMMD2_0 0x0A8
#define LVTSIMMD3_0 0x0AC
#define LVTSRDATA0_0 0x0B0
#define LVTSRDATA1_0 0x0B4
#define LVTSRDATA2_0 0x0B8
#define LVTSRDATA3_0 0x0BC
#define LVTSPROTCTL_0 0x0C0
#define PROTOFFSET GENMASK(15, 0)
#define LVTSPROTTA_0 0x0C4
#define LVTSPROTTB_0 0x0C8
#define LVTSPROTTC_0 0x0CC
#define LVTSCLKEN_0 0x0E4
#define ENABLE_LVTS_CTRL_CLK (1)
#define DISABLE_LVTS_CTRL_CLK (0)
#define LVTSDBGSEL_0 0x0E8
#define LVTSDBGSIG_0 0x0EC
#define LVTSSPARE0_0 0x0F0
#define LVTSSPARE1_0 0x0F4
#define LVTSSPARE2_0 0x0F8
#define LVTSSPARE3_0 0x0FC
#define THERMINTST 0xF04
/*
* LVTS register mask
*/
#define THERMAL_COLD_INTERRUPT_0 0x00000001
#define THERMAL_HOT_INTERRUPT_0 0x00000002
#define THERMAL_LOW_OFFSET_INTERRUPT_0 0x00000004
#define THERMAL_HIGH_OFFSET_INTERRUPT_0 0x00000008
#define THERMAL_HOT2NORMAL_INTERRUPT_0 0x00000010
#define THERMAL_COLD_INTERRUPT_1 0x00000020
#define THERMAL_HOT_INTERRUPT_1 0x00000040
#define THERMAL_LOW_OFFSET_INTERRUPT_1 0x00000080
#define THERMAL_HIGH_OFFSET_INTERRUPT_1 0x00000100
#define THERMAL_HOT2NORMAL_INTERRUPT_1 0x00000200
#define THERMAL_COLD_INTERRUPT_2 0x00000400
#define THERMAL_HOT_INTERRUPT_2 0x00000800
#define THERMAL_LOW_OFFSET_INTERRUPT_2 0x00001000
#define THERMAL_HIGH_OFFSET_INTERRUPT_2 0x00002000
#define THERMAL_HOT2NORMAL_INTERRUPT_2 0x00004000
#define THERMAL_AHB_TIMEOUT_INTERRUPT 0x00008000
#define THERMAL_DEVICE_TIMEOUT_INTERRUPT 0x00008000
#define THERMAL_IMMEDIATE_INTERRUPT_0 0x00010000
#define THERMAL_IMMEDIATE_INTERRUPT_1 0x00020000
#define THERMAL_IMMEDIATE_INTERRUPT_2 0x00040000
#define THERMAL_FILTER_INTERRUPT_0 0x00080000
#define THERMAL_FILTER_INTERRUPT_1 0x00100000
#define THERMAL_FILTER_INTERRUPT_2 0x00200000
#define THERMAL_COLD_INTERRUPT_3 0x00400000
#define THERMAL_HOT_INTERRUPT_3 0x00800000
#define THERMAL_LOW_OFFSET_INTERRUPT_3 0x01000000
#define THERMAL_HIGH_OFFSET_INTERRUPT_3 0x02000000
#define THERMAL_HOT2NORMAL_INTERRUPT_3 0x04000000
#define THERMAL_IMMEDIATE_INTERRUPT_3 0x08000000
#define THERMAL_FILTER_INTERRUPT_3 0x10000000
#define THERMAL_PROTECTION_STAGE_1 0x20000000
#define THERMAL_PROTECTION_STAGE_2 0x40000000
#define THERMAL_PROTECTION_STAGE_3 0x80000000
#endif /* __MTK_SOC_TEMP_LVTS_H__ */