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.smir...@gmail.com>
Reviewed-by: Daniel Lezcano <daniel.lezc...@linaro.org>
Tested-by: Lucas Stach <l.st...@pengutronix.de>
Cc: Chris Healy <cphe...@gmail.com>
Cc: Lucas Stach <l.st...@pengutronix.de>
Cc: Eduardo Valentin <edubez...@gmail.com>
Cc: Daniel Lezcano <daniel.lezc...@linaro.org>
Cc: Angus Ainslie (Purism) <an...@akkea.ca>
Cc: linux-...@nxp.com
Cc: linux...@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/thermal/qoriq_thermal.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/thermal/qoriq_thermal.c b/drivers/thermal/qoriq_thermal.c
index 1cc53a4a5c47..48853192514a 100644
--- a/drivers/thermal/qoriq_thermal.c
+++ b/drivers/thermal/qoriq_thermal.c
@@ -38,6 +38,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
                                           */
@@ -64,8 +65,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;
-- 
2.21.0

Reply via email to