|
@@ -922,6 +922,34 @@ static const struct attribute_group *cooling_device_attr_groups[] = {
|
|
|
NULL,
|
|
|
};
|
|
|
|
|
|
+static ssize_t
|
|
|
+thermal_cooling_device_weight_show(struct device *dev,
|
|
|
+ struct device_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ struct thermal_instance *instance;
|
|
|
+
|
|
|
+ instance = container_of(attr, struct thermal_instance, weight_attr);
|
|
|
+
|
|
|
+ return sprintf(buf, "%d\n", instance->weight);
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t
|
|
|
+thermal_cooling_device_weight_store(struct device *dev,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ const char *buf, size_t count)
|
|
|
+{
|
|
|
+ struct thermal_instance *instance;
|
|
|
+ int ret, weight;
|
|
|
+
|
|
|
+ ret = kstrtoint(buf, 0, &weight);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ instance = container_of(attr, struct thermal_instance, weight_attr);
|
|
|
+ instance->weight = weight;
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
/* Device management */
|
|
|
|
|
|
/**
|
|
@@ -1016,6 +1044,16 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
|
|
|
if (result)
|
|
|
goto remove_symbol_link;
|
|
|
|
|
|
+ sprintf(dev->weight_attr_name, "cdev%d_weight", dev->id);
|
|
|
+ sysfs_attr_init(&dev->weight_attr.attr);
|
|
|
+ dev->weight_attr.attr.name = dev->weight_attr_name;
|
|
|
+ dev->weight_attr.attr.mode = S_IWUSR | S_IRUGO;
|
|
|
+ dev->weight_attr.show = thermal_cooling_device_weight_show;
|
|
|
+ dev->weight_attr.store = thermal_cooling_device_weight_store;
|
|
|
+ result = device_create_file(&tz->device, &dev->weight_attr);
|
|
|
+ if (result)
|
|
|
+ goto remove_trip_file;
|
|
|
+
|
|
|
mutex_lock(&tz->lock);
|
|
|
mutex_lock(&cdev->lock);
|
|
|
list_for_each_entry(pos, &tz->thermal_instances, tz_node)
|
|
@@ -1033,6 +1071,8 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
|
|
|
if (!result)
|
|
|
return 0;
|
|
|
|
|
|
+ device_remove_file(&tz->device, &dev->weight_attr);
|
|
|
+remove_trip_file:
|
|
|
device_remove_file(&tz->device, &dev->attr);
|
|
|
remove_symbol_link:
|
|
|
sysfs_remove_link(&tz->device.kobj, dev->name);
|