This is a backport of a2291badc355d58ead5c19ae0609468947416040 from thermal-soc accepted upstream. The IMX6Q/IMX6DL SoC's have a 2-bit temperature grade stored in OTP. Instead of assuming 85C for passive cooling threshold and 100C for critical base these thresholds off the thermal gade max CPU temperature: - passive threshold: max - 10C - critical threshold: max - 5C Signed-off-by: Tim Harvey <tharvey@gateworks.com> SVN-Revision: 48011master
parent
f0070d495e
commit
158b5b4231
@ -0,0 +1,114 @@ |
||||
Index: linux-4.3/drivers/thermal/imx_thermal.c |
||||
=================================================================== |
||||
--- linux-4.3.orig/drivers/thermal/imx_thermal.c 2015-11-01 16:05:25.000000000 -0800 |
||||
+++ linux-4.3/drivers/thermal/imx_thermal.c 2015-12-18 10:39:44.915158318 -0800 |
||||
@@ -55,6 +55,7 @@ |
||||
#define TEMPSENSE2_PANIC_VALUE_SHIFT 16 |
||||
#define TEMPSENSE2_PANIC_VALUE_MASK 0xfff0000 |
||||
|
||||
+#define OCOTP_MEM0 0x0480 |
||||
#define OCOTP_ANA1 0x04e0 |
||||
|
||||
/* The driver supports 1 passive trip point and 1 critical trip point */ |
||||
@@ -64,12 +65,6 @@ |
||||
IMX_TRIP_NUM, |
||||
}; |
||||
|
||||
-/* |
||||
- * It defines the temperature in millicelsius for passive trip point |
||||
- * that will trigger cooling action when crossed. |
||||
- */ |
||||
-#define IMX_TEMP_PASSIVE 85000 |
||||
- |
||||
#define IMX_POLLING_DELAY 2000 /* millisecond */ |
||||
#define IMX_PASSIVE_DELAY 1000 |
||||
|
||||
@@ -100,12 +95,14 @@ |
||||
u32 c1, c2; /* See formula in imx_get_sensor_data() */ |
||||
int temp_passive; |
||||
int temp_critical; |
||||
+ unsigned long temp_max; |
||||
int alarm_temp; |
||||
int last_temp; |
||||
bool irq_enabled; |
||||
int irq; |
||||
struct clk *thermal_clk; |
||||
const struct thermal_soc_data *socdata; |
||||
+ const char *temp_grade; |
||||
}; |
||||
|
||||
static void imx_set_panic_temp(struct imx_thermal_data *data, |
||||
@@ -285,10 +282,12 @@ |
||||
{ |
||||
struct imx_thermal_data *data = tz->devdata; |
||||
|
||||
+ /* do not allow changing critical threshold */ |
||||
if (trip == IMX_TRIP_CRITICAL) |
||||
return -EPERM; |
||||
|
||||
- if (temp > IMX_TEMP_PASSIVE) |
||||
+ /* do not allow passive to be set higher than critical */ |
||||
+ if (temp < 0 || temp > data->temp_critical) |
||||
return -EINVAL; |
||||
|
||||
data->temp_passive = temp; |
||||
@@ -404,17 +403,39 @@ |
||||
data->c1 = temp64; |
||||
data->c2 = n1 * data->c1 + 1000 * t1; |
||||
|
||||
- /* |
||||
- * Set the default passive cooling trip point, |
||||
- * can be changed from userspace. |
||||
- */ |
||||
- data->temp_passive = IMX_TEMP_PASSIVE; |
||||
+ /* use OTP for thermal grade */ |
||||
+ ret = regmap_read(map, OCOTP_MEM0, &val); |
||||
+ if (ret) { |
||||
+ dev_err(&pdev->dev, "failed to read temp grade: %d\n", ret); |
||||
+ return ret; |
||||
+ } |
||||
+ |
||||
+ /* The maximum die temp is specified by the Temperature Grade */ |
||||
+ switch ((val >> 6) & 0x3) { |
||||
+ case 0: /* Commercial (0 to 95C) */ |
||||
+ data->temp_grade = "Commercial"; |
||||
+ data->temp_max = 95000; |
||||
+ break; |
||||
+ case 1: /* Extended Commercial (-20 to 105C) */ |
||||
+ data->temp_grade = "Extended Commercial"; |
||||
+ data->temp_max = 105000; |
||||
+ break; |
||||
+ case 2: /* Industrial (-40 to 105C) */ |
||||
+ data->temp_grade = "Industrial"; |
||||
+ data->temp_max = 105000; |
||||
+ break; |
||||
+ case 3: /* Automotive (-40 to 125C) */ |
||||
+ data->temp_grade = "Automotive"; |
||||
+ data->temp_max = 125000; |
||||
+ break; |
||||
+ } |
||||
|
||||
/* |
||||
- * The maximum die temperature set to 20 C higher than |
||||
- * IMX_TEMP_PASSIVE. |
||||
+ * Set the critical trip point at 5C under max |
||||
+ * Set the passive trip point at 10C under max (can change via sysfs) |
||||
*/ |
||||
- data->temp_critical = 1000 * 20 + data->temp_passive; |
||||
+ data->temp_critical = data->temp_max - (1000 * 5); |
||||
+ data->temp_passive = data->temp_max - (1000 * 10); |
||||
|
||||
return 0; |
||||
} |
||||
@@ -559,6 +580,11 @@ |
||||
return ret; |
||||
} |
||||
|
||||
+ dev_info(&pdev->dev, "%s CPU temperature grade - max:%ldC" |
||||
+ " critical:%ldC passive:%ldC\n", data->temp_grade, |
||||
+ data->temp_max / 1000, data->temp_critical / 1000, |
||||
+ data->temp_passive / 1000); |
||||
+ |
||||
/* Enable measurements at ~ 10 Hz */ |
||||
regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ); |
||||
measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */ |
Loading…
Reference in new issue