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 5f964f806187..2f8c5feb1a25 100644 --- a/drivers/thermal/qoriq_thermal.c +++ b/drivers/thermal/qoriq_thermal.c @@ -37,6 +37,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 */ @@ -62,8 +63,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