Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 318822
b: refs/heads/master
c: 27365a6
h: refs/heads/master
v: v3
  • Loading branch information
Durgadoss R authored and Len Brown committed Jul 25, 2012
1 parent 4333a82 commit 9c833e1
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c56f5c0342dfee11a1a13d2f5bb7618de5b17590
refs/heads/master: 27365a6c7d64a3bba22ee62109e4a071bbd7f933
6 changes: 6 additions & 0 deletions trunk/Documentation/thermal/sysfs-api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ Thermal zone device sys I/F, created once it's registered:
|---mode: Working mode of the thermal zone
|---trip_point_[0-*]_temp: Trip point temperature
|---trip_point_[0-*]_type: Trip point type
|---trip_point_[0-*]_hyst: Hysteresis value for this trip point

Thermal cooling device sys I/F, created once it's registered:
/sys/class/thermal/cooling_device[0-*]:
Expand Down Expand Up @@ -190,6 +191,11 @@ trip_point_[0-*]_type
thermal zone.
RO, Optional

trip_point_[0-*]_hyst
The hysteresis value for a trip point, represented as an integer
Unit: Celsius
RW, Optional

cdev[0-*]
Sysfs link to the thermal cooling device node where the sys I/F
for cooling device throttling control represents.
Expand Down
88 changes: 83 additions & 5 deletions trunk/drivers/thermal/thermal_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,52 @@ trip_point_temp_show(struct device *dev, struct device_attribute *attr,
return sprintf(buf, "%ld\n", temperature);
}

static ssize_t
trip_point_hyst_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct thermal_zone_device *tz = to_thermal_zone(dev);
int trip, ret;
unsigned long temperature;

if (!tz->ops->set_trip_hyst)
return -EPERM;

if (!sscanf(attr->attr.name, "trip_point_%d_hyst", &trip))
return -EINVAL;

if (kstrtoul(buf, 10, &temperature))
return -EINVAL;

/*
* We are not doing any check on the 'temperature' value
* here. The driver implementing 'set_trip_hyst' has to
* take care of this.
*/
ret = tz->ops->set_trip_hyst(tz, trip, temperature);

return ret ? ret : count;
}

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, ret;
unsigned long temperature;

if (!tz->ops->get_trip_hyst)
return -EPERM;

if (!sscanf(attr->attr.name, "trip_point_%d_hyst", &trip))
return -EINVAL;

ret = tz->ops->get_trip_hyst(tz, trip, &temperature);

return ret ? ret : sprintf(buf, "%ld\n", temperature);
}

static ssize_t
passive_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
Expand Down Expand Up @@ -1091,21 +1137,29 @@ EXPORT_SYMBOL(thermal_zone_device_update);
static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
{
int indx;
int size = sizeof(struct thermal_attr) * tz->trips;

tz->trip_type_attrs =
kzalloc(sizeof(struct thermal_attr) * tz->trips, GFP_KERNEL);
tz->trip_type_attrs = kzalloc(size, GFP_KERNEL);
if (!tz->trip_type_attrs)
return -ENOMEM;

tz->trip_temp_attrs =
kzalloc(sizeof(struct thermal_attr) * tz->trips, GFP_KERNEL);
tz->trip_temp_attrs = kzalloc(size, GFP_KERNEL);
if (!tz->trip_temp_attrs) {
kfree(tz->trip_type_attrs);
return -ENOMEM;
}

for (indx = 0; indx < tz->trips; indx++) {
if (tz->ops->get_trip_hyst) {
tz->trip_hyst_attrs = kzalloc(size, GFP_KERNEL);
if (!tz->trip_hyst_attrs) {
kfree(tz->trip_type_attrs);
kfree(tz->trip_temp_attrs);
return -ENOMEM;
}
}


for (indx = 0; indx < tz->trips; indx++) {
/* create trip type attribute */
snprintf(tz->trip_type_attrs[indx].name, THERMAL_NAME_LENGTH,
"trip_point_%d_type", indx);
Expand Down Expand Up @@ -1136,6 +1190,26 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)

device_create_file(&tz->device,
&tz->trip_temp_attrs[indx].attr);

/* create Optional trip hyst attribute */
if (!tz->ops->get_trip_hyst)
continue;
snprintf(tz->trip_hyst_attrs[indx].name, THERMAL_NAME_LENGTH,
"trip_point_%d_hyst", indx);

sysfs_attr_init(&tz->trip_hyst_attrs[indx].attr.attr);
tz->trip_hyst_attrs[indx].attr.attr.name =
tz->trip_hyst_attrs[indx].name;
tz->trip_hyst_attrs[indx].attr.attr.mode = S_IRUGO;
tz->trip_hyst_attrs[indx].attr.show = trip_point_hyst_show;
if (tz->ops->set_trip_hyst) {
tz->trip_hyst_attrs[indx].attr.attr.mode |= S_IWUSR;
tz->trip_hyst_attrs[indx].attr.store =
trip_point_hyst_store;
}

device_create_file(&tz->device,
&tz->trip_hyst_attrs[indx].attr);
}
return 0;
}
Expand All @@ -1149,9 +1223,13 @@ static void remove_trip_attrs(struct thermal_zone_device *tz)
&tz->trip_type_attrs[indx].attr);
device_remove_file(&tz->device,
&tz->trip_temp_attrs[indx].attr);
if (tz->ops->get_trip_hyst)
device_remove_file(&tz->device,
&tz->trip_hyst_attrs[indx].attr);
}
kfree(tz->trip_type_attrs);
kfree(tz->trip_temp_attrs);
kfree(tz->trip_hyst_attrs);
}

/**
Expand Down
5 changes: 5 additions & 0 deletions trunk/include/linux/thermal.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ struct thermal_zone_device_ops {
unsigned long *);
int (*set_trip_temp) (struct thermal_zone_device *, int,
unsigned long);
int (*get_trip_hyst) (struct thermal_zone_device *, int,
unsigned long *);
int (*set_trip_hyst) (struct thermal_zone_device *, int,
unsigned long);
int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *);
int (*notify) (struct thermal_zone_device *, int,
enum thermal_trip_type);
Expand Down Expand Up @@ -98,6 +102,7 @@ struct thermal_zone_device {
struct device device;
struct thermal_attr *trip_temp_attrs;
struct thermal_attr *trip_type_attrs;
struct thermal_attr *trip_hyst_attrs;
void *devdata;
int trips;
int tc1;
Expand Down

0 comments on commit 9c833e1

Please sign in to comment.