OSDN Git Service

thermal: qoriq: Do not report invalid temperature reading
authorAndrey Smirnov <andrew.smirnov@gmail.com>
Tue, 10 Dec 2019 16:41:51 +0000 (08:41 -0800)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Mon, 27 Jan 2020 09:24:32 +0000 (10:24 +0100)
Before returning measured temperature data to upper layer we need to
make sure that the reading was marked as "valid" to avoid reporting
bogus data.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Reviewed-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Tested-by: Lucas Stach <l.stach@pengutronix.de>
Cc: Chris Healy <cphealy@gmail.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Eduardo Valentin <edubezval@gmail.com>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Angus Ainslie (Purism) <angus@akkea.ca>
Cc: linux-imx@nxp.com
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20191210164153.10463-11-andrew.smirnov@gmail.com
drivers/thermal/qoriq_thermal.c

index 9a45594..1730dbe 100644 (file)
@@ -49,6 +49,7 @@
 #define REGS_TRITSR(n) (0x100 + 16 * (n)) /* Immediate Temperature
                                            * Site Register
                                            */
+#define TRITSR_V       BIT(31)
 #define REGS_TTRnCR(n) (0xf10 + 4 * (n)) /* Temperature Range n
                                           * Control Register
                                           */
@@ -81,8 +82,24 @@ static int tmu_get_temp(void *p, int *temp)
        struct qoriq_sensor *qsensor = p;
        struct qoriq_tmu_data *qdata = qoriq_sensor_to_data(qsensor);
        u32 val;
+       /*
+        * REGS_TRITSR(id) has the following layout:
+        *
+        * 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.
+        */
+       if (regmap_read_poll_timeout(qdata->regmap,
+                                    REGS_TRITSR(qsensor->id),
+                                    val,
+                                    val & TRITSR_V,
+                                    USEC_PER_MSEC,
+                                    10 * USEC_PER_MSEC))
+               return -ENODATA;
 
-       regmap_read(qdata->regmap, REGS_TRITSR(qsensor->id), &val);
        *temp = (val & 0xff) * 1000;
 
        return 0;