aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hwmon/w83791d.c85
1 files changed, 56 insertions, 29 deletions
diff --git a/drivers/hwmon/w83791d.c b/drivers/hwmon/w83791d.c
index 371ed4f69a97..9e5f885368b4 100644
--- a/drivers/hwmon/w83791d.c
+++ b/drivers/hwmon/w83791d.c
@@ -746,6 +746,52 @@ static ssize_t store_vrm_reg(struct device *dev,
746 746
747static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg); 747static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg);
748 748
749#define IN_UNIT_ATTRS(X) \
750 &sda_in_input[X].dev_attr.attr, \
751 &sda_in_min[X].dev_attr.attr, \
752 &sda_in_max[X].dev_attr.attr
753
754#define FAN_UNIT_ATTRS(X) \
755 &sda_fan_input[X].dev_attr.attr, \
756 &sda_fan_min[X].dev_attr.attr, \
757 &sda_fan_div[X].dev_attr.attr
758
759#define TEMP_UNIT_ATTRS(X) \
760 &sda_temp_input[X].dev_attr.attr, \
761 &sda_temp_max[X].dev_attr.attr, \
762 &sda_temp_max_hyst[X].dev_attr.attr
763
764static struct attribute *w83791d_attributes[] = {
765 IN_UNIT_ATTRS(0),
766 IN_UNIT_ATTRS(1),
767 IN_UNIT_ATTRS(2),
768 IN_UNIT_ATTRS(3),
769 IN_UNIT_ATTRS(4),
770 IN_UNIT_ATTRS(5),
771 IN_UNIT_ATTRS(6),
772 IN_UNIT_ATTRS(7),
773 IN_UNIT_ATTRS(8),
774 IN_UNIT_ATTRS(9),
775 FAN_UNIT_ATTRS(0),
776 FAN_UNIT_ATTRS(1),
777 FAN_UNIT_ATTRS(2),
778 FAN_UNIT_ATTRS(3),
779 FAN_UNIT_ATTRS(4),
780 TEMP_UNIT_ATTRS(0),
781 TEMP_UNIT_ATTRS(1),
782 TEMP_UNIT_ATTRS(2),
783 &dev_attr_alarms.attr,
784 &sda_beep_ctrl[0].dev_attr.attr,
785 &sda_beep_ctrl[1].dev_attr.attr,
786 &dev_attr_cpu0_vid.attr,
787 &dev_attr_vrm.attr,
788 NULL
789};
790
791static const struct attribute_group w83791d_group = {
792 .attrs = w83791d_attributes,
793};
794
749/* This function is called when: 795/* This function is called when:
750 * w83791d_driver is inserted (when this module is loaded), for each 796 * w83791d_driver is inserted (when this module is loaded), for each
751 available adapter 797 available adapter
@@ -967,41 +1013,20 @@ static int w83791d_detect(struct i2c_adapter *adapter, int address, int kind)
967 } 1013 }
968 1014
969 /* Register sysfs hooks */ 1015 /* Register sysfs hooks */
1016 if ((err = sysfs_create_group(&client->dev.kobj, &w83791d_group)))
1017 goto error3;
1018
1019 /* Everything is ready, now register the working device */
970 data->class_dev = hwmon_device_register(dev); 1020 data->class_dev = hwmon_device_register(dev);
971 if (IS_ERR(data->class_dev)) { 1021 if (IS_ERR(data->class_dev)) {
972 err = PTR_ERR(data->class_dev); 1022 err = PTR_ERR(data->class_dev);
973 goto error3; 1023 goto error4;
974 } 1024 }
975 1025
976 for (i = 0; i < NUMBER_OF_VIN; i++) {
977 device_create_file(dev, &sda_in_input[i].dev_attr);
978 device_create_file(dev, &sda_in_min[i].dev_attr);
979 device_create_file(dev, &sda_in_max[i].dev_attr);
980 }
981
982 for (i = 0; i < NUMBER_OF_FANIN; i++) {
983 device_create_file(dev, &sda_fan_input[i].dev_attr);
984 device_create_file(dev, &sda_fan_div[i].dev_attr);
985 device_create_file(dev, &sda_fan_min[i].dev_attr);
986 }
987
988 for (i = 0; i < NUMBER_OF_TEMPIN; i++) {
989 device_create_file(dev, &sda_temp_input[i].dev_attr);
990 device_create_file(dev, &sda_temp_max[i].dev_attr);
991 device_create_file(dev, &sda_temp_max_hyst[i].dev_attr);
992 }
993
994 device_create_file(dev, &dev_attr_alarms);
995
996 for (i = 0; i < ARRAY_SIZE(sda_beep_ctrl); i++) {
997 device_create_file(dev, &sda_beep_ctrl[i].dev_attr);
998 }
999
1000 device_create_file(dev, &dev_attr_cpu0_vid);
1001 device_create_file(dev, &dev_attr_vrm);
1002
1003 return 0; 1026 return 0;
1004 1027
1028error4:
1029 sysfs_remove_group(&client->dev.kobj, &w83791d_group);
1005error3: 1030error3:
1006 if (data->lm75[0] != NULL) { 1031 if (data->lm75[0] != NULL) {
1007 i2c_detach_client(data->lm75[0]); 1032 i2c_detach_client(data->lm75[0]);
@@ -1025,8 +1050,10 @@ static int w83791d_detach_client(struct i2c_client *client)
1025 int err; 1050 int err;
1026 1051
1027 /* main client */ 1052 /* main client */
1028 if (data) 1053 if (data) {
1029 hwmon_device_unregister(data->class_dev); 1054 hwmon_device_unregister(data->class_dev);
1055 sysfs_remove_group(&client->dev.kobj, &w83791d_group);
1056 }
1030 1057
1031 if ((err = i2c_detach_client(client))) 1058 if ((err = i2c_detach_client(client)))
1032 return err; 1059 return err;