diff options
Diffstat (limited to 'drivers/hwmon')
-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; |