| From 3e9c49981f84380adda47ae25762ee0039906203 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 6 Jul 2023 11:37:34 -0400 |
| Subject: thermal/drivers/mediatek/lvts_thermal: Use offset threshold for IRQ |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Nícolas F. R. A. Prado <nfraprado@collabora.com> |
| |
| [ Upstream commit f79e996c7ed27bb196facbcd1c69ee33631d7051 ] |
| |
| There are two kinds of temperature monitoring interrupts available: |
| * High Offset, Low Offset |
| * Hot, Hot to normal, Cold |
| |
| The code currently uses the hot/h2n/cold interrupts, however in a way |
| that doesn't work: the cold threshold is left uninitialized, which |
| prevents the other thresholds from ever triggering, and the h2n |
| interrupt is used as the lower threshold, which prevents the hot |
| interrupt from triggering again after the thresholds are updated by the |
| thermal framework, since a hot interrupt can only trigger again after |
| the hot to normal interrupt has been triggered. |
| |
| But better yet than addressing those issues, is to use the high/low |
| offset interrupts instead. This way only two thresholds need to be |
| managed, which have a simpler state machine, making them a better match |
| to the thermal framework's high and low thresholds. |
| |
| Fixes: f5f633b18234 ("thermal/drivers/mediatek: Add the Low Voltage Thermal Sensor driver") |
| 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/20230706153823.201943-4-nfraprado@collabora.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/thermal/mediatek/lvts_thermal.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/thermal/mediatek/lvts_thermal.c b/drivers/thermal/mediatek/lvts_thermal.c |
| index 64748153d181e..80abd10596d85 100644 |
| --- a/drivers/thermal/mediatek/lvts_thermal.c |
| +++ b/drivers/thermal/mediatek/lvts_thermal.c |
| @@ -296,9 +296,9 @@ static int lvts_set_trips(struct thermal_zone_device *tz, int low, int high) |
| u32 raw_high = lvts_temp_to_raw(high); |
| |
| /* |
| - * Hot to normal temperature threshold |
| + * Low offset temperature threshold |
| * |
| - * LVTS_H2NTHRE |
| + * LVTS_OFFSETL |
| * |
| * Bits: |
| * |
| @@ -307,13 +307,13 @@ static int lvts_set_trips(struct thermal_zone_device *tz, int low, int high) |
| if (low != -INT_MAX) { |
| pr_debug("%s: Setting low limit temperature interrupt: %d\n", |
| thermal_zone_device_type(tz), low); |
| - writel(raw_low, LVTS_H2NTHRE(base)); |
| + writel(raw_low, LVTS_OFFSETL(base)); |
| } |
| |
| /* |
| - * Hot temperature threshold |
| + * High offset temperature threshold |
| * |
| - * LVTS_HTHRE |
| + * LVTS_OFFSETH |
| * |
| * Bits: |
| * |
| @@ -321,7 +321,7 @@ static int lvts_set_trips(struct thermal_zone_device *tz, int low, int high) |
| */ |
| pr_debug("%s: Setting high limit temperature interrupt: %d\n", |
| thermal_zone_device_type(tz), high); |
| - writel(raw_high, LVTS_HTHRE(base)); |
| + writel(raw_high, LVTS_OFFSETH(base)); |
| |
| return 0; |
| } |
| -- |
| 2.40.1 |
| |