thermal: imx_tmu: Check the TEMP range for iMX8MM
authorPeng Fan <peng.fan@nxp.com>
Sun, 3 May 2020 14:19:50 +0000 (22:19 +0800)
committerStefano Babic <sbabic@denx.de>
Sun, 10 May 2020 18:55:20 +0000 (20:55 +0200)
On iMX8MM, the V flag in TRISTR register only reflect the state of SNSR
value, not the calibrated TEMP value. So checking this flag is not
reliable. Per IC suggestion, change to read the TEMP/AVG_TEMP directly
and check whether it in valid range 10-125C.

Signed-off-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
drivers/thermal/imx_tmu.c

index 2a08d5085cfda35b809e7d4a87938de4ab485114..c577b0bd6cd6bff9b59c9871d3f78052d88b9c08 100644 (file)
@@ -106,16 +106,24 @@ static int read_temperature(struct udevice *dev, int *temp)
        ulong drv_data = dev_get_driver_data(dev);
        u32 val;
        u32 retry = 10;
+       u32 valid = 0;
 
        do {
                mdelay(100);
                retry--;
 
-               if (drv_data & FLAGS_VER2)
+               if (drv_data & FLAGS_VER2) {
                        val = readl(&pdata->regs->regs_v2.tritsr);
-               else
+                       /*
+                        * Check if TEMP is in valid range, the V bit in TRITSR
+                        * only reflects the RAW uncalibrated data
+                        */
+                       valid =  ((val & 0xff) < 10 || (val & 0xff) > 125) ? 0 : 1;
+               } else {
                        val = readl(&pdata->regs->regs_v1.site[pdata->id].tritsr);
-       } while (!(val & 0x80000000) && retry > 0);
+                       valid = val & 0x80000000;
+               }
+       } while (!valid && retry > 0);
 
        if (retry > 0)
                *temp = (val & 0xff) * 1000;