diff options
-rw-r--r-- | Documentation/hwmon/lm95234 | 15 | ||||
-rw-r--r-- | drivers/hwmon/Kconfig | 6 | ||||
-rw-r--r-- | drivers/hwmon/lm95234.c | 91 |
3 files changed, 78 insertions, 34 deletions
diff --git a/Documentation/hwmon/lm95234 b/Documentation/hwmon/lm95234 index a0e95ddfd372..32b777ef224c 100644 --- a/Documentation/hwmon/lm95234 +++ b/Documentation/hwmon/lm95234 | |||
@@ -2,6 +2,10 @@ Kernel driver lm95234 | |||
2 | ===================== | 2 | ===================== |
3 | 3 | ||
4 | Supported chips: | 4 | Supported chips: |
5 | * National Semiconductor / Texas Instruments LM95233 | ||
6 | Addresses scanned: I2C 0x18, 0x2a, 0x2b | ||
7 | Datasheet: Publicly available at the Texas Instruments website | ||
8 | http://www.ti.com/product/lm95233 | ||
5 | * National Semiconductor / Texas Instruments LM95234 | 9 | * National Semiconductor / Texas Instruments LM95234 |
6 | Addresses scanned: I2C 0x18, 0x4d, 0x4e | 10 | Addresses scanned: I2C 0x18, 0x4d, 0x4e |
7 | Datasheet: Publicly available at the Texas Instruments website | 11 | Datasheet: Publicly available at the Texas Instruments website |
@@ -13,11 +17,12 @@ Author: Guenter Roeck <linux@roeck-us.net> | |||
13 | Description | 17 | Description |
14 | ----------- | 18 | ----------- |
15 | 19 | ||
16 | LM95234 is an 11-bit digital temperature sensor with a 2-wire System Management | 20 | LM95233 and LM95234 are 11-bit digital temperature sensors with a 2-wire |
17 | Bus (SMBus) interface and TrueTherm technology that can very accurately monitor | 21 | System Management Bus (SMBus) interface and TrueTherm technology |
18 | the temperature of four remote diodes as well as its own temperature. | 22 | that can very accurately monitor the temperature of two (LM95233) |
19 | The four remote diodes can be external devices such as microprocessors, | 23 | or four (LM95234) remote diodes as well as its own temperature. |
20 | graphics processors or diode-connected 2N3904s. The LM95234's TruTherm | 24 | The remote diodes can be external devices such as microprocessors, |
25 | graphics processors or diode-connected 2N3904s. The chip's TruTherm | ||
21 | beta compensation technology allows sensing of 90 nm or 65 nm process | 26 | beta compensation technology allows sensing of 90 nm or 65 nm process |
22 | thermal diodes accurately. | 27 | thermal diodes accurately. |
23 | 28 | ||
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 085f5a853618..b1ce6a093a93 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -1028,11 +1028,11 @@ config SENSORS_LM93 | |||
1028 | will be called lm93. | 1028 | will be called lm93. |
1029 | 1029 | ||
1030 | config SENSORS_LM95234 | 1030 | config SENSORS_LM95234 |
1031 | tristate "National Semiconductor LM95234" | 1031 | tristate "National Semiconductor LM95234 and compatibles" |
1032 | depends on I2C | 1032 | depends on I2C |
1033 | help | 1033 | help |
1034 | If you say yes here you get support for the LM95234 temperature | 1034 | If you say yes here you get support for the LM95233 and LM95234 |
1035 | sensor. | 1035 | temperature sensor chips. |
1036 | 1036 | ||
1037 | This driver can also be built as a module. If so, the module | 1037 | This driver can also be built as a module. If so, the module |
1038 | will be called lm95234. | 1038 | will be called lm95234. |
diff --git a/drivers/hwmon/lm95234.c b/drivers/hwmon/lm95234.c index 411202bdaf6b..8796de39ff9b 100644 --- a/drivers/hwmon/lm95234.c +++ b/drivers/hwmon/lm95234.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Driver for Texas Instruments / National Semiconductor LM95234 | 2 | * Driver for Texas Instruments / National Semiconductor LM95234 |
3 | * | 3 | * |
4 | * Copyright (c) 2013 Guenter Roeck <linux@roeck-us.net> | 4 | * Copyright (c) 2013, 2014 Guenter Roeck <linux@roeck-us.net> |
5 | * | 5 | * |
6 | * Derived from lm95241.c | 6 | * Derived from lm95241.c |
7 | * Copyright (C) 2008, 2010 Davide Rizzo <elpa.rizzo@gmail.com> | 7 | * Copyright (C) 2008, 2010 Davide Rizzo <elpa.rizzo@gmail.com> |
@@ -30,7 +30,10 @@ | |||
30 | 30 | ||
31 | #define DRVNAME "lm95234" | 31 | #define DRVNAME "lm95234" |
32 | 32 | ||
33 | static const unsigned short normal_i2c[] = { 0x18, 0x4d, 0x4e, I2C_CLIENT_END }; | 33 | enum chips { lm95233, lm95234 }; |
34 | |||
35 | static const unsigned short normal_i2c[] = { | ||
36 | 0x18, 0x2a, 0x2b, 0x4d, 0x4e, I2C_CLIENT_END }; | ||
34 | 37 | ||
35 | /* LM95234 registers */ | 38 | /* LM95234 registers */ |
36 | #define LM95234_REG_MAN_ID 0xFE | 39 | #define LM95234_REG_MAN_ID 0xFE |
@@ -53,11 +56,13 @@ static const unsigned short normal_i2c[] = { 0x18, 0x4d, 0x4e, I2C_CLIENT_END }; | |||
53 | #define LM95234_REG_TCRIT_HYST 0x5a | 56 | #define LM95234_REG_TCRIT_HYST 0x5a |
54 | 57 | ||
55 | #define NATSEMI_MAN_ID 0x01 | 58 | #define NATSEMI_MAN_ID 0x01 |
59 | #define LM95233_CHIP_ID 0x89 | ||
56 | #define LM95234_CHIP_ID 0x79 | 60 | #define LM95234_CHIP_ID 0x79 |
57 | 61 | ||
58 | /* Client data (each client gets its own) */ | 62 | /* Client data (each client gets its own) */ |
59 | struct lm95234_data { | 63 | struct lm95234_data { |
60 | struct i2c_client *client; | 64 | struct i2c_client *client; |
65 | const struct attribute_group *groups[3]; | ||
61 | struct mutex update_lock; | 66 | struct mutex update_lock; |
62 | unsigned long last_updated, interval; /* in jiffies */ | 67 | unsigned long last_updated, interval; /* in jiffies */ |
63 | bool valid; /* false until following fields are valid */ | 68 | bool valid; /* false until following fields are valid */ |
@@ -564,35 +569,23 @@ static SENSOR_DEVICE_ATTR(temp5_offset, S_IWUSR | S_IRUGO, show_offset, | |||
564 | static DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO, show_interval, | 569 | static DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO, show_interval, |
565 | set_interval); | 570 | set_interval); |
566 | 571 | ||
567 | static struct attribute *lm95234_attrs[] = { | 572 | static struct attribute *lm95234_common_attrs[] = { |
568 | &sensor_dev_attr_temp1_input.dev_attr.attr, | 573 | &sensor_dev_attr_temp1_input.dev_attr.attr, |
569 | &sensor_dev_attr_temp2_input.dev_attr.attr, | 574 | &sensor_dev_attr_temp2_input.dev_attr.attr, |
570 | &sensor_dev_attr_temp3_input.dev_attr.attr, | 575 | &sensor_dev_attr_temp3_input.dev_attr.attr, |
571 | &sensor_dev_attr_temp4_input.dev_attr.attr, | ||
572 | &sensor_dev_attr_temp5_input.dev_attr.attr, | ||
573 | &sensor_dev_attr_temp2_fault.dev_attr.attr, | 576 | &sensor_dev_attr_temp2_fault.dev_attr.attr, |
574 | &sensor_dev_attr_temp3_fault.dev_attr.attr, | 577 | &sensor_dev_attr_temp3_fault.dev_attr.attr, |
575 | &sensor_dev_attr_temp4_fault.dev_attr.attr, | ||
576 | &sensor_dev_attr_temp5_fault.dev_attr.attr, | ||
577 | &sensor_dev_attr_temp2_type.dev_attr.attr, | 578 | &sensor_dev_attr_temp2_type.dev_attr.attr, |
578 | &sensor_dev_attr_temp3_type.dev_attr.attr, | 579 | &sensor_dev_attr_temp3_type.dev_attr.attr, |
579 | &sensor_dev_attr_temp4_type.dev_attr.attr, | ||
580 | &sensor_dev_attr_temp5_type.dev_attr.attr, | ||
581 | &sensor_dev_attr_temp1_max.dev_attr.attr, | 580 | &sensor_dev_attr_temp1_max.dev_attr.attr, |
582 | &sensor_dev_attr_temp2_max.dev_attr.attr, | 581 | &sensor_dev_attr_temp2_max.dev_attr.attr, |
583 | &sensor_dev_attr_temp3_max.dev_attr.attr, | 582 | &sensor_dev_attr_temp3_max.dev_attr.attr, |
584 | &sensor_dev_attr_temp4_max.dev_attr.attr, | ||
585 | &sensor_dev_attr_temp5_max.dev_attr.attr, | ||
586 | &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, | 583 | &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, |
587 | &sensor_dev_attr_temp2_max_hyst.dev_attr.attr, | 584 | &sensor_dev_attr_temp2_max_hyst.dev_attr.attr, |
588 | &sensor_dev_attr_temp3_max_hyst.dev_attr.attr, | 585 | &sensor_dev_attr_temp3_max_hyst.dev_attr.attr, |
589 | &sensor_dev_attr_temp4_max_hyst.dev_attr.attr, | ||
590 | &sensor_dev_attr_temp5_max_hyst.dev_attr.attr, | ||
591 | &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, | 586 | &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, |
592 | &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, | 587 | &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, |
593 | &sensor_dev_attr_temp3_max_alarm.dev_attr.attr, | 588 | &sensor_dev_attr_temp3_max_alarm.dev_attr.attr, |
594 | &sensor_dev_attr_temp4_max_alarm.dev_attr.attr, | ||
595 | &sensor_dev_attr_temp5_max_alarm.dev_attr.attr, | ||
596 | &sensor_dev_attr_temp2_crit.dev_attr.attr, | 589 | &sensor_dev_attr_temp2_crit.dev_attr.attr, |
597 | &sensor_dev_attr_temp3_crit.dev_attr.attr, | 590 | &sensor_dev_attr_temp3_crit.dev_attr.attr, |
598 | &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, | 591 | &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, |
@@ -601,18 +594,44 @@ static struct attribute *lm95234_attrs[] = { | |||
601 | &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr, | 594 | &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr, |
602 | &sensor_dev_attr_temp2_offset.dev_attr.attr, | 595 | &sensor_dev_attr_temp2_offset.dev_attr.attr, |
603 | &sensor_dev_attr_temp3_offset.dev_attr.attr, | 596 | &sensor_dev_attr_temp3_offset.dev_attr.attr, |
597 | &dev_attr_update_interval.attr, | ||
598 | NULL | ||
599 | }; | ||
600 | |||
601 | static const struct attribute_group lm95234_common_group = { | ||
602 | .attrs = lm95234_common_attrs, | ||
603 | }; | ||
604 | |||
605 | static struct attribute *lm95234_attrs[] = { | ||
606 | &sensor_dev_attr_temp4_input.dev_attr.attr, | ||
607 | &sensor_dev_attr_temp5_input.dev_attr.attr, | ||
608 | &sensor_dev_attr_temp4_fault.dev_attr.attr, | ||
609 | &sensor_dev_attr_temp5_fault.dev_attr.attr, | ||
610 | &sensor_dev_attr_temp4_type.dev_attr.attr, | ||
611 | &sensor_dev_attr_temp5_type.dev_attr.attr, | ||
612 | &sensor_dev_attr_temp4_max.dev_attr.attr, | ||
613 | &sensor_dev_attr_temp5_max.dev_attr.attr, | ||
614 | &sensor_dev_attr_temp4_max_hyst.dev_attr.attr, | ||
615 | &sensor_dev_attr_temp5_max_hyst.dev_attr.attr, | ||
616 | &sensor_dev_attr_temp4_max_alarm.dev_attr.attr, | ||
617 | &sensor_dev_attr_temp5_max_alarm.dev_attr.attr, | ||
604 | &sensor_dev_attr_temp4_offset.dev_attr.attr, | 618 | &sensor_dev_attr_temp4_offset.dev_attr.attr, |
605 | &sensor_dev_attr_temp5_offset.dev_attr.attr, | 619 | &sensor_dev_attr_temp5_offset.dev_attr.attr, |
606 | &dev_attr_update_interval.attr, | ||
607 | NULL | 620 | NULL |
608 | }; | 621 | }; |
609 | ATTRIBUTE_GROUPS(lm95234); | 622 | |
623 | static const struct attribute_group lm95234_group = { | ||
624 | .attrs = lm95234_attrs, | ||
625 | }; | ||
610 | 626 | ||
611 | static int lm95234_detect(struct i2c_client *client, | 627 | static int lm95234_detect(struct i2c_client *client, |
612 | struct i2c_board_info *info) | 628 | struct i2c_board_info *info) |
613 | { | 629 | { |
614 | struct i2c_adapter *adapter = client->adapter; | 630 | struct i2c_adapter *adapter = client->adapter; |
631 | int address = client->addr; | ||
632 | u8 config_mask, model_mask; | ||
615 | int mfg_id, chip_id, val; | 633 | int mfg_id, chip_id, val; |
634 | const char *name; | ||
616 | 635 | ||
617 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | 636 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
618 | return -ENODEV; | 637 | return -ENODEV; |
@@ -622,15 +641,31 @@ static int lm95234_detect(struct i2c_client *client, | |||
622 | return -ENODEV; | 641 | return -ENODEV; |
623 | 642 | ||
624 | chip_id = i2c_smbus_read_byte_data(client, LM95234_REG_CHIP_ID); | 643 | chip_id = i2c_smbus_read_byte_data(client, LM95234_REG_CHIP_ID); |
625 | if (chip_id != LM95234_CHIP_ID) | 644 | switch (chip_id) { |
645 | case LM95233_CHIP_ID: | ||
646 | if (address != 0x18 && address != 0x2a && address != 0x2b) | ||
647 | return -ENODEV; | ||
648 | config_mask = 0xbf; | ||
649 | model_mask = 0xf9; | ||
650 | name = "lm95233"; | ||
651 | break; | ||
652 | case LM95234_CHIP_ID: | ||
653 | if (address != 0x18 && address != 0x4d && address != 0x4e) | ||
654 | return -ENODEV; | ||
655 | config_mask = 0xbc; | ||
656 | model_mask = 0xe1; | ||
657 | name = "lm95234"; | ||
658 | break; | ||
659 | default: | ||
626 | return -ENODEV; | 660 | return -ENODEV; |
661 | } | ||
627 | 662 | ||
628 | val = i2c_smbus_read_byte_data(client, LM95234_REG_STATUS); | 663 | val = i2c_smbus_read_byte_data(client, LM95234_REG_STATUS); |
629 | if (val & 0x30) | 664 | if (val & 0x30) |
630 | return -ENODEV; | 665 | return -ENODEV; |
631 | 666 | ||
632 | val = i2c_smbus_read_byte_data(client, LM95234_REG_CONFIG); | 667 | val = i2c_smbus_read_byte_data(client, LM95234_REG_CONFIG); |
633 | if (val & 0xbc) | 668 | if (val & config_mask) |
634 | return -ENODEV; | 669 | return -ENODEV; |
635 | 670 | ||
636 | val = i2c_smbus_read_byte_data(client, LM95234_REG_CONVRATE); | 671 | val = i2c_smbus_read_byte_data(client, LM95234_REG_CONVRATE); |
@@ -638,14 +673,14 @@ static int lm95234_detect(struct i2c_client *client, | |||
638 | return -ENODEV; | 673 | return -ENODEV; |
639 | 674 | ||
640 | val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL); | 675 | val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL); |
641 | if (val & 0xe1) | 676 | if (val & model_mask) |
642 | return -ENODEV; | 677 | return -ENODEV; |
643 | 678 | ||
644 | val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL_STS); | 679 | val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL_STS); |
645 | if (val & 0xe1) | 680 | if (val & model_mask) |
646 | return -ENODEV; | 681 | return -ENODEV; |
647 | 682 | ||
648 | strlcpy(info->type, "lm95234", I2C_NAME_SIZE); | 683 | strlcpy(info->type, name, I2C_NAME_SIZE); |
649 | return 0; | 684 | return 0; |
650 | } | 685 | } |
651 | 686 | ||
@@ -698,15 +733,19 @@ static int lm95234_probe(struct i2c_client *client, | |||
698 | if (err < 0) | 733 | if (err < 0) |
699 | return err; | 734 | return err; |
700 | 735 | ||
736 | data->groups[0] = &lm95234_common_group; | ||
737 | if (id->driver_data == lm95234) | ||
738 | data->groups[1] = &lm95234_group; | ||
739 | |||
701 | hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, | 740 | hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, |
702 | data, | 741 | data, data->groups); |
703 | lm95234_groups); | ||
704 | return PTR_ERR_OR_ZERO(hwmon_dev); | 742 | return PTR_ERR_OR_ZERO(hwmon_dev); |
705 | } | 743 | } |
706 | 744 | ||
707 | /* Driver data (common to all clients) */ | 745 | /* Driver data (common to all clients) */ |
708 | static const struct i2c_device_id lm95234_id[] = { | 746 | static const struct i2c_device_id lm95234_id[] = { |
709 | { "lm95234", 0 }, | 747 | { "lm95233", lm95233 }, |
748 | { "lm95234", lm95234 }, | ||
710 | { } | 749 | { } |
711 | }; | 750 | }; |
712 | MODULE_DEVICE_TABLE(i2c, lm95234_id); | 751 | MODULE_DEVICE_TABLE(i2c, lm95234_id); |
@@ -725,5 +764,5 @@ static struct i2c_driver lm95234_driver = { | |||
725 | module_i2c_driver(lm95234_driver); | 764 | module_i2c_driver(lm95234_driver); |
726 | 765 | ||
727 | MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>"); | 766 | MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>"); |
728 | MODULE_DESCRIPTION("LM95234 sensor driver"); | 767 | MODULE_DESCRIPTION("LM95233/LM95234 sensor driver"); |
729 | MODULE_LICENSE("GPL"); | 768 | MODULE_LICENSE("GPL"); |