diff options
Diffstat (limited to 'drivers/hwmon/w83791d.c')
| -rw-r--r-- | drivers/hwmon/w83791d.c | 85 |
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 | ||
| 747 | static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg); | 747 | static 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 | |||
| 764 | static 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 | |||
| 791 | static 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 | ||
| 1028 | error4: | ||
| 1029 | sysfs_remove_group(&client->dev.kobj, &w83791d_group); | ||
| 1005 | error3: | 1030 | error3: |
| 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; |
