diff options
| -rw-r--r-- | drivers/hwmon/f71805f.c | 324 | ||||
| -rw-r--r-- | drivers/hwmon/lm63.c | 89 | ||||
| -rw-r--r-- | drivers/hwmon/lm83.c | 125 | ||||
| -rw-r--r-- | drivers/hwmon/lm90.c | 83 |
4 files changed, 357 insertions, 264 deletions
diff --git a/drivers/hwmon/f71805f.c b/drivers/hwmon/f71805f.c index 678bae43716d..de17a72149d9 100644 --- a/drivers/hwmon/f71805f.c +++ b/drivers/hwmon/f71805f.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/hwmon-sysfs.h> | 31 | #include <linux/hwmon-sysfs.h> |
| 32 | #include <linux/err.h> | 32 | #include <linux/err.h> |
| 33 | #include <linux/mutex.h> | 33 | #include <linux/mutex.h> |
| 34 | #include <linux/sysfs.h> | ||
| 34 | #include <asm/io.h> | 35 | #include <asm/io.h> |
| 35 | 36 | ||
| 36 | static struct platform_device *pdev; | 37 | static struct platform_device *pdev; |
| @@ -593,104 +594,189 @@ static ssize_t show_name(struct device *dev, struct device_attribute | |||
| 593 | return sprintf(buf, "%s\n", data->name); | 594 | return sprintf(buf, "%s\n", data->name); |
| 594 | } | 595 | } |
| 595 | 596 | ||
| 596 | static struct device_attribute f71805f_dev_attr[] = { | 597 | static DEVICE_ATTR(in0_input, S_IRUGO, show_in0, NULL); |
| 597 | __ATTR(in0_input, S_IRUGO, show_in0, NULL), | 598 | static DEVICE_ATTR(in0_max, S_IRUGO| S_IWUSR, show_in0_max, set_in0_max); |
| 598 | __ATTR(in0_max, S_IRUGO| S_IWUSR, show_in0_max, set_in0_max), | 599 | static DEVICE_ATTR(in0_min, S_IRUGO| S_IWUSR, show_in0_min, set_in0_min); |
| 599 | __ATTR(in0_min, S_IRUGO| S_IWUSR, show_in0_min, set_in0_min), | 600 | static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1); |
| 600 | __ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL), | 601 | static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR, |
| 601 | __ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL), | 602 | show_in_max, set_in_max, 1); |
| 602 | __ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL), | 603 | static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR, |
| 603 | __ATTR(name, S_IRUGO, show_name, NULL), | 604 | show_in_min, set_in_min, 1); |
| 605 | static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2); | ||
| 606 | static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR, | ||
| 607 | show_in_max, set_in_max, 2); | ||
| 608 | static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR, | ||
| 609 | show_in_min, set_in_min, 2); | ||
| 610 | static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3); | ||
| 611 | static SENSOR_DEVICE_ATTR(in3_max, S_IRUGO | S_IWUSR, | ||
| 612 | show_in_max, set_in_max, 3); | ||
| 613 | static SENSOR_DEVICE_ATTR(in3_min, S_IRUGO | S_IWUSR, | ||
| 614 | show_in_min, set_in_min, 3); | ||
| 615 | static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4); | ||
| 616 | static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR, | ||
| 617 | show_in_max, set_in_max, 4); | ||
| 618 | static SENSOR_DEVICE_ATTR(in4_min, S_IRUGO | S_IWUSR, | ||
| 619 | show_in_min, set_in_min, 4); | ||
| 620 | static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5); | ||
| 621 | static SENSOR_DEVICE_ATTR(in5_max, S_IRUGO | S_IWUSR, | ||
| 622 | show_in_max, set_in_max, 5); | ||
| 623 | static SENSOR_DEVICE_ATTR(in5_min, S_IRUGO | S_IWUSR, | ||
| 624 | show_in_min, set_in_min, 5); | ||
| 625 | static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6); | ||
| 626 | static SENSOR_DEVICE_ATTR(in6_max, S_IRUGO | S_IWUSR, | ||
| 627 | show_in_max, set_in_max, 6); | ||
| 628 | static SENSOR_DEVICE_ATTR(in6_min, S_IRUGO | S_IWUSR, | ||
| 629 | show_in_min, set_in_min, 6); | ||
| 630 | static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7); | ||
| 631 | static SENSOR_DEVICE_ATTR(in7_max, S_IRUGO | S_IWUSR, | ||
| 632 | show_in_max, set_in_max, 7); | ||
| 633 | static SENSOR_DEVICE_ATTR(in7_min, S_IRUGO | S_IWUSR, | ||
| 634 | show_in_min, set_in_min, 7); | ||
| 635 | static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8); | ||
| 636 | static SENSOR_DEVICE_ATTR(in8_max, S_IRUGO | S_IWUSR, | ||
| 637 | show_in_max, set_in_max, 8); | ||
| 638 | static SENSOR_DEVICE_ATTR(in8_min, S_IRUGO | S_IWUSR, | ||
| 639 | show_in_min, set_in_min, 8); | ||
| 640 | |||
| 641 | static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0); | ||
| 642 | static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR, | ||
| 643 | show_fan_min, set_fan_min, 0); | ||
| 644 | static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1); | ||
| 645 | static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO | S_IWUSR, | ||
| 646 | show_fan_min, set_fan_min, 1); | ||
| 647 | static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2); | ||
| 648 | static SENSOR_DEVICE_ATTR(fan3_min, S_IRUGO | S_IWUSR, | ||
| 649 | show_fan_min, set_fan_min, 2); | ||
| 650 | |||
| 651 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0); | ||
| 652 | static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, | ||
| 653 | show_temp_max, set_temp_max, 0); | ||
| 654 | static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, | ||
| 655 | show_temp_hyst, set_temp_hyst, 0); | ||
| 656 | static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0); | ||
| 657 | static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1); | ||
| 658 | static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR, | ||
| 659 | show_temp_max, set_temp_max, 1); | ||
| 660 | static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, | ||
| 661 | show_temp_hyst, set_temp_hyst, 1); | ||
| 662 | static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1); | ||
| 663 | static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2); | ||
| 664 | static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR, | ||
| 665 | show_temp_max, set_temp_max, 2); | ||
| 666 | static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, | ||
| 667 | show_temp_hyst, set_temp_hyst, 2); | ||
| 668 | static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2); | ||
| 669 | |||
| 670 | static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0); | ||
| 671 | static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1); | ||
| 672 | static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2); | ||
| 673 | static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3); | ||
| 674 | static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4); | ||
| 675 | static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5); | ||
| 676 | static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6); | ||
| 677 | static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7); | ||
| 678 | static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8); | ||
| 679 | static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 11); | ||
| 680 | static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 12); | ||
| 681 | static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13); | ||
| 682 | static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16); | ||
| 683 | static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17); | ||
| 684 | static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18); | ||
| 685 | static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL); | ||
| 686 | static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL); | ||
| 687 | static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL); | ||
| 688 | |||
| 689 | static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); | ||
| 690 | |||
| 691 | static struct attribute *f71805f_attributes[] = { | ||
| 692 | &dev_attr_in0_input.attr, | ||
| 693 | &dev_attr_in0_max.attr, | ||
| 694 | &dev_attr_in0_min.attr, | ||
| 695 | &sensor_dev_attr_in1_input.dev_attr.attr, | ||
| 696 | &sensor_dev_attr_in1_max.dev_attr.attr, | ||
| 697 | &sensor_dev_attr_in1_min.dev_attr.attr, | ||
| 698 | &sensor_dev_attr_in2_input.dev_attr.attr, | ||
| 699 | &sensor_dev_attr_in2_max.dev_attr.attr, | ||
| 700 | &sensor_dev_attr_in2_min.dev_attr.attr, | ||
| 701 | &sensor_dev_attr_in3_input.dev_attr.attr, | ||
| 702 | &sensor_dev_attr_in3_max.dev_attr.attr, | ||
| 703 | &sensor_dev_attr_in3_min.dev_attr.attr, | ||
| 704 | &sensor_dev_attr_in4_input.dev_attr.attr, | ||
| 705 | &sensor_dev_attr_in4_max.dev_attr.attr, | ||
| 706 | &sensor_dev_attr_in4_min.dev_attr.attr, | ||
| 707 | &sensor_dev_attr_in5_input.dev_attr.attr, | ||
| 708 | &sensor_dev_attr_in5_max.dev_attr.attr, | ||
| 709 | &sensor_dev_attr_in5_min.dev_attr.attr, | ||
| 710 | &sensor_dev_attr_in6_input.dev_attr.attr, | ||
| 711 | &sensor_dev_attr_in6_max.dev_attr.attr, | ||
| 712 | &sensor_dev_attr_in6_min.dev_attr.attr, | ||
| 713 | &sensor_dev_attr_in7_input.dev_attr.attr, | ||
| 714 | &sensor_dev_attr_in7_max.dev_attr.attr, | ||
| 715 | &sensor_dev_attr_in7_min.dev_attr.attr, | ||
| 716 | &sensor_dev_attr_in8_input.dev_attr.attr, | ||
| 717 | &sensor_dev_attr_in8_max.dev_attr.attr, | ||
| 718 | &sensor_dev_attr_in8_min.dev_attr.attr, | ||
| 719 | |||
| 720 | &sensor_dev_attr_temp1_input.dev_attr.attr, | ||
| 721 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
| 722 | &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, | ||
| 723 | &sensor_dev_attr_temp1_type.dev_attr.attr, | ||
| 724 | &sensor_dev_attr_temp2_input.dev_attr.attr, | ||
| 725 | &sensor_dev_attr_temp2_max.dev_attr.attr, | ||
| 726 | &sensor_dev_attr_temp2_max_hyst.dev_attr.attr, | ||
| 727 | &sensor_dev_attr_temp2_type.dev_attr.attr, | ||
| 728 | &sensor_dev_attr_temp3_input.dev_attr.attr, | ||
| 729 | &sensor_dev_attr_temp3_max.dev_attr.attr, | ||
| 730 | &sensor_dev_attr_temp3_max_hyst.dev_attr.attr, | ||
| 731 | &sensor_dev_attr_temp3_type.dev_attr.attr, | ||
| 732 | |||
| 733 | &sensor_dev_attr_in0_alarm.dev_attr.attr, | ||
| 734 | &sensor_dev_attr_in1_alarm.dev_attr.attr, | ||
| 735 | &sensor_dev_attr_in2_alarm.dev_attr.attr, | ||
| 736 | &sensor_dev_attr_in3_alarm.dev_attr.attr, | ||
| 737 | &sensor_dev_attr_in4_alarm.dev_attr.attr, | ||
| 738 | &sensor_dev_attr_in5_alarm.dev_attr.attr, | ||
| 739 | &sensor_dev_attr_in6_alarm.dev_attr.attr, | ||
| 740 | &sensor_dev_attr_in7_alarm.dev_attr.attr, | ||
| 741 | &sensor_dev_attr_in8_alarm.dev_attr.attr, | ||
| 742 | &dev_attr_alarms_in.attr, | ||
| 743 | &sensor_dev_attr_temp1_alarm.dev_attr.attr, | ||
| 744 | &sensor_dev_attr_temp2_alarm.dev_attr.attr, | ||
| 745 | &sensor_dev_attr_temp3_alarm.dev_attr.attr, | ||
| 746 | &dev_attr_alarms_temp.attr, | ||
| 747 | &dev_attr_alarms_fan.attr, | ||
| 748 | |||
| 749 | &dev_attr_name.attr, | ||
| 750 | NULL | ||
| 604 | }; | 751 | }; |
| 605 | 752 | ||
| 606 | static struct sensor_device_attribute f71805f_sensor_attr[] = { | 753 | static const struct attribute_group f71805f_group = { |
| 607 | SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1), | 754 | .attrs = f71805f_attributes, |
| 608 | SENSOR_ATTR(in1_max, S_IRUGO | S_IWUSR, | ||
| 609 | show_in_max, set_in_max, 1), | ||
| 610 | SENSOR_ATTR(in1_min, S_IRUGO | S_IWUSR, | ||
| 611 | show_in_min, set_in_min, 1), | ||
| 612 | SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2), | ||
| 613 | SENSOR_ATTR(in2_max, S_IRUGO | S_IWUSR, | ||
| 614 | show_in_max, set_in_max, 2), | ||
| 615 | SENSOR_ATTR(in2_min, S_IRUGO | S_IWUSR, | ||
| 616 | show_in_min, set_in_min, 2), | ||
| 617 | SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3), | ||
| 618 | SENSOR_ATTR(in3_max, S_IRUGO | S_IWUSR, | ||
| 619 | show_in_max, set_in_max, 3), | ||
| 620 | SENSOR_ATTR(in3_min, S_IRUGO | S_IWUSR, | ||
| 621 | show_in_min, set_in_min, 3), | ||
| 622 | SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4), | ||
| 623 | SENSOR_ATTR(in4_max, S_IRUGO | S_IWUSR, | ||
| 624 | show_in_max, set_in_max, 4), | ||
| 625 | SENSOR_ATTR(in4_min, S_IRUGO | S_IWUSR, | ||
| 626 | show_in_min, set_in_min, 4), | ||
| 627 | SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5), | ||
| 628 | SENSOR_ATTR(in5_max, S_IRUGO | S_IWUSR, | ||
| 629 | show_in_max, set_in_max, 5), | ||
| 630 | SENSOR_ATTR(in5_min, S_IRUGO | S_IWUSR, | ||
| 631 | show_in_min, set_in_min, 5), | ||
| 632 | SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6), | ||
| 633 | SENSOR_ATTR(in6_max, S_IRUGO | S_IWUSR, | ||
| 634 | show_in_max, set_in_max, 6), | ||
| 635 | SENSOR_ATTR(in6_min, S_IRUGO | S_IWUSR, | ||
| 636 | show_in_min, set_in_min, 6), | ||
| 637 | SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7), | ||
| 638 | SENSOR_ATTR(in7_max, S_IRUGO | S_IWUSR, | ||
| 639 | show_in_max, set_in_max, 7), | ||
| 640 | SENSOR_ATTR(in7_min, S_IRUGO | S_IWUSR, | ||
| 641 | show_in_min, set_in_min, 7), | ||
| 642 | SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8), | ||
| 643 | SENSOR_ATTR(in8_max, S_IRUGO | S_IWUSR, | ||
| 644 | show_in_max, set_in_max, 8), | ||
| 645 | SENSOR_ATTR(in8_min, S_IRUGO | S_IWUSR, | ||
| 646 | show_in_min, set_in_min, 8), | ||
| 647 | |||
| 648 | SENSOR_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0), | ||
| 649 | SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, | ||
| 650 | show_temp_max, set_temp_max, 0), | ||
| 651 | SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, | ||
| 652 | show_temp_hyst, set_temp_hyst, 0), | ||
| 653 | SENSOR_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0), | ||
| 654 | SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1), | ||
| 655 | SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, | ||
| 656 | show_temp_max, set_temp_max, 1), | ||
| 657 | SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, | ||
| 658 | show_temp_hyst, set_temp_hyst, 1), | ||
| 659 | SENSOR_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1), | ||
| 660 | SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2), | ||
| 661 | SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, | ||
| 662 | show_temp_max, set_temp_max, 2), | ||
| 663 | SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, | ||
| 664 | show_temp_hyst, set_temp_hyst, 2), | ||
| 665 | SENSOR_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2), | ||
| 666 | |||
| 667 | SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0), | ||
| 668 | SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1), | ||
| 669 | SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2), | ||
| 670 | SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3), | ||
| 671 | SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4), | ||
| 672 | SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5), | ||
| 673 | SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6), | ||
| 674 | SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7), | ||
| 675 | SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8), | ||
| 676 | SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 11), | ||
| 677 | SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 12), | ||
| 678 | SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13), | ||
| 679 | }; | 755 | }; |
| 680 | 756 | ||
| 681 | static struct sensor_device_attribute f71805f_fan_attr[] = { | 757 | static struct attribute *f71805f_attributes_fan[3][4] = { |
| 682 | SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0), | 758 | { |
| 683 | SENSOR_ATTR(fan1_min, S_IRUGO | S_IWUSR, | 759 | &sensor_dev_attr_fan1_input.dev_attr.attr, |
| 684 | show_fan_min, set_fan_min, 0), | 760 | &sensor_dev_attr_fan1_min.dev_attr.attr, |
| 685 | SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16), | 761 | &sensor_dev_attr_fan1_alarm.dev_attr.attr, |
| 686 | SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1), | 762 | NULL |
| 687 | SENSOR_ATTR(fan2_min, S_IRUGO | S_IWUSR, | 763 | }, { |
| 688 | show_fan_min, set_fan_min, 1), | 764 | &sensor_dev_attr_fan2_input.dev_attr.attr, |
| 689 | SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17), | 765 | &sensor_dev_attr_fan2_min.dev_attr.attr, |
| 690 | SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2), | 766 | &sensor_dev_attr_fan2_alarm.dev_attr.attr, |
| 691 | SENSOR_ATTR(fan3_min, S_IRUGO | S_IWUSR, | 767 | NULL |
| 692 | show_fan_min, set_fan_min, 2), | 768 | }, { |
| 693 | SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18), | 769 | &sensor_dev_attr_fan3_input.dev_attr.attr, |
| 770 | &sensor_dev_attr_fan3_min.dev_attr.attr, | ||
| 771 | &sensor_dev_attr_fan3_alarm.dev_attr.attr, | ||
| 772 | NULL | ||
| 773 | } | ||
| 774 | }; | ||
| 775 | |||
| 776 | static const struct attribute_group f71805f_group_fan[3] = { | ||
| 777 | { .attrs = f71805f_attributes_fan[0] }, | ||
| 778 | { .attrs = f71805f_attributes_fan[1] }, | ||
| 779 | { .attrs = f71805f_attributes_fan[2] }, | ||
| 694 | }; | 780 | }; |
| 695 | 781 | ||
| 696 | /* | 782 | /* |
| @@ -738,43 +824,35 @@ static int __devinit f71805f_probe(struct platform_device *pdev) | |||
| 738 | 824 | ||
| 739 | platform_set_drvdata(pdev, data); | 825 | platform_set_drvdata(pdev, data); |
| 740 | 826 | ||
| 741 | data->class_dev = hwmon_device_register(&pdev->dev); | ||
| 742 | if (IS_ERR(data->class_dev)) { | ||
| 743 | err = PTR_ERR(data->class_dev); | ||
| 744 | dev_err(&pdev->dev, "Class registration failed (%d)\n", err); | ||
| 745 | goto exit_free; | ||
| 746 | } | ||
| 747 | |||
| 748 | /* Initialize the F71805F chip */ | 827 | /* Initialize the F71805F chip */ |
| 749 | f71805f_init_device(data); | 828 | f71805f_init_device(data); |
| 750 | 829 | ||
| 751 | /* Register sysfs interface files */ | 830 | /* Register sysfs interface files */ |
| 752 | for (i = 0; i < ARRAY_SIZE(f71805f_dev_attr); i++) { | 831 | if ((err = sysfs_create_group(&pdev->dev.kobj, &f71805f_group))) |
| 753 | err = device_create_file(&pdev->dev, &f71805f_dev_attr[i]); | 832 | goto exit_free; |
| 754 | if (err) | 833 | for (i = 0; i < 3; i++) { |
| 755 | goto exit_class; | 834 | if (!(data->fan_enabled & (1 << i))) |
| 756 | } | ||
| 757 | for (i = 0; i < ARRAY_SIZE(f71805f_sensor_attr); i++) { | ||
| 758 | err = device_create_file(&pdev->dev, | ||
| 759 | &f71805f_sensor_attr[i].dev_attr); | ||
| 760 | if (err) | ||
| 761 | goto exit_class; | ||
| 762 | } | ||
| 763 | for (i = 0; i < ARRAY_SIZE(f71805f_fan_attr); i++) { | ||
| 764 | if (!(data->fan_enabled & (1 << (i / 3)))) | ||
| 765 | continue; | 835 | continue; |
| 766 | err = device_create_file(&pdev->dev, | 836 | if ((err = sysfs_create_group(&pdev->dev.kobj, |
| 767 | &f71805f_fan_attr[i].dev_attr); | 837 | &f71805f_group_fan[i]))) |
| 768 | if (err) | 838 | goto exit_remove_files; |
| 769 | goto exit_class; | 839 | } |
| 840 | |||
| 841 | data->class_dev = hwmon_device_register(&pdev->dev); | ||
| 842 | if (IS_ERR(data->class_dev)) { | ||
| 843 | err = PTR_ERR(data->class_dev); | ||
| 844 | dev_err(&pdev->dev, "Class registration failed (%d)\n", err); | ||
| 845 | goto exit_remove_files; | ||
| 770 | } | 846 | } |
| 771 | 847 | ||
| 772 | return 0; | 848 | return 0; |
| 773 | 849 | ||
| 774 | exit_class: | 850 | exit_remove_files: |
| 775 | dev_err(&pdev->dev, "Sysfs interface creation failed\n"); | 851 | sysfs_remove_group(&pdev->dev.kobj, &f71805f_group); |
| 776 | hwmon_device_unregister(data->class_dev); | 852 | for (i = 0; i < 3; i++) |
| 853 | sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_fan[i]); | ||
| 777 | exit_free: | 854 | exit_free: |
| 855 | platform_set_drvdata(pdev, NULL); | ||
| 778 | kfree(data); | 856 | kfree(data); |
| 779 | exit: | 857 | exit: |
| 780 | return err; | 858 | return err; |
| @@ -783,9 +861,13 @@ exit: | |||
| 783 | static int __devexit f71805f_remove(struct platform_device *pdev) | 861 | static int __devexit f71805f_remove(struct platform_device *pdev) |
| 784 | { | 862 | { |
| 785 | struct f71805f_data *data = platform_get_drvdata(pdev); | 863 | struct f71805f_data *data = platform_get_drvdata(pdev); |
| 864 | int i; | ||
| 786 | 865 | ||
| 787 | platform_set_drvdata(pdev, NULL); | 866 | platform_set_drvdata(pdev, NULL); |
| 788 | hwmon_device_unregister(data->class_dev); | 867 | hwmon_device_unregister(data->class_dev); |
| 868 | sysfs_remove_group(&pdev->dev.kobj, &f71805f_group); | ||
| 869 | for (i = 0; i < 3; i++) | ||
| 870 | sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_fan[i]); | ||
| 789 | kfree(data); | 871 | kfree(data); |
| 790 | 872 | ||
| 791 | return 0; | 873 | return 0; |
diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index 00a50bea7cbd..d69f3cf07122 100644 --- a/drivers/hwmon/lm63.c +++ b/drivers/hwmon/lm63.c | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #include <linux/hwmon.h> | 46 | #include <linux/hwmon.h> |
| 47 | #include <linux/err.h> | 47 | #include <linux/err.h> |
| 48 | #include <linux/mutex.h> | 48 | #include <linux/mutex.h> |
| 49 | #include <linux/sysfs.h> | ||
| 49 | 50 | ||
| 50 | /* | 51 | /* |
| 51 | * Addresses to scan | 52 | * Addresses to scan |
| @@ -370,6 +371,42 @@ static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6); | |||
| 370 | /* Raw alarm file for compatibility */ | 371 | /* Raw alarm file for compatibility */ |
| 371 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); | 372 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); |
| 372 | 373 | ||
| 374 | static struct attribute *lm63_attributes[] = { | ||
| 375 | &dev_attr_pwm1.attr, | ||
| 376 | &dev_attr_pwm1_enable.attr, | ||
| 377 | &sensor_dev_attr_temp1_input.dev_attr.attr, | ||
| 378 | &sensor_dev_attr_temp2_input.dev_attr.attr, | ||
| 379 | &sensor_dev_attr_temp2_min.dev_attr.attr, | ||
| 380 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
| 381 | &sensor_dev_attr_temp2_max.dev_attr.attr, | ||
| 382 | &sensor_dev_attr_temp2_crit.dev_attr.attr, | ||
| 383 | &dev_attr_temp2_crit_hyst.attr, | ||
| 384 | |||
| 385 | &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, | ||
| 386 | &sensor_dev_attr_temp2_input_fault.dev_attr.attr, | ||
| 387 | &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, | ||
| 388 | &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, | ||
| 389 | &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, | ||
| 390 | &dev_attr_alarms.attr, | ||
| 391 | NULL | ||
| 392 | }; | ||
| 393 | |||
| 394 | static const struct attribute_group lm63_group = { | ||
| 395 | .attrs = lm63_attributes, | ||
| 396 | }; | ||
| 397 | |||
| 398 | static struct attribute *lm63_attributes_fan1[] = { | ||
| 399 | &sensor_dev_attr_fan1_input.dev_attr.attr, | ||
| 400 | &sensor_dev_attr_fan1_min.dev_attr.attr, | ||
| 401 | |||
| 402 | &sensor_dev_attr_fan1_min_alarm.dev_attr.attr, | ||
| 403 | NULL | ||
| 404 | }; | ||
| 405 | |||
| 406 | static const struct attribute_group lm63_group_fan1 = { | ||
| 407 | .attrs = lm63_attributes_fan1, | ||
| 408 | }; | ||
| 409 | |||
| 373 | /* | 410 | /* |
| 374 | * Real code | 411 | * Real code |
| 375 | */ | 412 | */ |
| @@ -456,50 +493,26 @@ static int lm63_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 456 | lm63_init_client(new_client); | 493 | lm63_init_client(new_client); |
| 457 | 494 | ||
| 458 | /* Register sysfs hooks */ | 495 | /* Register sysfs hooks */ |
| 459 | data->class_dev = hwmon_device_register(&new_client->dev); | 496 | if ((err = sysfs_create_group(&new_client->dev.kobj, |
| 460 | if (IS_ERR(data->class_dev)) { | 497 | &lm63_group))) |
| 461 | err = PTR_ERR(data->class_dev); | ||
| 462 | goto exit_detach; | 498 | goto exit_detach; |
| 499 | if (data->config & 0x04) { /* tachometer enabled */ | ||
| 500 | if ((err = sysfs_create_group(&new_client->dev.kobj, | ||
| 501 | &lm63_group_fan1))) | ||
| 502 | goto exit_remove_files; | ||
| 463 | } | 503 | } |
| 464 | 504 | ||
| 465 | if (data->config & 0x04) { /* tachometer enabled */ | 505 | data->class_dev = hwmon_device_register(&new_client->dev); |
| 466 | device_create_file(&new_client->dev, | 506 | if (IS_ERR(data->class_dev)) { |
| 467 | &sensor_dev_attr_fan1_input.dev_attr); | 507 | err = PTR_ERR(data->class_dev); |
| 468 | device_create_file(&new_client->dev, | 508 | goto exit_remove_files; |
| 469 | &sensor_dev_attr_fan1_min.dev_attr); | ||
| 470 | device_create_file(&new_client->dev, | ||
| 471 | &sensor_dev_attr_fan1_min_alarm.dev_attr); | ||
| 472 | } | 509 | } |
| 473 | device_create_file(&new_client->dev, &dev_attr_pwm1); | ||
| 474 | device_create_file(&new_client->dev, &dev_attr_pwm1_enable); | ||
| 475 | device_create_file(&new_client->dev, | ||
| 476 | &sensor_dev_attr_temp1_input.dev_attr); | ||
| 477 | device_create_file(&new_client->dev, | ||
| 478 | &sensor_dev_attr_temp2_input.dev_attr); | ||
| 479 | device_create_file(&new_client->dev, | ||
| 480 | &sensor_dev_attr_temp2_min.dev_attr); | ||
| 481 | device_create_file(&new_client->dev, | ||
| 482 | &sensor_dev_attr_temp1_max.dev_attr); | ||
| 483 | device_create_file(&new_client->dev, | ||
| 484 | &sensor_dev_attr_temp2_max.dev_attr); | ||
| 485 | device_create_file(&new_client->dev, | ||
| 486 | &sensor_dev_attr_temp2_crit.dev_attr); | ||
| 487 | device_create_file(&new_client->dev, &dev_attr_temp2_crit_hyst); | ||
| 488 | |||
| 489 | device_create_file(&new_client->dev, | ||
| 490 | &sensor_dev_attr_temp2_input_fault.dev_attr); | ||
| 491 | device_create_file(&new_client->dev, | ||
| 492 | &sensor_dev_attr_temp2_min_alarm.dev_attr); | ||
| 493 | device_create_file(&new_client->dev, | ||
| 494 | &sensor_dev_attr_temp1_max_alarm.dev_attr); | ||
| 495 | device_create_file(&new_client->dev, | ||
| 496 | &sensor_dev_attr_temp2_max_alarm.dev_attr); | ||
| 497 | device_create_file(&new_client->dev, | ||
| 498 | &sensor_dev_attr_temp2_crit_alarm.dev_attr); | ||
| 499 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
| 500 | 510 | ||
| 501 | return 0; | 511 | return 0; |
| 502 | 512 | ||
| 513 | exit_remove_files: | ||
| 514 | sysfs_remove_group(&new_client->dev.kobj, &lm63_group); | ||
| 515 | sysfs_remove_group(&new_client->dev.kobj, &lm63_group_fan1); | ||
| 503 | exit_detach: | 516 | exit_detach: |
| 504 | i2c_detach_client(new_client); | 517 | i2c_detach_client(new_client); |
| 505 | exit_free: | 518 | exit_free: |
| @@ -549,6 +562,8 @@ static int lm63_detach_client(struct i2c_client *client) | |||
| 549 | int err; | 562 | int err; |
| 550 | 563 | ||
| 551 | hwmon_device_unregister(data->class_dev); | 564 | hwmon_device_unregister(data->class_dev); |
| 565 | sysfs_remove_group(&client->dev.kobj, &lm63_group); | ||
| 566 | sysfs_remove_group(&client->dev.kobj, &lm63_group_fan1); | ||
| 552 | 567 | ||
| 553 | if ((err = i2c_detach_client(client))) | 568 | if ((err = i2c_detach_client(client))) |
| 554 | return err; | 569 | return err; |
diff --git a/drivers/hwmon/lm83.c b/drivers/hwmon/lm83.c index ea224891d311..feb87b41e986 100644 --- a/drivers/hwmon/lm83.c +++ b/drivers/hwmon/lm83.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <linux/hwmon.h> | 40 | #include <linux/hwmon.h> |
| 41 | #include <linux/err.h> | 41 | #include <linux/err.h> |
| 42 | #include <linux/mutex.h> | 42 | #include <linux/mutex.h> |
| 43 | #include <linux/sysfs.h> | ||
| 43 | 44 | ||
| 44 | /* | 45 | /* |
| 45 | * Addresses to scan | 46 | * Addresses to scan |
| @@ -234,6 +235,48 @@ static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 15); | |||
| 234 | /* Raw alarm file for compatibility */ | 235 | /* Raw alarm file for compatibility */ |
| 235 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); | 236 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); |
| 236 | 237 | ||
| 238 | static struct attribute *lm83_attributes[] = { | ||
| 239 | &sensor_dev_attr_temp1_input.dev_attr.attr, | ||
| 240 | &sensor_dev_attr_temp3_input.dev_attr.attr, | ||
| 241 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
| 242 | &sensor_dev_attr_temp3_max.dev_attr.attr, | ||
| 243 | &sensor_dev_attr_temp1_crit.dev_attr.attr, | ||
| 244 | &sensor_dev_attr_temp3_crit.dev_attr.attr, | ||
| 245 | |||
| 246 | &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, | ||
| 247 | &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr, | ||
| 248 | &sensor_dev_attr_temp3_input_fault.dev_attr.attr, | ||
| 249 | &sensor_dev_attr_temp3_max_alarm.dev_attr.attr, | ||
| 250 | &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, | ||
| 251 | &dev_attr_alarms.attr, | ||
| 252 | NULL | ||
| 253 | }; | ||
| 254 | |||
| 255 | static const struct attribute_group lm83_group = { | ||
| 256 | .attrs = lm83_attributes, | ||
| 257 | }; | ||
| 258 | |||
| 259 | static struct attribute *lm83_attributes_opt[] = { | ||
| 260 | &sensor_dev_attr_temp2_input.dev_attr.attr, | ||
| 261 | &sensor_dev_attr_temp4_input.dev_attr.attr, | ||
| 262 | &sensor_dev_attr_temp2_max.dev_attr.attr, | ||
| 263 | &sensor_dev_attr_temp4_max.dev_attr.attr, | ||
| 264 | &sensor_dev_attr_temp2_crit.dev_attr.attr, | ||
| 265 | &sensor_dev_attr_temp4_crit.dev_attr.attr, | ||
| 266 | |||
| 267 | &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, | ||
| 268 | &sensor_dev_attr_temp4_crit_alarm.dev_attr.attr, | ||
| 269 | &sensor_dev_attr_temp4_input_fault.dev_attr.attr, | ||
| 270 | &sensor_dev_attr_temp4_max_alarm.dev_attr.attr, | ||
| 271 | &sensor_dev_attr_temp2_input_fault.dev_attr.attr, | ||
| 272 | &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, | ||
| 273 | NULL | ||
| 274 | }; | ||
| 275 | |||
| 276 | static const struct attribute_group lm83_group_opt = { | ||
| 277 | .attrs = lm83_attributes_opt, | ||
| 278 | }; | ||
| 279 | |||
| 237 | /* | 280 | /* |
| 238 | * Real code | 281 | * Real code |
| 239 | */ | 282 | */ |
| @@ -342,82 +385,32 @@ static int lm83_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 342 | goto exit_free; | 385 | goto exit_free; |
| 343 | 386 | ||
| 344 | /* | 387 | /* |
| 345 | * Initialize the LM83 chip | 388 | * Register sysfs hooks |
| 346 | * (Nothing to do for this one.) | ||
| 347 | */ | ||
| 348 | |||
| 349 | /* Register sysfs hooks */ | ||
| 350 | data->class_dev = hwmon_device_register(&new_client->dev); | ||
| 351 | if (IS_ERR(data->class_dev)) { | ||
| 352 | err = PTR_ERR(data->class_dev); | ||
| 353 | goto exit_detach; | ||
| 354 | } | ||
| 355 | |||
| 356 | /* | ||
| 357 | * The LM82 can only monitor one external diode which is | 389 | * The LM82 can only monitor one external diode which is |
| 358 | * at the same register as the LM83 temp3 entry - so we | 390 | * at the same register as the LM83 temp3 entry - so we |
| 359 | * declare 1 and 3 common, and then 2 and 4 only for the LM83. | 391 | * declare 1 and 3 common, and then 2 and 4 only for the LM83. |
| 360 | */ | 392 | */ |
| 361 | 393 | ||
| 362 | device_create_file(&new_client->dev, | 394 | if ((err = sysfs_create_group(&new_client->dev.kobj, &lm83_group))) |
| 363 | &sensor_dev_attr_temp1_input.dev_attr); | 395 | goto exit_detach; |
| 364 | device_create_file(&new_client->dev, | ||
| 365 | &sensor_dev_attr_temp3_input.dev_attr); | ||
| 366 | |||
| 367 | device_create_file(&new_client->dev, | ||
| 368 | &sensor_dev_attr_temp1_max.dev_attr); | ||
| 369 | device_create_file(&new_client->dev, | ||
| 370 | &sensor_dev_attr_temp3_max.dev_attr); | ||
| 371 | |||
| 372 | device_create_file(&new_client->dev, | ||
| 373 | &sensor_dev_attr_temp1_crit.dev_attr); | ||
| 374 | device_create_file(&new_client->dev, | ||
| 375 | &sensor_dev_attr_temp3_crit.dev_attr); | ||
| 376 | |||
| 377 | device_create_file(&new_client->dev, | ||
| 378 | &sensor_dev_attr_temp3_input_fault.dev_attr); | ||
| 379 | device_create_file(&new_client->dev, | ||
| 380 | &sensor_dev_attr_temp1_max_alarm.dev_attr); | ||
| 381 | device_create_file(&new_client->dev, | ||
| 382 | &sensor_dev_attr_temp3_max_alarm.dev_attr); | ||
| 383 | device_create_file(&new_client->dev, | ||
| 384 | &sensor_dev_attr_temp1_crit_alarm.dev_attr); | ||
| 385 | device_create_file(&new_client->dev, | ||
| 386 | &sensor_dev_attr_temp3_crit_alarm.dev_attr); | ||
| 387 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
| 388 | 396 | ||
| 389 | if (kind == lm83) { | 397 | if (kind == lm83) { |
| 390 | device_create_file(&new_client->dev, | 398 | if ((err = sysfs_create_group(&new_client->dev.kobj, |
| 391 | &sensor_dev_attr_temp2_input.dev_attr); | 399 | &lm83_group_opt))) |
| 392 | device_create_file(&new_client->dev, | 400 | goto exit_remove_files; |
| 393 | &sensor_dev_attr_temp4_input.dev_attr); | 401 | } |
| 394 | 402 | ||
| 395 | device_create_file(&new_client->dev, | 403 | data->class_dev = hwmon_device_register(&new_client->dev); |
| 396 | &sensor_dev_attr_temp2_max.dev_attr); | 404 | if (IS_ERR(data->class_dev)) { |
| 397 | device_create_file(&new_client->dev, | 405 | err = PTR_ERR(data->class_dev); |
| 398 | &sensor_dev_attr_temp4_max.dev_attr); | 406 | goto exit_remove_files; |
| 399 | |||
| 400 | device_create_file(&new_client->dev, | ||
| 401 | &sensor_dev_attr_temp2_crit.dev_attr); | ||
| 402 | device_create_file(&new_client->dev, | ||
| 403 | &sensor_dev_attr_temp4_crit.dev_attr); | ||
| 404 | |||
| 405 | device_create_file(&new_client->dev, | ||
| 406 | &sensor_dev_attr_temp2_input_fault.dev_attr); | ||
| 407 | device_create_file(&new_client->dev, | ||
| 408 | &sensor_dev_attr_temp4_input_fault.dev_attr); | ||
| 409 | device_create_file(&new_client->dev, | ||
| 410 | &sensor_dev_attr_temp2_max_alarm.dev_attr); | ||
| 411 | device_create_file(&new_client->dev, | ||
| 412 | &sensor_dev_attr_temp4_max_alarm.dev_attr); | ||
| 413 | device_create_file(&new_client->dev, | ||
| 414 | &sensor_dev_attr_temp2_crit_alarm.dev_attr); | ||
| 415 | device_create_file(&new_client->dev, | ||
| 416 | &sensor_dev_attr_temp4_crit_alarm.dev_attr); | ||
| 417 | } | 407 | } |
| 418 | 408 | ||
| 419 | return 0; | 409 | return 0; |
| 420 | 410 | ||
| 411 | exit_remove_files: | ||
| 412 | sysfs_remove_group(&new_client->dev.kobj, &lm83_group); | ||
| 413 | sysfs_remove_group(&new_client->dev.kobj, &lm83_group_opt); | ||
| 421 | exit_detach: | 414 | exit_detach: |
| 422 | i2c_detach_client(new_client); | 415 | i2c_detach_client(new_client); |
| 423 | exit_free: | 416 | exit_free: |
| @@ -432,6 +425,8 @@ static int lm83_detach_client(struct i2c_client *client) | |||
| 432 | int err; | 425 | int err; |
| 433 | 426 | ||
| 434 | hwmon_device_unregister(data->class_dev); | 427 | hwmon_device_unregister(data->class_dev); |
| 428 | sysfs_remove_group(&client->dev.kobj, &lm83_group); | ||
| 429 | sysfs_remove_group(&client->dev.kobj, &lm83_group_opt); | ||
| 435 | 430 | ||
| 436 | if ((err = i2c_detach_client(client))) | 431 | if ((err = i2c_detach_client(client))) |
| 437 | return err; | 432 | return err; |
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c index 77f8e3f7fd49..6882ce75feee 100644 --- a/drivers/hwmon/lm90.c +++ b/drivers/hwmon/lm90.c | |||
| @@ -79,6 +79,7 @@ | |||
| 79 | #include <linux/hwmon.h> | 79 | #include <linux/hwmon.h> |
| 80 | #include <linux/err.h> | 80 | #include <linux/err.h> |
| 81 | #include <linux/mutex.h> | 81 | #include <linux/mutex.h> |
| 82 | #include <linux/sysfs.h> | ||
| 82 | 83 | ||
| 83 | /* | 84 | /* |
| 84 | * Addresses to scan | 85 | * Addresses to scan |
| @@ -366,6 +367,33 @@ static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6); | |||
| 366 | /* Raw alarm file for compatibility */ | 367 | /* Raw alarm file for compatibility */ |
| 367 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); | 368 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); |
| 368 | 369 | ||
| 370 | static struct attribute *lm90_attributes[] = { | ||
| 371 | &sensor_dev_attr_temp1_input.dev_attr.attr, | ||
| 372 | &sensor_dev_attr_temp2_input.dev_attr.attr, | ||
| 373 | &sensor_dev_attr_temp1_min.dev_attr.attr, | ||
| 374 | &sensor_dev_attr_temp2_min.dev_attr.attr, | ||
| 375 | &sensor_dev_attr_temp1_max.dev_attr.attr, | ||
| 376 | &sensor_dev_attr_temp2_max.dev_attr.attr, | ||
| 377 | &sensor_dev_attr_temp1_crit.dev_attr.attr, | ||
| 378 | &sensor_dev_attr_temp2_crit.dev_attr.attr, | ||
| 379 | &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr, | ||
| 380 | &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, | ||
| 381 | |||
| 382 | &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, | ||
| 383 | &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, | ||
| 384 | &sensor_dev_attr_temp2_input_fault.dev_attr.attr, | ||
| 385 | &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, | ||
| 386 | &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, | ||
| 387 | &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, | ||
| 388 | &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, | ||
| 389 | &dev_attr_alarms.attr, | ||
| 390 | NULL | ||
| 391 | }; | ||
| 392 | |||
| 393 | static const struct attribute_group lm90_group = { | ||
| 394 | .attrs = lm90_attributes, | ||
| 395 | }; | ||
| 396 | |||
| 369 | /* pec used for ADM1032 only */ | 397 | /* pec used for ADM1032 only */ |
| 370 | static ssize_t show_pec(struct device *dev, struct device_attribute *dummy, | 398 | static ssize_t show_pec(struct device *dev, struct device_attribute *dummy, |
| 371 | char *buf) | 399 | char *buf) |
| @@ -589,54 +617,25 @@ static int lm90_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 589 | lm90_init_client(new_client); | 617 | lm90_init_client(new_client); |
| 590 | 618 | ||
| 591 | /* Register sysfs hooks */ | 619 | /* Register sysfs hooks */ |
| 620 | if ((err = sysfs_create_group(&new_client->dev.kobj, &lm90_group))) | ||
| 621 | goto exit_detach; | ||
| 622 | if (new_client->flags & I2C_CLIENT_PEC) { | ||
| 623 | if ((err = device_create_file(&new_client->dev, | ||
| 624 | &dev_attr_pec))) | ||
| 625 | goto exit_remove_files; | ||
| 626 | } | ||
| 627 | |||
| 592 | data->class_dev = hwmon_device_register(&new_client->dev); | 628 | data->class_dev = hwmon_device_register(&new_client->dev); |
| 593 | if (IS_ERR(data->class_dev)) { | 629 | if (IS_ERR(data->class_dev)) { |
| 594 | err = PTR_ERR(data->class_dev); | 630 | err = PTR_ERR(data->class_dev); |
| 595 | goto exit_detach; | 631 | goto exit_remove_files; |
| 596 | } | 632 | } |
| 597 | 633 | ||
| 598 | device_create_file(&new_client->dev, | ||
| 599 | &sensor_dev_attr_temp1_input.dev_attr); | ||
| 600 | device_create_file(&new_client->dev, | ||
| 601 | &sensor_dev_attr_temp2_input.dev_attr); | ||
| 602 | device_create_file(&new_client->dev, | ||
| 603 | &sensor_dev_attr_temp1_min.dev_attr); | ||
| 604 | device_create_file(&new_client->dev, | ||
| 605 | &sensor_dev_attr_temp2_min.dev_attr); | ||
| 606 | device_create_file(&new_client->dev, | ||
| 607 | &sensor_dev_attr_temp1_max.dev_attr); | ||
| 608 | device_create_file(&new_client->dev, | ||
| 609 | &sensor_dev_attr_temp2_max.dev_attr); | ||
| 610 | device_create_file(&new_client->dev, | ||
| 611 | &sensor_dev_attr_temp1_crit.dev_attr); | ||
| 612 | device_create_file(&new_client->dev, | ||
| 613 | &sensor_dev_attr_temp2_crit.dev_attr); | ||
| 614 | device_create_file(&new_client->dev, | ||
| 615 | &sensor_dev_attr_temp1_crit_hyst.dev_attr); | ||
| 616 | device_create_file(&new_client->dev, | ||
| 617 | &sensor_dev_attr_temp2_crit_hyst.dev_attr); | ||
| 618 | |||
| 619 | device_create_file(&new_client->dev, | ||
| 620 | &sensor_dev_attr_temp2_input_fault.dev_attr); | ||
| 621 | device_create_file(&new_client->dev, | ||
| 622 | &sensor_dev_attr_temp1_min_alarm.dev_attr); | ||
| 623 | device_create_file(&new_client->dev, | ||
| 624 | &sensor_dev_attr_temp2_min_alarm.dev_attr); | ||
| 625 | device_create_file(&new_client->dev, | ||
| 626 | &sensor_dev_attr_temp1_max_alarm.dev_attr); | ||
| 627 | device_create_file(&new_client->dev, | ||
| 628 | &sensor_dev_attr_temp2_max_alarm.dev_attr); | ||
| 629 | device_create_file(&new_client->dev, | ||
| 630 | &sensor_dev_attr_temp1_crit_alarm.dev_attr); | ||
| 631 | device_create_file(&new_client->dev, | ||
| 632 | &sensor_dev_attr_temp2_crit_alarm.dev_attr); | ||
| 633 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
| 634 | |||
| 635 | if (new_client->flags & I2C_CLIENT_PEC) | ||
| 636 | device_create_file(&new_client->dev, &dev_attr_pec); | ||
| 637 | |||
| 638 | return 0; | 634 | return 0; |
| 639 | 635 | ||
| 636 | exit_remove_files: | ||
| 637 | sysfs_remove_group(&new_client->dev.kobj, &lm90_group); | ||
| 638 | device_remove_file(&new_client->dev, &dev_attr_pec); | ||
| 640 | exit_detach: | 639 | exit_detach: |
| 641 | i2c_detach_client(new_client); | 640 | i2c_detach_client(new_client); |
| 642 | exit_free: | 641 | exit_free: |
| @@ -669,6 +668,8 @@ static int lm90_detach_client(struct i2c_client *client) | |||
| 669 | int err; | 668 | int err; |
| 670 | 669 | ||
| 671 | hwmon_device_unregister(data->class_dev); | 670 | hwmon_device_unregister(data->class_dev); |
| 671 | sysfs_remove_group(&client->dev.kobj, &lm90_group); | ||
| 672 | device_remove_file(&client->dev, &dev_attr_pec); | ||
| 672 | 673 | ||
| 673 | if ((err = i2c_detach_client(client))) | 674 | if ((err = i2c_detach_client(client))) |
| 674 | return err; | 675 | return err; |
