summaryrefslogtreecommitdiff
path: root/drivers/thermal
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/thermal')
-rw-r--r--drivers/thermal/thermal_core.c54
1 files changed, 49 insertions, 5 deletions
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index d9e525cc9c1c..f392eb8fccd5 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -431,15 +431,21 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
tz->ops->get_trip_temp(tz, trip, &trip_temp);
/* If we have not crossed the trip_temp, we do not care. */
- if (trip_temp <= 0 || tz->temperature < trip_temp)
- return;
+ if (trip_type != THERMAL_TRIP_CRITICAL_LOW &&
+ trip_type != THERMAL_TRIP_CONFIGURABLE_LOW) {
+ if (tz->temperature < trip_temp)
+ return;
+ } else
+ if (tz->temperature >= trip_temp)
+ return;
trace_thermal_zone_trip(tz, trip, trip_type);
if (tz->ops->notify)
tz->ops->notify(tz, trip, trip_type);
- if (trip_type == THERMAL_TRIP_CRITICAL) {
+ if (trip_type == THERMAL_TRIP_CRITICAL ||
+ trip_type == THERMAL_TRIP_CRITICAL_LOW) {
dev_emerg(&tz->device,
"critical temperature reached(%d C),shutting down\n",
tz->temperature / 1000);
@@ -453,7 +459,10 @@ static void handle_thermal_trip(struct thermal_zone_device *tz, int trip)
tz->ops->get_trip_type(tz, trip, &type);
- if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT)
+ if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT ||
+ type == THERMAL_TRIP_CONFIGURABLE_HI ||
+ type == THERMAL_TRIP_CONFIGURABLE_LOW ||
+ type == THERMAL_TRIP_CRITICAL_LOW)
handle_critical_trips(tz, trip, type);
else
handle_non_critical_trips(tz, trip, type);
@@ -649,6 +658,12 @@ trip_point_type_show(struct device *dev, struct device_attribute *attr,
return sprintf(buf, "critical\n");
case THERMAL_TRIP_HOT:
return sprintf(buf, "hot\n");
+ case THERMAL_TRIP_CONFIGURABLE_HI:
+ return sprintf(buf, "configurable_hi\n");
+ case THERMAL_TRIP_CONFIGURABLE_LOW:
+ return sprintf(buf, "configurable_low\n");
+ case THERMAL_TRIP_CRITICAL_LOW:
+ return sprintf(buf, "critical_low\n");
case THERMAL_TRIP_PASSIVE:
return sprintf(buf, "passive\n");
case THERMAL_TRIP_ACTIVE:
@@ -659,6 +674,34 @@ trip_point_type_show(struct device *dev, struct device_attribute *attr,
}
static ssize_t
+trip_point_type_activate(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct thermal_zone_device *tz = to_thermal_zone(dev);
+ int trip, result;
+
+ if (!tz->ops->activate_trip_type)
+ return -EPERM;
+
+ if (!sscanf(attr->attr.name, "trip_point_%d_type", &trip))
+ return -EINVAL;
+
+ if (!strncmp(buf, "enabled", sizeof("enabled")))
+ result = tz->ops->activate_trip_type(tz, trip,
+ THERMAL_TRIP_ACTIVATION_ENABLED);
+ else if (!strncmp(buf, "disabled", sizeof("disabled")))
+ result = tz->ops->activate_trip_type(tz, trip,
+ THERMAL_TRIP_ACTIVATION_DISABLED);
+ else
+ result = -EINVAL;
+
+ if (result)
+ return result;
+
+ return count;
+}
+
+static ssize_t
trip_point_temp_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
@@ -1670,8 +1713,9 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
sysfs_attr_init(&tz->trip_type_attrs[indx].attr.attr);
tz->trip_type_attrs[indx].attr.attr.name =
tz->trip_type_attrs[indx].name;
- tz->trip_type_attrs[indx].attr.attr.mode = S_IRUGO;
+ tz->trip_type_attrs[indx].attr.attr.mode = S_IRUGO | S_IWUSR;
tz->trip_type_attrs[indx].attr.show = trip_point_type_show;
+ tz->trip_type_attrs[indx].attr.store = trip_point_type_activate;
device_create_file(&tz->device,
&tz->trip_type_attrs[indx].attr);