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>
Signed-off-by: Laura Nao <laura.nao@collabora.com>
---
drivers/thermal/mediatek/lvts_thermal.c | 44 +++++++++++++++++++++----
1 file changed, 37 insertions(+), 7 deletions(-)
diff --git a/drivers/thermal/mediatek/lvts_thermal.c b/drivers/thermal/mediatek/lvts_thermal.c
index 750345465f00..fbe735e4fd77 100644
--- a/drivers/thermal/mediatek/lvts_thermal.c
+++ b/drivers/thermal/mediatek/lvts_thermal.c
@@ -44,6 +44,10 @@
#define LVTS_EDATA01(__base) (__base + 0x0058)
#define LVTS_EDATA02(__base) (__base + 0x005C)
#define LVTS_EDATA03(__base) (__base + 0x0060)
+#define LVTS_ATP0(__base) (__base + 0x0070)
+#define LVTS_ATP1(__base) (__base + 0x0074)
+#define LVTS_ATP2(__base) (__base + 0x0078)
+#define LVTS_ATP3(__base) (__base + 0x007C)
#define LVTS_MSR0(__base) (__base + 0x0090)
#define LVTS_MSR1(__base) (__base + 0x0094)
#define LVTS_MSR2(__base) (__base + 0x0098)
@@ -88,9 +92,6 @@
#define LVTS_COEFF_A_MT7988 -204650
#define LVTS_COEFF_B_MT7988 204650
-#define LVTS_MSR_IMMEDIATE_MODE 0
-#define LVTS_MSR_FILTERED_MODE 1
-
#define LVTS_MSR_READ_TIMEOUT_US 400
#define LVTS_MSR_READ_WAIT_US (LVTS_MSR_READ_TIMEOUT_US / 2)
@@ -101,6 +102,12 @@
static int golden_temp = LVTS_GOLDEN_TEMP_DEFAULT;
static int golden_temp_offset;
+enum lvts_msr_mode {
+ LVTS_MSR_IMMEDIATE_MODE,
+ LVTS_MSR_FILTERED_MODE,
+ LVTS_MSR_ATP_MODE,
+};
+
struct lvts_sensor_data {
int dt_id;
u8 cal_offsets[LVTS_MAX_CAL_OFFSETS];
@@ -110,7 +117,7 @@ struct lvts_ctrl_data {
struct lvts_sensor_data lvts_sensor[LVTS_SENSOR_MAX];
u8 valid_sensor_mask;
int offset;
- int mode;
+ enum lvts_msr_mode mode;
};
#define VALID_SENSOR_MAP(s0, s1, s2, s3) \
@@ -211,6 +218,10 @@ static const struct debugfs_reg32 lvts_regs[] = {
LVTS_DEBUG_FS_REGS(LVTS_EDATA01),
LVTS_DEBUG_FS_REGS(LVTS_EDATA02),
LVTS_DEBUG_FS_REGS(LVTS_EDATA03),
+ LVTS_DEBUG_FS_REGS(LVTS_ATP0),
+ LVTS_DEBUG_FS_REGS(LVTS_ATP1),
+ LVTS_DEBUG_FS_REGS(LVTS_ATP2),
+ LVTS_DEBUG_FS_REGS(LVTS_ATP3),
LVTS_DEBUG_FS_REGS(LVTS_MSR0),
LVTS_DEBUG_FS_REGS(LVTS_MSR1),
LVTS_DEBUG_FS_REGS(LVTS_MSR2),
@@ -625,6 +636,13 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
LVTS_IMMD3(lvts_ctrl->base)
};
+ void __iomem *atp_regs[] = {
+ LVTS_ATP0(lvts_ctrl->base),
+ LVTS_ATP1(lvts_ctrl->base),
+ LVTS_ATP2(lvts_ctrl->base),
+ LVTS_ATP3(lvts_ctrl->base)
+ };
+
int i;
lvts_for_each_valid_sensor(i, lvts_ctrl_data) {
@@ -660,8 +678,20 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
/*
* Each sensor has its own register address to read from.
*/
- lvts_sensor[i].msr = lvts_ctrl_data->mode == LVTS_MSR_IMMEDIATE_MODE ?
- imm_regs[i] : msr_regs[i];
+ switch (lvts_ctrl_data->mode) {
+ case LVTS_MSR_IMMEDIATE_MODE:
+ lvts_sensor[i].msr = imm_regs[i];
+ break;
+ case LVTS_MSR_FILTERED_MODE:
+ lvts_sensor[i].msr = msr_regs[i];
+ break;
+ case LVTS_MSR_ATP_MODE:
+ lvts_sensor[i].msr = atp_regs[i];
+ break;
+ default:
+ lvts_sensor[i].msr = imm_regs[i];
+ break;
+ }
lvts_sensor[i].low_thresh = INT_MIN;
lvts_sensor[i].high_thresh = INT_MIN;
@@ -911,7 +941,7 @@ static void lvts_ctrl_monitor_enable(struct device *dev, struct lvts_ctrl *lvts_
u32 sensor_map = 0;
int i;
- if (lvts_ctrl->mode != LVTS_MSR_FILTERED_MODE)
+ if (lvts_ctrl->mode == LVTS_MSR_IMMEDIATE_MODE)
return;
if (enable) {
--
2.39.5
Il 30/07/25 17:21, Laura Nao ha scritto: > 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> > Signed-off-by: Laura Nao <laura.nao@collabora.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
On Wed, Jul 30, 2025 at 11:40 PM Laura Nao <laura.nao@collabora.com> wrote: > > 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> > Signed-off-by: Laura Nao <laura.nao@collabora.com> It's not visible in this patch, but a heads-up that I see lvts_ctrl_start() also depends on whether lvts is in immediate mode. I wonder if anything is needed there for ATP mode e.g. a new sensor_atp_bitmap. Feel free to ignore if this is a false alarm. Regards, Fei
Hi Fei, On 7/31/25 06:25, Fei Shao wrote: > On Wed, Jul 30, 2025 at 11:40 PM Laura Nao <laura.nao@collabora.com> wrote: >> >> 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> >> Signed-off-by: Laura Nao <laura.nao@collabora.com> > > It's not visible in this patch, but a heads-up that I see > lvts_ctrl_start() also depends on whether lvts is in immediate mode. I > wonder if anything is needed there for ATP mode e.g. a new > sensor_atp_bitmap. > Feel free to ignore if this is a false alarm. > Thanks for the heads up - the bitmap for ATP mode is the same as sensor_filt_bitmap, so the function is already working as intended. Best, Laura > Regards, > Fei
On Thu, Jul 31, 2025 at 6:15 PM Laura Nao <laura.nao@collabora.com> wrote: > > Hi Fei, > > On 7/31/25 06:25, Fei Shao wrote: > > On Wed, Jul 30, 2025 at 11:40 PM Laura Nao <laura.nao@collabora.com> wrote: > >> > >> 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> > >> Signed-off-by: Laura Nao <laura.nao@collabora.com> > > > > It's not visible in this patch, but a heads-up that I see > > lvts_ctrl_start() also depends on whether lvts is in immediate mode. I > > wonder if anything is needed there for ATP mode e.g. a new > > sensor_atp_bitmap. > > Feel free to ignore if this is a false alarm. > > > > Thanks for the heads up - the bitmap for ATP mode is the same as > sensor_filt_bitmap, so the function is already working as intended. Acknowledged, thanks for the clarification. Reviewed-by: Fei Shao <fshao@chromium.org> > > Best, > > Laura > > > Regards, > > Fei >
© 2016 - 2025 Red Hat, Inc.