summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnson Huang <b20788@freescale.com>2013-03-22 09:16:12 +0800
committerAnson Huang <b20788@freescale.com>2013-03-27 16:42:59 -0400
commit7232c7ce56a9743996814783a886f5c299b5bbc2 (patch)
tree2a3785dabd1acef2c9095cc3b38354ba24d61f7b
parent82a4725015d9e0e31544c0ab853ef8f2889c53f2 (diff)
ENGR00255481 mx6: Update equation for thermal sensor
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.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/cpu/arm_cortexa8/mx6/generic.c b/cpu/arm_cortexa8/mx6/generic.c
index 8f0f1e670c..880374d25a 100644
--- a/cpu/arm_cortexa8/mx6/generic.c
+++ b/cpu/arm_cortexa8/mx6/generic.c
@@ -108,6 +108,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;
@@ -877,7 +880,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:
@@ -888,7 +891,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