aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/f71805f.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/f71805f.c')
-rw-r--r--drivers/hwmon/f71805f.c324
1 files changed, 203 insertions, 121 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
36static struct platform_device *pdev; 37static 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
596static struct device_attribute f71805f_dev_attr[] = { 597static DEVICE_ATTR(in0_input, S_IRUGO, show_in0, NULL);
597 __ATTR(in0_input, S_IRUGO, show_in0, NULL), 598static 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), 599static 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), 600static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1);
600 __ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL), 601static 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), 603static 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);
605static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2);
606static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR,
607 show_in_max, set_in_max, 2);
608static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR,
609 show_in_min, set_in_min, 2);
610static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3);
611static SENSOR_DEVICE_ATTR(in3_max, S_IRUGO | S_IWUSR,
612 show_in_max, set_in_max, 3);
613static SENSOR_DEVICE_ATTR(in3_min, S_IRUGO | S_IWUSR,
614 show_in_min, set_in_min, 3);
615static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4);
616static SENSOR_DEVICE_ATTR(in4_max, S_IRUGO | S_IWUSR,
617 show_in_max, set_in_max, 4);
618static SENSOR_DEVICE_ATTR(in4_min, S_IRUGO | S_IWUSR,
619 show_in_min, set_in_min, 4);
620static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5);
621static SENSOR_DEVICE_ATTR(in5_max, S_IRUGO | S_IWUSR,
622 show_in_max, set_in_max, 5);
623static SENSOR_DEVICE_ATTR(in5_min, S_IRUGO | S_IWUSR,
624 show_in_min, set_in_min, 5);
625static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6);
626static SENSOR_DEVICE_ATTR(in6_max, S_IRUGO | S_IWUSR,
627 show_in_max, set_in_max, 6);
628static SENSOR_DEVICE_ATTR(in6_min, S_IRUGO | S_IWUSR,
629 show_in_min, set_in_min, 6);
630static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7);
631static SENSOR_DEVICE_ATTR(in7_max, S_IRUGO | S_IWUSR,
632 show_in_max, set_in_max, 7);
633static SENSOR_DEVICE_ATTR(in7_min, S_IRUGO | S_IWUSR,
634 show_in_min, set_in_min, 7);
635static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8);
636static SENSOR_DEVICE_ATTR(in8_max, S_IRUGO | S_IWUSR,
637 show_in_max, set_in_max, 8);
638static SENSOR_DEVICE_ATTR(in8_min, S_IRUGO | S_IWUSR,
639 show_in_min, set_in_min, 8);
640
641static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
642static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR,
643 show_fan_min, set_fan_min, 0);
644static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
645static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO | S_IWUSR,
646 show_fan_min, set_fan_min, 1);
647static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
648static SENSOR_DEVICE_ATTR(fan3_min, S_IRUGO | S_IWUSR,
649 show_fan_min, set_fan_min, 2);
650
651static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0);
652static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR,
653 show_temp_max, set_temp_max, 0);
654static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
655 show_temp_hyst, set_temp_hyst, 0);
656static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0);
657static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1);
658static SENSOR_DEVICE_ATTR(temp2_max, S_IRUGO | S_IWUSR,
659 show_temp_max, set_temp_max, 1);
660static SENSOR_DEVICE_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR,
661 show_temp_hyst, set_temp_hyst, 1);
662static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1);
663static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2);
664static SENSOR_DEVICE_ATTR(temp3_max, S_IRUGO | S_IWUSR,
665 show_temp_max, set_temp_max, 2);
666static SENSOR_DEVICE_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR,
667 show_temp_hyst, set_temp_hyst, 2);
668static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2);
669
670static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
671static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
672static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
673static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
674static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4);
675static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5);
676static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6);
677static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7);
678static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8);
679static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 11);
680static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 12);
681static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13);
682static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16);
683static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17);
684static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18);
685static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL);
686static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL);
687static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL);
688
689static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
690
691static 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
606static struct sensor_device_attribute f71805f_sensor_attr[] = { 753static 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
681static struct sensor_device_attribute f71805f_fan_attr[] = { 757static 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
776static 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
774exit_class: 850exit_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]);
777exit_free: 854exit_free:
855 platform_set_drvdata(pdev, NULL);
778 kfree(data); 856 kfree(data);
779exit: 857exit:
780 return err; 858 return err;
@@ -783,9 +861,13 @@ exit:
783static int __devexit f71805f_remove(struct platform_device *pdev) 861static 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;