mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-20 06:08:08 +00:00
121 lines
4.4 KiB
Diff
121 lines
4.4 KiB
Diff
|
From 6d827142643ee10c13ff9a1d90f38fb399aa9fff 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, 6 Jul 2023 11:37:33 -0400
|
||
|
Subject: [PATCH 26/42] thermal/drivers/mediatek/lvts_thermal: Honor sensors in
|
||
|
immediate mode
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
Each controller can be configured to operate on immediate or filtered
|
||
|
mode. On filtered mode, the sensors are enabled by setting the
|
||
|
corresponding bits in MONCTL0, while on immediate mode, by setting
|
||
|
MSRCTL1.
|
||
|
|
||
|
Previously, the code would set MSRCTL1 for all four sensors when
|
||
|
configured to immediate mode, but given that the controller might not
|
||
|
have all four sensors connected, this would cause interrupts to trigger
|
||
|
for non-existent sensors. Fix this by handling the MSRCTL1 register
|
||
|
analogously to the MONCTL0: only enable the sensors that were declared.
|
||
|
|
||
|
Fixes: f5f633b18234 ("thermal/drivers/mediatek: Add the Low Voltage Thermal Sensor driver")
|
||
|
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||
|
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>
|
||
|
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||
|
Link: https://lore.kernel.org/r/20230706153823.201943-3-nfraprado@collabora.com
|
||
|
---
|
||
|
drivers/thermal/mediatek/lvts_thermal.c | 57 ++++++++++++++-----------
|
||
|
1 file changed, 33 insertions(+), 24 deletions(-)
|
||
|
|
||
|
--- a/drivers/thermal/mediatek/lvts_thermal.c
|
||
|
+++ b/drivers/thermal/mediatek/lvts_thermal.c
|
||
|
@@ -897,24 +897,6 @@ static int lvts_ctrl_configure(struct de
|
||
|
writel(value, LVTS_MSRCTL0(lvts_ctrl->base));
|
||
|
|
||
|
/*
|
||
|
- * LVTS_MSRCTL1 : Measurement control
|
||
|
- *
|
||
|
- * Bits:
|
||
|
- *
|
||
|
- * 9: Ignore MSRCTL0 config and do immediate measurement on sensor3
|
||
|
- * 6: Ignore MSRCTL0 config and do immediate measurement on sensor2
|
||
|
- * 5: Ignore MSRCTL0 config and do immediate measurement on sensor1
|
||
|
- * 4: Ignore MSRCTL0 config and do immediate measurement on sensor0
|
||
|
- *
|
||
|
- * That configuration will ignore the filtering and the delays
|
||
|
- * introduced below in MONCTL1 and MONCTL2
|
||
|
- */
|
||
|
- if (lvts_ctrl->mode == LVTS_MSR_IMMEDIATE_MODE) {
|
||
|
- value = BIT(9) | BIT(6) | BIT(5) | BIT(4);
|
||
|
- writel(value, LVTS_MSRCTL1(lvts_ctrl->base));
|
||
|
- }
|
||
|
-
|
||
|
- /*
|
||
|
* LVTS_MONCTL1 : Period unit and group interval configuration
|
||
|
*
|
||
|
* The clock source of LVTS thermal controller is 26MHz.
|
||
|
@@ -979,6 +961,15 @@ static int lvts_ctrl_start(struct device
|
||
|
struct thermal_zone_device *tz;
|
||
|
u32 sensor_map = 0;
|
||
|
int i;
|
||
|
+ /*
|
||
|
+ * Bitmaps to enable each sensor on immediate and filtered modes, as
|
||
|
+ * described in MSRCTL1 and MONCTL0 registers below, respectively.
|
||
|
+ */
|
||
|
+ u32 sensor_imm_bitmap[] = { BIT(4), BIT(5), BIT(6), BIT(9) };
|
||
|
+ u32 sensor_filt_bitmap[] = { BIT(0), BIT(1), BIT(2), BIT(3) };
|
||
|
+
|
||
|
+ u32 *sensor_bitmap = lvts_ctrl->mode == LVTS_MSR_IMMEDIATE_MODE ?
|
||
|
+ sensor_imm_bitmap : sensor_filt_bitmap;
|
||
|
|
||
|
for (i = 0; i < lvts_ctrl->num_lvts_sensor; i++) {
|
||
|
|
||
|
@@ -1016,20 +1007,38 @@ static int lvts_ctrl_start(struct device
|
||
|
* map, so we can enable the temperature monitoring in
|
||
|
* the hardware thermal controller.
|
||
|
*/
|
||
|
- sensor_map |= BIT(i);
|
||
|
+ sensor_map |= sensor_bitmap[i];
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
- * Bits:
|
||
|
- * 9: Single point access flow
|
||
|
- * 0-3: Enable sensing point 0-3
|
||
|
- *
|
||
|
* The initialization of the thermal zones give us
|
||
|
* which sensor point to enable. If any thermal zone
|
||
|
* was not described in the device tree, it won't be
|
||
|
* enabled here in the sensor map.
|
||
|
*/
|
||
|
- writel(sensor_map | BIT(9), LVTS_MONCTL0(lvts_ctrl->base));
|
||
|
+ if (lvts_ctrl->mode == LVTS_MSR_IMMEDIATE_MODE) {
|
||
|
+ /*
|
||
|
+ * LVTS_MSRCTL1 : Measurement control
|
||
|
+ *
|
||
|
+ * Bits:
|
||
|
+ *
|
||
|
+ * 9: Ignore MSRCTL0 config and do immediate measurement on sensor3
|
||
|
+ * 6: Ignore MSRCTL0 config and do immediate measurement on sensor2
|
||
|
+ * 5: Ignore MSRCTL0 config and do immediate measurement on sensor1
|
||
|
+ * 4: Ignore MSRCTL0 config and do immediate measurement on sensor0
|
||
|
+ *
|
||
|
+ * That configuration will ignore the filtering and the delays
|
||
|
+ * introduced in MONCTL1 and MONCTL2
|
||
|
+ */
|
||
|
+ writel(sensor_map, LVTS_MSRCTL1(lvts_ctrl->base));
|
||
|
+ } else {
|
||
|
+ /*
|
||
|
+ * Bits:
|
||
|
+ * 9: Single point access flow
|
||
|
+ * 0-3: Enable sensing point 0-3
|
||
|
+ */
|
||
|
+ writel(sensor_map | BIT(9), LVTS_MONCTL0(lvts_ctrl->base));
|
||
|
+ }
|
||
|
|
||
|
return 0;
|
||
|
}
|