thermal: imx: update to new formula according to NXP AN5215
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Thu, 30 Nov 2017 09:17:38 +0000 (10:17 +0100)
committerEduardo Valentin <edubezval@gmail.com>
Mon, 1 Jan 2018 19:49:01 +0000 (11:49 -0800)
According to an application note from 03/2017 there is an updated formula to
calculate the temperature that better matches reality. This is implemented here.

While updating move the magic constants from cpp defines which are far above the
explaining formula to constants in the code just under the explaining comment.

Reviewed-by: Leonard Crestez <leonard.crestez@nxp.com>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
drivers/thermal/imx_thermal.c

index 41e15cf..a67781b 100644 (file)
@@ -70,10 +70,6 @@ enum imx_thermal_trip {
 #define IMX_POLLING_DELAY              2000 /* millisecond */
 #define IMX_PASSIVE_DELAY              1000
 
-#define FACTOR0                                10000000
-#define FACTOR1                                15976
-#define FACTOR2                                4297157
-
 #define TEMPMON_IMX6Q                  1
 #define TEMPMON_IMX6SX                 2
 
@@ -350,7 +346,7 @@ static struct thermal_zone_device_ops imx_tz_ops = {
 static int imx_init_calib(struct platform_device *pdev, u32 ocotp_ana1)
 {
        struct imx_thermal_data *data = platform_get_drvdata(pdev);
-       int t1, n1;
+       int n1;
        u64 temp64;
 
        if (ocotp_ana1 == 0 || ocotp_ana1 == ~0) {
@@ -365,25 +361,25 @@ static int imx_init_calib(struct platform_device *pdev, u32 ocotp_ana1)
         * To find the actual temperature T, the following formula has to be used
         * when reading value n from the sensor:
         *
-        * T = T1 + (N - N1) / (0.4297157 - 0.0015976 * N1) °C
-        *   = [T1 - N1 / (0.4297157 - 0.0015976 * N1) °C] + N / (0.4297157 - 0.0015976 * N1) °C
-        *   = [T1 + N1 / (0.0015976 * N1 - 0.4297157) °C] - N / (0.0015976 * N1 - 0.4297157) °C
+        * T = T1 + (N - N1) / (0.4148468 - 0.0015423 * N1) °C + 3.580661 °C
+        *   = [T1' - N1 / (0.4148468 - 0.0015423 * N1) °C] + N / (0.4148468 - 0.0015423 * N1) °C
+        *   = [T1' + N1 / (0.0015423 * N1 - 0.4148468) °C] - N / (0.0015423 * N1 - 0.4148468) °C
         *   = c2 - c1 * N
         *
         * with
         *
-        *   c1 = 1 / (0.0015976 * N1 - 0.4297157) °C
-        *   c2 = T1 + N1 / (0.0015976 * N1 - 0.4297157) °C
-        *      = T1 + N1 * C1
+        *  T1' = 28.580661 °C
+        *   c1 = 1 / (0.0015423 * N1 - 0.4297157) °C
+        *   c2 = T1' + N1 / (0.0015423 * N1 - 0.4148468) °C
+        *      = T1' + N1 * c1
         */
        n1 = ocotp_ana1 >> 20;
-       t1 = 25; /* °C */
 
-       temp64 = FACTOR0; /* 10^7 for FACTOR1 and FACTOR2 */
+       temp64 = 10000000; /* use 10^7 as fixed point constant for values in formula */
        temp64 *= 1000; /* to get result in °mC */
-       do_div(temp64, FACTOR1 * n1 - FACTOR2);
+       do_div(temp64, 15423 * n1 - 4148468);
        data->c1 = temp64;
-       data->c2 = n1 * data->c1 + 1000 * t1;
+       data->c2 = n1 * data->c1 + 28581;
 
        return 0;
 }