Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94f669e7 authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by Kevin Hilman
Browse files

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>
(cherry picked from commit 2dc10f8963e6a03a1a75deafe1d1984bafab08dd)
Signed-off-by: default avatarKevin Hilman <khilman@linaro.org>
parent 2b42b5a7
Loading
Loading
Loading
Loading
+17 −20
Original line number Diff line number Diff line
@@ -899,6 +899,22 @@ thermal_cooling_device_trip_point_show(struct device *dev,
		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 */

/**
@@ -1128,6 +1144,7 @@ __thermal_cooling_device_register(struct device_node *np,
	cdev->ops = ops;
	cdev->updated = false;
	cdev->device.class = &thermal_class;
	cdev->device.groups = cooling_device_attr_groups;
	cdev->devdata = devdata;
	dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
	result = device_register(&cdev->device);
@@ -1137,21 +1154,6 @@ __thermal_cooling_device_register(struct device_node *np,
		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 */
	mutex_lock(&thermal_list_lock);
	list_add(&cdev->node, &thermal_cdev_list);
@@ -1161,11 +1163,6 @@ __thermal_cooling_device_register(struct device_node *np,
	bind_cdev(cdev);

	return cdev;

unregister:
	release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
	device_unregister(&cdev->device);
	return ERR_PTR(result);
}

/**