|
@@ -125,6 +125,8 @@ struct atk_data {
|
|
|
int temperature_count;
|
|
|
int fan_count;
|
|
|
struct list_head sensor_list;
|
|
|
+ struct attribute_group attr_group;
|
|
|
+ const struct attribute_group *attr_groups[2];
|
|
|
|
|
|
struct {
|
|
|
struct dentry *root;
|
|
@@ -262,14 +264,6 @@ static ssize_t atk_limit2_show(struct device *dev,
|
|
|
return sprintf(buf, "%lld\n", value);
|
|
|
}
|
|
|
|
|
|
-static ssize_t atk_name_show(struct device *dev,
|
|
|
- struct device_attribute *attr, char *buf)
|
|
|
-{
|
|
|
- return sprintf(buf, "atk0110\n");
|
|
|
-}
|
|
|
-static struct device_attribute atk_name_attr =
|
|
|
- __ATTR(name, 0444, atk_name_show, NULL);
|
|
|
-
|
|
|
static void atk_init_attribute(struct device_attribute *attr, char *name,
|
|
|
sysfs_show_func show)
|
|
|
{
|
|
@@ -1193,42 +1187,30 @@ static int atk_enumerate_new_hwmon(struct atk_data *data)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int atk_create_files(struct atk_data *data)
|
|
|
+static int atk_init_attribute_groups(struct atk_data *data)
|
|
|
{
|
|
|
+ struct device *dev = &data->acpi_dev->dev;
|
|
|
struct atk_sensor_data *s;
|
|
|
- int err;
|
|
|
+ struct attribute **attrs;
|
|
|
+ int i = 0;
|
|
|
+ int len = (data->voltage_count + data->temperature_count
|
|
|
+ + data->fan_count) * 4 + 1;
|
|
|
+
|
|
|
+ attrs = devm_kcalloc(dev, len, sizeof(struct attribute *), GFP_KERNEL);
|
|
|
+ if (!attrs)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
list_for_each_entry(s, &data->sensor_list, list) {
|
|
|
- err = device_create_file(data->hwmon_dev, &s->input_attr);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
- err = device_create_file(data->hwmon_dev, &s->label_attr);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
- err = device_create_file(data->hwmon_dev, &s->limit1_attr);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
- err = device_create_file(data->hwmon_dev, &s->limit2_attr);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
+ attrs[i++] = &s->input_attr.attr;
|
|
|
+ attrs[i++] = &s->label_attr.attr;
|
|
|
+ attrs[i++] = &s->limit1_attr.attr;
|
|
|
+ attrs[i++] = &s->limit2_attr.attr;
|
|
|
}
|
|
|
|
|
|
- err = device_create_file(data->hwmon_dev, &atk_name_attr);
|
|
|
+ data->attr_group.attrs = attrs;
|
|
|
+ data->attr_groups[0] = &data->attr_group;
|
|
|
|
|
|
- return err;
|
|
|
-}
|
|
|
-
|
|
|
-static void atk_remove_files(struct atk_data *data)
|
|
|
-{
|
|
|
- struct atk_sensor_data *s;
|
|
|
-
|
|
|
- list_for_each_entry(s, &data->sensor_list, list) {
|
|
|
- device_remove_file(data->hwmon_dev, &s->input_attr);
|
|
|
- device_remove_file(data->hwmon_dev, &s->label_attr);
|
|
|
- device_remove_file(data->hwmon_dev, &s->limit1_attr);
|
|
|
- device_remove_file(data->hwmon_dev, &s->limit2_attr);
|
|
|
- }
|
|
|
- device_remove_file(data->hwmon_dev, &atk_name_attr);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void atk_free_sensors(struct atk_data *data)
|
|
@@ -1245,24 +1227,15 @@ static void atk_free_sensors(struct atk_data *data)
|
|
|
static int atk_register_hwmon(struct atk_data *data)
|
|
|
{
|
|
|
struct device *dev = &data->acpi_dev->dev;
|
|
|
- int err;
|
|
|
|
|
|
dev_dbg(dev, "registering hwmon device\n");
|
|
|
- data->hwmon_dev = hwmon_device_register(dev);
|
|
|
+ data->hwmon_dev = hwmon_device_register_with_groups(dev, "atk0110",
|
|
|
+ data,
|
|
|
+ data->attr_groups);
|
|
|
if (IS_ERR(data->hwmon_dev))
|
|
|
return PTR_ERR(data->hwmon_dev);
|
|
|
|
|
|
- dev_dbg(dev, "populating sysfs directory\n");
|
|
|
- err = atk_create_files(data);
|
|
|
- if (err)
|
|
|
- goto remove;
|
|
|
-
|
|
|
return 0;
|
|
|
-remove:
|
|
|
- /* Cleanup the registered files */
|
|
|
- atk_remove_files(data);
|
|
|
- hwmon_device_unregister(data->hwmon_dev);
|
|
|
- return err;
|
|
|
}
|
|
|
|
|
|
static int atk_probe_if(struct atk_data *data)
|
|
@@ -1397,6 +1370,9 @@ static int atk_add(struct acpi_device *device)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ err = atk_init_attribute_groups(data);
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
err = atk_register_hwmon(data);
|
|
|
if (err)
|
|
|
goto cleanup;
|
|
@@ -1423,7 +1399,6 @@ static int atk_remove(struct acpi_device *device)
|
|
|
|
|
|
atk_debugfs_cleanup(data);
|
|
|
|
|
|
- atk_remove_files(data);
|
|
|
atk_free_sensors(data);
|
|
|
hwmon_device_unregister(data->hwmon_dev);
|
|
|
|