|
@@ -875,6 +875,102 @@ emul_temp_store(struct device *dev, struct device_attribute *attr,
|
|
|
static DEVICE_ATTR(emul_temp, S_IWUSR, NULL, emul_temp_store);
|
|
|
#endif/*CONFIG_THERMAL_EMULATION*/
|
|
|
|
|
|
+static ssize_t
|
|
|
+sustainable_power_show(struct device *dev, struct device_attribute *devattr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct thermal_zone_device *tz = to_thermal_zone(dev);
|
|
|
+
|
|
|
+ if (tz->tzp)
|
|
|
+ return sprintf(buf, "%u\n", tz->tzp->sustainable_power);
|
|
|
+ else
|
|
|
+ return -EIO;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t
|
|
|
+sustainable_power_store(struct device *dev, struct device_attribute *devattr,
|
|
|
+ const char *buf, size_t count)
|
|
|
+{
|
|
|
+ struct thermal_zone_device *tz = to_thermal_zone(dev);
|
|
|
+ u32 sustainable_power;
|
|
|
+
|
|
|
+ if (!tz->tzp)
|
|
|
+ return -EIO;
|
|
|
+
|
|
|
+ if (kstrtou32(buf, 10, &sustainable_power))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ tz->tzp->sustainable_power = sustainable_power;
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+static DEVICE_ATTR(sustainable_power, S_IWUSR | S_IRUGO, sustainable_power_show,
|
|
|
+ sustainable_power_store);
|
|
|
+
|
|
|
+#define create_s32_tzp_attr(name) \
|
|
|
+ static ssize_t \
|
|
|
+ name##_show(struct device *dev, struct device_attribute *devattr, \
|
|
|
+ char *buf) \
|
|
|
+ { \
|
|
|
+ struct thermal_zone_device *tz = to_thermal_zone(dev); \
|
|
|
+ \
|
|
|
+ if (tz->tzp) \
|
|
|
+ return sprintf(buf, "%u\n", tz->tzp->name); \
|
|
|
+ else \
|
|
|
+ return -EIO; \
|
|
|
+ } \
|
|
|
+ \
|
|
|
+ static ssize_t \
|
|
|
+ name##_store(struct device *dev, struct device_attribute *devattr, \
|
|
|
+ const char *buf, size_t count) \
|
|
|
+ { \
|
|
|
+ struct thermal_zone_device *tz = to_thermal_zone(dev); \
|
|
|
+ s32 value; \
|
|
|
+ \
|
|
|
+ if (!tz->tzp) \
|
|
|
+ return -EIO; \
|
|
|
+ \
|
|
|
+ if (kstrtos32(buf, 10, &value)) \
|
|
|
+ return -EINVAL; \
|
|
|
+ \
|
|
|
+ tz->tzp->name = value; \
|
|
|
+ \
|
|
|
+ return count; \
|
|
|
+ } \
|
|
|
+ static DEVICE_ATTR(name, S_IWUSR | S_IRUGO, name##_show, name##_store)
|
|
|
+
|
|
|
+create_s32_tzp_attr(k_po);
|
|
|
+create_s32_tzp_attr(k_pu);
|
|
|
+create_s32_tzp_attr(k_i);
|
|
|
+create_s32_tzp_attr(k_d);
|
|
|
+create_s32_tzp_attr(integral_cutoff);
|
|
|
+#undef create_s32_tzp_attr
|
|
|
+
|
|
|
+static struct device_attribute *dev_tzp_attrs[] = {
|
|
|
+ &dev_attr_sustainable_power,
|
|
|
+ &dev_attr_k_po,
|
|
|
+ &dev_attr_k_pu,
|
|
|
+ &dev_attr_k_i,
|
|
|
+ &dev_attr_k_d,
|
|
|
+ &dev_attr_integral_cutoff,
|
|
|
+};
|
|
|
+
|
|
|
+static int create_tzp_attrs(struct device *dev)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(dev_tzp_attrs); i++) {
|
|
|
+ int ret;
|
|
|
+ struct device_attribute *dev_attr = dev_tzp_attrs[i];
|
|
|
+
|
|
|
+ ret = device_create_file(dev, dev_attr);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* power_actor_get_max_power() - get the maximum power that a cdev can consume
|
|
|
* @cdev: pointer to &thermal_cooling_device
|
|
@@ -1712,6 +1808,11 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
|
|
|
if (result)
|
|
|
goto unregister;
|
|
|
|
|
|
+ /* Add thermal zone params */
|
|
|
+ result = create_tzp_attrs(&tz->device);
|
|
|
+ if (result)
|
|
|
+ goto unregister;
|
|
|
+
|
|
|
/* Update 'this' zone's governor information */
|
|
|
mutex_lock(&thermal_governor_lock);
|
|
|
|