Skip to content

Commit 6cd9a3b

Browse files
laura-naodlezcano
authored andcommitted
thermal/drivers/mediatek/lvts: Add support for ATP mode
MT8196/MT6991 uses ATP (Abnormal Temperature Prevention) mode to detect abnormal temperature conditions, which involves reading temperature data from a dedicated set of registers separate from the ones used for immediate and filtered modes. Add support for ATP mode and its relative registers to ensure accurate temperature readings and proper thermal management on MT8196/MT6991 devices. While at it, convert mode defines to enum. Reviewed-by: Chen-Yu Tsai <wenst@chromium.org> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Reviewed-by: Fei Shao <fshao@chromium.org> Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Tested-by: Frank Wunderlich <frank-w@public-files.de> Signed-off-by: Laura Nao <laura.nao@collabora.com> Link: https://patch.msgid.link/20251125-mt8196-lvts-v4-v5-5-6db7eb903fb7@collabora.com Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
1 parent 6d0fc79 commit 6cd9a3b

1 file changed

Lines changed: 37 additions & 7 deletions

File tree

drivers/thermal/mediatek/lvts_thermal.c

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
#define LVTS_EDATA01(__base) (__base + 0x0058)
4545
#define LVTS_EDATA02(__base) (__base + 0x005C)
4646
#define LVTS_EDATA03(__base) (__base + 0x0060)
47+
#define LVTS_ATP0(__base) (__base + 0x0070)
48+
#define LVTS_ATP1(__base) (__base + 0x0074)
49+
#define LVTS_ATP2(__base) (__base + 0x0078)
50+
#define LVTS_ATP3(__base) (__base + 0x007C)
4751
#define LVTS_MSR0(__base) (__base + 0x0090)
4852
#define LVTS_MSR1(__base) (__base + 0x0094)
4953
#define LVTS_MSR2(__base) (__base + 0x0098)
@@ -88,9 +92,6 @@
8892
#define LVTS_COEFF_A_MT7988 -204650
8993
#define LVTS_COEFF_B_MT7988 204650
9094

91-
#define LVTS_MSR_IMMEDIATE_MODE 0
92-
#define LVTS_MSR_FILTERED_MODE 1
93-
9495
#define LVTS_MSR_READ_TIMEOUT_US 400
9596
#define LVTS_MSR_READ_WAIT_US (LVTS_MSR_READ_TIMEOUT_US / 2)
9697

@@ -102,6 +103,12 @@
102103
static int golden_temp = LVTS_GOLDEN_TEMP_DEFAULT;
103104
static int golden_temp_offset;
104105

106+
enum lvts_msr_mode {
107+
LVTS_MSR_IMMEDIATE_MODE,
108+
LVTS_MSR_FILTERED_MODE,
109+
LVTS_MSR_ATP_MODE,
110+
};
111+
105112
struct lvts_sensor_data {
106113
int dt_id;
107114
u8 cal_offsets[LVTS_MAX_CAL_OFFSETS];
@@ -111,7 +118,7 @@ struct lvts_ctrl_data {
111118
struct lvts_sensor_data lvts_sensor[LVTS_SENSOR_MAX];
112119
u8 valid_sensor_mask;
113120
int offset;
114-
int mode;
121+
enum lvts_msr_mode mode;
115122
};
116123

117124
#define VALID_SENSOR_MAP(s0, s1, s2, s3) \
@@ -212,6 +219,10 @@ static const struct debugfs_reg32 lvts_regs[] = {
212219
LVTS_DEBUG_FS_REGS(LVTS_EDATA01),
213220
LVTS_DEBUG_FS_REGS(LVTS_EDATA02),
214221
LVTS_DEBUG_FS_REGS(LVTS_EDATA03),
222+
LVTS_DEBUG_FS_REGS(LVTS_ATP0),
223+
LVTS_DEBUG_FS_REGS(LVTS_ATP1),
224+
LVTS_DEBUG_FS_REGS(LVTS_ATP2),
225+
LVTS_DEBUG_FS_REGS(LVTS_ATP3),
215226
LVTS_DEBUG_FS_REGS(LVTS_MSR0),
216227
LVTS_DEBUG_FS_REGS(LVTS_MSR1),
217228
LVTS_DEBUG_FS_REGS(LVTS_MSR2),
@@ -628,6 +639,13 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
628639
LVTS_IMMD3(lvts_ctrl->base)
629640
};
630641

642+
void __iomem *atp_regs[] = {
643+
LVTS_ATP0(lvts_ctrl->base),
644+
LVTS_ATP1(lvts_ctrl->base),
645+
LVTS_ATP2(lvts_ctrl->base),
646+
LVTS_ATP3(lvts_ctrl->base)
647+
};
648+
631649
int i;
632650

633651
lvts_for_each_valid_sensor(i, lvts_ctrl_data) {
@@ -663,8 +681,20 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
663681
/*
664682
* Each sensor has its own register address to read from.
665683
*/
666-
lvts_sensor[i].msr = lvts_ctrl_data->mode == LVTS_MSR_IMMEDIATE_MODE ?
667-
imm_regs[i] : msr_regs[i];
684+
switch (lvts_ctrl_data->mode) {
685+
case LVTS_MSR_IMMEDIATE_MODE:
686+
lvts_sensor[i].msr = imm_regs[i];
687+
break;
688+
case LVTS_MSR_FILTERED_MODE:
689+
lvts_sensor[i].msr = msr_regs[i];
690+
break;
691+
case LVTS_MSR_ATP_MODE:
692+
lvts_sensor[i].msr = atp_regs[i];
693+
break;
694+
default:
695+
lvts_sensor[i].msr = imm_regs[i];
696+
break;
697+
}
668698

669699
lvts_sensor[i].low_thresh = INT_MIN;
670700
lvts_sensor[i].high_thresh = INT_MIN;
@@ -934,7 +964,7 @@ static void lvts_ctrl_monitor_enable(struct device *dev, struct lvts_ctrl *lvts_
934964
u32 sensor_map = 0;
935965
int i;
936966

937-
if (lvts_ctrl->mode != LVTS_MSR_FILTERED_MODE)
967+
if (lvts_ctrl->mode == LVTS_MSR_IMMEDIATE_MODE)
938968
return;
939969

940970
if (enable) {

0 commit comments

Comments
 (0)