Message ID | 20200503141957.14635-7-peng.fan@nxp.com |
---|---|
State | Accepted |
Commit | 951bf19dae2198c7684e4bb3f1eae10ba60d3677 |
Headers | show |
Series | imx: tmu support and scu thermal update | expand |
> 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 at nxp.com> > Signed-off-by: Peng Fan <peng.fan at nxp.com> Applied to u-boot-imx, master, thanks ! Best regards, Stefano Babic
diff --git a/drivers/thermal/imx_tmu.c b/drivers/thermal/imx_tmu.c index 2a08d5085c..c577b0bd6c 100644 --- a/drivers/thermal/imx_tmu.c +++ b/drivers/thermal/imx_tmu.c @@ -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;