Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (41 commits) ACPICA: hw: Don't carry spinlock over suspend ACPICA: hw: remove use_lock flag from acpi_hw_register_{read, write} ACPI: cpuidle: port idle timer suspend/resume workaround to cpuidle ACPI: clean up acpi_enter_sleep_state_prep Hibernation: Make sure that ACPI is enabled in acpi_hibernation_finish ACPI: suppress uninitialized var warning cpuidle: consolidate 2.6.22 cpuidle branch into one patch ACPI: thinkpad-acpi: skip blanks before the data when parsing sysfs ACPI: AC: Add sysfs interface ACPI: SBS: Add sysfs alarm ACPI: SBS: Add ACPI_PROCFS around procfs handling code. ACPI: SBS: Add support for power_supply class (and sysfs) ACPI: SBS: Make SBS reads table-driven. ACPI: SBS: Simplify data structures in SBS ACPI: SBS: Split host controller (ACPI0001) from SBS driver (ACPI0002) ACPI: EC: Add new query handler to list head. ACPI: Add acpi_bus_generate_event4() function ACPI: Battery: add sysfs alarm ACPI: Battery: Add sysfs support ACPI: Battery: Misc clean-ups, no functional changes ... Fix up conflicts in drivers/misc/thinkpad_acpi.[ch] manually
This commit is contained in:
@@ -195,6 +195,7 @@ struct acpi_thermal {
|
||||
struct acpi_thermal_trips trips;
|
||||
struct acpi_handle_list devices;
|
||||
struct timer_list timer;
|
||||
struct mutex lock;
|
||||
};
|
||||
|
||||
static const struct file_operations acpi_thermal_state_fops = {
|
||||
@@ -711,6 +712,7 @@ static void acpi_thermal_check(void *data)
|
||||
int result = 0;
|
||||
struct acpi_thermal *tz = data;
|
||||
unsigned long sleep_time = 0;
|
||||
unsigned long timeout_jiffies = 0;
|
||||
int i = 0;
|
||||
struct acpi_thermal_state state;
|
||||
|
||||
@@ -720,11 +722,15 @@ static void acpi_thermal_check(void *data)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check if someone else is already running */
|
||||
if (!mutex_trylock(&tz->lock))
|
||||
return;
|
||||
|
||||
state = tz->state;
|
||||
|
||||
result = acpi_thermal_get_temperature(tz);
|
||||
if (result)
|
||||
return;
|
||||
goto unlock;
|
||||
|
||||
memset(&tz->state, 0, sizeof(tz->state));
|
||||
|
||||
@@ -787,10 +793,13 @@ static void acpi_thermal_check(void *data)
|
||||
* a thermal event occurs). Note that _TSP and _TZD values are
|
||||
* 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;
|
||||
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;
|
||||
timeout_jiffies = round_jiffies(jiffies + (HZ * sleep_time) / 1000);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s: temperature[%lu] sleep[%lu]\n",
|
||||
tz->name, tz->temperature, sleep_time));
|
||||
@@ -804,17 +813,16 @@ static void acpi_thermal_check(void *data)
|
||||
del_timer(&(tz->timer));
|
||||
} else {
|
||||
if (timer_pending(&(tz->timer)))
|
||||
mod_timer(&(tz->timer),
|
||||
jiffies + (HZ * sleep_time) / 1000);
|
||||
mod_timer(&(tz->timer), timeout_jiffies);
|
||||
else {
|
||||
tz->timer.data = (unsigned long)tz;
|
||||
tz->timer.function = acpi_thermal_run;
|
||||
tz->timer.expires = jiffies + (HZ * sleep_time) / 1000;
|
||||
tz->timer.expires = timeout_jiffies;
|
||||
add_timer(&(tz->timer));
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
unlock:
|
||||
mutex_unlock(&tz->lock);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
@@ -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_class(device), ACPI_THERMAL_CLASS);
|
||||
acpi_driver_data(device) = tz;
|
||||
|
||||
mutex_init(&tz->lock);
|
||||
result = acpi_thermal_get_info(tz);
|
||||
if (result)
|
||||
goto end;
|
||||
@@ -1321,7 +1329,7 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
|
||||
}
|
||||
|
||||
acpi_thermal_remove_fs(device);
|
||||
|
||||
mutex_destroy(&tz->lock);
|
||||
kfree(tz);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user