thermal: qoriq: Update the settings for TMUv2
authorYuantian Tang <andy.tang@nxp.com>
Tue, 26 May 2020 06:02:12 +0000 (14:02 +0800)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Fri, 29 May 2020 18:26:51 +0000 (20:26 +0200)
For TMU v2, TMSAR registers need to be set properly to get the
accurate temperature values.
Also the temperature read needs to be converted to degree Celsius
since it is in degrees Kelvin.

Signed-off-by: Yuantian Tang <andy.tang@nxp.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20200526060212.4118-1-andy.tang@nxp.com
drivers/thermal/qoriq_thermal.c

index 028a6bb..73049f9 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/regmap.h>
 #include <linux/sizes.h>
 #include <linux/thermal.h>
+#include <linux/units.h>
 
 #include "thermal_core.h"
 #include "thermal_hwmon.h"
@@ -23,6 +24,7 @@
 #define TMTMIR_DEFAULT 0x0000000f
 #define TIER_DISABLE   0x0
 #define TEUMR0_V2              0x51009c00
+#define TMSARA_V2              0xe
 #define TMU_VER1               0x1
 #define TMU_VER2               0x2
 
@@ -50,6 +52,9 @@
                                            * Site Register
                                            */
 #define TRITSR_V       BIT(31)
+#define REGS_V2_TMSAR(n)       (0x304 + 16 * (n))      /* TMU monitoring
+                                               * site adjustment register
+                                               */
 #define REGS_TTRnCR(n) (0xf10 + 4 * (n)) /* Temperature Range n
                                           * Control Register
                                           */
@@ -85,12 +90,21 @@ static int tmu_get_temp(void *p, int *temp)
        /*
         * REGS_TRITSR(id) has the following layout:
         *
+        * For TMU Rev1:
         * 31  ... 7 6 5 4 3 2 1 0
         *  V          TEMP
         *
         * Where V bit signifies if the measurement is ready and is
         * within sensor range. TEMP is an 8 bit value representing
-        * temperature in C.
+        * temperature in Celsius.
+
+        * For TMU Rev2:
+        * 31  ... 8 7 6 5 4 3 2 1 0
+        *  V          TEMP
+        *
+        * Where V bit signifies if the measurement is ready and is
+        * within sensor range. TEMP is an 9 bit value representing
+        * temperature in KelVin.
         */
        if (regmap_read_poll_timeout(qdata->regmap,
                                     REGS_TRITSR(qsensor->id),
@@ -100,7 +114,10 @@ static int tmu_get_temp(void *p, int *temp)
                                     10 * USEC_PER_MSEC))
                return -ENODATA;
 
-       *temp = (val & 0xff) * 1000;
+       if (qdata->ver == TMU_VER1)
+               *temp = (val & GENMASK(7, 0)) * MILLIDEGREE_PER_DEGREE;
+       else
+               *temp = kelvin_to_millicelsius(val & GENMASK(8, 0));
 
        return 0;
 }
@@ -192,6 +209,8 @@ static int qoriq_tmu_calibration(struct device *dev,
 
 static void qoriq_tmu_init_device(struct qoriq_tmu_data *data)
 {
+       int i;
+
        /* Disable interrupt, using polling instead */
        regmap_write(data->regmap, REGS_TIER, TIER_DISABLE);
 
@@ -202,6 +221,8 @@ static void qoriq_tmu_init_device(struct qoriq_tmu_data *data)
        } else {
                regmap_write(data->regmap, REGS_V2_TMTMIR, TMTMIR_DEFAULT);
                regmap_write(data->regmap, REGS_V2_TEUMR(0), TEUMR0_V2);
+               for (i = 0; i < SITES_MAX; i++)
+                       regmap_write(data->regmap, REGS_V2_TMSAR(i), TMSARA_V2);
        }
 
        /* Disable monitoring */
@@ -212,6 +233,7 @@ static const struct regmap_range qoriq_yes_ranges[] = {
        regmap_reg_range(REGS_TMR, REGS_TSCFGR),
        regmap_reg_range(REGS_TTRnCR(0), REGS_TTRnCR(3)),
        regmap_reg_range(REGS_V2_TEUMR(0), REGS_V2_TEUMR(2)),
+       regmap_reg_range(REGS_V2_TMSAR(0), REGS_V2_TMSAR(15)),
        regmap_reg_range(REGS_IPBRR(0), REGS_IPBRR(1)),
        /* Read only registers below */
        regmap_reg_range(REGS_TRITSR(0), REGS_TRITSR(15)),