summaryrefslogtreecommitdiff
path: root/patches.tizen/0977-thermal-imx-dynamic-passive-and-SoC-specific-critica.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0977-thermal-imx-dynamic-passive-and-SoC-specific-critica.patch')
-rw-r--r--patches.tizen/0977-thermal-imx-dynamic-passive-and-SoC-specific-critica.patch124
1 files changed, 124 insertions, 0 deletions
diff --git a/patches.tizen/0977-thermal-imx-dynamic-passive-and-SoC-specific-critica.patch b/patches.tizen/0977-thermal-imx-dynamic-passive-and-SoC-specific-critica.patch
new file mode 100644
index 00000000000..dd6c4d1c90c
--- /dev/null
+++ b/patches.tizen/0977-thermal-imx-dynamic-passive-and-SoC-specific-critica.patch
@@ -0,0 +1,124 @@
+From 84a52af3b15abc8894ba8b44defade561c2a9e9c Mon Sep 17 00:00:00 2001
+From: Philipp Zabel <p.zabel@pengutronix.de>
+Date: Thu, 1 Aug 2013 18:33:11 +0200
+Subject: [PATCH 0977/1302] thermal: imx: dynamic passive and SoC specific
+ critical trip points
+
+Set passive and critical trip point values depending on the maximum die
+temperature stored in the OCOTP fuses. This allows higher trip points
+for industrial and automotive rated i.MX6 SoCs.
+Also allow to configure the passive trip point from userspace.
+
+Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
+Acked-by: Shawn Guo <shawn.guo@linaro.org>
+Signed-off-by: Zhang Rui <rui.zhang@intel.com>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/thermal/imx_thermal.c | 50 ++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 40 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
+index d16c33c..c9a55b02 100644
+--- a/drivers/thermal/imx_thermal.c
++++ b/drivers/thermal/imx_thermal.c
+@@ -55,12 +55,6 @@ enum imx_thermal_trip {
+ */
+ #define IMX_TEMP_PASSIVE 85000
+
+-/*
+- * The maximum die temperature on imx parts is 105C, let's give some cushion
+- * for noise and possible temperature rise between measurements.
+- */
+-#define IMX_TEMP_CRITICAL 100000
+-
+ #define IMX_POLLING_DELAY 2000 /* millisecond */
+ #define IMX_PASSIVE_DELAY 1000
+
+@@ -70,6 +64,8 @@ struct imx_thermal_data {
+ enum thermal_device_mode mode;
+ struct regmap *tempmon;
+ int c1, c2; /* See formula in imx_get_sensor_data() */
++ unsigned long temp_passive;
++ unsigned long temp_critical;
+ };
+
+ static int imx_get_temp(struct thermal_zone_device *tz, unsigned long *temp)
+@@ -156,15 +152,35 @@ static int imx_get_trip_type(struct thermal_zone_device *tz, int trip,
+ static int imx_get_crit_temp(struct thermal_zone_device *tz,
+ unsigned long *temp)
+ {
+- *temp = IMX_TEMP_CRITICAL;
++ struct imx_thermal_data *data = tz->devdata;
++
++ *temp = data->temp_critical;
+ return 0;
+ }
+
+ static int imx_get_trip_temp(struct thermal_zone_device *tz, int trip,
+ unsigned long *temp)
+ {
+- *temp = (trip == IMX_TRIP_PASSIVE) ? IMX_TEMP_PASSIVE :
+- IMX_TEMP_CRITICAL;
++ struct imx_thermal_data *data = tz->devdata;
++
++ *temp = (trip == IMX_TRIP_PASSIVE) ? data->temp_passive :
++ data->temp_critical;
++ return 0;
++}
++
++static int imx_set_trip_temp(struct thermal_zone_device *tz, int trip,
++ unsigned long temp)
++{
++ struct imx_thermal_data *data = tz->devdata;
++
++ if (trip == IMX_TRIP_CRITICAL)
++ return -EPERM;
++
++ if (temp > IMX_TEMP_PASSIVE)
++ return -EINVAL;
++
++ data->temp_passive = temp;
++
+ return 0;
+ }
+
+@@ -211,6 +227,7 @@ static const struct thermal_zone_device_ops imx_tz_ops = {
+ .get_trip_type = imx_get_trip_type,
+ .get_trip_temp = imx_get_trip_temp,
+ .get_crit_temp = imx_get_crit_temp,
++ .set_trip_temp = imx_set_trip_temp,
+ };
+
+ static int imx_get_sensor_data(struct platform_device *pdev)
+@@ -267,6 +284,18 @@ static int imx_get_sensor_data(struct platform_device *pdev)
+ data->c1 = 1000 * (t1 - t2) / (n1 - n2);
+ data->c2 = 1000 * t2 - data->c1 * n2;
+
++ /*
++ * Set the default passive cooling trip point to 20 °C below the
++ * maximum die temperature. Can be changed from userspace.
++ */
++ data->temp_passive = 1000 * (t2 - 20);
++
++ /*
++ * The maximum die temperature is t2, let's give 5 °C cushion
++ * for noise and possible temperature rise between measurements.
++ */
++ data->temp_critical = 1000 * (t2 - 5);
++
+ return 0;
+ }
+
+@@ -314,7 +343,8 @@ static int imx_thermal_probe(struct platform_device *pdev)
+ }
+
+ data->tz = thermal_zone_device_register("imx_thermal_zone",
+- IMX_TRIP_NUM, 0, data,
++ IMX_TRIP_NUM,
++ BIT(IMX_TRIP_PASSIVE), data,
+ &imx_tz_ops, NULL,
+ IMX_PASSIVE_DELAY,
+ IMX_POLLING_DELAY);
+--
+1.8.3.2
+