thermal: brcmstb_thermal: Do not use DT coefficients
authorFlorian Fainelli <f.fainelli@gmail.com>
Tue, 14 Jan 2020 19:06:02 +0000 (11:06 -0800)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Mon, 27 Jan 2020 10:41:08 +0000 (11:41 +0100)
At the time the brcmstb_thermal driver and its binding were merged, the
DT binding did not make the coefficients properties a mandatory one,
therefore all users of the brcmstb_thermal driver out there have a non
functional implementation with zero coefficients. Even if these
properties were provided, the formula used for computation is incorrect.

The coefficients are entirely process specific (right now, only 28nm is
supported) and not board or SoC specific, it is therefore appropriate to
hard code them in the driver given the compatibility string we are
probed with which has to be updated whenever a new process is
introduced.

We remove the existing coefficients definition since subsequent patches
are going to add support for a new process and will introduce new
coefficients as well.

Fixes: 9e03cf1b2dd5 ("thermal: add brcmstb AVS TMON driver")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Amit Kucheria <amit.kucheria@linaro.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20200114190607.29339-2-f.fainelli@gmail.com
drivers/thermal/broadcom/brcmstb_thermal.c

index 5825ac581f56367e47f8ee70e4e180b4bd8fcb8c..680f1a0706065ba87d8bc8353f2fe1dcf8eafddf 100644 (file)
@@ -49,7 +49,7 @@
 #define AVS_TMON_TP_TEST_ENABLE                0x20
 
 /* Default coefficients */
-#define AVS_TMON_TEMP_SLOPE            -487
+#define AVS_TMON_TEMP_SLOPE            487
 #define AVS_TMON_TEMP_OFFSET           410040
 
 /* HW related temperature constants */
@@ -108,23 +108,12 @@ struct brcmstb_thermal_priv {
        struct thermal_zone_device *thermal;
 };
 
-static void avs_tmon_get_coeffs(struct thermal_zone_device *tz, int *slope,
-                               int *offset)
-{
-       *slope = thermal_zone_get_slope(tz);
-       *offset = thermal_zone_get_offset(tz);
-}
-
 /* Convert a HW code to a temperature reading (millidegree celsius) */
 static inline int avs_tmon_code_to_temp(struct thermal_zone_device *tz,
                                        u32 code)
 {
-       const int val = code & AVS_TMON_TEMP_MASK;
-       int slope, offset;
-
-       avs_tmon_get_coeffs(tz, &slope, &offset);
-
-       return slope * val + offset;
+       return (AVS_TMON_TEMP_OFFSET -
+               (int)((code & AVS_TMON_TEMP_MAX) * AVS_TMON_TEMP_SLOPE));
 }
 
 /*
@@ -136,20 +125,18 @@ static inline int avs_tmon_code_to_temp(struct thermal_zone_device *tz,
 static inline u32 avs_tmon_temp_to_code(struct thermal_zone_device *tz,
                                        int temp, bool low)
 {
-       int slope, offset;
-
        if (temp < AVS_TMON_TEMP_MIN)
-               return AVS_TMON_TEMP_MAX; /* Maximum code value */
-
-       avs_tmon_get_coeffs(tz, &slope, &offset);
+               return AVS_TMON_TEMP_MAX;       /* Maximum code value */
 
-       if (temp >= offset)
+       if (temp >= AVS_TMON_TEMP_OFFSET)
                return 0;       /* Minimum code value */
 
        if (low)
-               return (u32)(DIV_ROUND_UP(offset - temp, abs(slope)));
+               return (u32)(DIV_ROUND_UP(AVS_TMON_TEMP_OFFSET - temp,
+                                         AVS_TMON_TEMP_SLOPE));
        else
-               return (u32)((offset - temp) / abs(slope));
+               return (u32)((AVS_TMON_TEMP_OFFSET - temp) /
+                             AVS_TMON_TEMP_SLOPE);
 }
 
 static int brcmstb_get_temp(void *data, int *temp)