summaryrefslogtreecommitdiff
path: root/drivers/misc
diff options
context:
space:
mode:
authorJoshua Primero <jprimero@nvidia.com>2011-10-13 14:42:56 -0700
committerVarun Wadekar <vwadekar@nvidia.com>2011-12-08 17:03:24 +0530
commitaa5203999e22df96a3722a70759053cd35c4d9d6 (patch)
tree7e06b4b567184058597c8481c79b84beb3f69e58 /drivers/misc
parente93fee7719a78f60a1e9fe48d29cd325b723ee67 (diff)
drivers: nct1008: Generic therm funcs to nct1008
Preparing nct1008 for refactoring overhaul. Added generic functions which will be used by Tegra thermal module. Reviewed-on: http://git-master/r/57952 Reviewed-on: http://git-master/r/63337 cherry-picked from 2d5e2369511fb49f1895938fea935b12d72c4827 Change-Id: Ia850db408f533318db4b634e6f29b68c1ad8a1de Signed-off-by: Joshua Primero <jprimero@nvidia.com> Reviewed-on: http://git-master/r/66549 Reviewed-by: Diwakar Tundlam <dtundlam@nvidia.com>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/nct1008.c88
1 files changed, 71 insertions, 17 deletions
diff --git a/drivers/misc/nct1008.c b/drivers/misc/nct1008.c
index cd42102f432a..ad301a0b1eef 100644
--- a/drivers/misc/nct1008.c
+++ b/drivers/misc/nct1008.c
@@ -86,22 +86,6 @@
#define CELSIUS_TO_MILLICELSIUS(x) ((x)*1000)
#define MILLICELSIUS_TO_CELSIUS(x) ((x)/1000)
-struct nct1008_data {
- struct work_struct work;
- struct i2c_client *client;
- struct nct1008_platform_data plat_data;
- struct mutex mutex;
- struct dentry *dent;
- u8 config;
- s8 *limits;
- u8 limits_sz;
- void (*alarm_fn)(bool raised);
- struct regulator *nct_reg;
-#ifdef CONFIG_TEGRA_THERMAL_SYSFS
- struct thermal_zone_device *thz;
-#endif
-};
-
static inline s8 value_to_temperature(bool extended, u8 value)
{
return extended ? (s8)(value - EXTENDED_RANGE_OFFSET) : (s8)value;
@@ -949,6 +933,9 @@ static int __devinit nct1008_configure_sensor(struct nct1008_data* data)
}
data->alarm_fn = pdata->alarm_fn;
+
+ data->current_lo_limit = -1;
+ data->current_hi_limit = -1;
return 0;
error:
dev_err(&client->dev, "\n exit %s, err=%d ", __func__, err);
@@ -996,6 +983,70 @@ static unsigned int get_ext_mode_delay_ms(unsigned int conv_rate)
}
}
+int nct1008_thermal_get_temp(struct nct1008_data *data, long *temp)
+{
+ return nct1008_get_temp(&data->client->dev, temp);
+}
+
+int nct1008_thermal_set_limits(struct nct1008_data *data,
+ long lo_limit_milli,
+ long hi_limit_milli)
+{
+ int err;
+ u8 value;
+ bool extended_range = data->plat_data.ext_range;
+ long lo_limit = MILLICELSIUS_TO_CELSIUS(lo_limit_milli);
+ long hi_limit = MILLICELSIUS_TO_CELSIUS(hi_limit_milli);
+
+ if (lo_limit >= hi_limit)
+ return -EINVAL;
+
+ if (data->current_lo_limit == lo_limit &&
+ data->current_hi_limit == hi_limit)
+ return 0;
+
+ if (data->current_lo_limit != lo_limit) {
+ value = temperature_to_value(extended_range, lo_limit);
+ pr_debug("%s: %d\n", __func__, value);
+ err = i2c_smbus_write_byte_data(data->client,
+ EXT_TEMP_LO_LIMIT_HI_BYTE_WR, value);
+ if (err)
+ return err;
+
+ data->current_lo_limit = lo_limit;
+ }
+
+ if (data->current_hi_limit != hi_limit) {
+ value = temperature_to_value(extended_range, hi_limit);
+ pr_debug("%s: %d\n", __func__, value);
+ err = i2c_smbus_write_byte_data(data->client,
+ EXT_TEMP_HI_LIMIT_HI_BYTE_WR, value);
+ if (err)
+ return err;
+
+ data->current_hi_limit = hi_limit;
+ }
+
+}
+
+int nct1008_thermal_set_alert(struct nct1008_data *data,
+ void (*alert_func)(void *),
+ void *alert_data)
+{
+ data->alert_func = alert_func;
+ data->alert_data = alert_data;
+
+ return 0;
+}
+
+int nct1008_thermal_set_shutdown_temp(struct nct1008_data *data,
+ long shutdown_temp)
+{
+ data->shutdown_temp = shutdown_temp;
+
+ return 0;
+}
+
#ifdef CONFIG_TEGRA_THERMAL_SYSFS
static int nct1008_thermal_zone_bind(struct thermal_zone_device *thermal,
@@ -1084,7 +1135,6 @@ static int __devinit nct1008_probe(struct i2c_client *client,
#endif
data = kzalloc(sizeof(struct nct1008_data), GFP_KERNEL);
-
if (!data)
return -ENOMEM;
@@ -1159,6 +1209,9 @@ static int __devinit nct1008_probe(struct i2c_client *client,
data->thz = thz;
#endif
+ if (data->plat_data.probe_callback)
+ data->plat_data.probe_callback(data);
+
return 0;
error:
@@ -1190,6 +1243,7 @@ static int __devexit nct1008_remove(struct i2c_client *client)
nct1008_power_control(data, false);
if (data->nct_reg)
regulator_put(data->nct_reg);
+
kfree(data);
return 0;