diff options
author | Anson Huang <b20788@freescale.com> | 2013-03-22 09:16:12 +0800 |
---|---|---|
committer | Jason Liu <r64343@freescale.com> | 2013-03-27 17:44:07 +0800 |
commit | fede41cf7a04d144562cae71cf39a0a71495bf09 (patch) | |
tree | a052f6606911386aef7aa6615e00789a2692b7c5 | |
parent | f85867638e24e78f9fdaf9dd05b403e5f45cfda8 (diff) | |
download | u-boot-imx-imx_v2009.08_12.09.01.zip u-boot-imx-imx_v2009.08_12.09.01.tar.gz u-boot-imx-imx_v2009.08_12.09.01.tar.bz2 |
ENGR00255481 mx6: Update equation for thermal sensorrel_imx_3.0.35_1.0.3imx_v2009.08_12.09.01
Use universal equation and 25C's calibration data to
get thermal sensor's ratio.
Signed-off-by: Anson Huang <b20788@freescale.com>
-rw-r--r-- | cpu/arm_cortexa8/mx6/generic.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/cpu/arm_cortexa8/mx6/generic.c b/cpu/arm_cortexa8/mx6/generic.c index 748a2cf..1da1f7c 100644 --- a/cpu/arm_cortexa8/mx6/generic.c +++ b/cpu/arm_cortexa8/mx6/generic.c @@ -105,6 +105,9 @@ enum pll_clocks { #define TEMPERATURE_HOT 80 #define TEMPERATURE_MAX 125 #define REG_VALUE_TO_CEL(ratio, raw) ((raw_n40c - raw) * 100 / ratio - 40) +#define FACTOR1 15976 +#define FACTOR2 4297157 + static int cpu_tmp; static unsigned int fuse; @@ -869,7 +872,7 @@ static inline int read_cpu_temperature(void) MXC_CCM_CCGR2); fuse = readl(OCOTP_BASE_ADDR + OCOTP_THERMAL_OFFSET); writel(ccm_ccgr2, MXC_CCM_CCGR2); - if (fuse == 0 || fuse == 0xffffffff) + if (fuse == 0 || fuse == 0xffffffff || (fuse & 0xfff00000) == 0) return TEMPERATURE_MIN; /* Fuse data layout: @@ -880,7 +883,25 @@ static inline int read_cpu_temperature(void) raw_hot = (fuse & 0xfff00) >> 8; hot_temp = fuse & 0xff; + /* + * Only when it is i.MX6Q and high temperature calibration + * data not used, we use universal equation to get thermal + * sensor's ratio. + */ +#if (defined(CONFIG_MX6Q) && !defined(USE_CALIBRATION)) + /* + * The universal equation for thermal sensor + * is slope = 0.4297157 - (0.0015976 * 25C fuse), + * here we convert them to integer to make them + * easy for counting, FACTOR1 is 15976, + * FACTOR2 is 4297157. Our ratio = -100 * slope. + */ + ratio = ((FACTOR1 * raw_25c - FACTOR2) + 50000) / 100000; +#else ratio = ((raw_25c - raw_hot) * 100) / (hot_temp - 25); +#endif + + printf("Thermal sensor with ratio = %d\n", ratio); raw_n40c = raw_25c + (13 * ratio) / 20; /* now we only using single measure, every time we measure |