summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/mxc/thermal/thermal.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/drivers/mxc/thermal/thermal.c b/drivers/mxc/thermal/thermal.c
index 0982a7b781bd..21ff18fb14fd 100644
--- a/drivers/mxc/thermal/thermal.c
+++ b/drivers/mxc/thermal/thermal.c
@@ -3,7 +3,7 @@
*
* Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
* Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
- * Copyright (C) 2011-2012 Freescale Semiconductor, Inc.
+ * Copyright (C) 2011-2013 Freescale Semiconductor, Inc.
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* This program is free software; you can redistribute it and/or modify
@@ -43,6 +43,7 @@
#include <linux/cpufreq.h>
#include <linux/clk.h>
#include "anatop_driver.h"
+#include <mach/hardware.h>
/* register define of anatop */
#define HW_ANADIG_ANA_MISC0 (0x00000150)
@@ -137,6 +138,9 @@
#define ANATOP_DEBUG false
#define THERMAL_FUSE_NAME "/sys/fsl_otp/HW_OCOTP_ANA1"
+#define FACTOR1 15976
+#define FACTOR2 4297157
+
/* variables */
unsigned long anatop_base;
unsigned int ratio;
@@ -147,6 +151,7 @@ static bool suspend_flag;
static unsigned int thermal_irq;
bool cooling_cpuhotplug;
bool cooling_device_disable;
+static bool calibration_valid;
unsigned long temperature_cooling;
static const struct anatop_device_id thermal_device_ids[] = {
{ANATOP_THERMAL_HID},
@@ -824,12 +829,22 @@ static int __init anatop_thermal_cooling_device_disable(char *str)
}
__setup("no_cooling_device", anatop_thermal_cooling_device_disable);
+static int __init anatop_thermal_use_calibration(char *str)
+{
+ calibration_valid = true;
+ pr_info("%s: use calibration data for thermal sensor!\n", __func__);
+
+ return 1;
+}
+__setup("use_calibration", anatop_thermal_use_calibration);
+
static int anatop_thermal_counting_ratio(unsigned int fuse_data)
{
int ret = -EINVAL;
pr_info("Thermal calibration data is 0x%x\n", fuse_data);
- if (fuse_data == 0 || fuse_data == 0xffffffff || (fuse_data & 0xff) == 0) {
+ if (fuse_data == 0 || fuse_data == 0xffffffff ||
+ (fuse_data & 0xfff00000) == 0) {
pr_info("%s: invalid calibration data, disable cooling!!!\n", __func__);
cooling_device_disable = true;
ratio = DEFAULT_RATIO;
@@ -846,7 +861,19 @@ static int anatop_thermal_counting_ratio(unsigned int fuse_data)
raw_hot = (fuse_data & 0xfff00) >> 8;
hot_temp = fuse_data & 0xff;
- ratio = ((raw_25c - raw_hot) * 100) / (hot_temp - 25);
+ if (!calibration_valid && cpu_is_mx6q())
+ /*
+ * 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,
+ * FACTORs is 4297157. Our ratio = -100 * slope.
+ */
+ ratio = ((FACTOR1 * raw_25c - FACTOR2) + 50000) / 100000;
+ else
+ ratio = ((raw_25c - raw_hot) * 100) / (hot_temp - 25);
+
+ pr_info("Thermal sensor with ratio = %d\n", ratio);
raw_n40c = raw_25c + (13 * ratio) / 20;
raw_125c = raw_25c - ratio;
/* Init default critical temp to set alarm */