Commit 2dc10f89 authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by Eduardo Valentin

thermal: Make sysfs attributes of cooling devices default attributes

Default attributes are created when the device is registered. Attributes
created after device registration can lead to race conditions, where user space
(e.g. udev) sees the device but not the attributes.
Signed-off-by: default avatarMatthias Kaehlcke <mka@chromium.org>
Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
parent d5bce867
...@@ -899,6 +899,22 @@ thermal_cooling_device_trip_point_show(struct device *dev, ...@@ -899,6 +899,22 @@ thermal_cooling_device_trip_point_show(struct device *dev,
return sprintf(buf, "%d\n", instance->trip); return sprintf(buf, "%d\n", instance->trip);
} }
static struct attribute *cooling_device_attrs[] = {
&dev_attr_cdev_type.attr,
&dev_attr_max_state.attr,
&dev_attr_cur_state.attr,
NULL,
};
static const struct attribute_group cooling_device_attr_group = {
.attrs = cooling_device_attrs,
};
static const struct attribute_group *cooling_device_attr_groups[] = {
&cooling_device_attr_group,
NULL,
};
/* Device management */ /* Device management */
/** /**
...@@ -1130,6 +1146,7 @@ __thermal_cooling_device_register(struct device_node *np, ...@@ -1130,6 +1146,7 @@ __thermal_cooling_device_register(struct device_node *np,
cdev->ops = ops; cdev->ops = ops;
cdev->updated = false; cdev->updated = false;
cdev->device.class = &thermal_class; cdev->device.class = &thermal_class;
cdev->device.groups = cooling_device_attr_groups;
cdev->devdata = devdata; cdev->devdata = devdata;
dev_set_name(&cdev->device, "cooling_device%d", cdev->id); dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
result = device_register(&cdev->device); result = device_register(&cdev->device);
...@@ -1139,21 +1156,6 @@ __thermal_cooling_device_register(struct device_node *np, ...@@ -1139,21 +1156,6 @@ __thermal_cooling_device_register(struct device_node *np,
return ERR_PTR(result); return ERR_PTR(result);
} }
/* sys I/F */
if (type) {
result = device_create_file(&cdev->device, &dev_attr_cdev_type);
if (result)
goto unregister;
}
result = device_create_file(&cdev->device, &dev_attr_max_state);
if (result)
goto unregister;
result = device_create_file(&cdev->device, &dev_attr_cur_state);
if (result)
goto unregister;
/* Add 'this' new cdev to the global cdev list */ /* Add 'this' new cdev to the global cdev list */
mutex_lock(&thermal_list_lock); mutex_lock(&thermal_list_lock);
list_add(&cdev->node, &thermal_cdev_list); list_add(&cdev->node, &thermal_cdev_list);
...@@ -1163,11 +1165,6 @@ __thermal_cooling_device_register(struct device_node *np, ...@@ -1163,11 +1165,6 @@ __thermal_cooling_device_register(struct device_node *np,
bind_cdev(cdev); bind_cdev(cdev);
return cdev; return cdev;
unregister:
release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
device_unregister(&cdev->device);
return ERR_PTR(result);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment