diff options
-rw-r--r-- | Documentation/hwmon/lm90 | 2 | ||||
-rw-r--r-- | drivers/hwmon/lm90.c | 37 |
2 files changed, 34 insertions, 5 deletions
diff --git a/Documentation/hwmon/lm90 b/Documentation/hwmon/lm90 index e0d5206d1de3..0e8411710238 100644 --- a/Documentation/hwmon/lm90 +++ b/Documentation/hwmon/lm90 | |||
@@ -8,7 +8,7 @@ Supported chips: | |||
8 | Datasheet: Publicly available at the National Semiconductor website | 8 | Datasheet: Publicly available at the National Semiconductor website |
9 | http://www.national.com/pf/LM/LM90.html | 9 | http://www.national.com/pf/LM/LM90.html |
10 | * National Semiconductor LM89 | 10 | * National Semiconductor LM89 |
11 | Prefix: 'lm99' | 11 | Prefix: 'lm89' (no auto-detection) |
12 | Addresses scanned: I2C 0x4c and 0x4d | 12 | Addresses scanned: I2C 0x4c and 0x4d |
13 | Datasheet: Publicly available at the National Semiconductor website | 13 | Datasheet: Publicly available at the National Semiconductor website |
14 | http://www.national.com/mpf/LM/LM89.html | 14 | http://www.national.com/mpf/LM/LM89.html |
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c index 6242e72a82c1..96a701866726 100644 --- a/drivers/hwmon/lm90.c +++ b/drivers/hwmon/lm90.c | |||
@@ -12,9 +12,9 @@ | |||
12 | * made by National Semiconductor. Both have an increased remote | 12 | * made by National Semiconductor. Both have an increased remote |
13 | * temperature measurement accuracy (1 degree), and the LM99 | 13 | * temperature measurement accuracy (1 degree), and the LM99 |
14 | * additionally shifts remote temperatures (measured and limits) by 16 | 14 | * additionally shifts remote temperatures (measured and limits) by 16 |
15 | * degrees, which allows for higher temperatures measurement. The | 15 | * degrees, which allows for higher temperatures measurement. |
16 | * driver doesn't handle it since it can be done easily in user-space. | ||
17 | * Note that there is no way to differentiate between both chips. | 16 | * Note that there is no way to differentiate between both chips. |
17 | * When device is auto-detected, the driver will assume an LM99. | ||
18 | * | 18 | * |
19 | * This driver also supports the LM86, another sensor chip made by | 19 | * This driver also supports the LM86, another sensor chip made by |
20 | * National Semiconductor. It is exactly similar to the LM90 except it | 20 | * National Semiconductor. It is exactly similar to the LM90 except it |
@@ -169,8 +169,8 @@ static const struct i2c_device_id lm90_id[] = { | |||
169 | { "adt7461", adt7461 }, | 169 | { "adt7461", adt7461 }, |
170 | { "lm90", lm90 }, | 170 | { "lm90", lm90 }, |
171 | { "lm86", lm86 }, | 171 | { "lm86", lm86 }, |
172 | { "lm89", lm99 }, | 172 | { "lm89", lm86 }, |
173 | { "lm99", lm99 }, /* Missing temperature offset */ | 173 | { "lm99", lm99 }, |
174 | { "max6646", max6646 }, | 174 | { "max6646", max6646 }, |
175 | { "max6647", max6646 }, | 175 | { "max6647", max6646 }, |
176 | { "max6649", max6646 }, | 176 | { "max6649", max6646 }, |
@@ -366,6 +366,10 @@ static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr, | |||
366 | else | 366 | else |
367 | temp = temp_from_s8(data->temp8[attr->index]); | 367 | temp = temp_from_s8(data->temp8[attr->index]); |
368 | 368 | ||
369 | /* +16 degrees offset for temp2 for the LM99 */ | ||
370 | if (data->kind == lm99 && attr->index == 3) | ||
371 | temp += 16000; | ||
372 | |||
369 | return sprintf(buf, "%d\n", temp); | 373 | return sprintf(buf, "%d\n", temp); |
370 | } | 374 | } |
371 | 375 | ||
@@ -385,6 +389,10 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr, | |||
385 | long val = simple_strtol(buf, NULL, 10); | 389 | long val = simple_strtol(buf, NULL, 10); |
386 | int nr = attr->index; | 390 | int nr = attr->index; |
387 | 391 | ||
392 | /* +16 degrees offset for temp2 for the LM99 */ | ||
393 | if (data->kind == lm99 && attr->index == 3) | ||
394 | val -= 16000; | ||
395 | |||
388 | mutex_lock(&data->update_lock); | 396 | mutex_lock(&data->update_lock); |
389 | if (data->kind == adt7461) | 397 | if (data->kind == adt7461) |
390 | data->temp8[nr] = temp_to_u8_adt7461(data, val); | 398 | data->temp8[nr] = temp_to_u8_adt7461(data, val); |
@@ -411,6 +419,10 @@ static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr, | |||
411 | else | 419 | else |
412 | temp = temp_from_s16(data->temp11[attr->index]); | 420 | temp = temp_from_s16(data->temp11[attr->index]); |
413 | 421 | ||
422 | /* +16 degrees offset for temp2 for the LM99 */ | ||
423 | if (data->kind == lm99 && attr->index <= 2) | ||
424 | temp += 16000; | ||
425 | |||
414 | return sprintf(buf, "%d\n", temp); | 426 | return sprintf(buf, "%d\n", temp); |
415 | } | 427 | } |
416 | 428 | ||
@@ -432,6 +444,10 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr, | |||
432 | long val = simple_strtol(buf, NULL, 10); | 444 | long val = simple_strtol(buf, NULL, 10); |
433 | int nr = attr->index; | 445 | int nr = attr->index; |
434 | 446 | ||
447 | /* +16 degrees offset for temp2 for the LM99 */ | ||
448 | if (data->kind == lm99 && attr->index <= 2) | ||
449 | val -= 16000; | ||
450 | |||
435 | mutex_lock(&data->update_lock); | 451 | mutex_lock(&data->update_lock); |
436 | if (data->kind == adt7461) | 452 | if (data->kind == adt7461) |
437 | data->temp11[nr] = temp_to_u16_adt7461(data, val); | 453 | data->temp11[nr] = temp_to_u16_adt7461(data, val); |
@@ -466,6 +482,10 @@ static ssize_t show_temphyst(struct device *dev, struct device_attribute *devatt | |||
466 | else | 482 | else |
467 | temp = temp_from_s8(data->temp8[attr->index]); | 483 | temp = temp_from_s8(data->temp8[attr->index]); |
468 | 484 | ||
485 | /* +16 degrees offset for temp2 for the LM99 */ | ||
486 | if (data->kind == lm99 && attr->index == 3) | ||
487 | temp += 16000; | ||
488 | |||
469 | return sprintf(buf, "%d\n", temp - temp_from_s8(data->temp_hyst)); | 489 | return sprintf(buf, "%d\n", temp - temp_from_s8(data->temp_hyst)); |
470 | } | 490 | } |
471 | 491 | ||
@@ -691,6 +711,15 @@ static int lm90_detect(struct i2c_client *new_client, int kind, | |||
691 | } else | 711 | } else |
692 | if ((chip_id & 0xF0) == 0x30) { /* LM89/LM99 */ | 712 | if ((chip_id & 0xF0) == 0x30) { /* LM89/LM99 */ |
693 | kind = lm99; | 713 | kind = lm99; |
714 | dev_info(&adapter->dev, | ||
715 | "Assuming LM99 chip at " | ||
716 | "0x%02x\n", address); | ||
717 | dev_info(&adapter->dev, | ||
718 | "If it is an LM89, pass " | ||
719 | "force_lm86=%d,0x%02x when " | ||
720 | "loading the lm90 driver\n", | ||
721 | i2c_adapter_id(adapter), | ||
722 | address); | ||
694 | } else | 723 | } else |
695 | if (address == 0x4C | 724 | if (address == 0x4C |
696 | && (chip_id & 0xF0) == 0x10) { /* LM86 */ | 725 | && (chip_id & 0xF0) == 0x10) { /* LM86 */ |