Commit a2883dfa authored by Len Brown's avatar Len Brown

Pull thermal into release branch

parents 73a855f7 6e215785
...@@ -195,6 +195,7 @@ struct acpi_thermal { ...@@ -195,6 +195,7 @@ struct acpi_thermal {
struct acpi_thermal_trips trips; struct acpi_thermal_trips trips;
struct acpi_handle_list devices; struct acpi_handle_list devices;
struct timer_list timer; struct timer_list timer;
struct mutex lock;
}; };
static const struct file_operations acpi_thermal_state_fops = { static const struct file_operations acpi_thermal_state_fops = {
...@@ -711,6 +712,7 @@ static void acpi_thermal_check(void *data) ...@@ -711,6 +712,7 @@ static void acpi_thermal_check(void *data)
int result = 0; int result = 0;
struct acpi_thermal *tz = data; struct acpi_thermal *tz = data;
unsigned long sleep_time = 0; unsigned long sleep_time = 0;
unsigned long timeout_jiffies = 0;
int i = 0; int i = 0;
struct acpi_thermal_state state; struct acpi_thermal_state state;
...@@ -720,11 +722,15 @@ static void acpi_thermal_check(void *data) ...@@ -720,11 +722,15 @@ static void acpi_thermal_check(void *data)
return; return;
} }
/* Check if someone else is already running */
if (!mutex_trylock(&tz->lock))
return;
state = tz->state; state = tz->state;
result = acpi_thermal_get_temperature(tz); result = acpi_thermal_get_temperature(tz);
if (result) if (result)
return; goto unlock;
memset(&tz->state, 0, sizeof(tz->state)); memset(&tz->state, 0, sizeof(tz->state));
...@@ -787,10 +793,13 @@ static void acpi_thermal_check(void *data) ...@@ -787,10 +793,13 @@ static void acpi_thermal_check(void *data)
* a thermal event occurs). Note that _TSP and _TZD values are * a thermal event occurs). Note that _TSP and _TZD values are
* given in 1/10th seconds (we must covert to milliseconds). * given in 1/10th seconds (we must covert to milliseconds).
*/ */
if (tz->state.passive) if (tz->state.passive) {
sleep_time = tz->trips.passive.tsp * 100; sleep_time = tz->trips.passive.tsp * 100;
else if (tz->polling_frequency > 0) timeout_jiffies = jiffies + (HZ * sleep_time) / 1000;
} else if (tz->polling_frequency > 0) {
sleep_time = tz->polling_frequency * 100; sleep_time = tz->polling_frequency * 100;
timeout_jiffies = round_jiffies(jiffies + (HZ * sleep_time) / 1000);
}
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s: temperature[%lu] sleep[%lu]\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s: temperature[%lu] sleep[%lu]\n",
tz->name, tz->temperature, sleep_time)); tz->name, tz->temperature, sleep_time));
...@@ -804,17 +813,16 @@ static void acpi_thermal_check(void *data) ...@@ -804,17 +813,16 @@ static void acpi_thermal_check(void *data)
del_timer(&(tz->timer)); del_timer(&(tz->timer));
} else { } else {
if (timer_pending(&(tz->timer))) if (timer_pending(&(tz->timer)))
mod_timer(&(tz->timer), mod_timer(&(tz->timer), timeout_jiffies);
jiffies + (HZ * sleep_time) / 1000);
else { else {
tz->timer.data = (unsigned long)tz; tz->timer.data = (unsigned long)tz;
tz->timer.function = acpi_thermal_run; tz->timer.function = acpi_thermal_run;
tz->timer.expires = jiffies + (HZ * sleep_time) / 1000; tz->timer.expires = timeout_jiffies;
add_timer(&(tz->timer)); add_timer(&(tz->timer));
} }
} }
unlock:
return; mutex_unlock(&tz->lock);
} }
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
...@@ -1251,7 +1259,7 @@ static int acpi_thermal_add(struct acpi_device *device) ...@@ -1251,7 +1259,7 @@ static int acpi_thermal_add(struct acpi_device *device)
strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS); strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
acpi_driver_data(device) = tz; acpi_driver_data(device) = tz;
mutex_init(&tz->lock);
result = acpi_thermal_get_info(tz); result = acpi_thermal_get_info(tz);
if (result) if (result)
goto end; goto end;
...@@ -1321,7 +1329,7 @@ static int acpi_thermal_remove(struct acpi_device *device, int type) ...@@ -1321,7 +1329,7 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
} }
acpi_thermal_remove_fs(device); acpi_thermal_remove_fs(device);
mutex_destroy(&tz->lock);
kfree(tz); kfree(tz);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment