Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[linux-2.6-block.git] / drivers / hwmon / acpi_power_meter.c
1 /*
2  * A hwmon driver for ACPI 4.0 power meters
3  * Copyright (C) 2009 IBM
4  *
5  * Author: Darrick J. Wong <djwong@us.ibm.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #include <linux/module.h>
23 #include <linux/hwmon.h>
24 #include <linux/hwmon-sysfs.h>
25 #include <linux/jiffies.h>
26 #include <linux/mutex.h>
27 #include <linux/dmi.h>
28 #include <linux/slab.h>
29 #include <linux/kdev_t.h>
30 #include <linux/sched.h>
31 #include <linux/time.h>
32 #include <acpi/acpi_drivers.h>
33 #include <acpi/acpi_bus.h>
34
35 #define ACPI_POWER_METER_NAME           "power_meter"
36 ACPI_MODULE_NAME(ACPI_POWER_METER_NAME);
37 #define ACPI_POWER_METER_DEVICE_NAME    "Power Meter"
38 #define ACPI_POWER_METER_CLASS          "pwr_meter_resource"
39
40 #define NUM_SENSORS                     17
41
42 #define POWER_METER_CAN_MEASURE (1 << 0)
43 #define POWER_METER_CAN_TRIP    (1 << 1)
44 #define POWER_METER_CAN_CAP     (1 << 2)
45 #define POWER_METER_CAN_NOTIFY  (1 << 3)
46 #define POWER_METER_IS_BATTERY  (1 << 8)
47 #define UNKNOWN_HYSTERESIS      0xFFFFFFFF
48
49 #define METER_NOTIFY_CONFIG     0x80
50 #define METER_NOTIFY_TRIP       0x81
51 #define METER_NOTIFY_CAP        0x82
52 #define METER_NOTIFY_CAPPING    0x83
53 #define METER_NOTIFY_INTERVAL   0x84
54
55 #define POWER_AVERAGE_NAME      "power1_average"
56 #define POWER_CAP_NAME          "power1_cap"
57 #define POWER_AVG_INTERVAL_NAME "power1_average_interval"
58 #define POWER_ALARM_NAME        "power1_alarm"
59
60 static int cap_in_hardware;
61 static bool force_cap_on;
62
63 static int can_cap_in_hardware(void)
64 {
65         return force_cap_on || cap_in_hardware;
66 }
67
68 static const struct acpi_device_id power_meter_ids[] = {
69         {"ACPI000D", 0},
70         {"", 0},
71 };
72 MODULE_DEVICE_TABLE(acpi, power_meter_ids);
73
74 struct acpi_power_meter_capabilities {
75         u64             flags;
76         u64             units;
77         u64             type;
78         u64             accuracy;
79         u64             sampling_time;
80         u64             min_avg_interval;
81         u64             max_avg_interval;
82         u64             hysteresis;
83         u64             configurable_cap;
84         u64             min_cap;
85         u64             max_cap;
86 };
87
88 struct acpi_power_meter_resource {
89         struct acpi_device      *acpi_dev;
90         acpi_bus_id             name;
91         struct mutex            lock;
92         struct device           *hwmon_dev;
93         struct acpi_power_meter_capabilities    caps;
94         acpi_string             model_number;
95         acpi_string             serial_number;
96         acpi_string             oem_info;
97         u64             power;
98         u64             cap;
99         u64             avg_interval;
100         int                     sensors_valid;
101         unsigned long           sensors_last_updated;
102         struct sensor_device_attribute  sensors[NUM_SENSORS];
103         int                     num_sensors;
104         int                     trip[2];
105         int                     num_domain_devices;
106         struct acpi_device      **domain_devices;
107         struct kobject          *holders_dir;
108 };
109
110 struct sensor_template {
111         char *label;
112         ssize_t (*show)(struct device *dev,
113                         struct device_attribute *devattr,
114                         char *buf);
115         ssize_t (*set)(struct device *dev,
116                        struct device_attribute *devattr,
117                        const char *buf, size_t count);
118         int index;
119 };
120
121 /* Averaging interval */
122 static int update_avg_interval(struct acpi_power_meter_resource *resource)
123 {
124         unsigned long long data;
125         acpi_status status;
126
127         status = acpi_evaluate_integer(resource->acpi_dev->handle, "_GAI",
128                                        NULL, &data);
129         if (ACPI_FAILURE(status)) {
130                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _GAI"));
131                 return -ENODEV;
132         }
133
134         resource->avg_interval = data;
135         return 0;
136 }
137
138 static ssize_t show_avg_interval(struct device *dev,
139                                  struct device_attribute *devattr,
140                                  char *buf)
141 {
142         struct acpi_device *acpi_dev = to_acpi_device(dev);
143         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
144
145         mutex_lock(&resource->lock);
146         update_avg_interval(resource);
147         mutex_unlock(&resource->lock);
148
149         return sprintf(buf, "%llu\n", resource->avg_interval);
150 }
151
152 static ssize_t set_avg_interval(struct device *dev,
153                                 struct device_attribute *devattr,
154                                 const char *buf, size_t count)
155 {
156         struct acpi_device *acpi_dev = to_acpi_device(dev);
157         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
158         union acpi_object arg0 = { ACPI_TYPE_INTEGER };
159         struct acpi_object_list args = { 1, &arg0 };
160         int res;
161         unsigned long temp;
162         unsigned long long data;
163         acpi_status status;
164
165         res = kstrtoul(buf, 10, &temp);
166         if (res)
167                 return res;
168
169         if (temp > resource->caps.max_avg_interval ||
170             temp < resource->caps.min_avg_interval)
171                 return -EINVAL;
172         arg0.integer.value = temp;
173
174         mutex_lock(&resource->lock);
175         status = acpi_evaluate_integer(resource->acpi_dev->handle, "_PAI",
176                                        &args, &data);
177         if (!ACPI_FAILURE(status))
178                 resource->avg_interval = temp;
179         mutex_unlock(&resource->lock);
180
181         if (ACPI_FAILURE(status)) {
182                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PAI"));
183                 return -EINVAL;
184         }
185
186         /* _PAI returns 0 on success, nonzero otherwise */
187         if (data)
188                 return -EINVAL;
189
190         return count;
191 }
192
193 /* Cap functions */
194 static int update_cap(struct acpi_power_meter_resource *resource)
195 {
196         unsigned long long data;
197         acpi_status status;
198
199         status = acpi_evaluate_integer(resource->acpi_dev->handle, "_GHL",
200                                        NULL, &data);
201         if (ACPI_FAILURE(status)) {
202                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _GHL"));
203                 return -ENODEV;
204         }
205
206         resource->cap = data;
207         return 0;
208 }
209
210 static ssize_t show_cap(struct device *dev,
211                         struct device_attribute *devattr,
212                         char *buf)
213 {
214         struct acpi_device *acpi_dev = to_acpi_device(dev);
215         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
216
217         mutex_lock(&resource->lock);
218         update_cap(resource);
219         mutex_unlock(&resource->lock);
220
221         return sprintf(buf, "%llu\n", resource->cap * 1000);
222 }
223
224 static ssize_t set_cap(struct device *dev, struct device_attribute *devattr,
225                        const char *buf, size_t count)
226 {
227         struct acpi_device *acpi_dev = to_acpi_device(dev);
228         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
229         union acpi_object arg0 = { ACPI_TYPE_INTEGER };
230         struct acpi_object_list args = { 1, &arg0 };
231         int res;
232         unsigned long temp;
233         unsigned long long data;
234         acpi_status status;
235
236         res = kstrtoul(buf, 10, &temp);
237         if (res)
238                 return res;
239
240         temp /= 1000;
241         if (temp > resource->caps.max_cap || temp < resource->caps.min_cap)
242                 return -EINVAL;
243         arg0.integer.value = temp;
244
245         mutex_lock(&resource->lock);
246         status = acpi_evaluate_integer(resource->acpi_dev->handle, "_SHL",
247                                        &args, &data);
248         if (!ACPI_FAILURE(status))
249                 resource->cap = temp;
250         mutex_unlock(&resource->lock);
251
252         if (ACPI_FAILURE(status)) {
253                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _SHL"));
254                 return -EINVAL;
255         }
256
257         /* _SHL returns 0 on success, nonzero otherwise */
258         if (data)
259                 return -EINVAL;
260
261         return count;
262 }
263
264 /* Power meter trip points */
265 static int set_acpi_trip(struct acpi_power_meter_resource *resource)
266 {
267         union acpi_object arg_objs[] = {
268                 {ACPI_TYPE_INTEGER},
269                 {ACPI_TYPE_INTEGER}
270         };
271         struct acpi_object_list args = { 2, arg_objs };
272         unsigned long long data;
273         acpi_status status;
274
275         /* Both trip levels must be set */
276         if (resource->trip[0] < 0 || resource->trip[1] < 0)
277                 return 0;
278
279         /* This driver stores min, max; ACPI wants max, min. */
280         arg_objs[0].integer.value = resource->trip[1];
281         arg_objs[1].integer.value = resource->trip[0];
282
283         status = acpi_evaluate_integer(resource->acpi_dev->handle, "_PTP",
284                                        &args, &data);
285         if (ACPI_FAILURE(status)) {
286                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PTP"));
287                 return -EINVAL;
288         }
289
290         /* _PTP returns 0 on success, nonzero otherwise */
291         if (data)
292                 return -EINVAL;
293
294         return 0;
295 }
296
297 static ssize_t set_trip(struct device *dev, struct device_attribute *devattr,
298                         const char *buf, size_t count)
299 {
300         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
301         struct acpi_device *acpi_dev = to_acpi_device(dev);
302         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
303         int res;
304         unsigned long temp;
305
306         res = kstrtoul(buf, 10, &temp);
307         if (res)
308                 return res;
309
310         temp /= 1000;
311         if (temp < 0)
312                 return -EINVAL;
313
314         mutex_lock(&resource->lock);
315         resource->trip[attr->index - 7] = temp;
316         res = set_acpi_trip(resource);
317         mutex_unlock(&resource->lock);
318
319         if (res)
320                 return res;
321
322         return count;
323 }
324
325 /* Power meter */
326 static int update_meter(struct acpi_power_meter_resource *resource)
327 {
328         unsigned long long data;
329         acpi_status status;
330         unsigned long local_jiffies = jiffies;
331
332         if (time_before(local_jiffies, resource->sensors_last_updated +
333                         msecs_to_jiffies(resource->caps.sampling_time)) &&
334                         resource->sensors_valid)
335                 return 0;
336
337         status = acpi_evaluate_integer(resource->acpi_dev->handle, "_PMM",
338                                        NULL, &data);
339         if (ACPI_FAILURE(status)) {
340                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PMM"));
341                 return -ENODEV;
342         }
343
344         resource->power = data;
345         resource->sensors_valid = 1;
346         resource->sensors_last_updated = jiffies;
347         return 0;
348 }
349
350 static ssize_t show_power(struct device *dev,
351                           struct device_attribute *devattr,
352                           char *buf)
353 {
354         struct acpi_device *acpi_dev = to_acpi_device(dev);
355         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
356
357         mutex_lock(&resource->lock);
358         update_meter(resource);
359         mutex_unlock(&resource->lock);
360
361         return sprintf(buf, "%llu\n", resource->power * 1000);
362 }
363
364 /* Miscellaneous */
365 static ssize_t show_str(struct device *dev,
366                         struct device_attribute *devattr,
367                         char *buf)
368 {
369         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
370         struct acpi_device *acpi_dev = to_acpi_device(dev);
371         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
372         acpi_string val;
373
374         switch (attr->index) {
375         case 0:
376                 val = resource->model_number;
377                 break;
378         case 1:
379                 val = resource->serial_number;
380                 break;
381         case 2:
382                 val = resource->oem_info;
383                 break;
384         default:
385                 BUG();
386                 val = "";
387         }
388
389         return sprintf(buf, "%s\n", val);
390 }
391
392 static ssize_t show_val(struct device *dev,
393                         struct device_attribute *devattr,
394                         char *buf)
395 {
396         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
397         struct acpi_device *acpi_dev = to_acpi_device(dev);
398         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
399         u64 val = 0;
400
401         switch (attr->index) {
402         case 0:
403                 val = resource->caps.min_avg_interval;
404                 break;
405         case 1:
406                 val = resource->caps.max_avg_interval;
407                 break;
408         case 2:
409                 val = resource->caps.min_cap * 1000;
410                 break;
411         case 3:
412                 val = resource->caps.max_cap * 1000;
413                 break;
414         case 4:
415                 if (resource->caps.hysteresis == UNKNOWN_HYSTERESIS)
416                         return sprintf(buf, "unknown\n");
417
418                 val = resource->caps.hysteresis * 1000;
419                 break;
420         case 5:
421                 if (resource->caps.flags & POWER_METER_IS_BATTERY)
422                         val = 1;
423                 else
424                         val = 0;
425                 break;
426         case 6:
427                 if (resource->power > resource->cap)
428                         val = 1;
429                 else
430                         val = 0;
431                 break;
432         case 7:
433         case 8:
434                 if (resource->trip[attr->index - 7] < 0)
435                         return sprintf(buf, "unknown\n");
436
437                 val = resource->trip[attr->index - 7] * 1000;
438                 break;
439         default:
440                 BUG();
441         }
442
443         return sprintf(buf, "%llu\n", val);
444 }
445
446 static ssize_t show_accuracy(struct device *dev,
447                              struct device_attribute *devattr,
448                              char *buf)
449 {
450         struct acpi_device *acpi_dev = to_acpi_device(dev);
451         struct acpi_power_meter_resource *resource = acpi_dev->driver_data;
452         unsigned int acc = resource->caps.accuracy;
453
454         return sprintf(buf, "%u.%u%%\n", acc / 1000, acc % 1000);
455 }
456
457 static ssize_t show_name(struct device *dev,
458                          struct device_attribute *devattr,
459                          char *buf)
460 {
461         return sprintf(buf, "%s\n", ACPI_POWER_METER_NAME);
462 }
463
464 #define RO_SENSOR_TEMPLATE(_label, _show, _index)       \
465         {                                               \
466                 .label = _label,                        \
467                 .show  = _show,                         \
468                 .index = _index,                        \
469         }
470
471 #define RW_SENSOR_TEMPLATE(_label, _show, _set, _index) \
472         {                                               \
473                 .label = _label,                        \
474                 .show  = _show,                         \
475                 .set   = _set,                          \
476                 .index = _index,                        \
477         }
478
479 /* Sensor descriptions.  If you add a sensor, update NUM_SENSORS above! */
480 static struct sensor_template meter_attrs[] = {
481         RO_SENSOR_TEMPLATE(POWER_AVERAGE_NAME, show_power, 0),
482         RO_SENSOR_TEMPLATE("power1_accuracy", show_accuracy, 0),
483         RO_SENSOR_TEMPLATE("power1_average_interval_min", show_val, 0),
484         RO_SENSOR_TEMPLATE("power1_average_interval_max", show_val, 1),
485         RO_SENSOR_TEMPLATE("power1_is_battery", show_val, 5),
486         RW_SENSOR_TEMPLATE(POWER_AVG_INTERVAL_NAME, show_avg_interval,
487                 set_avg_interval, 0),
488         {},
489 };
490
491 static struct sensor_template misc_cap_attrs[] = {
492         RO_SENSOR_TEMPLATE("power1_cap_min", show_val, 2),
493         RO_SENSOR_TEMPLATE("power1_cap_max", show_val, 3),
494         RO_SENSOR_TEMPLATE("power1_cap_hyst", show_val, 4),
495         RO_SENSOR_TEMPLATE(POWER_ALARM_NAME, show_val, 6),
496         {},
497 };
498
499 static struct sensor_template ro_cap_attrs[] = {
500         RO_SENSOR_TEMPLATE(POWER_CAP_NAME, show_cap, 0),
501         {},
502 };
503
504 static struct sensor_template rw_cap_attrs[] = {
505         RW_SENSOR_TEMPLATE(POWER_CAP_NAME, show_cap, set_cap, 0),
506         {},
507 };
508
509 static struct sensor_template trip_attrs[] = {
510         RW_SENSOR_TEMPLATE("power1_average_min", show_val, set_trip, 7),
511         RW_SENSOR_TEMPLATE("power1_average_max", show_val, set_trip, 8),
512         {},
513 };
514
515 static struct sensor_template misc_attrs[] = {
516         RO_SENSOR_TEMPLATE("name", show_name, 0),
517         RO_SENSOR_TEMPLATE("power1_model_number", show_str, 0),
518         RO_SENSOR_TEMPLATE("power1_oem_info", show_str, 2),
519         RO_SENSOR_TEMPLATE("power1_serial_number", show_str, 1),
520         {},
521 };
522
523 #undef RO_SENSOR_TEMPLATE
524 #undef RW_SENSOR_TEMPLATE
525
526 /* Read power domain data */
527 static void remove_domain_devices(struct acpi_power_meter_resource *resource)
528 {
529         int i;
530
531         if (!resource->num_domain_devices)
532                 return;
533
534         for (i = 0; i < resource->num_domain_devices; i++) {
535                 struct acpi_device *obj = resource->domain_devices[i];
536                 if (!obj)
537                         continue;
538
539                 sysfs_remove_link(resource->holders_dir,
540                                   kobject_name(&obj->dev.kobj));
541                 put_device(&obj->dev);
542         }
543
544         kfree(resource->domain_devices);
545         kobject_put(resource->holders_dir);
546         resource->num_domain_devices = 0;
547 }
548
549 static int read_domain_devices(struct acpi_power_meter_resource *resource)
550 {
551         int res = 0;
552         int i;
553         struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
554         union acpi_object *pss;
555         acpi_status status;
556
557         status = acpi_evaluate_object(resource->acpi_dev->handle, "_PMD", NULL,
558                                       &buffer);
559         if (ACPI_FAILURE(status)) {
560                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PMD"));
561                 return -ENODEV;
562         }
563
564         pss = buffer.pointer;
565         if (!pss ||
566             pss->type != ACPI_TYPE_PACKAGE) {
567                 dev_err(&resource->acpi_dev->dev, ACPI_POWER_METER_NAME
568                         "Invalid _PMD data\n");
569                 res = -EFAULT;
570                 goto end;
571         }
572
573         if (!pss->package.count)
574                 goto end;
575
576         resource->domain_devices = kzalloc(sizeof(struct acpi_device *) *
577                                            pss->package.count, GFP_KERNEL);
578         if (!resource->domain_devices) {
579                 res = -ENOMEM;
580                 goto end;
581         }
582
583         resource->holders_dir = kobject_create_and_add("measures",
584                                         &resource->acpi_dev->dev.kobj);
585         if (!resource->holders_dir) {
586                 res = -ENOMEM;
587                 goto exit_free;
588         }
589
590         resource->num_domain_devices = pss->package.count;
591
592         for (i = 0; i < pss->package.count; i++) {
593                 struct acpi_device *obj;
594                 union acpi_object *element = &(pss->package.elements[i]);
595
596                 /* Refuse non-references */
597                 if (element->type != ACPI_TYPE_LOCAL_REFERENCE)
598                         continue;
599
600                 /* Create a symlink to domain objects */
601                 resource->domain_devices[i] = NULL;
602                 status = acpi_bus_get_device(element->reference.handle,
603                                              &resource->domain_devices[i]);
604                 if (ACPI_FAILURE(status))
605                         continue;
606
607                 obj = resource->domain_devices[i];
608                 get_device(&obj->dev);
609
610                 res = sysfs_create_link(resource->holders_dir, &obj->dev.kobj,
611                                       kobject_name(&obj->dev.kobj));
612                 if (res) {
613                         put_device(&obj->dev);
614                         resource->domain_devices[i] = NULL;
615                 }
616         }
617
618         res = 0;
619         goto end;
620
621 exit_free:
622         kfree(resource->domain_devices);
623 end:
624         kfree(buffer.pointer);
625         return res;
626 }
627
628 /* Registration and deregistration */
629 static int register_attrs(struct acpi_power_meter_resource *resource,
630                           struct sensor_template *attrs)
631 {
632         struct device *dev = &resource->acpi_dev->dev;
633         struct sensor_device_attribute *sensors =
634                 &resource->sensors[resource->num_sensors];
635         int res = 0;
636
637         while (attrs->label) {
638                 sensors->dev_attr.attr.name = attrs->label;
639                 sensors->dev_attr.attr.mode = S_IRUGO;
640                 sensors->dev_attr.show = attrs->show;
641                 sensors->index = attrs->index;
642
643                 if (attrs->set) {
644                         sensors->dev_attr.attr.mode |= S_IWUSR;
645                         sensors->dev_attr.store = attrs->set;
646                 }
647
648                 sysfs_attr_init(&sensors->dev_attr.attr);
649                 res = device_create_file(dev, &sensors->dev_attr);
650                 if (res) {
651                         sensors->dev_attr.attr.name = NULL;
652                         goto error;
653                 }
654                 sensors++;
655                 resource->num_sensors++;
656                 attrs++;
657         }
658
659 error:
660         return res;
661 }
662
663 static void remove_attrs(struct acpi_power_meter_resource *resource)
664 {
665         int i;
666
667         for (i = 0; i < resource->num_sensors; i++) {
668                 if (!resource->sensors[i].dev_attr.attr.name)
669                         continue;
670                 device_remove_file(&resource->acpi_dev->dev,
671                                    &resource->sensors[i].dev_attr);
672         }
673
674         remove_domain_devices(resource);
675
676         resource->num_sensors = 0;
677 }
678
679 static int setup_attrs(struct acpi_power_meter_resource *resource)
680 {
681         int res = 0;
682
683         res = read_domain_devices(resource);
684         if (res)
685                 return res;
686
687         if (resource->caps.flags & POWER_METER_CAN_MEASURE) {
688                 res = register_attrs(resource, meter_attrs);
689                 if (res)
690                         goto error;
691         }
692
693         if (resource->caps.flags & POWER_METER_CAN_CAP) {
694                 if (!can_cap_in_hardware()) {
695                         dev_err(&resource->acpi_dev->dev,
696                                 "Ignoring unsafe software power cap!\n");
697                         goto skip_unsafe_cap;
698                 }
699
700                 if (resource->caps.configurable_cap)
701                         res = register_attrs(resource, rw_cap_attrs);
702                 else
703                         res = register_attrs(resource, ro_cap_attrs);
704
705                 if (res)
706                         goto error;
707
708                 res = register_attrs(resource, misc_cap_attrs);
709                 if (res)
710                         goto error;
711         }
712
713 skip_unsafe_cap:
714         if (resource->caps.flags & POWER_METER_CAN_TRIP) {
715                 res = register_attrs(resource, trip_attrs);
716                 if (res)
717                         goto error;
718         }
719
720         res = register_attrs(resource, misc_attrs);
721         if (res)
722                 goto error;
723
724         return res;
725 error:
726         remove_attrs(resource);
727         return res;
728 }
729
730 static void free_capabilities(struct acpi_power_meter_resource *resource)
731 {
732         acpi_string *str;
733         int i;
734
735         str = &resource->model_number;
736         for (i = 0; i < 3; i++, str++)
737                 kfree(*str);
738 }
739
740 static int read_capabilities(struct acpi_power_meter_resource *resource)
741 {
742         int res = 0;
743         int i;
744         struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
745         struct acpi_buffer state = { 0, NULL };
746         struct acpi_buffer format = { sizeof("NNNNNNNNNNN"), "NNNNNNNNNNN" };
747         union acpi_object *pss;
748         acpi_string *str;
749         acpi_status status;
750
751         status = acpi_evaluate_object(resource->acpi_dev->handle, "_PMC", NULL,
752                                       &buffer);
753         if (ACPI_FAILURE(status)) {
754                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PMC"));
755                 return -ENODEV;
756         }
757
758         pss = buffer.pointer;
759         if (!pss ||
760             pss->type != ACPI_TYPE_PACKAGE ||
761             pss->package.count != 14) {
762                 dev_err(&resource->acpi_dev->dev, ACPI_POWER_METER_NAME
763                         "Invalid _PMC data\n");
764                 res = -EFAULT;
765                 goto end;
766         }
767
768         /* Grab all the integer data at once */
769         state.length = sizeof(struct acpi_power_meter_capabilities);
770         state.pointer = &resource->caps;
771
772         status = acpi_extract_package(pss, &format, &state);
773         if (ACPI_FAILURE(status)) {
774                 ACPI_EXCEPTION((AE_INFO, status, "Invalid data"));
775                 res = -EFAULT;
776                 goto end;
777         }
778
779         if (resource->caps.units) {
780                 dev_err(&resource->acpi_dev->dev, ACPI_POWER_METER_NAME
781                         "Unknown units %llu.\n",
782                         resource->caps.units);
783                 res = -EINVAL;
784                 goto end;
785         }
786
787         /* Grab the string data */
788         str = &resource->model_number;
789
790         for (i = 11; i < 14; i++) {
791                 union acpi_object *element = &(pss->package.elements[i]);
792
793                 if (element->type != ACPI_TYPE_STRING) {
794                         res = -EINVAL;
795                         goto error;
796                 }
797
798                 *str = kzalloc(sizeof(u8) * (element->string.length + 1),
799                                GFP_KERNEL);
800                 if (!*str) {
801                         res = -ENOMEM;
802                         goto error;
803                 }
804
805                 strncpy(*str, element->string.pointer, element->string.length);
806                 str++;
807         }
808
809         dev_info(&resource->acpi_dev->dev, "Found ACPI power meter.\n");
810         goto end;
811 error:
812         str = &resource->model_number;
813         for (i = 0; i < 3; i++, str++)
814                 kfree(*str);
815 end:
816         kfree(buffer.pointer);
817         return res;
818 }
819
820 /* Handle ACPI event notifications */
821 static void acpi_power_meter_notify(struct acpi_device *device, u32 event)
822 {
823         struct acpi_power_meter_resource *resource;
824         int res;
825
826         if (!device || !acpi_driver_data(device))
827                 return;
828
829         resource = acpi_driver_data(device);
830
831         mutex_lock(&resource->lock);
832         switch (event) {
833         case METER_NOTIFY_CONFIG:
834                 free_capabilities(resource);
835                 res = read_capabilities(resource);
836                 if (res)
837                         break;
838
839                 remove_attrs(resource);
840                 setup_attrs(resource);
841                 break;
842         case METER_NOTIFY_TRIP:
843                 sysfs_notify(&device->dev.kobj, NULL, POWER_AVERAGE_NAME);
844                 update_meter(resource);
845                 break;
846         case METER_NOTIFY_CAP:
847                 sysfs_notify(&device->dev.kobj, NULL, POWER_CAP_NAME);
848                 update_cap(resource);
849                 break;
850         case METER_NOTIFY_INTERVAL:
851                 sysfs_notify(&device->dev.kobj, NULL, POWER_AVG_INTERVAL_NAME);
852                 update_avg_interval(resource);
853                 break;
854         case METER_NOTIFY_CAPPING:
855                 sysfs_notify(&device->dev.kobj, NULL, POWER_ALARM_NAME);
856                 dev_info(&device->dev, "Capping in progress.\n");
857                 break;
858         default:
859                 BUG();
860         }
861         mutex_unlock(&resource->lock);
862
863         acpi_bus_generate_netlink_event(ACPI_POWER_METER_CLASS,
864                                         dev_name(&device->dev), event, 0);
865 }
866
867 static int acpi_power_meter_add(struct acpi_device *device)
868 {
869         int res;
870         struct acpi_power_meter_resource *resource;
871
872         if (!device)
873                 return -EINVAL;
874
875         resource = kzalloc(sizeof(struct acpi_power_meter_resource),
876                            GFP_KERNEL);
877         if (!resource)
878                 return -ENOMEM;
879
880         resource->sensors_valid = 0;
881         resource->acpi_dev = device;
882         mutex_init(&resource->lock);
883         strcpy(acpi_device_name(device), ACPI_POWER_METER_DEVICE_NAME);
884         strcpy(acpi_device_class(device), ACPI_POWER_METER_CLASS);
885         device->driver_data = resource;
886
887         free_capabilities(resource);
888         res = read_capabilities(resource);
889         if (res)
890                 goto exit_free;
891
892         resource->trip[0] = resource->trip[1] = -1;
893
894         res = setup_attrs(resource);
895         if (res)
896                 goto exit_free;
897
898         resource->hwmon_dev = hwmon_device_register(&device->dev);
899         if (IS_ERR(resource->hwmon_dev)) {
900                 res = PTR_ERR(resource->hwmon_dev);
901                 goto exit_remove;
902         }
903
904         res = 0;
905         goto exit;
906
907 exit_remove:
908         remove_attrs(resource);
909 exit_free:
910         kfree(resource);
911 exit:
912         return res;
913 }
914
915 static int acpi_power_meter_remove(struct acpi_device *device, int type)
916 {
917         struct acpi_power_meter_resource *resource;
918
919         if (!device || !acpi_driver_data(device))
920                 return -EINVAL;
921
922         resource = acpi_driver_data(device);
923         hwmon_device_unregister(resource->hwmon_dev);
924
925         free_capabilities(resource);
926         remove_attrs(resource);
927
928         kfree(resource);
929         return 0;
930 }
931
932 static int acpi_power_meter_resume(struct acpi_device *device)
933 {
934         struct acpi_power_meter_resource *resource;
935
936         if (!device || !acpi_driver_data(device))
937                 return -EINVAL;
938
939         resource = acpi_driver_data(device);
940         free_capabilities(resource);
941         read_capabilities(resource);
942
943         return 0;
944 }
945
946 static struct acpi_driver acpi_power_meter_driver = {
947         .name = "power_meter",
948         .class = ACPI_POWER_METER_CLASS,
949         .ids = power_meter_ids,
950         .ops = {
951                 .add = acpi_power_meter_add,
952                 .remove = acpi_power_meter_remove,
953                 .resume = acpi_power_meter_resume,
954                 .notify = acpi_power_meter_notify,
955                 },
956 };
957
958 /* Module init/exit routines */
959 static int __init enable_cap_knobs(const struct dmi_system_id *d)
960 {
961         cap_in_hardware = 1;
962         return 0;
963 }
964
965 static struct dmi_system_id __initdata pm_dmi_table[] = {
966         {
967                 enable_cap_knobs, "IBM Active Energy Manager",
968                 {
969                         DMI_MATCH(DMI_SYS_VENDOR, "IBM")
970                 },
971         },
972         {}
973 };
974
975 static int __init acpi_power_meter_init(void)
976 {
977         int result;
978
979         if (acpi_disabled)
980                 return -ENODEV;
981
982         dmi_check_system(pm_dmi_table);
983
984         result = acpi_bus_register_driver(&acpi_power_meter_driver);
985         if (result < 0)
986                 return -ENODEV;
987
988         return 0;
989 }
990
991 static void __exit acpi_power_meter_exit(void)
992 {
993         acpi_bus_unregister_driver(&acpi_power_meter_driver);
994 }
995
996 MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>");
997 MODULE_DESCRIPTION("ACPI 4.0 power meter driver");
998 MODULE_LICENSE("GPL");
999
1000 module_param(force_cap_on, bool, 0644);
1001 MODULE_PARM_DESC(force_cap_on, "Enable power cap even it is unsafe to do so.");
1002
1003 module_init(acpi_power_meter_init);
1004 module_exit(acpi_power_meter_exit);