mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
c36de2e73a
Backport almost 50 commits from upstream Linux to improve thermal drivers for MediaTek SoCs and add new LVTS driver for MT7988. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
96 lines
3.4 KiB
Diff
96 lines
3.4 KiB
Diff
From c2ab54ab0425388e65901a7af2fbf69ead968708 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?=
|
|
<nfraprado@collabora.com>
|
|
Date: Thu, 13 Jul 2023 11:42:37 -0400
|
|
Subject: [PATCH 33/42] thermal/drivers/mediatek/lvts_thermal: Make readings
|
|
valid in filtered mode
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Currently, when a controller is configured to use filtered mode, thermal
|
|
readings are valid only about 30% of the time.
|
|
|
|
Upon testing, it was noticed that lowering any of the interval settings
|
|
resulted in an improved rate of valid data. The same was observed when
|
|
decreasing the number of samples for each sensor (which also results in
|
|
quicker measurements).
|
|
|
|
Retrying the read with a timeout longer than the time it takes to
|
|
resample (about 344us with these settings and 4 sensors) also improves
|
|
the rate.
|
|
|
|
Lower all timing settings to the minimum, configure the filtering to
|
|
single sample, and poll the measurement register for at least one period
|
|
to improve the data validity on filtered mode. With these changes in
|
|
place, out of 100000 reads, a single one failed, ie 99.999% of the data
|
|
was valid.
|
|
|
|
Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
|
|
Tested-by: Chen-Yu Tsai <wenst@chromium.org>
|
|
Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>
|
|
Reviewed-by: Alexandre Mergnat <amergnat@baylibre.com>
|
|
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
|
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
|
|
Link: https://lore.kernel.org/r/20230713154743.611870-1-nfraprado@collabora.com
|
|
---
|
|
drivers/thermal/mediatek/lvts_thermal.c | 19 ++++++++++++-------
|
|
1 file changed, 12 insertions(+), 7 deletions(-)
|
|
|
|
--- a/drivers/thermal/mediatek/lvts_thermal.c
|
|
+++ b/drivers/thermal/mediatek/lvts_thermal.c
|
|
@@ -58,11 +58,11 @@
|
|
#define LVTS_PROTTC(__base) (__base + 0x00CC)
|
|
#define LVTS_CLKEN(__base) (__base + 0x00E4)
|
|
|
|
-#define LVTS_PERIOD_UNIT ((118 * 1000) / (256 * 38))
|
|
-#define LVTS_GROUP_INTERVAL 1
|
|
-#define LVTS_FILTER_INTERVAL 1
|
|
-#define LVTS_SENSOR_INTERVAL 1
|
|
-#define LVTS_HW_FILTER 0x2
|
|
+#define LVTS_PERIOD_UNIT 0
|
|
+#define LVTS_GROUP_INTERVAL 0
|
|
+#define LVTS_FILTER_INTERVAL 0
|
|
+#define LVTS_SENSOR_INTERVAL 0
|
|
+#define LVTS_HW_FILTER 0x0
|
|
#define LVTS_TSSEL_CONF 0x13121110
|
|
#define LVTS_CALSCALE_CONF 0x300
|
|
#define LVTS_MONINT_CONF 0x8300318C
|
|
@@ -86,6 +86,9 @@
|
|
#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)
|
|
+
|
|
#define LVTS_HW_SHUTDOWN_MT8195 105000
|
|
|
|
#define LVTS_MINIMUM_THRESHOLD 20000
|
|
@@ -268,6 +271,7 @@ static int lvts_get_temp(struct thermal_
|
|
struct lvts_sensor *lvts_sensor = thermal_zone_device_priv(tz);
|
|
void __iomem *msr = lvts_sensor->msr;
|
|
u32 value;
|
|
+ int rc;
|
|
|
|
/*
|
|
* Measurement registers:
|
|
@@ -280,7 +284,8 @@ static int lvts_get_temp(struct thermal_
|
|
* 16 : Valid temperature
|
|
* 15-0 : Raw temperature
|
|
*/
|
|
- value = readl(msr);
|
|
+ rc = readl_poll_timeout(msr, value, value & BIT(16),
|
|
+ LVTS_MSR_READ_WAIT_US, LVTS_MSR_READ_TIMEOUT_US);
|
|
|
|
/*
|
|
* As the thermal zone temperature will read before the
|
|
@@ -293,7 +298,7 @@ static int lvts_get_temp(struct thermal_
|
|
* functionning temperature and directly jump to a system
|
|
* shutdown.
|
|
*/
|
|
- if (!(value & BIT(16)))
|
|
+ if (rc)
|
|
return -EAGAIN;
|
|
|
|
*temp = lvts_raw_to_temp(value & 0xFFFF);
|