mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
thermal: sysfs: Get to trips via attribute pointers
The _store() and _show() functions for sysfs attributes corresponding to trip point parameters (type, temperature and hysteresis) read the trip ID from the attribute name and then use the trip ID as the index in the given thermal zone's trips table to get to the trip object they want. Instead of doing this, make them use the attribute pointer they get as the second argument to get to the trip object embedded in the same struct thermal_trip_desc as the struct device_attribute pointed to by it, which is much more straightforward and less overhead. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Link: https://patch.msgid.link/114841552.nniJfEyVGO@rjwysocki.net
This commit is contained in:
parent
66b263306a
commit
afd84fb10c
@ -12,6 +12,7 @@
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/container_of.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
@ -78,39 +79,38 @@ mode_store(struct device *dev, struct device_attribute *attr,
|
||||
return count;
|
||||
}
|
||||
|
||||
#define thermal_trip_of_attr(_ptr_, _attr_) \
|
||||
({ \
|
||||
struct thermal_trip_desc *td; \
|
||||
\
|
||||
td = container_of(_ptr_, struct thermal_trip_desc, \
|
||||
trip_attrs._attr_.attr); \
|
||||
&td->trip; \
|
||||
})
|
||||
|
||||
static ssize_t
|
||||
trip_point_type_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct thermal_zone_device *tz = to_thermal_zone(dev);
|
||||
int trip_id;
|
||||
struct thermal_trip *trip = thermal_trip_of_attr(attr, type);
|
||||
|
||||
if (sscanf(attr->attr.name, "trip_point_%d_type", &trip_id) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(buf, "%s\n", thermal_trip_type_name(tz->trips[trip_id].trip.type));
|
||||
return sprintf(buf, "%s\n", thermal_trip_type_name(trip->type));
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
trip_point_temp_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct thermal_trip *trip = thermal_trip_of_attr(attr, temp);
|
||||
struct thermal_zone_device *tz = to_thermal_zone(dev);
|
||||
struct thermal_trip *trip;
|
||||
int trip_id, ret;
|
||||
int temp;
|
||||
int ret, temp;
|
||||
|
||||
ret = kstrtoint(buf, 10, &temp);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&tz->lock);
|
||||
|
||||
trip = &tz->trips[trip_id].trip;
|
||||
|
||||
if (temp != trip->temperature) {
|
||||
if (tz->ops.set_trip_temp) {
|
||||
ret = tz->ops.set_trip_temp(tz, trip, temp);
|
||||
@ -133,35 +133,25 @@ static ssize_t
|
||||
trip_point_temp_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct thermal_zone_device *tz = to_thermal_zone(dev);
|
||||
int trip_id;
|
||||
struct thermal_trip *trip = thermal_trip_of_attr(attr, temp);
|
||||
|
||||
if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(buf, "%d\n", READ_ONCE(tz->trips[trip_id].trip.temperature));
|
||||
return sprintf(buf, "%d\n", READ_ONCE(trip->temperature));
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
trip_point_hyst_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct thermal_trip *trip = thermal_trip_of_attr(attr, hyst);
|
||||
struct thermal_zone_device *tz = to_thermal_zone(dev);
|
||||
struct thermal_trip *trip;
|
||||
int trip_id, ret;
|
||||
int hyst;
|
||||
int ret, hyst;
|
||||
|
||||
ret = kstrtoint(buf, 10, &hyst);
|
||||
if (ret || hyst < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip_id) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&tz->lock);
|
||||
|
||||
trip = &tz->trips[trip_id].trip;
|
||||
|
||||
if (hyst != trip->hysteresis) {
|
||||
WRITE_ONCE(trip->hysteresis, hyst);
|
||||
|
||||
@ -177,13 +167,9 @@ static ssize_t
|
||||
trip_point_hyst_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct thermal_zone_device *tz = to_thermal_zone(dev);
|
||||
int trip_id;
|
||||
struct thermal_trip *trip = thermal_trip_of_attr(attr, hyst);
|
||||
|
||||
if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip_id) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(buf, "%d\n", READ_ONCE(tz->trips[trip_id].trip.hysteresis));
|
||||
return sprintf(buf, "%d\n", READ_ONCE(trip->hysteresis));
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
Loading…
Reference in New Issue
Block a user