@@ -1340,8 +1340,9 @@ thermal_zone_device_register(const char *type, int trips, int mask,
tz->device.class = &thermal_class;
tz->devdata = devdata;
tz->trips = trips;
- tz->passive_delay_ms = passive_delay;
- tz->polling_delay_ms = polling_delay;
+
+ thermal_zone_set_passive_delay(tz, passive_delay);
+ thermal_zone_set_polling_delay(tz, polling_delay);
/* sys I/F */
/* Add nodes that are always present via .groups */
@@ -128,6 +128,24 @@ int thermal_build_list_of_policies(char *buf);
/* Helpers */
void thermal_zone_set_trips(struct thermal_zone_device *tz);
+static inline void thermal_zone_set_passive_delay(
+ struct thermal_zone_device *tz, int delay_ms)
+{
+ tz->passive_delay_ms = delay_ms;
+ tz->passive_delay_jiffies = msecs_to_jiffies(delay_ms);
+ if (delay_ms > 1000)
+ tz->passive_delay_jiffies = round_jiffies(tz->passive_delay_jiffies);
+}
+
+static inline void thermal_zone_set_polling_delay(
+ struct thermal_zone_device *tz, int delay_ms)
+{
+ tz->polling_delay_ms = delay_ms;
+ tz->polling_delay_jiffies = msecs_to_jiffies(delay_ms);
+ if (delay_ms > 1000)
+ tz->polling_delay_jiffies = round_jiffies(tz->polling_delay_jiffies);
+}
+
/* sysfs I/F */
int thermal_zone_create_device_groups(struct thermal_zone_device *, int);
void thermal_zone_destroy_device_groups(struct thermal_zone_device *);
@@ -234,11 +234,11 @@ passive_store(struct device *dev, struct device_attribute *attr,
if (state && !tz->forced_passive) {
if (!tz->passive_delay_ms)
- tz->passive_delay_ms = 1000;
+ thermal_zone_set_passive_delay(tz, 1000);
thermal_zone_device_rebind_exception(tz, "Processor",
sizeof("Processor"));
} else if (!state && tz->forced_passive) {
- tz->passive_delay_ms = 0;
+ thermal_zone_set_passive_delay(tz, 0);
thermal_zone_device_unbind_exception(tz, "Processor",
sizeof("Processor"));
}
@@ -118,9 +118,14 @@ struct thermal_cooling_device {
* @trips_disabled; bitmap for disabled trips
* @passive_delay_ms: number of milliseconds to wait between polls when
* performing passive cooling.
+ * @passive_delay_jiffies: number of jiffies to wait between polls when
+ * performing passive cooling.
* @polling_delay_ms: number of milliseconds to wait between polls when
* checking whether trip points have been crossed (0 for
* interrupt driven systems)
+ * @polling_delay_jiffies: number of jiffies to wait between polls when
+ * checking whether trip points have been crossed (0 for
+ * interrupt driven systems)
* @temperature: current temperature. This is only for core code,
* drivers should use thermal_zone_get_temp() to get the
* current temperature
@@ -161,6 +166,8 @@ struct thermal_zone_device {
unsigned long trips_disabled; /* bitmap for disabled trips */
int passive_delay_ms;
int polling_delay_ms;
+ int passive_delay_jiffies;
+ int polling_delay_jiffies;
int temperature;
int last_temperature;
int emul_temperature;
The delays are stored in ms units and when the polling function is called this delay is converted into jiffies at each call. Instead of doing the conversion again and again, compute the jiffies at init time and use the value directly when setting the polling. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> --- drivers/thermal/thermal_core.c | 5 +++-- drivers/thermal/thermal_core.h | 18 ++++++++++++++++++ drivers/thermal/thermal_sysfs.c | 4 ++-- include/linux/thermal.h | 7 +++++++ 4 files changed, 30 insertions(+), 4 deletions(-)