diff options
author | Bitan Biswas <bbiswas@nvidia.com> | 2011-08-25 21:12:00 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:48:34 -0800 |
commit | b6077255f0596d7a7ef8e3f8332304a407f84a3e (patch) | |
tree | c5027d83b225ee8d507e070e60bc6754705552fb /drivers/misc | |
parent | 9f7d7dd1e09b1e8a1f723b1295c1dd0df00ea4e7 (diff) |
misc: nct1008: sub-zero temperature support
Added support for sub-zero temperatures
Original-Change-Id: Id35590ee4d058f35625088089623cc063f9a711a
Reviewed-on: http://git-master/r/48690
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Tested-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-by: Ramachandrudu Kandhala <rkandhala@nvidia.com>
Reviewed-by: Diwakar Tundlam <dtundlam@nvidia.com>
Rebase-Id: Rf705a1b4f3c246029abc55570f26e876ae3bfaa9
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/nct1008.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/misc/nct1008.c b/drivers/misc/nct1008.c index 172be5c26847..6e0f7a43b189 100644 --- a/drivers/misc/nct1008.c +++ b/drivers/misc/nct1008.c @@ -80,27 +80,29 @@ struct nct1008_data { struct nct1008_platform_data plat_data; struct mutex mutex; u8 config; - u8 *limits; + s8 *limits; u8 limits_sz; void (*alarm_fn)(bool raised); struct regulator *nct_reg; }; -static inline u8 value_to_temperature(bool extended, u8 value) +static inline s8 value_to_temperature(bool extended, u8 value) { - return extended ? (u8)(value - EXTENDED_RANGE_OFFSET) : value; + return extended ? (s8)(value - EXTENDED_RANGE_OFFSET) : (s8)value; } -static inline u8 temperature_to_value(bool extended, u8 temp) +static inline u8 temperature_to_value(bool extended, s8 temp) { - return extended ? (u8)(temp + EXTENDED_RANGE_OFFSET) : temp; + return extended ? (u8)(temp + EXTENDED_RANGE_OFFSET) : (u8)temp; } static int nct1008_get_temp(struct device *dev, u8 *pTemp) { struct i2c_client *client = to_i2c_client(dev); struct nct1008_platform_data *pdata = client->dev.platform_data; - u8 temp1, temp2, temp; + s8 temp1; + u8 temp2; + s8 temp; u8 value; value = i2c_smbus_read_byte_data(client, LOCAL_TEMP_RD); if (value < 0) @@ -133,8 +135,8 @@ static ssize_t nct1008_show_temp(struct device *dev, { struct i2c_client *client = to_i2c_client(dev); struct nct1008_platform_data *pdata = client->dev.platform_data; - u8 temp1 = 0; - u8 temp = 0; + s8 temp1 = 0; + s8 temp = 0; u8 temp2 = 0; u8 value = 0; @@ -170,7 +172,7 @@ static ssize_t nct1008_show_temp_overheat(struct device *dev, struct i2c_client *client = to_i2c_client(dev); struct nct1008_platform_data *pdata = client->dev.platform_data; u8 value; - u8 temp, temp2; + s8 temp, temp2; /* Local temperature h/w shutdown limit */ value = i2c_smbus_read_byte_data(client, LOCAL_THERM_LIMIT_WR); @@ -206,7 +208,7 @@ static ssize_t nct1008_set_temp_overheat(struct device *dev, char bufOverheat[MAX_STR_PRINT]; unsigned int ret; - if (strict_strtoul(buf, 0, &num)) { + if (strict_strtol(buf, 0, &num)) { dev_err(dev, "\n file: %s, line=%d return %s() ", __FILE__, __LINE__, __func__); return -EINVAL; @@ -231,13 +233,13 @@ static ssize_t nct1008_set_temp_overheat(struct device *dev, } /* External temperature h/w shutdown limit */ - temp = temperature_to_value(pdata->ext_range, (u8)num); + temp = temperature_to_value(pdata->ext_range, (s8)num); err = i2c_smbus_write_byte_data(client, EXT_THERM_LIMIT_WR, temp); if (err < 0) goto error; /* Local temperature h/w shutdown limit */ - temp = temperature_to_value(pdata->ext_range, (u8)num); + temp = temperature_to_value(pdata->ext_range, (s8)num); err = i2c_smbus_write_byte_data(client, LOCAL_THERM_LIMIT_WR, temp); if (err < 0) goto error; @@ -254,7 +256,7 @@ static ssize_t nct1008_show_temp_alert(struct device *dev, struct i2c_client *client = to_i2c_client(dev); struct nct1008_platform_data *pdata = client->dev.platform_data; u8 value; - u8 temp, temp2; + s8 temp, temp2; /* External Temperature Throttling limit */ value = i2c_smbus_read_byte_data(client, EXT_TEMP_HI_LIMIT_HI_BYTE_RD); if (value < 0) @@ -285,7 +287,7 @@ static ssize_t nct1008_set_temp_alert(struct device *dev, struct i2c_client *client = to_i2c_client(dev); struct nct1008_platform_data *pdata = client->dev.platform_data; - if (strict_strtoul(buf, 0, &num)) { + if (strict_strtol(buf, 0, &num)) { dev_err(dev, "\n file: %s, line=%d return %s() ", __FILE__, __LINE__, __func__); return -EINVAL; @@ -297,7 +299,7 @@ static ssize_t nct1008_set_temp_alert(struct device *dev, } /* External Temperature Throttling limit */ - value = temperature_to_value(pdata->ext_range, num); + value = temperature_to_value(pdata->ext_range, (s8)num); err = i2c_smbus_write_byte_data(client, EXT_TEMP_HI_LIMIT_HI_BYTE_WR, value); if (err < 0) @@ -321,7 +323,7 @@ static ssize_t nct1008_show_ext_temp(struct device *dev, { struct i2c_client *client = to_i2c_client(dev); struct nct1008_platform_data *pdata = client->dev.platform_data; - u8 temp_value; + s8 temp_value; u8 data = 0; u8 data_lo; @@ -572,7 +574,9 @@ static int __devinit nct1008_configure_sensor(struct nct1008_data* data) { struct i2c_client *client = data->client; struct nct1008_platform_data *pdata = client->dev.platform_data; - u8 value, temp, temp2; + u8 value; + s8 temp; + u8 temp2; int err; int hi_limit; |