spi: spidev_fdx: Add support for Dual/Quad SPI Transfers
[cascardo/linux.git] / drivers / acpi / thermal.c
1 /*
2  *  acpi_thermal.c - ACPI Thermal Zone Driver ($Revision: 41 $)
3  *
4  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
5  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
6  *
7  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or (at
12  *  your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful, but
15  *  WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  *  General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License along
20  *  with this program; if not, write to the Free Software Foundation, Inc.,
21  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22  *
23  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24  *
25  *  This driver fully implements the ACPI thermal policy as described in the
26  *  ACPI 2.0 Specification.
27  *
28  *  TBD: 1. Implement passive cooling hysteresis.
29  *       2. Enhance passive cooling (CPU) states/limit interface to support
30  *          concepts of 'multiple limiters', upper/lower limits, etc.
31  *
32  */
33
34 #include <linux/kernel.h>
35 #include <linux/module.h>
36 #include <linux/dmi.h>
37 #include <linux/init.h>
38 #include <linux/slab.h>
39 #include <linux/types.h>
40 #include <linux/jiffies.h>
41 #include <linux/kmod.h>
42 #include <linux/reboot.h>
43 #include <linux/device.h>
44 #include <linux/thermal.h>
45 #include <linux/acpi.h>
46 #include <asm/uaccess.h>
47
48 #define PREFIX "ACPI: "
49
50 #define ACPI_THERMAL_CLASS              "thermal_zone"
51 #define ACPI_THERMAL_DEVICE_NAME        "Thermal Zone"
52 #define ACPI_THERMAL_NOTIFY_TEMPERATURE 0x80
53 #define ACPI_THERMAL_NOTIFY_THRESHOLDS  0x81
54 #define ACPI_THERMAL_NOTIFY_DEVICES     0x82
55 #define ACPI_THERMAL_NOTIFY_CRITICAL    0xF0
56 #define ACPI_THERMAL_NOTIFY_HOT         0xF1
57 #define ACPI_THERMAL_MODE_ACTIVE        0x00
58
59 #define ACPI_THERMAL_MAX_ACTIVE 10
60 #define ACPI_THERMAL_MAX_LIMIT_STR_LEN 65
61
62 #define _COMPONENT              ACPI_THERMAL_COMPONENT
63 ACPI_MODULE_NAME("thermal");
64
65 MODULE_AUTHOR("Paul Diefenbaugh");
66 MODULE_DESCRIPTION("ACPI Thermal Zone Driver");
67 MODULE_LICENSE("GPL");
68
69 static int act;
70 module_param(act, int, 0644);
71 MODULE_PARM_DESC(act, "Disable or override all lowest active trip points.");
72
73 static int crt;
74 module_param(crt, int, 0644);
75 MODULE_PARM_DESC(crt, "Disable or lower all critical trip points.");
76
77 static int tzp;
78 module_param(tzp, int, 0444);
79 MODULE_PARM_DESC(tzp, "Thermal zone polling frequency, in 1/10 seconds.");
80
81 static int nocrt;
82 module_param(nocrt, int, 0);
83 MODULE_PARM_DESC(nocrt, "Set to take no action upon ACPI thermal zone critical trips points.");
84
85 static int off;
86 module_param(off, int, 0);
87 MODULE_PARM_DESC(off, "Set to disable ACPI thermal support.");
88
89 static int psv;
90 module_param(psv, int, 0644);
91 MODULE_PARM_DESC(psv, "Disable or override all passive trip points.");
92
93 static int acpi_thermal_add(struct acpi_device *device);
94 static int acpi_thermal_remove(struct acpi_device *device);
95 static void acpi_thermal_notify(struct acpi_device *device, u32 event);
96
97 static const struct acpi_device_id  thermal_device_ids[] = {
98         {ACPI_THERMAL_HID, 0},
99         {"", 0},
100 };
101 MODULE_DEVICE_TABLE(acpi, thermal_device_ids);
102
103 #ifdef CONFIG_PM_SLEEP
104 static int acpi_thermal_resume(struct device *dev);
105 #endif
106 static SIMPLE_DEV_PM_OPS(acpi_thermal_pm, NULL, acpi_thermal_resume);
107
108 static struct acpi_driver acpi_thermal_driver = {
109         .name = "thermal",
110         .class = ACPI_THERMAL_CLASS,
111         .ids = thermal_device_ids,
112         .ops = {
113                 .add = acpi_thermal_add,
114                 .remove = acpi_thermal_remove,
115                 .notify = acpi_thermal_notify,
116                 },
117         .drv.pm = &acpi_thermal_pm,
118 };
119
120 struct acpi_thermal_state {
121         u8 critical:1;
122         u8 hot:1;
123         u8 passive:1;
124         u8 active:1;
125         u8 reserved:4;
126         int active_index;
127 };
128
129 struct acpi_thermal_state_flags {
130         u8 valid:1;
131         u8 enabled:1;
132         u8 reserved:6;
133 };
134
135 struct acpi_thermal_critical {
136         struct acpi_thermal_state_flags flags;
137         unsigned long temperature;
138 };
139
140 struct acpi_thermal_hot {
141         struct acpi_thermal_state_flags flags;
142         unsigned long temperature;
143 };
144
145 struct acpi_thermal_passive {
146         struct acpi_thermal_state_flags flags;
147         unsigned long temperature;
148         unsigned long tc1;
149         unsigned long tc2;
150         unsigned long tsp;
151         struct acpi_handle_list devices;
152 };
153
154 struct acpi_thermal_active {
155         struct acpi_thermal_state_flags flags;
156         unsigned long temperature;
157         struct acpi_handle_list devices;
158 };
159
160 struct acpi_thermal_trips {
161         struct acpi_thermal_critical critical;
162         struct acpi_thermal_hot hot;
163         struct acpi_thermal_passive passive;
164         struct acpi_thermal_active active[ACPI_THERMAL_MAX_ACTIVE];
165 };
166
167 struct acpi_thermal_flags {
168         u8 cooling_mode:1;      /* _SCP */
169         u8 devices:1;           /* _TZD */
170         u8 reserved:6;
171 };
172
173 struct acpi_thermal {
174         struct acpi_device * device;
175         acpi_bus_id name;
176         unsigned long temperature;
177         unsigned long last_temperature;
178         unsigned long polling_frequency;
179         volatile u8 zombie;
180         struct acpi_thermal_flags flags;
181         struct acpi_thermal_state state;
182         struct acpi_thermal_trips trips;
183         struct acpi_handle_list devices;
184         struct thermal_zone_device *thermal_zone;
185         int tz_enabled;
186         int kelvin_offset;
187 };
188
189 /* --------------------------------------------------------------------------
190                              Thermal Zone Management
191    -------------------------------------------------------------------------- */
192
193 static int acpi_thermal_get_temperature(struct acpi_thermal *tz)
194 {
195         acpi_status status = AE_OK;
196         unsigned long long tmp;
197
198         if (!tz)
199                 return -EINVAL;
200
201         tz->last_temperature = tz->temperature;
202
203         status = acpi_evaluate_integer(tz->device->handle, "_TMP", NULL, &tmp);
204         if (ACPI_FAILURE(status))
205                 return -ENODEV;
206
207         tz->temperature = tmp;
208         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Temperature is %lu dK\n",
209                           tz->temperature));
210
211         return 0;
212 }
213
214 static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
215 {
216         acpi_status status = AE_OK;
217         unsigned long long tmp;
218
219         if (!tz)
220                 return -EINVAL;
221
222         status = acpi_evaluate_integer(tz->device->handle, "_TZP", NULL, &tmp);
223         if (ACPI_FAILURE(status))
224                 return -ENODEV;
225
226         tz->polling_frequency = tmp;
227         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Polling frequency is %lu dS\n",
228                           tz->polling_frequency));
229
230         return 0;
231 }
232
233 static int acpi_thermal_set_cooling_mode(struct acpi_thermal *tz, int mode)
234 {
235         if (!tz)
236                 return -EINVAL;
237
238         if (!acpi_has_method(tz->device->handle, "_SCP")) {
239                 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "_SCP not present\n"));
240                 return -ENODEV;
241         } else if (ACPI_FAILURE(acpi_execute_simple_method(tz->device->handle,
242                                                            "_SCP", mode))) {
243                 return -ENODEV;
244         }
245
246         return 0;
247 }
248
249 #define ACPI_TRIPS_CRITICAL     0x01
250 #define ACPI_TRIPS_HOT          0x02
251 #define ACPI_TRIPS_PASSIVE      0x04
252 #define ACPI_TRIPS_ACTIVE       0x08
253 #define ACPI_TRIPS_DEVICES      0x10
254
255 #define ACPI_TRIPS_REFRESH_THRESHOLDS   (ACPI_TRIPS_PASSIVE | ACPI_TRIPS_ACTIVE)
256 #define ACPI_TRIPS_REFRESH_DEVICES      ACPI_TRIPS_DEVICES
257
258 #define ACPI_TRIPS_INIT      (ACPI_TRIPS_CRITICAL | ACPI_TRIPS_HOT |    \
259                               ACPI_TRIPS_PASSIVE | ACPI_TRIPS_ACTIVE |  \
260                               ACPI_TRIPS_DEVICES)
261
262 /*
263  * This exception is thrown out in two cases:
264  * 1.An invalid trip point becomes invalid or a valid trip point becomes invalid
265  *   when re-evaluating the AML code.
266  * 2.TODO: Devices listed in _PSL, _ALx, _TZD may change.
267  *   We need to re-bind the cooling devices of a thermal zone when this occurs.
268  */
269 #define ACPI_THERMAL_TRIPS_EXCEPTION(flags, str)        \
270 do {    \
271         if (flags != ACPI_TRIPS_INIT)   \
272                 ACPI_EXCEPTION((AE_INFO, AE_ERROR,      \
273                 "ACPI thermal trip point %s changed\n"  \
274                 "Please send acpidump to linux-acpi@vger.kernel.org", str)); \
275 } while (0)
276
277 static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
278 {
279         acpi_status status = AE_OK;
280         unsigned long long tmp;
281         struct acpi_handle_list devices;
282         int valid = 0;
283         int i;
284
285         /* Critical Shutdown */
286         if (flag & ACPI_TRIPS_CRITICAL) {
287                 status = acpi_evaluate_integer(tz->device->handle,
288                                 "_CRT", NULL, &tmp);
289                 tz->trips.critical.temperature = tmp;
290                 /*
291                  * Treat freezing temperatures as invalid as well; some
292                  * BIOSes return really low values and cause reboots at startup.
293                  * Below zero (Celsius) values clearly aren't right for sure..
294                  * ... so lets discard those as invalid.
295                  */
296                 if (ACPI_FAILURE(status)) {
297                         tz->trips.critical.flags.valid = 0;
298                         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
299                                           "No critical threshold\n"));
300                 } else if (tmp <= 2732) {
301                         pr_warn(FW_BUG "Invalid critical threshold (%llu)\n",
302                                 tmp);
303                         tz->trips.critical.flags.valid = 0;
304                 } else {
305                         tz->trips.critical.flags.valid = 1;
306                         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
307                                           "Found critical threshold [%lu]\n",
308                                           tz->trips.critical.temperature));
309                 }
310                 if (tz->trips.critical.flags.valid == 1) {
311                         if (crt == -1) {
312                                 tz->trips.critical.flags.valid = 0;
313                         } else if (crt > 0) {
314                                 unsigned long crt_k = CELSIUS_TO_KELVIN(crt);
315                                 /*
316                                  * Allow override critical threshold
317                                  */
318                                 if (crt_k > tz->trips.critical.temperature)
319                                         pr_warn(PREFIX "Critical threshold %d C\n",
320                                                 crt);
321                                 tz->trips.critical.temperature = crt_k;
322                         }
323                 }
324         }
325
326         /* Critical Sleep (optional) */
327         if (flag & ACPI_TRIPS_HOT) {
328                 status = acpi_evaluate_integer(tz->device->handle,
329                                 "_HOT", NULL, &tmp);
330                 if (ACPI_FAILURE(status)) {
331                         tz->trips.hot.flags.valid = 0;
332                         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
333                                         "No hot threshold\n"));
334                 } else {
335                         tz->trips.hot.temperature = tmp;
336                         tz->trips.hot.flags.valid = 1;
337                         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
338                                         "Found hot threshold [%lu]\n",
339                                         tz->trips.critical.temperature));
340                 }
341         }
342
343         /* Passive (optional) */
344         if (((flag & ACPI_TRIPS_PASSIVE) && tz->trips.passive.flags.valid) ||
345                 (flag == ACPI_TRIPS_INIT)) {
346                 valid = tz->trips.passive.flags.valid;
347                 if (psv == -1) {
348                         status = AE_SUPPORT;
349                 } else if (psv > 0) {
350                         tmp = CELSIUS_TO_KELVIN(psv);
351                         status = AE_OK;
352                 } else {
353                         status = acpi_evaluate_integer(tz->device->handle,
354                                 "_PSV", NULL, &tmp);
355                 }
356
357                 if (ACPI_FAILURE(status))
358                         tz->trips.passive.flags.valid = 0;
359                 else {
360                         tz->trips.passive.temperature = tmp;
361                         tz->trips.passive.flags.valid = 1;
362                         if (flag == ACPI_TRIPS_INIT) {
363                                 status = acpi_evaluate_integer(
364                                                 tz->device->handle, "_TC1",
365                                                 NULL, &tmp);
366                                 if (ACPI_FAILURE(status))
367                                         tz->trips.passive.flags.valid = 0;
368                                 else
369                                         tz->trips.passive.tc1 = tmp;
370                                 status = acpi_evaluate_integer(
371                                                 tz->device->handle, "_TC2",
372                                                 NULL, &tmp);
373                                 if (ACPI_FAILURE(status))
374                                         tz->trips.passive.flags.valid = 0;
375                                 else
376                                         tz->trips.passive.tc2 = tmp;
377                                 status = acpi_evaluate_integer(
378                                                 tz->device->handle, "_TSP",
379                                                 NULL, &tmp);
380                                 if (ACPI_FAILURE(status))
381                                         tz->trips.passive.flags.valid = 0;
382                                 else
383                                         tz->trips.passive.tsp = tmp;
384                         }
385                 }
386         }
387         if ((flag & ACPI_TRIPS_DEVICES) && tz->trips.passive.flags.valid) {
388                 memset(&devices, 0, sizeof(struct acpi_handle_list));
389                 status = acpi_evaluate_reference(tz->device->handle, "_PSL",
390                                                         NULL, &devices);
391                 if (ACPI_FAILURE(status)) {
392                         pr_warn(PREFIX "Invalid passive threshold\n");
393                         tz->trips.passive.flags.valid = 0;
394                 }
395                 else
396                         tz->trips.passive.flags.valid = 1;
397
398                 if (memcmp(&tz->trips.passive.devices, &devices,
399                                 sizeof(struct acpi_handle_list))) {
400                         memcpy(&tz->trips.passive.devices, &devices,
401                                 sizeof(struct acpi_handle_list));
402                         ACPI_THERMAL_TRIPS_EXCEPTION(flag, "device");
403                 }
404         }
405         if ((flag & ACPI_TRIPS_PASSIVE) || (flag & ACPI_TRIPS_DEVICES)) {
406                 if (valid != tz->trips.passive.flags.valid)
407                                 ACPI_THERMAL_TRIPS_EXCEPTION(flag, "state");
408         }
409
410         /* Active (optional) */
411         for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
412                 char name[5] = { '_', 'A', 'C', ('0' + i), '\0' };
413                 valid = tz->trips.active[i].flags.valid;
414
415                 if (act == -1)
416                         break; /* disable all active trip points */
417
418                 if ((flag == ACPI_TRIPS_INIT) || ((flag & ACPI_TRIPS_ACTIVE) &&
419                         tz->trips.active[i].flags.valid)) {
420                         status = acpi_evaluate_integer(tz->device->handle,
421                                                         name, NULL, &tmp);
422                         if (ACPI_FAILURE(status)) {
423                                 tz->trips.active[i].flags.valid = 0;
424                                 if (i == 0)
425                                         break;
426                                 if (act <= 0)
427                                         break;
428                                 if (i == 1)
429                                         tz->trips.active[0].temperature =
430                                                 CELSIUS_TO_KELVIN(act);
431                                 else
432                                         /*
433                                          * Don't allow override higher than
434                                          * the next higher trip point
435                                          */
436                                         tz->trips.active[i - 1].temperature =
437                                                 (tz->trips.active[i - 2].temperature <
438                                                 CELSIUS_TO_KELVIN(act) ?
439                                                 tz->trips.active[i - 2].temperature :
440                                                 CELSIUS_TO_KELVIN(act));
441                                 break;
442                         } else {
443                                 tz->trips.active[i].temperature = tmp;
444                                 tz->trips.active[i].flags.valid = 1;
445                         }
446                 }
447
448                 name[2] = 'L';
449                 if ((flag & ACPI_TRIPS_DEVICES) && tz->trips.active[i].flags.valid ) {
450                         memset(&devices, 0, sizeof(struct acpi_handle_list));
451                         status = acpi_evaluate_reference(tz->device->handle,
452                                                 name, NULL, &devices);
453                         if (ACPI_FAILURE(status)) {
454                                 pr_warn(PREFIX "Invalid active%d threshold\n",
455                                         i);
456                                 tz->trips.active[i].flags.valid = 0;
457                         }
458                         else
459                                 tz->trips.active[i].flags.valid = 1;
460
461                         if (memcmp(&tz->trips.active[i].devices, &devices,
462                                         sizeof(struct acpi_handle_list))) {
463                                 memcpy(&tz->trips.active[i].devices, &devices,
464                                         sizeof(struct acpi_handle_list));
465                                 ACPI_THERMAL_TRIPS_EXCEPTION(flag, "device");
466                         }
467                 }
468                 if ((flag & ACPI_TRIPS_ACTIVE) || (flag & ACPI_TRIPS_DEVICES))
469                         if (valid != tz->trips.active[i].flags.valid)
470                                 ACPI_THERMAL_TRIPS_EXCEPTION(flag, "state");
471
472                 if (!tz->trips.active[i].flags.valid)
473                         break;
474         }
475
476         if ((flag & ACPI_TRIPS_DEVICES)
477             && acpi_has_method(tz->device->handle, "_TZD")) {
478                 memset(&devices, 0, sizeof(devices));
479                 status = acpi_evaluate_reference(tz->device->handle, "_TZD",
480                                                 NULL, &devices);
481                 if (ACPI_SUCCESS(status)
482                     && memcmp(&tz->devices, &devices, sizeof(devices))) {
483                         tz->devices = devices;
484                         ACPI_THERMAL_TRIPS_EXCEPTION(flag, "device");
485                 }
486         }
487
488         return 0;
489 }
490
491 static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)
492 {
493         int i, valid, ret = acpi_thermal_trips_update(tz, ACPI_TRIPS_INIT);
494
495         if (ret)
496                 return ret;
497
498         valid = tz->trips.critical.flags.valid |
499                 tz->trips.hot.flags.valid |
500                 tz->trips.passive.flags.valid;
501
502         for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++)
503                 valid |= tz->trips.active[i].flags.valid;
504
505         if (!valid) {
506                 pr_warn(FW_BUG "No valid trip found\n");
507                 return -ENODEV;
508         }
509         return 0;
510 }
511
512 static void acpi_thermal_check(void *data)
513 {
514         struct acpi_thermal *tz = data;
515
516         if (!tz->tz_enabled)
517                 return;
518
519         thermal_zone_device_update(tz->thermal_zone);
520 }
521
522 /* sys I/F for generic thermal sysfs support */
523 #define KELVIN_TO_MILLICELSIUS(t, off) (((t) - (off)) * 100)
524
525 static int thermal_get_temp(struct thermal_zone_device *thermal,
526                             unsigned long *temp)
527 {
528         struct acpi_thermal *tz = thermal->devdata;
529         int result;
530
531         if (!tz)
532                 return -EINVAL;
533
534         result = acpi_thermal_get_temperature(tz);
535         if (result)
536                 return result;
537
538         *temp = KELVIN_TO_MILLICELSIUS(tz->temperature, tz->kelvin_offset);
539         return 0;
540 }
541
542 static int thermal_get_mode(struct thermal_zone_device *thermal,
543                                 enum thermal_device_mode *mode)
544 {
545         struct acpi_thermal *tz = thermal->devdata;
546
547         if (!tz)
548                 return -EINVAL;
549
550         *mode = tz->tz_enabled ? THERMAL_DEVICE_ENABLED :
551                 THERMAL_DEVICE_DISABLED;
552
553         return 0;
554 }
555
556 static int thermal_set_mode(struct thermal_zone_device *thermal,
557                                 enum thermal_device_mode mode)
558 {
559         struct acpi_thermal *tz = thermal->devdata;
560         int enable;
561
562         if (!tz)
563                 return -EINVAL;
564
565         /*
566          * enable/disable thermal management from ACPI thermal driver
567          */
568         if (mode == THERMAL_DEVICE_ENABLED)
569                 enable = 1;
570         else if (mode == THERMAL_DEVICE_DISABLED) {
571                 enable = 0;
572                 pr_warn("thermal zone will be disabled\n");
573         } else
574                 return -EINVAL;
575
576         if (enable != tz->tz_enabled) {
577                 tz->tz_enabled = enable;
578                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
579                         "%s kernel ACPI thermal control\n",
580                         tz->tz_enabled ? "Enable" : "Disable"));
581                 acpi_thermal_check(tz);
582         }
583         return 0;
584 }
585
586 static int thermal_get_trip_type(struct thermal_zone_device *thermal,
587                                  int trip, enum thermal_trip_type *type)
588 {
589         struct acpi_thermal *tz = thermal->devdata;
590         int i;
591
592         if (!tz || trip < 0)
593                 return -EINVAL;
594
595         if (tz->trips.critical.flags.valid) {
596                 if (!trip) {
597                         *type = THERMAL_TRIP_CRITICAL;
598                         return 0;
599                 }
600                 trip--;
601         }
602
603         if (tz->trips.hot.flags.valid) {
604                 if (!trip) {
605                         *type = THERMAL_TRIP_HOT;
606                         return 0;
607                 }
608                 trip--;
609         }
610
611         if (tz->trips.passive.flags.valid) {
612                 if (!trip) {
613                         *type = THERMAL_TRIP_PASSIVE;
614                         return 0;
615                 }
616                 trip--;
617         }
618
619         for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE &&
620                 tz->trips.active[i].flags.valid; i++) {
621                 if (!trip) {
622                         *type = THERMAL_TRIP_ACTIVE;
623                         return 0;
624                 }
625                 trip--;
626         }
627
628         return -EINVAL;
629 }
630
631 static int thermal_get_trip_temp(struct thermal_zone_device *thermal,
632                                  int trip, unsigned long *temp)
633 {
634         struct acpi_thermal *tz = thermal->devdata;
635         int i;
636
637         if (!tz || trip < 0)
638                 return -EINVAL;
639
640         if (tz->trips.critical.flags.valid) {
641                 if (!trip) {
642                         *temp = KELVIN_TO_MILLICELSIUS(
643                                 tz->trips.critical.temperature,
644                                 tz->kelvin_offset);
645                         return 0;
646                 }
647                 trip--;
648         }
649
650         if (tz->trips.hot.flags.valid) {
651                 if (!trip) {
652                         *temp = KELVIN_TO_MILLICELSIUS(
653                                 tz->trips.hot.temperature,
654                                 tz->kelvin_offset);
655                         return 0;
656                 }
657                 trip--;
658         }
659
660         if (tz->trips.passive.flags.valid) {
661                 if (!trip) {
662                         *temp = KELVIN_TO_MILLICELSIUS(
663                                 tz->trips.passive.temperature,
664                                 tz->kelvin_offset);
665                         return 0;
666                 }
667                 trip--;
668         }
669
670         for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE &&
671                 tz->trips.active[i].flags.valid; i++) {
672                 if (!trip) {
673                         *temp = KELVIN_TO_MILLICELSIUS(
674                                 tz->trips.active[i].temperature,
675                                 tz->kelvin_offset);
676                         return 0;
677                 }
678                 trip--;
679         }
680
681         return -EINVAL;
682 }
683
684 static int thermal_get_crit_temp(struct thermal_zone_device *thermal,
685                                 unsigned long *temperature) {
686         struct acpi_thermal *tz = thermal->devdata;
687
688         if (tz->trips.critical.flags.valid) {
689                 *temperature = KELVIN_TO_MILLICELSIUS(
690                                 tz->trips.critical.temperature,
691                                 tz->kelvin_offset);
692                 return 0;
693         } else
694                 return -EINVAL;
695 }
696
697 static int thermal_get_trend(struct thermal_zone_device *thermal,
698                                 int trip, enum thermal_trend *trend)
699 {
700         struct acpi_thermal *tz = thermal->devdata;
701         enum thermal_trip_type type;
702         int i;
703
704         if (thermal_get_trip_type(thermal, trip, &type))
705                 return -EINVAL;
706
707         if (type == THERMAL_TRIP_ACTIVE) {
708                 unsigned long trip_temp;
709                 unsigned long temp = KELVIN_TO_MILLICELSIUS(tz->temperature,
710                                                         tz->kelvin_offset);
711                 if (thermal_get_trip_temp(thermal, trip, &trip_temp))
712                         return -EINVAL;
713
714                 if (temp > trip_temp) {
715                         *trend = THERMAL_TREND_RAISING;
716                         return 0;
717                 } else {
718                         /* Fall back on default trend */
719                         return -EINVAL;
720                 }
721         }
722
723         /*
724          * tz->temperature has already been updated by generic thermal layer,
725          * before this callback being invoked
726          */
727         i = (tz->trips.passive.tc1 * (tz->temperature - tz->last_temperature))
728                 + (tz->trips.passive.tc2
729                 * (tz->temperature - tz->trips.passive.temperature));
730
731         if (i > 0)
732                 *trend = THERMAL_TREND_RAISING;
733         else if (i < 0)
734                 *trend = THERMAL_TREND_DROPPING;
735         else
736                 *trend = THERMAL_TREND_STABLE;
737         return 0;
738 }
739
740
741 static int thermal_notify(struct thermal_zone_device *thermal, int trip,
742                            enum thermal_trip_type trip_type)
743 {
744         u8 type = 0;
745         struct acpi_thermal *tz = thermal->devdata;
746
747         if (trip_type == THERMAL_TRIP_CRITICAL)
748                 type = ACPI_THERMAL_NOTIFY_CRITICAL;
749         else if (trip_type == THERMAL_TRIP_HOT)
750                 type = ACPI_THERMAL_NOTIFY_HOT;
751         else
752                 return 0;
753
754         acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
755                                         dev_name(&tz->device->dev), type, 1);
756
757         if (trip_type == THERMAL_TRIP_CRITICAL && nocrt)
758                 return 1;
759
760         return 0;
761 }
762
763 static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,
764                                         struct thermal_cooling_device *cdev,
765                                         bool bind)
766 {
767         struct acpi_device *device = cdev->devdata;
768         struct acpi_thermal *tz = thermal->devdata;
769         struct acpi_device *dev;
770         acpi_status status;
771         acpi_handle handle;
772         int i;
773         int j;
774         int trip = -1;
775         int result = 0;
776
777         if (tz->trips.critical.flags.valid)
778                 trip++;
779
780         if (tz->trips.hot.flags.valid)
781                 trip++;
782
783         if (tz->trips.passive.flags.valid) {
784                 trip++;
785                 for (i = 0; i < tz->trips.passive.devices.count;
786                     i++) {
787                         handle = tz->trips.passive.devices.handles[i];
788                         status = acpi_bus_get_device(handle, &dev);
789                         if (ACPI_FAILURE(status) || dev != device)
790                                 continue;
791                         if (bind)
792                                 result =
793                                         thermal_zone_bind_cooling_device
794                                         (thermal, trip, cdev,
795                                          THERMAL_NO_LIMIT, THERMAL_NO_LIMIT);
796                         else
797                                 result =
798                                         thermal_zone_unbind_cooling_device
799                                         (thermal, trip, cdev);
800                         if (result)
801                                 goto failed;
802                 }
803         }
804
805         for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
806                 if (!tz->trips.active[i].flags.valid)
807                         break;
808                 trip++;
809                 for (j = 0;
810                     j < tz->trips.active[i].devices.count;
811                     j++) {
812                         handle = tz->trips.active[i].devices.handles[j];
813                         status = acpi_bus_get_device(handle, &dev);
814                         if (ACPI_FAILURE(status) || dev != device)
815                                 continue;
816                         if (bind)
817                                 result = thermal_zone_bind_cooling_device
818                                         (thermal, trip, cdev,
819                                          THERMAL_NO_LIMIT, THERMAL_NO_LIMIT);
820                         else
821                                 result = thermal_zone_unbind_cooling_device
822                                         (thermal, trip, cdev);
823                         if (result)
824                                 goto failed;
825                 }
826         }
827
828         for (i = 0; i < tz->devices.count; i++) {
829                 handle = tz->devices.handles[i];
830                 status = acpi_bus_get_device(handle, &dev);
831                 if (ACPI_SUCCESS(status) && (dev == device)) {
832                         if (bind)
833                                 result = thermal_zone_bind_cooling_device
834                                                 (thermal, THERMAL_TRIPS_NONE,
835                                                  cdev, THERMAL_NO_LIMIT,
836                                                  THERMAL_NO_LIMIT);
837                         else
838                                 result = thermal_zone_unbind_cooling_device
839                                                 (thermal, THERMAL_TRIPS_NONE,
840                                                  cdev);
841                         if (result)
842                                 goto failed;
843                 }
844         }
845
846 failed:
847         return result;
848 }
849
850 static int
851 acpi_thermal_bind_cooling_device(struct thermal_zone_device *thermal,
852                                         struct thermal_cooling_device *cdev)
853 {
854         return acpi_thermal_cooling_device_cb(thermal, cdev, true);
855 }
856
857 static int
858 acpi_thermal_unbind_cooling_device(struct thermal_zone_device *thermal,
859                                         struct thermal_cooling_device *cdev)
860 {
861         return acpi_thermal_cooling_device_cb(thermal, cdev, false);
862 }
863
864 static struct thermal_zone_device_ops acpi_thermal_zone_ops = {
865         .bind = acpi_thermal_bind_cooling_device,
866         .unbind = acpi_thermal_unbind_cooling_device,
867         .get_temp = thermal_get_temp,
868         .get_mode = thermal_get_mode,
869         .set_mode = thermal_set_mode,
870         .get_trip_type = thermal_get_trip_type,
871         .get_trip_temp = thermal_get_trip_temp,
872         .get_crit_temp = thermal_get_crit_temp,
873         .get_trend = thermal_get_trend,
874         .notify = thermal_notify,
875 };
876
877 static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
878 {
879         int trips = 0;
880         int result;
881         acpi_status status;
882         int i;
883
884         if (tz->trips.critical.flags.valid)
885                 trips++;
886
887         if (tz->trips.hot.flags.valid)
888                 trips++;
889
890         if (tz->trips.passive.flags.valid)
891                 trips++;
892
893         for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE &&
894                         tz->trips.active[i].flags.valid; i++, trips++);
895
896         if (tz->trips.passive.flags.valid)
897                 tz->thermal_zone =
898                         thermal_zone_device_register("acpitz", trips, 0, tz,
899                                                 &acpi_thermal_zone_ops, NULL,
900                                                      tz->trips.passive.tsp*100,
901                                                      tz->polling_frequency*100);
902         else
903                 tz->thermal_zone =
904                         thermal_zone_device_register("acpitz", trips, 0, tz,
905                                                 &acpi_thermal_zone_ops, NULL,
906                                                 0, tz->polling_frequency*100);
907         if (IS_ERR(tz->thermal_zone))
908                 return -ENODEV;
909
910         result = sysfs_create_link(&tz->device->dev.kobj,
911                                    &tz->thermal_zone->device.kobj, "thermal_zone");
912         if (result)
913                 return result;
914
915         result = sysfs_create_link(&tz->thermal_zone->device.kobj,
916                                    &tz->device->dev.kobj, "device");
917         if (result)
918                 return result;
919
920         status = acpi_attach_data(tz->device->handle,
921                                   acpi_bus_private_data_handler,
922                                   tz->thermal_zone);
923         if (ACPI_FAILURE(status)) {
924                 pr_err(PREFIX "Error attaching device data\n");
925                 return -ENODEV;
926         }
927
928         tz->tz_enabled = 1;
929
930         dev_info(&tz->device->dev, "registered as thermal_zone%d\n",
931                  tz->thermal_zone->id);
932         return 0;
933 }
934
935 static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
936 {
937         sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
938         sysfs_remove_link(&tz->thermal_zone->device.kobj, "device");
939         thermal_zone_device_unregister(tz->thermal_zone);
940         tz->thermal_zone = NULL;
941         acpi_detach_data(tz->device->handle, acpi_bus_private_data_handler);
942 }
943
944
945 /* --------------------------------------------------------------------------
946                                  Driver Interface
947    -------------------------------------------------------------------------- */
948
949 static void acpi_thermal_notify(struct acpi_device *device, u32 event)
950 {
951         struct acpi_thermal *tz = acpi_driver_data(device);
952
953
954         if (!tz)
955                 return;
956
957         switch (event) {
958         case ACPI_THERMAL_NOTIFY_TEMPERATURE:
959                 acpi_thermal_check(tz);
960                 break;
961         case ACPI_THERMAL_NOTIFY_THRESHOLDS:
962                 acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_THRESHOLDS);
963                 acpi_thermal_check(tz);
964                 acpi_bus_generate_netlink_event(device->pnp.device_class,
965                                                   dev_name(&device->dev), event, 0);
966                 break;
967         case ACPI_THERMAL_NOTIFY_DEVICES:
968                 acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_DEVICES);
969                 acpi_thermal_check(tz);
970                 acpi_bus_generate_netlink_event(device->pnp.device_class,
971                                                   dev_name(&device->dev), event, 0);
972                 break;
973         default:
974                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
975                                   "Unsupported event [0x%x]\n", event));
976                 break;
977         }
978 }
979
980 /*
981  * On some platforms, the AML code has dependency about
982  * the evaluating order of _TMP and _CRT/_HOT/_PSV/_ACx.
983  * 1. On HP Pavilion G4-1016tx, _TMP must be invoked after
984  *    /_CRT/_HOT/_PSV/_ACx, or else system will be power off.
985  * 2. On HP Compaq 6715b/6715s, the return value of _PSV is 0
986  *    if _TMP has never been evaluated.
987  *
988  * As this dependency is totally transparent to OS, evaluate
989  * all of them once, in the order of _CRT/_HOT/_PSV/_ACx,
990  * _TMP, before they are actually used.
991  */
992 static void acpi_thermal_aml_dependency_fix(struct acpi_thermal *tz)
993 {
994         acpi_handle handle = tz->device->handle;
995         unsigned long long value;
996         int i;
997
998         acpi_evaluate_integer(handle, "_CRT", NULL, &value);
999         acpi_evaluate_integer(handle, "_HOT", NULL, &value);
1000         acpi_evaluate_integer(handle, "_PSV", NULL, &value);
1001         for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
1002                 char name[5] = { '_', 'A', 'C', ('0' + i), '\0' };
1003                 acpi_status status;
1004
1005                 status = acpi_evaluate_integer(handle, name, NULL, &value);
1006                 if (status == AE_NOT_FOUND)
1007                         break;
1008         }
1009         acpi_evaluate_integer(handle, "_TMP", NULL, &value);
1010 }
1011
1012 static int acpi_thermal_get_info(struct acpi_thermal *tz)
1013 {
1014         int result = 0;
1015
1016
1017         if (!tz)
1018                 return -EINVAL;
1019
1020         acpi_thermal_aml_dependency_fix(tz);
1021
1022         /* Get trip points [_CRT, _PSV, etc.] (required) */
1023         result = acpi_thermal_get_trip_points(tz);
1024         if (result)
1025                 return result;
1026
1027         /* Get temperature [_TMP] (required) */
1028         result = acpi_thermal_get_temperature(tz);
1029         if (result)
1030                 return result;
1031
1032         /* Set the cooling mode [_SCP] to active cooling (default) */
1033         result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE);
1034         if (!result)
1035                 tz->flags.cooling_mode = 1;
1036
1037         /* Get default polling frequency [_TZP] (optional) */
1038         if (tzp)
1039                 tz->polling_frequency = tzp;
1040         else
1041                 acpi_thermal_get_polling_frequency(tz);
1042
1043         return 0;
1044 }
1045
1046 /*
1047  * The exact offset between Kelvin and degree Celsius is 273.15. However ACPI
1048  * handles temperature values with a single decimal place. As a consequence,
1049  * some implementations use an offset of 273.1 and others use an offset of
1050  * 273.2. Try to find out which one is being used, to present the most
1051  * accurate and visually appealing number.
1052  *
1053  * The heuristic below should work for all ACPI thermal zones which have a
1054  * critical trip point with a value being a multiple of 0.5 degree Celsius.
1055  */
1056 static void acpi_thermal_guess_offset(struct acpi_thermal *tz)
1057 {
1058         if (tz->trips.critical.flags.valid &&
1059             (tz->trips.critical.temperature % 5) == 1)
1060                 tz->kelvin_offset = 2731;
1061         else
1062                 tz->kelvin_offset = 2732;
1063 }
1064
1065 static int acpi_thermal_add(struct acpi_device *device)
1066 {
1067         int result = 0;
1068         struct acpi_thermal *tz = NULL;
1069
1070
1071         if (!device)
1072                 return -EINVAL;
1073
1074         tz = kzalloc(sizeof(struct acpi_thermal), GFP_KERNEL);
1075         if (!tz)
1076                 return -ENOMEM;
1077
1078         tz->device = device;
1079         strcpy(tz->name, device->pnp.bus_id);
1080         strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME);
1081         strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
1082         device->driver_data = tz;
1083
1084         result = acpi_thermal_get_info(tz);
1085         if (result)
1086                 goto free_memory;
1087
1088         acpi_thermal_guess_offset(tz);
1089
1090         result = acpi_thermal_register_thermal_zone(tz);
1091         if (result)
1092                 goto free_memory;
1093
1094         pr_info(PREFIX "%s [%s] (%ld C)\n", acpi_device_name(device),
1095                 acpi_device_bid(device), KELVIN_TO_CELSIUS(tz->temperature));
1096         goto end;
1097
1098 free_memory:
1099         kfree(tz);
1100 end:
1101         return result;
1102 }
1103
1104 static int acpi_thermal_remove(struct acpi_device *device)
1105 {
1106         struct acpi_thermal *tz = NULL;
1107
1108         if (!device || !acpi_driver_data(device))
1109                 return -EINVAL;
1110
1111         tz = acpi_driver_data(device);
1112
1113         acpi_thermal_unregister_thermal_zone(tz);
1114         kfree(tz);
1115         return 0;
1116 }
1117
1118 #ifdef CONFIG_PM_SLEEP
1119 static int acpi_thermal_resume(struct device *dev)
1120 {
1121         struct acpi_thermal *tz;
1122         int i, j, power_state, result;
1123
1124         if (!dev)
1125                 return -EINVAL;
1126
1127         tz = acpi_driver_data(to_acpi_device(dev));
1128         if (!tz)
1129                 return -EINVAL;
1130
1131         for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
1132                 if (!(&tz->trips.active[i]))
1133                         break;
1134                 if (!tz->trips.active[i].flags.valid)
1135                         break;
1136                 tz->trips.active[i].flags.enabled = 1;
1137                 for (j = 0; j < tz->trips.active[i].devices.count; j++) {
1138                         result = acpi_bus_update_power(
1139                                         tz->trips.active[i].devices.handles[j],
1140                                         &power_state);
1141                         if (result || (power_state != ACPI_STATE_D0)) {
1142                                 tz->trips.active[i].flags.enabled = 0;
1143                                 break;
1144                         }
1145                 }
1146                 tz->state.active |= tz->trips.active[i].flags.enabled;
1147         }
1148
1149         acpi_thermal_check(tz);
1150
1151         return AE_OK;
1152 }
1153 #endif
1154
1155 static int thermal_act(const struct dmi_system_id *d) {
1156
1157         if (act == 0) {
1158                 pr_notice(PREFIX "%s detected: "
1159                           "disabling all active thermal trip points\n", d->ident);
1160                 act = -1;
1161         }
1162         return 0;
1163 }
1164 static int thermal_nocrt(const struct dmi_system_id *d) {
1165
1166         pr_notice(PREFIX "%s detected: "
1167                   "disabling all critical thermal trip point actions.\n", d->ident);
1168         nocrt = 1;
1169         return 0;
1170 }
1171 static int thermal_tzp(const struct dmi_system_id *d) {
1172
1173         if (tzp == 0) {
1174                 pr_notice(PREFIX "%s detected: "
1175                           "enabling thermal zone polling\n", d->ident);
1176                 tzp = 300;      /* 300 dS = 30 Seconds */
1177         }
1178         return 0;
1179 }
1180 static int thermal_psv(const struct dmi_system_id *d) {
1181
1182         if (psv == 0) {
1183                 pr_notice(PREFIX "%s detected: "
1184                           "disabling all passive thermal trip points\n", d->ident);
1185                 psv = -1;
1186         }
1187         return 0;
1188 }
1189
1190 static struct dmi_system_id thermal_dmi_table[] __initdata = {
1191         /*
1192          * Award BIOS on this AOpen makes thermal control almost worthless.
1193          * http://bugzilla.kernel.org/show_bug.cgi?id=8842
1194          */
1195         {
1196          .callback = thermal_act,
1197          .ident = "AOpen i915GMm-HFS",
1198          .matches = {
1199                 DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
1200                 DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
1201                 },
1202         },
1203         {
1204          .callback = thermal_psv,
1205          .ident = "AOpen i915GMm-HFS",
1206          .matches = {
1207                 DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
1208                 DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
1209                 },
1210         },
1211         {
1212          .callback = thermal_tzp,
1213          .ident = "AOpen i915GMm-HFS",
1214          .matches = {
1215                 DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
1216                 DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
1217                 },
1218         },
1219         {
1220          .callback = thermal_nocrt,
1221          .ident = "Gigabyte GA-7ZX",
1222          .matches = {
1223                 DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
1224                 DMI_MATCH(DMI_BOARD_NAME, "7ZX"),
1225                 },
1226         },
1227         {}
1228 };
1229
1230 static int __init acpi_thermal_init(void)
1231 {
1232         int result = 0;
1233
1234         dmi_check_system(thermal_dmi_table);
1235
1236         if (off) {
1237                 pr_notice(PREFIX "thermal control disabled\n");
1238                 return -ENODEV;
1239         }
1240
1241         result = acpi_bus_register_driver(&acpi_thermal_driver);
1242         if (result < 0)
1243                 return -ENODEV;
1244
1245         return 0;
1246 }
1247
1248 static void __exit acpi_thermal_exit(void)
1249 {
1250
1251         acpi_bus_unregister_driver(&acpi_thermal_driver);
1252
1253         return;
1254 }
1255
1256 module_init(acpi_thermal_init);
1257 module_exit(acpi_thermal_exit);