x86 boot code comments typos
[safe/jmp/linux-2.6] / drivers / acpi / thermal.c
index 19f3ea4..5a62de1 100644 (file)
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/proc_fs.h>
-#include <linux/sched.h>
+#include <linux/timer.h>
+#include <linux/jiffies.h>
 #include <linux/kmod.h>
 #include <linux/seq_file.h>
+#include <linux/reboot.h>
 #include <asm/uaccess.h>
 
 #include <acpi/acpi_bus.h>
@@ -46,7 +48,6 @@
 
 #define ACPI_THERMAL_COMPONENT         0x04000000
 #define ACPI_THERMAL_CLASS             "thermal_zone"
-#define ACPI_THERMAL_DRIVER_NAME       "ACPI Thermal Zone Driver"
 #define ACPI_THERMAL_DEVICE_NAME       "Thermal Zone"
 #define ACPI_THERMAL_FILE_STATE                "state"
 #define ACPI_THERMAL_FILE_TEMPERATURE  "temperature"
@@ -59,9 +60,6 @@
 #define ACPI_THERMAL_NOTIFY_CRITICAL   0xF0
 #define ACPI_THERMAL_NOTIFY_HOT                0xF1
 #define ACPI_THERMAL_MODE_ACTIVE       0x00
-#define ACPI_THERMAL_MODE_PASSIVE      0x01
-#define ACPI_THERMAL_MODE_CRITICAL     0xff
-#define ACPI_THERMAL_PATH_POWEROFF     "/sbin/poweroff"
 
 #define ACPI_THERMAL_MAX_ACTIVE        10
 #define ACPI_THERMAL_MAX_LIMIT_STR_LEN 65
 #define CELSIUS_TO_KELVIN(t)   ((t+273)*10)
 
 #define _COMPONENT             ACPI_THERMAL_COMPONENT
-ACPI_MODULE_NAME("acpi_thermal")
+ACPI_MODULE_NAME("thermal");
 
 MODULE_AUTHOR("Paul Diefenbaugh");
-MODULE_DESCRIPTION(ACPI_THERMAL_DRIVER_NAME);
+MODULE_DESCRIPTION("ACPI Thermal Zone Driver");
 MODULE_LICENSE("GPL");
 
 static int tzp;
@@ -82,12 +80,10 @@ MODULE_PARM_DESC(tzp, "Thermal zone polling frequency, in 1/10 seconds.\n");
 
 static int acpi_thermal_add(struct acpi_device *device);
 static int acpi_thermal_remove(struct acpi_device *device, int type);
+static int acpi_thermal_resume(struct acpi_device *device);
 static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file);
 static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file);
 static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file);
-static ssize_t acpi_thermal_write_trip_points(struct file *,
-                                             const char __user *, size_t,
-                                             loff_t *);
 static int acpi_thermal_cooling_open_fs(struct inode *inode, struct file *file);
 static ssize_t acpi_thermal_write_cooling_mode(struct file *,
                                               const char __user *, size_t,
@@ -96,13 +92,20 @@ static int acpi_thermal_polling_open_fs(struct inode *inode, struct file *file);
 static ssize_t acpi_thermal_write_polling(struct file *, const char __user *,
                                          size_t, loff_t *);
 
+static const struct acpi_device_id  thermal_device_ids[] = {
+       {ACPI_THERMAL_HID, 0},
+       {"", 0},
+};
+MODULE_DEVICE_TABLE(acpi, thermal_device_ids);
+
 static struct acpi_driver acpi_thermal_driver = {
-       .name = ACPI_THERMAL_DRIVER_NAME,
+       .name = "thermal",
        .class = ACPI_THERMAL_CLASS,
-       .ids = ACPI_THERMAL_HID,
+       .ids = thermal_device_ids,
        .ops = {
                .add = acpi_thermal_add,
                .remove = acpi_thermal_remove,
+               .resume = acpi_thermal_resume,
                },
 };
 
@@ -160,12 +163,11 @@ struct acpi_thermal_flags {
 };
 
 struct acpi_thermal {
-       acpi_handle handle;
+       struct acpi_device * device;
        acpi_bus_id name;
        unsigned long temperature;
        unsigned long last_temperature;
        unsigned long polling_frequency;
-       u8 cooling_mode;
        volatile u8 zombie;
        struct acpi_thermal_flags flags;
        struct acpi_thermal_state state;
@@ -174,29 +176,28 @@ struct acpi_thermal {
        struct timer_list timer;
 };
 
-static struct file_operations acpi_thermal_state_fops = {
+static const struct file_operations acpi_thermal_state_fops = {
        .open = acpi_thermal_state_open_fs,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations acpi_thermal_temp_fops = {
+static const struct file_operations acpi_thermal_temp_fops = {
        .open = acpi_thermal_temp_open_fs,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations acpi_thermal_trip_fops = {
+static const struct file_operations acpi_thermal_trip_fops = {
        .open = acpi_thermal_trip_open_fs,
        .read = seq_read,
-       .write = acpi_thermal_write_trip_points,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations acpi_thermal_cooling_fops = {
+static const struct file_operations acpi_thermal_cooling_fops = {
        .open = acpi_thermal_cooling_open_fs,
        .read = seq_read,
        .write = acpi_thermal_write_cooling_mode,
@@ -204,7 +205,7 @@ static struct file_operations acpi_thermal_cooling_fops = {
        .release = single_release,
 };
 
-static struct file_operations acpi_thermal_polling_fops = {
+static const struct file_operations acpi_thermal_polling_fops = {
        .open = acpi_thermal_polling_open_fs,
        .read = seq_read,
        .write = acpi_thermal_write_polling,
@@ -220,59 +221,56 @@ static int acpi_thermal_get_temperature(struct acpi_thermal *tz)
 {
        acpi_status status = AE_OK;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_get_temperature");
 
        if (!tz)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        tz->last_temperature = tz->temperature;
 
        status =
-           acpi_evaluate_integer(tz->handle, "_TMP", NULL, &tz->temperature);
+           acpi_evaluate_integer(tz->device->handle, "_TMP", NULL, &tz->temperature);
        if (ACPI_FAILURE(status))
-               return_VALUE(-ENODEV);
+               return -ENODEV;
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Temperature is %lu dK\n",
                          tz->temperature));
 
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
 {
        acpi_status status = AE_OK;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_get_polling_frequency");
 
        if (!tz)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        status =
-           acpi_evaluate_integer(tz->handle, "_TZP", NULL,
+           acpi_evaluate_integer(tz->device->handle, "_TZP", NULL,
                                  &tz->polling_frequency);
        if (ACPI_FAILURE(status))
-               return_VALUE(-ENODEV);
+               return -ENODEV;
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Polling frequency is %lu dS\n",
                          tz->polling_frequency));
 
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_set_polling(struct acpi_thermal *tz, int seconds)
 {
-       ACPI_FUNCTION_TRACE("acpi_thermal_set_polling");
 
        if (!tz)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        tz->polling_frequency = seconds * 10;   /* Convert value to deci-seconds */
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                          "Polling frequency set to %lu seconds\n",
-                         tz->polling_frequency));
+                         tz->polling_frequency/10));
 
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_set_cooling_mode(struct acpi_thermal *tz, int mode)
@@ -282,29 +280,23 @@ static int acpi_thermal_set_cooling_mode(struct acpi_thermal *tz, int mode)
        struct acpi_object_list arg_list = { 1, &arg0 };
        acpi_handle handle = NULL;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_set_cooling_mode");
 
        if (!tz)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
-       status = acpi_get_handle(tz->handle, "_SCP", &handle);
+       status = acpi_get_handle(tz->device->handle, "_SCP", &handle);
        if (ACPI_FAILURE(status)) {
                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "_SCP not present\n"));
-               return_VALUE(-ENODEV);
+               return -ENODEV;
        }
 
        arg0.integer.value = mode;
 
        status = acpi_evaluate_object(handle, NULL, &arg_list, NULL);
        if (ACPI_FAILURE(status))
-               return_VALUE(-ENODEV);
+               return -ENODEV;
 
-       tz->cooling_mode = mode;
-
-       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Cooling mode [%s]\n",
-                         mode ? "passive" : "active"));
-
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
@@ -312,19 +304,18 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
        acpi_status status = AE_OK;
        int i = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_get_trip_points");
 
        if (!tz)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        /* Critical Shutdown (required) */
 
-       status = acpi_evaluate_integer(tz->handle, "_CRT", NULL,
+       status = acpi_evaluate_integer(tz->device->handle, "_CRT", NULL,
                                       &tz->trips.critical.temperature);
        if (ACPI_FAILURE(status)) {
                tz->trips.critical.flags.valid = 0;
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No critical threshold\n"));
-               return_VALUE(-ENODEV);
+               ACPI_EXCEPTION((AE_INFO, status, "No critical threshold"));
+               return -ENODEV;
        } else {
                tz->trips.critical.flags.valid = 1;
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
@@ -335,7 +326,7 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
        /* Critical Sleep (optional) */
 
        status =
-           acpi_evaluate_integer(tz->handle, "_HOT", NULL,
+           acpi_evaluate_integer(tz->device->handle, "_HOT", NULL,
                                  &tz->trips.hot.temperature);
        if (ACPI_FAILURE(status)) {
                tz->trips.hot.flags.valid = 0;
@@ -349,7 +340,7 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
        /* Passive: Processors (optional) */
 
        status =
-           acpi_evaluate_integer(tz->handle, "_PSV", NULL,
+           acpi_evaluate_integer(tz->device->handle, "_PSV", NULL,
                                  &tz->trips.passive.temperature);
        if (ACPI_FAILURE(status)) {
                tz->trips.passive.flags.valid = 0;
@@ -358,32 +349,31 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
                tz->trips.passive.flags.valid = 1;
 
                status =
-                   acpi_evaluate_integer(tz->handle, "_TC1", NULL,
+                   acpi_evaluate_integer(tz->device->handle, "_TC1", NULL,
                                          &tz->trips.passive.tc1);
                if (ACPI_FAILURE(status))
                        tz->trips.passive.flags.valid = 0;
 
                status =
-                   acpi_evaluate_integer(tz->handle, "_TC2", NULL,
+                   acpi_evaluate_integer(tz->device->handle, "_TC2", NULL,
                                          &tz->trips.passive.tc2);
                if (ACPI_FAILURE(status))
                        tz->trips.passive.flags.valid = 0;
 
                status =
-                   acpi_evaluate_integer(tz->handle, "_TSP", NULL,
+                   acpi_evaluate_integer(tz->device->handle, "_TSP", NULL,
                                          &tz->trips.passive.tsp);
                if (ACPI_FAILURE(status))
                        tz->trips.passive.flags.valid = 0;
 
                status =
-                   acpi_evaluate_reference(tz->handle, "_PSL", NULL,
+                   acpi_evaluate_reference(tz->device->handle, "_PSL", NULL,
                                            &tz->trips.passive.devices);
                if (ACPI_FAILURE(status))
                        tz->trips.passive.flags.valid = 0;
 
                if (!tz->trips.passive.flags.valid)
-                       ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                         "Invalid passive threshold\n"));
+                       printk(KERN_WARNING PREFIX "Invalid passive threshold\n");
                else
                        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                          "Found passive threshold [%lu]\n",
@@ -397,14 +387,14 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
                char name[5] = { '_', 'A', 'C', ('0' + i), '\0' };
 
                status =
-                   acpi_evaluate_integer(tz->handle, name, NULL,
+                   acpi_evaluate_integer(tz->device->handle, name, NULL,
                                          &tz->trips.active[i].temperature);
                if (ACPI_FAILURE(status))
                        break;
 
                name[2] = 'L';
                status =
-                   acpi_evaluate_reference(tz->handle, name, NULL,
+                   acpi_evaluate_reference(tz->device->handle, name, NULL,
                                            &tz->trips.active[i].devices);
                if (ACPI_SUCCESS(status)) {
                        tz->trips.active[i].flags.valid = 1;
@@ -412,109 +402,68 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
                                          "Found active threshold [%d]:[%lu]\n",
                                          i, tz->trips.active[i].temperature));
                } else
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Invalid active threshold [%d]\n",
-                                         i));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Invalid active threshold [%d]", i));
        }
 
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_get_devices(struct acpi_thermal *tz)
 {
        acpi_status status = AE_OK;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_get_devices");
 
        if (!tz)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        status =
-           acpi_evaluate_reference(tz->handle, "_TZD", NULL, &tz->devices);
+           acpi_evaluate_reference(tz->device->handle, "_TZD", NULL, &tz->devices);
        if (ACPI_FAILURE(status))
-               return_VALUE(-ENODEV);
-
-       return_VALUE(0);
-}
-
-static int acpi_thermal_call_usermode(char *path)
-{
-       char *argv[2] = { NULL, NULL };
-       char *envp[3] = { NULL, NULL, NULL };
-
-       ACPI_FUNCTION_TRACE("acpi_thermal_call_usermode");
-
-       if (!path)
-               return_VALUE(-EINVAL);
+               return -ENODEV;
 
-       argv[0] = path;
-
-       /* minimal command environment */
-       envp[0] = "HOME=/";
-       envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
-
-       call_usermodehelper(argv[0], argv, envp, 0);
-
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_critical(struct acpi_thermal *tz)
 {
-       int result = 0;
-       struct acpi_device *device = NULL;
-
-       ACPI_FUNCTION_TRACE("acpi_thermal_critical");
-
        if (!tz || !tz->trips.critical.flags.valid)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        if (tz->temperature >= tz->trips.critical.temperature) {
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Critical trip point\n"));
+               printk(KERN_WARNING PREFIX "Critical trip point\n");
                tz->trips.critical.flags.enabled = 1;
        } else if (tz->trips.critical.flags.enabled)
                tz->trips.critical.flags.enabled = 0;
 
-       result = acpi_bus_get_device(tz->handle, &device);
-       if (result)
-               return_VALUE(result);
-
        printk(KERN_EMERG
               "Critical temperature reached (%ld C), shutting down.\n",
               KELVIN_TO_CELSIUS(tz->temperature));
-       acpi_bus_generate_event(device, ACPI_THERMAL_NOTIFY_CRITICAL,
+       acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_CRITICAL,
                                tz->trips.critical.flags.enabled);
 
-       acpi_thermal_call_usermode(ACPI_THERMAL_PATH_POWEROFF);
+       orderly_poweroff(true);
 
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_hot(struct acpi_thermal *tz)
 {
-       int result = 0;
-       struct acpi_device *device = NULL;
-
-       ACPI_FUNCTION_TRACE("acpi_thermal_hot");
-
        if (!tz || !tz->trips.hot.flags.valid)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        if (tz->temperature >= tz->trips.hot.temperature) {
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Hot trip point\n"));
+               printk(KERN_WARNING PREFIX "Hot trip point\n");
                tz->trips.hot.flags.enabled = 1;
        } else if (tz->trips.hot.flags.enabled)
                tz->trips.hot.flags.enabled = 0;
 
-       result = acpi_bus_get_device(tz->handle, &device);
-       if (result)
-               return_VALUE(result);
-
-       acpi_bus_generate_event(device, ACPI_THERMAL_NOTIFY_HOT,
+       acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_HOT,
                                tz->trips.hot.flags.enabled);
 
        /* TBD: Call user-mode "sleep(S4)" function */
 
-       return_VALUE(0);
+       return 0;
 }
 
 static void acpi_thermal_passive(struct acpi_thermal *tz)
@@ -524,7 +473,6 @@ static void acpi_thermal_passive(struct acpi_thermal *tz)
        int trend = 0;
        int i = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_passive");
 
        if (!tz || !tz->trips.passive.flags.valid)
                return;
@@ -613,7 +561,6 @@ static void acpi_thermal_active(struct acpi_thermal *tz)
        int j = 0;
        unsigned long maxtemp = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_active");
 
        if (!tz)
                return;
@@ -640,10 +587,10 @@ static void acpi_thermal_active(struct acpi_thermal *tz)
                                                       handles[j],
                                                       ACPI_STATE_D0);
                                if (result) {
-                                       ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                                         "Unable to turn cooling device [%p] 'on'\n",
-                                                         active->devices.
-                                                         handles[j]));
+                                       printk(KERN_WARNING PREFIX
+                                                     "Unable to turn cooling device [%p] 'on'\n",
+                                                     active->devices.
+                                                     handles[j]);
                                        continue;
                                }
                                active->flags.enabled = 1;
@@ -665,9 +612,9 @@ static void acpi_thermal_active(struct acpi_thermal *tz)
                        result = acpi_bus_set_power(active->devices.handles[j],
                                                    ACPI_STATE_D3);
                        if (result) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                                 "Unable to turn cooling device [%p] 'off'\n",
-                                                 active->devices.handles[j]));
+                               printk(KERN_WARNING PREFIX
+                                             "Unable to turn cooling device [%p] 'off'\n",
+                                             active->devices.handles[j]);
                                continue;
                        }
                        active->flags.enabled = 0;
@@ -684,30 +631,28 @@ static void acpi_thermal_run(unsigned long data)
 {
        struct acpi_thermal *tz = (struct acpi_thermal *)data;
        if (!tz->zombie)
-               acpi_os_queue_for_execution(OSD_PRIORITY_GPE,
-                                           acpi_thermal_check, (void *)data);
+               acpi_os_execute(OSL_GPE_HANDLER, acpi_thermal_check, (void *)data);
 }
 
 static void acpi_thermal_check(void *data)
 {
        int result = 0;
-       struct acpi_thermal *tz = (struct acpi_thermal *)data;
+       struct acpi_thermal *tz = data;
        unsigned long sleep_time = 0;
        int i = 0;
        struct acpi_thermal_state state;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_check");
 
        if (!tz) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid (NULL) context.\n"));
-               return_VOID;
+               printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
+               return;
        }
 
        state = tz->state;
 
        result = acpi_thermal_get_temperature(tz);
        if (result)
-               return_VOID;
+               return;
 
        memset(&tz->state, 0, sizeof(tz->state));
 
@@ -787,7 +732,8 @@ static void acpi_thermal_check(void *data)
                        del_timer(&(tz->timer));
        } else {
                if (timer_pending(&(tz->timer)))
-                       mod_timer(&(tz->timer), (HZ * sleep_time) / 1000);
+                       mod_timer(&(tz->timer),
+                                       jiffies + (HZ * sleep_time) / 1000);
                else {
                        tz->timer.data = (unsigned long)tz;
                        tz->timer.function = acpi_thermal_run;
@@ -796,7 +742,7 @@ static void acpi_thermal_check(void *data)
                }
        }
 
-       return_VOID;
+       return;
 }
 
 /* --------------------------------------------------------------------------
@@ -807,9 +753,8 @@ static struct proc_dir_entry *acpi_thermal_dir;
 
 static int acpi_thermal_state_seq_show(struct seq_file *seq, void *offset)
 {
-       struct acpi_thermal *tz = (struct acpi_thermal *)seq->private;
+       struct acpi_thermal *tz = seq->private;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_state_seq_show");
 
        if (!tz)
                goto end;
@@ -832,7 +777,7 @@ static int acpi_thermal_state_seq_show(struct seq_file *seq, void *offset)
        }
 
       end:
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file)
@@ -843,9 +788,8 @@ static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file)
 static int acpi_thermal_temp_seq_show(struct seq_file *seq, void *offset)
 {
        int result = 0;
-       struct acpi_thermal *tz = (struct acpi_thermal *)seq->private;
+       struct acpi_thermal *tz = seq->private;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_temp_seq_show");
 
        if (!tz)
                goto end;
@@ -858,7 +802,7 @@ static int acpi_thermal_temp_seq_show(struct seq_file *seq, void *offset)
                   KELVIN_TO_CELSIUS(tz->temperature));
 
       end:
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file)
@@ -868,11 +812,13 @@ static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file)
 
 static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset)
 {
-       struct acpi_thermal *tz = (struct acpi_thermal *)seq->private;
+       struct acpi_thermal *tz = seq->private;
+       struct acpi_device *device;
+       acpi_status status;
+
        int i = 0;
        int j = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_trip_seq_show");
 
        if (!tz)
                goto end;
@@ -892,9 +838,10 @@ static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset)
                           tz->trips.passive.tc1, tz->trips.passive.tc2,
                           tz->trips.passive.tsp);
                for (j = 0; j < tz->trips.passive.devices.count; j++) {
-
-                       seq_printf(seq, "0x%p ",
-                                  tz->trips.passive.devices.handles[j]);
+                       status = acpi_bus_get_device(tz->trips.passive.devices.
+                                                    handles[j], &device);
+                       seq_printf(seq, "%4.4s ", status ? "" :
+                                  acpi_device_bid(device));
                }
                seq_puts(seq, "\n");
        }
@@ -905,14 +852,18 @@ static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset)
                seq_printf(seq, "active[%d]:               %ld C: devices=",
                           i,
                           KELVIN_TO_CELSIUS(tz->trips.active[i].temperature));
-               for (j = 0; j < tz->trips.active[i].devices.count; j++)
-                       seq_printf(seq, "0x%p ",
-                                  tz->trips.active[i].devices.handles[j]);
+               for (j = 0; j < tz->trips.active[i].devices.count; j++){
+                       status = acpi_bus_get_device(tz->trips.active[i].
+                                                    devices.handles[j],
+                                                    &device);
+                       seq_printf(seq, "%4.4s ", status ? "" :
+                                  acpi_device_bid(device));
+               }
                seq_puts(seq, "\n");
        }
 
       end:
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file)
@@ -920,92 +871,21 @@ static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file)
        return single_open(file, acpi_thermal_trip_seq_show, PDE(inode)->data);
 }
 
-static ssize_t
-acpi_thermal_write_trip_points(struct file *file,
-                              const char __user * buffer,
-                              size_t count, loff_t * ppos)
-{
-       struct seq_file *m = (struct seq_file *)file->private_data;
-       struct acpi_thermal *tz = (struct acpi_thermal *)m->private;
-
-       char *limit_string;
-       int num, critical, hot, passive;
-       int *active;
-       int i = 0;
-
-       ACPI_FUNCTION_TRACE("acpi_thermal_write_trip_points");
-
-       limit_string = kmalloc(ACPI_THERMAL_MAX_LIMIT_STR_LEN, GFP_KERNEL);
-       if (!limit_string)
-               return_VALUE(-ENOMEM);
-
-       memset(limit_string, 0, ACPI_THERMAL_MAX_LIMIT_STR_LEN);
-
-       active = kmalloc(ACPI_THERMAL_MAX_ACTIVE * sizeof(int), GFP_KERNEL);
-       if (!active)
-               return_VALUE(-ENOMEM);
-
-       if (!tz || (count > ACPI_THERMAL_MAX_LIMIT_STR_LEN - 1)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid argument\n"));
-               count = -EINVAL;
-               goto end;
-       }
-
-       if (copy_from_user(limit_string, buffer, count)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid data\n"));
-               count = -EFAULT;
-               goto end;
-       }
-
-       limit_string[count] = '\0';
-
-       num = sscanf(limit_string, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
-                    &critical, &hot, &passive,
-                    &active[0], &active[1], &active[2], &active[3], &active[4],
-                    &active[5], &active[6], &active[7], &active[8],
-                    &active[9]);
-       if (!(num >= 5 && num < (ACPI_THERMAL_MAX_ACTIVE + 3))) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid data format\n"));
-               count = -EINVAL;
-               goto end;
-       }
-
-       tz->trips.critical.temperature = CELSIUS_TO_KELVIN(critical);
-       tz->trips.hot.temperature = CELSIUS_TO_KELVIN(hot);
-       tz->trips.passive.temperature = CELSIUS_TO_KELVIN(passive);
-       for (i = 0; i < num - 3; i++) {
-               if (!(tz->trips.active[i].flags.valid))
-                       break;
-               tz->trips.active[i].temperature = CELSIUS_TO_KELVIN(active[i]);
-       }
-
-      end:
-       kfree(active);
-       kfree(limit_string);
-       return_VALUE(count);
-}
-
 static int acpi_thermal_cooling_seq_show(struct seq_file *seq, void *offset)
 {
-       struct acpi_thermal *tz = (struct acpi_thermal *)seq->private;
+       struct acpi_thermal *tz = seq->private;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_cooling_seq_show");
 
        if (!tz)
                goto end;
 
-       if (!tz->flags.cooling_mode) {
+       if (!tz->flags.cooling_mode)
                seq_puts(seq, "<setting not supported>\n");
-       }
-
-       if (tz->cooling_mode == ACPI_THERMAL_MODE_CRITICAL)
-               seq_printf(seq, "cooling mode:  critical\n");
        else
-               seq_printf(seq, "cooling mode:  %s\n",
-                          tz->cooling_mode ? "passive" : "active");
+               seq_puts(seq, "0 - Active; 1 - Passive\n");
 
       end:
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_cooling_open_fs(struct inode *inode, struct file *file)
@@ -1019,21 +899,20 @@ acpi_thermal_write_cooling_mode(struct file *file,
                                const char __user * buffer,
                                size_t count, loff_t * ppos)
 {
-       struct seq_file *m = (struct seq_file *)file->private_data;
-       struct acpi_thermal *tz = (struct acpi_thermal *)m->private;
+       struct seq_file *m = file->private_data;
+       struct acpi_thermal *tz = m->private;
        int result = 0;
        char mode_string[12] = { '\0' };
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_write_cooling_mode");
 
        if (!tz || (count > sizeof(mode_string) - 1))
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        if (!tz->flags.cooling_mode)
-               return_VALUE(-ENODEV);
+               return -ENODEV;
 
        if (copy_from_user(mode_string, buffer, count))
-               return_VALUE(-EFAULT);
+               return -EFAULT;
 
        mode_string[count] = '\0';
 
@@ -1041,18 +920,17 @@ acpi_thermal_write_cooling_mode(struct file *file,
                                               simple_strtoul(mode_string, NULL,
                                                              0));
        if (result)
-               return_VALUE(result);
+               return result;
 
        acpi_thermal_check(tz);
 
-       return_VALUE(count);
+       return count;
 }
 
 static int acpi_thermal_polling_seq_show(struct seq_file *seq, void *offset)
 {
-       struct acpi_thermal *tz = (struct acpi_thermal *)seq->private;
+       struct acpi_thermal *tz = seq->private;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_polling_seq_show");
 
        if (!tz)
                goto end;
@@ -1066,7 +944,7 @@ static int acpi_thermal_polling_seq_show(struct seq_file *seq, void *offset)
                   (tz->polling_frequency / 10));
 
       end:
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_polling_open_fs(struct inode *inode, struct file *file)
@@ -1080,19 +958,18 @@ acpi_thermal_write_polling(struct file *file,
                           const char __user * buffer,
                           size_t count, loff_t * ppos)
 {
-       struct seq_file *m = (struct seq_file *)file->private_data;
-       struct acpi_thermal *tz = (struct acpi_thermal *)m->private;
+       struct seq_file *m = file->private_data;
+       struct acpi_thermal *tz = m->private;
        int result = 0;
        char polling_string[12] = { '\0' };
        int seconds = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_write_polling");
 
        if (!tz || (count > sizeof(polling_string) - 1))
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        if (copy_from_user(polling_string, buffer, count))
-               return_VALUE(-EFAULT);
+               return -EFAULT;
 
        polling_string[count] = '\0';
 
@@ -1100,24 +977,23 @@ acpi_thermal_write_polling(struct file *file,
 
        result = acpi_thermal_set_polling(tz, seconds);
        if (result)
-               return_VALUE(result);
+               return result;
 
        acpi_thermal_check(tz);
 
-       return_VALUE(count);
+       return count;
 }
 
 static int acpi_thermal_add_fs(struct acpi_device *device)
 {
        struct proc_dir_entry *entry = NULL;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_add_fs");
 
        if (!acpi_device_dir(device)) {
                acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
                                                     acpi_thermal_dir);
                if (!acpi_device_dir(device))
-                       return_VALUE(-ENODEV);
+                       return -ENODEV;
                acpi_device_dir(device)->owner = THIS_MODULE;
        }
 
@@ -1125,9 +1001,7 @@ static int acpi_thermal_add_fs(struct acpi_device *device)
        entry = create_proc_entry(ACPI_THERMAL_FILE_STATE,
                                  S_IRUGO, acpi_device_dir(device));
        if (!entry)
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unable to create '%s' fs entry\n",
-                                 ACPI_THERMAL_FILE_STATE));
+               return -ENODEV;
        else {
                entry->proc_fops = &acpi_thermal_state_fops;
                entry->data = acpi_driver_data(device);
@@ -1138,9 +1012,7 @@ static int acpi_thermal_add_fs(struct acpi_device *device)
        entry = create_proc_entry(ACPI_THERMAL_FILE_TEMPERATURE,
                                  S_IRUGO, acpi_device_dir(device));
        if (!entry)
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unable to create '%s' fs entry\n",
-                                 ACPI_THERMAL_FILE_TEMPERATURE));
+               return -ENODEV;
        else {
                entry->proc_fops = &acpi_thermal_temp_fops;
                entry->data = acpi_driver_data(device);
@@ -1152,9 +1024,7 @@ static int acpi_thermal_add_fs(struct acpi_device *device)
                                  S_IFREG | S_IRUGO | S_IWUSR,
                                  acpi_device_dir(device));
        if (!entry)
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unable to create '%s' fs entry\n",
-                                 ACPI_THERMAL_FILE_TRIP_POINTS));
+               return -ENODEV;
        else {
                entry->proc_fops = &acpi_thermal_trip_fops;
                entry->data = acpi_driver_data(device);
@@ -1166,9 +1036,7 @@ static int acpi_thermal_add_fs(struct acpi_device *device)
                                  S_IFREG | S_IRUGO | S_IWUSR,
                                  acpi_device_dir(device));
        if (!entry)
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unable to create '%s' fs entry\n",
-                                 ACPI_THERMAL_FILE_COOLING_MODE));
+               return -ENODEV;
        else {
                entry->proc_fops = &acpi_thermal_cooling_fops;
                entry->data = acpi_driver_data(device);
@@ -1180,21 +1048,18 @@ static int acpi_thermal_add_fs(struct acpi_device *device)
                                  S_IFREG | S_IRUGO | S_IWUSR,
                                  acpi_device_dir(device));
        if (!entry)
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unable to create '%s' fs entry\n",
-                                 ACPI_THERMAL_FILE_POLLING_FREQ));
+               return -ENODEV;
        else {
                entry->proc_fops = &acpi_thermal_polling_fops;
                entry->data = acpi_driver_data(device);
                entry->owner = THIS_MODULE;
        }
 
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_remove_fs(struct acpi_device *device)
 {
-       ACPI_FUNCTION_TRACE("acpi_thermal_remove_fs");
 
        if (acpi_device_dir(device)) {
                remove_proc_entry(ACPI_THERMAL_FILE_POLLING_FREQ,
@@ -1211,7 +1076,7 @@ static int acpi_thermal_remove_fs(struct acpi_device *device)
                acpi_device_dir(device) = NULL;
        }
 
-       return_VALUE(0);
+       return 0;
 }
 
 /* --------------------------------------------------------------------------
@@ -1220,16 +1085,14 @@ static int acpi_thermal_remove_fs(struct acpi_device *device)
 
 static void acpi_thermal_notify(acpi_handle handle, u32 event, void *data)
 {
-       struct acpi_thermal *tz = (struct acpi_thermal *)data;
+       struct acpi_thermal *tz = data;
        struct acpi_device *device = NULL;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_notify");
 
        if (!tz)
-               return_VOID;
+               return;
 
-       if (acpi_bus_get_device(tz->handle, &device))
-               return_VOID;
+       device = tz->device;
 
        switch (event) {
        case ACPI_THERMAL_NOTIFY_TEMPERATURE:
@@ -1251,54 +1114,31 @@ static void acpi_thermal_notify(acpi_handle handle, u32 event, void *data)
                break;
        }
 
-       return_VOID;
+       return;
 }
 
 static int acpi_thermal_get_info(struct acpi_thermal *tz)
 {
        int result = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_get_info");
 
        if (!tz)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
        /* Get temperature [_TMP] (required) */
        result = acpi_thermal_get_temperature(tz);
        if (result)
-               return_VALUE(result);
+               return result;
 
        /* Get trip points [_CRT, _PSV, etc.] (required) */
        result = acpi_thermal_get_trip_points(tz);
        if (result)
-               return_VALUE(result);
+               return result;
 
        /* Set the cooling mode [_SCP] to active cooling (default) */
        result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE);
        if (!result)
                tz->flags.cooling_mode = 1;
-       else {
-               /* Oh,we have not _SCP method.
-                  Generally show cooling_mode by _ACx, _PSV,spec 12.2 */
-               tz->flags.cooling_mode = 0;
-               if (tz->trips.active[0].flags.valid
-                   && tz->trips.passive.flags.valid) {
-                       if (tz->trips.passive.temperature >
-                           tz->trips.active[0].temperature)
-                               tz->cooling_mode = ACPI_THERMAL_MODE_ACTIVE;
-                       else
-                               tz->cooling_mode = ACPI_THERMAL_MODE_PASSIVE;
-               } else if (!tz->trips.active[0].flags.valid
-                          && tz->trips.passive.flags.valid) {
-                       tz->cooling_mode = ACPI_THERMAL_MODE_PASSIVE;
-               } else if (tz->trips.active[0].flags.valid
-                          && !tz->trips.passive.flags.valid) {
-                       tz->cooling_mode = ACPI_THERMAL_MODE_ACTIVE;
-               } else {
-                       /* _ACx and _PSV are optional, but _CRT is required */
-                       tz->cooling_mode = ACPI_THERMAL_MODE_CRITICAL;
-               }
-       }
 
        /* Get default polling frequency [_TZP] (optional) */
        if (tzp)
@@ -1311,7 +1151,7 @@ static int acpi_thermal_get_info(struct acpi_thermal *tz)
        if (!result)
                tz->flags.devices = 1;
 
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_thermal_add(struct acpi_device *device)
@@ -1320,17 +1160,15 @@ static int acpi_thermal_add(struct acpi_device *device)
        acpi_status status = AE_OK;
        struct acpi_thermal *tz = NULL;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_add");
 
        if (!device)
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
-       tz = kmalloc(sizeof(struct acpi_thermal), GFP_KERNEL);
+       tz = kzalloc(sizeof(struct acpi_thermal), GFP_KERNEL);
        if (!tz)
-               return_VALUE(-ENOMEM);
-       memset(tz, 0, sizeof(struct acpi_thermal));
+               return -ENOMEM;
 
-       tz->handle = device->handle;
+       tz->device = device;
        strcpy(tz->name, device->pnp.bus_id);
        strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
@@ -1342,18 +1180,16 @@ static int acpi_thermal_add(struct acpi_device *device)
 
        result = acpi_thermal_add_fs(device);
        if (result)
-               return_VALUE(result);
+               goto end;
 
        init_timer(&tz->timer);
 
        acpi_thermal_check(tz);
 
-       status = acpi_install_notify_handler(tz->handle,
+       status = acpi_install_notify_handler(device->handle,
                                             ACPI_DEVICE_NOTIFY,
                                             acpi_thermal_notify, tz);
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Error installing notify handler\n"));
                result = -ENODEV;
                goto end;
        }
@@ -1368,7 +1204,7 @@ static int acpi_thermal_add(struct acpi_device *device)
                kfree(tz);
        }
 
-       return_VALUE(result);
+       return result;
 }
 
 static int acpi_thermal_remove(struct acpi_device *device, int type)
@@ -1376,12 +1212,11 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
        acpi_status status = AE_OK;
        struct acpi_thermal *tz = NULL;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_remove");
 
        if (!device || !acpi_driver_data(device))
-               return_VALUE(-EINVAL);
+               return -EINVAL;
 
-       tz = (struct acpi_thermal *)acpi_driver_data(device);
+       tz = acpi_driver_data(device);
 
        /* avoid timer adding new defer task */
        tz->zombie = 1;
@@ -1392,12 +1227,9 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
        /* deferred task may reinsert timer */
        del_timer_sync(&(tz->timer));
 
-       status = acpi_remove_notify_handler(tz->handle,
+       status = acpi_remove_notify_handler(device->handle,
                                            ACPI_DEVICE_NOTIFY,
                                            acpi_thermal_notify);
-       if (ACPI_FAILURE(status))
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Error removing notify handler\n"));
 
        /* Terminate policy */
        if (tz->trips.passive.flags.valid && tz->trips.passive.flags.enabled) {
@@ -1413,38 +1245,69 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
        acpi_thermal_remove_fs(device);
 
        kfree(tz);
-       return_VALUE(0);
+       return 0;
+}
+
+static int acpi_thermal_resume(struct acpi_device *device)
+{
+       struct acpi_thermal *tz = NULL;
+       int i, j, power_state, result;
+
+
+       if (!device || !acpi_driver_data(device))
+               return -EINVAL;
+
+       tz = acpi_driver_data(device);
+
+       for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
+               if (!(&tz->trips.active[i]))
+                       break;
+               if (!tz->trips.active[i].flags.valid)
+                       break;
+               tz->trips.active[i].flags.enabled = 1;
+               for (j = 0; j < tz->trips.active[i].devices.count; j++) {
+                       result = acpi_bus_get_power(tz->trips.active[i].devices.
+                           handles[j], &power_state);
+                       if (result || (power_state != ACPI_STATE_D0)) {
+                               tz->trips.active[i].flags.enabled = 0;
+                               break;
+                       }
+               }
+               tz->state.active |= tz->trips.active[i].flags.enabled;
+       }
+
+       acpi_thermal_check(tz);
+
+       return AE_OK;
 }
 
 static int __init acpi_thermal_init(void)
 {
        int result = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_thermal_init");
 
        acpi_thermal_dir = proc_mkdir(ACPI_THERMAL_CLASS, acpi_root_dir);
        if (!acpi_thermal_dir)
-               return_VALUE(-ENODEV);
+               return -ENODEV;
        acpi_thermal_dir->owner = THIS_MODULE;
 
        result = acpi_bus_register_driver(&acpi_thermal_driver);
        if (result < 0) {
                remove_proc_entry(ACPI_THERMAL_CLASS, acpi_root_dir);
-               return_VALUE(-ENODEV);
+               return -ENODEV;
        }
 
-       return_VALUE(0);
+       return 0;
 }
 
 static void __exit acpi_thermal_exit(void)
 {
-       ACPI_FUNCTION_TRACE("acpi_thermal_exit");
 
        acpi_bus_unregister_driver(&acpi_thermal_driver);
 
        remove_proc_entry(ACPI_THERMAL_CLASS, acpi_root_dir);
 
-       return_VOID;
+       return;
 }
 
 module_init(acpi_thermal_init);