thermal/drivers/sun8i: Extend H6 calibration to support 4 sensors
authorMaksim Kiselev <bigunclemax@gmail.com>
Mon, 19 Feb 2024 15:36:36 +0000 (15:36 +0000)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Mon, 11 Mar 2024 16:14:46 +0000 (17:14 +0100)
The H616 SoC resembles the H6 thermal sensor controller, with a few
changes like four sensors.

Extend sun50i_h6_ths_calibrate() function to support calibration of
these sensors.

Co-developed-by: Martin Botka <martin.botka@somainline.org>
Signed-off-by: Martin Botka <martin.botka@somainline.org>
Signed-off-by: Maksim Kiselev <bigunclemax@gmail.com>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Acked-by: Vasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20240219153639.179814-5-andre.przywara@arm.com
drivers/thermal/sun8i_thermal.c

index 42bee03c4e5078b4331ff7bfdcfe7c8b158c499e..c919b0fd5e16932830a1152f7610fd1d25c442c0 100644 (file)
@@ -222,16 +222,21 @@ static int sun50i_h6_ths_calibrate(struct ths_device *tmdev,
        struct device *dev = tmdev->dev;
        int i, ft_temp;
 
-       if (!caldata[0] || callen < 2 + 2 * tmdev->chip->sensor_num)
+       if (!caldata[0])
                return -EINVAL;
 
        /*
         * efuse layout:
         *
-        *      0   11  16       32
-        *      +-------+-------+-------+
-        *      |temp|  |sensor0|sensor1|
-        *      +-------+-------+-------+
+        * 0      11  16     27   32     43   48    57
+        * +----------+-----------+-----------+-----------+
+        * |  temp |  |sensor0|   |sensor1|   |sensor2|   |
+        * +----------+-----------+-----------+-----------+
+        *                      ^           ^           ^
+        *                      |           |           |
+        *                      |           |           sensor3[11:8]
+        *                      |           sensor3[7:4]
+        *                      sensor3[3:0]
         *
         * The calibration data on the H6 is the ambient temperature and
         * sensor values that are filled during the factory test stage.
@@ -244,9 +249,16 @@ static int sun50i_h6_ths_calibrate(struct ths_device *tmdev,
        ft_temp = (caldata[0] & FT_TEMP_MASK) * 100;
 
        for (i = 0; i < tmdev->chip->sensor_num; i++) {
-               int sensor_reg = caldata[i + 1] & TEMP_CALIB_MASK;
-               int cdata, offset;
-               int sensor_temp = tmdev->chip->calc_temp(tmdev, i, sensor_reg);
+               int sensor_reg, sensor_temp, cdata, offset;
+
+               if (i == 3)
+                       sensor_reg = (caldata[1] >> 12)
+                                    | ((caldata[2] >> 12) << 4)
+                                    | ((caldata[3] >> 12) << 8);
+               else
+                       sensor_reg = caldata[i + 1] & TEMP_CALIB_MASK;
+
+               sensor_temp = tmdev->chip->calc_temp(tmdev, i, sensor_reg);
 
                /*
                 * Calibration data is CALIBRATE_DEFAULT - (calculated