diff --git a/cpu/arm_cortexa8/mx6/generic.c b/cpu/arm_cortexa8/mx6/generic.c
index 724fcd8e4f6bff08ef875b384de02db6646ea510..ae8e152237b51b1d9cf5df953aefe93aaab6558e 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