123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- From 6d827142643ee10c13ff9a1d90f38fb399aa9fff Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?=
- <[email protected]>
- 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 <[email protected]>
- Tested-by: Chen-Yu Tsai <[email protected]>
- Signed-off-by: Nícolas F. R. A. Prado <[email protected]>
- Reviewed-by: Alexandre Mergnat <[email protected]>
- Signed-off-by: Daniel Lezcano <[email protected]>
- Link: https://lore.kernel.org/r/[email protected]
- ---
- 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;
- }
|