aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/lm90.c
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2008-10-17 11:51:11 -0400
committerJean Delvare <khali@mahadeva.delvare>2008-10-17 11:51:11 -0400
commit271dabf5bbf6ae6e2792cd5cf6f0434230e5c18c (patch)
tree654915a99671b90924bf34e1ddaa4cb0bb600290 /drivers/hwmon/lm90.c
parent9d4d3834229e9949c066c2d0f73ed5d4b4965761 (diff)
hwmon: (lm90) Support MAX6646, MAX6647 and MAX6649
These Maxim chips are similar to MAX6657 but use unsigned temperature values to allow for readings up to 145 degrees. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/hwmon/lm90.c')
-rw-r--r--drivers/hwmon/lm90.c77
1 files changed, 65 insertions, 12 deletions
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index 85ba2c4feb46..fe09f82c42e8 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -32,6 +32,11 @@
32 * supported by this driver. These chips lack the remote temperature 32 * supported by this driver. These chips lack the remote temperature
33 * offset feature. 33 * offset feature.
34 * 34 *
35 * This driver also supports the MAX6646, MAX6647 and MAX6649 chips
36 * made by Maxim. These are again similar to the LM86, but they use
37 * unsigned temperature values and can report temperatures from 0 to
38 * 145 degrees.
39 *
35 * This driver also supports the MAX6680 and MAX6681, two other sensor 40 * This driver also supports the MAX6680 and MAX6681, two other sensor
36 * chips made by Maxim. These are quite similar to the other Maxim 41 * chips made by Maxim. These are quite similar to the other Maxim
37 * chips. The MAX6680 and MAX6681 only differ in the pinout so they can 42 * chips. The MAX6680 and MAX6681 only differ in the pinout so they can
@@ -76,9 +81,10 @@
76 * Addresses to scan 81 * Addresses to scan
77 * Address is fully defined internally and cannot be changed except for 82 * Address is fully defined internally and cannot be changed except for
78 * MAX6659, MAX6680 and MAX6681. 83 * MAX6659, MAX6680 and MAX6681.
79 * LM86, LM89, LM90, LM99, ADM1032, ADM1032-1, ADT7461, MAX6657 and MAX6658 84 * LM86, LM89, LM90, LM99, ADM1032, ADM1032-1, ADT7461, MAX6649, MAX6657
80 * have address 0x4c. 85 * and MAX6658 have address 0x4c.
81 * ADM1032-2, ADT7461-2, LM89-1, and LM99-1 have address 0x4d. 86 * ADM1032-2, ADT7461-2, LM89-1, LM99-1 and MAX6646 have address 0x4d.
87 * MAX6647 has address 0x4e.
82 * MAX6659 can have address 0x4c, 0x4d or 0x4e (unsupported). 88 * MAX6659 can have address 0x4c, 0x4d or 0x4e (unsupported).
83 * MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 89 * MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b,
84 * 0x4c, 0x4d or 0x4e. 90 * 0x4c, 0x4d or 0x4e.
@@ -91,7 +97,8 @@ static const unsigned short normal_i2c[] = {
91 * Insmod parameters 97 * Insmod parameters
92 */ 98 */
93 99
94I2C_CLIENT_INSMOD_7(lm90, adm1032, lm99, lm86, max6657, adt7461, max6680); 100I2C_CLIENT_INSMOD_8(lm90, adm1032, lm99, lm86, max6657, adt7461, max6680,
101 max6646);
95 102
96/* 103/*
97 * The LM90 registers 104 * The LM90 registers
@@ -132,7 +139,7 @@ I2C_CLIENT_INSMOD_7(lm90, adm1032, lm99, lm86, max6657, adt7461, max6680);
132#define LM90_REG_R_TCRIT_HYST 0x21 139#define LM90_REG_R_TCRIT_HYST 0x21
133#define LM90_REG_W_TCRIT_HYST 0x21 140#define LM90_REG_W_TCRIT_HYST 0x21
134 141
135/* MAX6657-specific registers */ 142/* MAX6646/6647/6649/6657/6658/6659 registers */
136 143
137#define MAX6657_REG_R_LOCAL_TEMPL 0x11 144#define MAX6657_REG_R_LOCAL_TEMPL 0x11
138 145
@@ -164,6 +171,9 @@ static const struct i2c_device_id lm90_id[] = {
164 { "lm86", lm86 }, 171 { "lm86", lm86 },
165 { "lm89", lm99 }, 172 { "lm89", lm99 },
166 { "lm99", lm99 }, /* Missing temperature offset */ 173 { "lm99", lm99 }, /* Missing temperature offset */
174 { "max6646", max6646 },
175 { "max6647", max6646 },
176 { "max6649", max6646 },
167 { "max6657", max6657 }, 177 { "max6657", max6657 },
168 { "max6658", max6657 }, 178 { "max6658", max6657 },
169 { "max6659", max6657 }, 179 { "max6659", max6657 },
@@ -205,7 +215,7 @@ struct lm90_data {
205 s16 temp11[5]; /* 0: remote input 215 s16 temp11[5]; /* 0: remote input
206 1: remote low limit 216 1: remote low limit
207 2: remote high limit 217 2: remote high limit
208 3: remote offset (except max6657) 218 3: remote offset (except max6646 and max6657)
209 4: local input */ 219 4: local input */
210 u8 temp_hyst; 220 u8 temp_hyst;
211 u8 alarms; /* bitvector */ 221 u8 alarms; /* bitvector */
@@ -216,7 +226,8 @@ struct lm90_data {
216 * For local temperatures and limits, critical limits and the hysteresis 226 * For local temperatures and limits, critical limits and the hysteresis
217 * value, the LM90 uses signed 8-bit values with LSB = 1 degree Celsius. 227 * value, the LM90 uses signed 8-bit values with LSB = 1 degree Celsius.
218 * For remote temperatures and limits, it uses signed 11-bit values with 228 * For remote temperatures and limits, it uses signed 11-bit values with
219 * LSB = 0.125 degree Celsius, left-justified in 16-bit registers. 229 * LSB = 0.125 degree Celsius, left-justified in 16-bit registers. Some
230 * Maxim chips use unsigned values.
220 */ 231 */
221 232
222static inline int temp_from_s8(s8 val) 233static inline int temp_from_s8(s8 val)
@@ -224,11 +235,21 @@ static inline int temp_from_s8(s8 val)
224 return val * 1000; 235 return val * 1000;
225} 236}
226 237
238static inline int temp_from_u8(u8 val)
239{
240 return val * 1000;
241}
242
227static inline int temp_from_s16(s16 val) 243static inline int temp_from_s16(s16 val)
228{ 244{
229 return val / 32 * 125; 245 return val / 32 * 125;
230} 246}
231 247
248static inline int temp_from_u16(u16 val)
249{
250 return val / 32 * 125;
251}
252
232static s8 temp_to_s8(long val) 253static s8 temp_to_s8(long val)
233{ 254{
234 if (val <= -128000) 255 if (val <= -128000)
@@ -240,6 +261,15 @@ static s8 temp_to_s8(long val)
240 return (val + 500) / 1000; 261 return (val + 500) / 1000;
241} 262}
242 263
264static u8 temp_to_u8(long val)
265{
266 if (val <= 0)
267 return 0;
268 if (val >= 255000)
269 return 255;
270 return (val + 500) / 1000;
271}
272
243static s16 temp_to_s16(long val) 273static s16 temp_to_s16(long val)
244{ 274{
245 if (val <= -128000) 275 if (val <= -128000)
@@ -331,6 +361,8 @@ static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,
331 361
332 if (data->kind == adt7461) 362 if (data->kind == adt7461)
333 temp = temp_from_u8_adt7461(data, data->temp8[attr->index]); 363 temp = temp_from_u8_adt7461(data, data->temp8[attr->index]);
364 else if (data->kind == max6646)
365 temp = temp_from_u8(data->temp8[attr->index]);
334 else 366 else
335 temp = temp_from_s8(data->temp8[attr->index]); 367 temp = temp_from_s8(data->temp8[attr->index]);
336 368
@@ -356,6 +388,8 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
356 mutex_lock(&data->update_lock); 388 mutex_lock(&data->update_lock);
357 if (data->kind == adt7461) 389 if (data->kind == adt7461)
358 data->temp8[nr] = temp_to_u8_adt7461(data, val); 390 data->temp8[nr] = temp_to_u8_adt7461(data, val);
391 else if (data->kind == max6646)
392 data->temp8[nr] = temp_to_u8(val);
359 else 393 else
360 data->temp8[nr] = temp_to_s8(val); 394 data->temp8[nr] = temp_to_s8(val);
361 i2c_smbus_write_byte_data(client, reg[nr], data->temp8[nr]); 395 i2c_smbus_write_byte_data(client, reg[nr], data->temp8[nr]);
@@ -372,6 +406,8 @@ static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
372 406
373 if (data->kind == adt7461) 407 if (data->kind == adt7461)
374 temp = temp_from_u16_adt7461(data, data->temp11[attr->index]); 408 temp = temp_from_u16_adt7461(data, data->temp11[attr->index]);
409 else if (data->kind == max6646)
410 temp = temp_from_u16(data->temp11[attr->index]);
375 else 411 else
376 temp = temp_from_s16(data->temp11[attr->index]); 412 temp = temp_from_s16(data->temp11[attr->index]);
377 413
@@ -401,12 +437,15 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
401 data->temp11[nr] = temp_to_u16_adt7461(data, val); 437 data->temp11[nr] = temp_to_u16_adt7461(data, val);
402 else if (data->kind == max6657 || data->kind == max6680) 438 else if (data->kind == max6657 || data->kind == max6680)
403 data->temp11[nr] = temp_to_s8(val) << 8; 439 data->temp11[nr] = temp_to_s8(val) << 8;
440 else if (data->kind == max6646)
441 data->temp11[nr] = temp_to_u8(val) << 8;
404 else 442 else
405 data->temp11[nr] = temp_to_s16(val); 443 data->temp11[nr] = temp_to_s16(val);
406 444
407 i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2], 445 i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2],
408 data->temp11[nr] >> 8); 446 data->temp11[nr] >> 8);
409 if (data->kind != max6657 && data->kind != max6680) 447 if (data->kind != max6657 && data->kind != max6680
448 && data->kind != max6646)
410 i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2 + 1], 449 i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2 + 1],
411 data->temp11[nr] & 0xff); 450 data->temp11[nr] & 0xff);
412 mutex_unlock(&data->update_lock); 451 mutex_unlock(&data->update_lock);
@@ -689,6 +728,16 @@ static int lm90_detect(struct i2c_client *new_client, int kind,
689 && (reg_config1 & 0x03) == 0x00 728 && (reg_config1 & 0x03) == 0x00
690 && reg_convrate <= 0x07) { 729 && reg_convrate <= 0x07) {
691 kind = max6680; 730 kind = max6680;
731 } else
732 /* The chip_id register of the MAX6646/6647/6649
733 * holds the revision of the chip.
734 * The lowest 6 bits of the config1 register are
735 * unused and should return zero when read.
736 */
737 if (chip_id == 0x59
738 && (reg_config1 & 0x3f) == 0x00
739 && reg_convrate <= 0x07) {
740 kind = max6646;
692 } 741 }
693 } 742 }
694 743
@@ -719,6 +768,8 @@ static int lm90_detect(struct i2c_client *new_client, int kind,
719 name = "max6680"; 768 name = "max6680";
720 } else if (kind == adt7461) { 769 } else if (kind == adt7461) {
721 name = "adt7461"; 770 name = "adt7461";
771 } else if (kind == max6646) {
772 name = "max6646";
722 } 773 }
723 strlcpy(info->type, name, I2C_NAME_SIZE); 774 strlcpy(info->type, name, I2C_NAME_SIZE);
724 775
@@ -758,7 +809,7 @@ static int lm90_probe(struct i2c_client *new_client,
758 &dev_attr_pec))) 809 &dev_attr_pec)))
759 goto exit_remove_files; 810 goto exit_remove_files;
760 } 811 }
761 if (data->kind != max6657) { 812 if (data->kind != max6657 && data->kind != max6646) {
762 if ((err = device_create_file(&new_client->dev, 813 if ((err = device_create_file(&new_client->dev,
763 &sensor_dev_attr_temp2_offset.dev_attr))) 814 &sensor_dev_attr_temp2_offset.dev_attr)))
764 goto exit_remove_files; 815 goto exit_remove_files;
@@ -824,7 +875,7 @@ static int lm90_remove(struct i2c_client *client)
824 hwmon_device_unregister(data->hwmon_dev); 875 hwmon_device_unregister(data->hwmon_dev);
825 sysfs_remove_group(&client->dev.kobj, &lm90_group); 876 sysfs_remove_group(&client->dev.kobj, &lm90_group);
826 device_remove_file(&client->dev, &dev_attr_pec); 877 device_remove_file(&client->dev, &dev_attr_pec);
827 if (data->kind != max6657) 878 if (data->kind != max6657 && data->kind != max6646)
828 device_remove_file(&client->dev, 879 device_remove_file(&client->dev,
829 &sensor_dev_attr_temp2_offset.dev_attr); 880 &sensor_dev_attr_temp2_offset.dev_attr);
830 881
@@ -881,7 +932,7 @@ static struct lm90_data *lm90_update_device(struct device *dev)
881 lm90_read_reg(client, LM90_REG_R_REMOTE_CRIT, &data->temp8[3]); 932 lm90_read_reg(client, LM90_REG_R_REMOTE_CRIT, &data->temp8[3]);
882 lm90_read_reg(client, LM90_REG_R_TCRIT_HYST, &data->temp_hyst); 933 lm90_read_reg(client, LM90_REG_R_TCRIT_HYST, &data->temp_hyst);
883 934
884 if (data->kind == max6657) { 935 if (data->kind == max6657 || data->kind == max6646) {
885 lm90_read16(client, LM90_REG_R_LOCAL_TEMP, 936 lm90_read16(client, LM90_REG_R_LOCAL_TEMP,
886 MAX6657_REG_R_LOCAL_TEMPL, 937 MAX6657_REG_R_LOCAL_TEMPL,
887 &data->temp11[4]); 938 &data->temp11[4]);
@@ -896,6 +947,7 @@ static struct lm90_data *lm90_update_device(struct device *dev)
896 if (lm90_read_reg(client, LM90_REG_R_REMOTE_LOWH, &h) == 0) { 947 if (lm90_read_reg(client, LM90_REG_R_REMOTE_LOWH, &h) == 0) {
897 data->temp11[1] = h << 8; 948 data->temp11[1] = h << 8;
898 if (data->kind != max6657 && data->kind != max6680 949 if (data->kind != max6657 && data->kind != max6680
950 && data->kind != max6646
899 && lm90_read_reg(client, LM90_REG_R_REMOTE_LOWL, 951 && lm90_read_reg(client, LM90_REG_R_REMOTE_LOWL,
900 &l) == 0) 952 &l) == 0)
901 data->temp11[1] |= l; 953 data->temp11[1] |= l;
@@ -903,12 +955,13 @@ static struct lm90_data *lm90_update_device(struct device *dev)
903 if (lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHH, &h) == 0) { 955 if (lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHH, &h) == 0) {
904 data->temp11[2] = h << 8; 956 data->temp11[2] = h << 8;
905 if (data->kind != max6657 && data->kind != max6680 957 if (data->kind != max6657 && data->kind != max6680
958 && data->kind != max6646
906 && lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHL, 959 && lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHL,
907 &l) == 0) 960 &l) == 0)
908 data->temp11[2] |= l; 961 data->temp11[2] |= l;
909 } 962 }
910 963
911 if (data->kind != max6657) { 964 if (data->kind != max6657 && data->kind != max6646) {
912 if (lm90_read_reg(client, LM90_REG_R_REMOTE_OFFSH, 965 if (lm90_read_reg(client, LM90_REG_R_REMOTE_OFFSH,
913 &h) == 0 966 &h) == 0
914 && lm90_read_reg(client, LM90_REG_R_REMOTE_OFFSL, 967 && lm90_read_reg(client, LM90_REG_R_REMOTE_OFFSL,