arm: tegra: thermal: Low temp to therm algorithm
Joshua Primero [Sun, 18 Dec 2011 23:44:25 +0000 (15:44 -0800)]
Instead of using 0C as default low temp in thermal
algorithm, query the thermal device driver for
lowest supported temperature.

Change-Id: Id1f70380ba476dec80e36ce79b42ab6f24a5d5ba
Signed-off-by: Joshua Primero <jprimero@nvidia.com>
Reviewed-on: http://git-master/r/70935
Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>

Rebase-Id: Rdbf4ea3ed04b02216a4358864949a3a0c09e62aa

arch/arm/mach-tegra/include/mach/thermal.h
arch/arm/mach-tegra/tegra3_thermal.c
arch/arm/mach-tegra/tegra3_tsensor.c

index b46dcb8..ab7b344 100644 (file)
@@ -40,6 +40,7 @@ struct tegra_thermal_device {
        void *data;
        long offset;
        int (*get_temp) (void *, long *);
+       int (*get_temp_low)(void *, long *);
        int (*set_limits) (void *, long, long);
        int (*set_alert)(void *, void (*)(void *), void *);
        int (*set_shutdown_temp)(void *, long);
index be4e7c0..8ad7bd5 100644 (file)
@@ -174,6 +174,7 @@ void tegra_thermal_alert(void *data)
        long temp_dev, temp_tj;
        long lo_limit_throttle_tj, hi_limit_throttle_tj;
        long lo_limit_edp_tj = 0, hi_limit_edp_tj = 0;
+       long temp_low_dev, temp_low_tj;
        int lo_limit_tj = 0, hi_limit_tj = 0;
 #ifdef CONFIG_TEGRA_EDP_LIMITS
        const struct tegra_edp_limits *z;
@@ -202,8 +203,10 @@ void tegra_thermal_alert(void *data)
        /* Convert all temps to tj and then do all work/logic in terms of
           tj in order to avoid confusion */
        temp_tj = dev2tj(thermal->device, temp_dev);
+       thermal->device->get_temp_low(thermal->device, &temp_low_dev);
+       temp_low_tj = dev2tj(thermal->device, temp_low_dev);
 
-       lo_limit_throttle_tj = dev2tj(thermal->device, 0);
+       lo_limit_throttle_tj = temp_low_tj;
        hi_limit_throttle_tj = thermal->temp_throttle_tj;
 
 #ifndef CONFIG_TEGRA_THERMAL_SYSFS
@@ -228,7 +231,7 @@ void tegra_thermal_alert(void *data)
 #define EDP_TEMP_TJ(_index)    edp2tj(thermal, z[_index].temperature * 1000)
 
        if (temp_tj < EDP_TEMP_TJ(0)) {
-               lo_limit_edp_tj = dev2tj(thermal->device, 0);
+               lo_limit_edp_tj = temp_low_tj;
                hi_limit_edp_tj = EDP_TEMP_TJ(0);
        } else if (temp_tj >= EDP_TEMP_TJ(zones_sz-1)) {
                lo_limit_edp_tj = EDP_TEMP_TJ(zones_sz-1) -
@@ -247,7 +250,7 @@ void tegra_thermal_alert(void *data)
        }
 #undef EDP_TEMP_TJ
 #else
-       lo_limit_edp_tj = 0;
+       lo_limit_edp_tj = temp_low_tj;
        hi_limit_edp_tj = thermal->temp_shutdown_tj;
 #endif
 
index 9e027c8..a19a997 100644 (file)
@@ -62,6 +62,12 @@ static int tsensor_get_temp(void *vdata, long *milli_temp)
        return tsensor_thermal_get_temp(data, milli_temp);
 }
 
+static int tsensor_get_temp_low(void *vdata, long *milli_temp)
+{
+       struct tegra_tsensor_data *data = vdata;
+       return tsensor_thermal_get_temp_low(data, milli_temp);
+}
+
 static int tsensor_set_limits(void *vdata,
                        long lo_limit_milli,
                        long hi_limit_milli)
@@ -102,6 +108,7 @@ static void tegra3_tsensor_probe_callback(struct tegra_tsensor_data *data)
        thermal_device->data = data;
        thermal_device->offset = TSENSOR_OFFSET;
        thermal_device->get_temp = tsensor_get_temp;
+       thermal_device->get_temp_low = tsensor_get_temp_low;
        thermal_device->set_limits = tsensor_set_limits;
        thermal_device->set_alert = tsensor_set_alert;
        thermal_device->set_shutdown_temp = tsensor_set_shutdown_temp;