2 * A hwmon driver for ACPI 4.0 power meters
3 * Copyright (C) 2009 IBM
5 * Author: Darrick J. Wong <djwong@us.ibm.com>
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.
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.
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
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/kdev_t.h>
29 #include <linux/sched.h>
30 #include <linux/time.h>
31 #include <acpi/acpi_drivers.h>
32 #include <acpi/acpi_bus.h>
34 #define ACPI_POWER_METER_NAME "power_meter"
35 ACPI_MODULE_NAME(ACPI_POWER_METER_NAME
);
36 #define ACPI_POWER_METER_DEVICE_NAME "Power Meter"
37 #define ACPI_POWER_METER_CLASS "power_meter_resource"
39 #define NUM_SENSORS 17
41 #define POWER_METER_CAN_MEASURE (1 << 0)
42 #define POWER_METER_CAN_TRIP (1 << 1)
43 #define POWER_METER_CAN_CAP (1 << 2)
44 #define POWER_METER_CAN_NOTIFY (1 << 3)
45 #define POWER_METER_IS_BATTERY (1 << 8)
46 #define UNKNOWN_HYSTERESIS 0xFFFFFFFF
48 #define METER_NOTIFY_CONFIG 0x80
49 #define METER_NOTIFY_TRIP 0x81
50 #define METER_NOTIFY_CAP 0x82
51 #define METER_NOTIFY_CAPPING 0x83
52 #define METER_NOTIFY_INTERVAL 0x84
54 #define POWER_AVERAGE_NAME "power1_average"
55 #define POWER_CAP_NAME "power1_cap"
56 #define POWER_AVG_INTERVAL_NAME "power1_average_interval"
57 #define POWER_ALARM_NAME "power1_alarm"
59 static int cap_in_hardware
;
60 static int force_cap_on
;
62 static int can_cap_in_hardware(void)
64 return force_cap_on
|| cap_in_hardware
;
67 static struct acpi_device_id power_meter_ids
[] = {
71 MODULE_DEVICE_TABLE(acpi
, power_meter_ids
);
73 struct acpi_power_meter_capabilities
{
77 acpi_integer accuracy
;
78 acpi_integer sampling_time
;
79 acpi_integer min_avg_interval
;
80 acpi_integer max_avg_interval
;
81 acpi_integer hysteresis
;
82 acpi_integer configurable_cap
;
87 struct acpi_power_meter_resource
{
88 struct acpi_device
*acpi_dev
;
91 struct device
*hwmon_dev
;
92 struct acpi_power_meter_capabilities caps
;
93 acpi_string model_number
;
94 acpi_string serial_number
;
98 acpi_integer avg_interval
;
100 unsigned long sensors_last_updated
;
101 struct sensor_device_attribute sensors
[NUM_SENSORS
];
104 int num_domain_devices
;
105 struct acpi_device
**domain_devices
;
106 struct kobject
*holders_dir
;
109 struct ro_sensor_template
{
111 ssize_t (*show
)(struct device
*dev
,
112 struct device_attribute
*devattr
,
117 struct rw_sensor_template
{
119 ssize_t (*show
)(struct device
*dev
,
120 struct device_attribute
*devattr
,
122 ssize_t (*set
)(struct device
*dev
,
123 struct device_attribute
*devattr
,
124 const char *buf
, size_t count
);
128 /* Averaging interval */
129 static int update_avg_interval(struct acpi_power_meter_resource
*resource
)
131 unsigned long long data
;
134 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_GAI",
136 if (ACPI_FAILURE(status
)) {
137 ACPI_EXCEPTION((AE_INFO
, status
, "Evaluating _GAI"));
141 resource
->avg_interval
= data
;
145 static ssize_t
show_avg_interval(struct device
*dev
,
146 struct device_attribute
*devattr
,
149 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
150 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
152 mutex_lock(&resource
->lock
);
153 update_avg_interval(resource
);
154 mutex_unlock(&resource
->lock
);
156 return sprintf(buf
, "%llu\n", resource
->avg_interval
);
159 static ssize_t
set_avg_interval(struct device
*dev
,
160 struct device_attribute
*devattr
,
161 const char *buf
, size_t count
)
163 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
164 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
165 union acpi_object arg0
= { ACPI_TYPE_INTEGER
};
166 struct acpi_object_list args
= { 1, &arg0
};
169 unsigned long long data
;
172 res
= strict_strtoul(buf
, 10, &temp
);
176 if (temp
> resource
->caps
.max_avg_interval
||
177 temp
< resource
->caps
.min_avg_interval
)
179 arg0
.integer
.value
= temp
;
181 mutex_lock(&resource
->lock
);
182 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_PAI",
184 if (!ACPI_FAILURE(status
))
185 resource
->avg_interval
= temp
;
186 mutex_unlock(&resource
->lock
);
188 if (ACPI_FAILURE(status
)) {
189 ACPI_EXCEPTION((AE_INFO
, status
, "Evaluating _PAI"));
193 /* _PAI returns 0 on success, nonzero otherwise */
201 static int update_cap(struct acpi_power_meter_resource
*resource
)
203 unsigned long long data
;
206 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_GHL",
208 if (ACPI_FAILURE(status
)) {
209 ACPI_EXCEPTION((AE_INFO
, status
, "Evaluating _GHL"));
213 resource
->cap
= data
;
217 static ssize_t
show_cap(struct device
*dev
,
218 struct device_attribute
*devattr
,
221 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
222 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
224 mutex_lock(&resource
->lock
);
225 update_cap(resource
);
226 mutex_unlock(&resource
->lock
);
228 return sprintf(buf
, "%llu\n", resource
->cap
* 1000);
231 static ssize_t
set_cap(struct device
*dev
, struct device_attribute
*devattr
,
232 const char *buf
, size_t count
)
234 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
235 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
236 union acpi_object arg0
= { ACPI_TYPE_INTEGER
};
237 struct acpi_object_list args
= { 1, &arg0
};
240 unsigned long long data
;
243 res
= strict_strtoul(buf
, 10, &temp
);
248 if (temp
> resource
->caps
.max_cap
|| temp
< resource
->caps
.min_cap
)
250 arg0
.integer
.value
= temp
;
252 mutex_lock(&resource
->lock
);
253 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_SHL",
255 if (!ACPI_FAILURE(status
))
256 resource
->cap
= temp
;
257 mutex_unlock(&resource
->lock
);
259 if (ACPI_FAILURE(status
)) {
260 ACPI_EXCEPTION((AE_INFO
, status
, "Evaluating _SHL"));
264 /* _SHL returns 0 on success, nonzero otherwise */
271 /* Power meter trip points */
272 static int set_acpi_trip(struct acpi_power_meter_resource
*resource
)
274 union acpi_object arg_objs
[] = {
278 struct acpi_object_list args
= { 2, arg_objs
};
279 unsigned long long data
;
282 /* Both trip levels must be set */
283 if (resource
->trip
[0] < 0 || resource
->trip
[1] < 0)
286 /* This driver stores min, max; ACPI wants max, min. */
287 arg_objs
[0].integer
.value
= resource
->trip
[1];
288 arg_objs
[1].integer
.value
= resource
->trip
[0];
290 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_PTP",
292 if (ACPI_FAILURE(status
)) {
293 ACPI_EXCEPTION((AE_INFO
, status
, "Evaluating _PTP"));
297 /* _PTP returns 0 on success, nonzero otherwise */
304 static ssize_t
set_trip(struct device
*dev
, struct device_attribute
*devattr
,
305 const char *buf
, size_t count
)
307 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
308 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
309 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
313 res
= strict_strtoul(buf
, 10, &temp
);
321 mutex_lock(&resource
->lock
);
322 resource
->trip
[attr
->index
- 7] = temp
;
323 res
= set_acpi_trip(resource
);
324 mutex_unlock(&resource
->lock
);
333 static int update_meter(struct acpi_power_meter_resource
*resource
)
335 unsigned long long data
;
337 unsigned long local_jiffies
= jiffies
;
339 if (time_before(local_jiffies
, resource
->sensors_last_updated
+
340 msecs_to_jiffies(resource
->caps
.sampling_time
)) &&
341 resource
->sensors_valid
)
344 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_PMM",
346 if (ACPI_FAILURE(status
)) {
347 ACPI_EXCEPTION((AE_INFO
, status
, "Evaluating _PMM"));
351 resource
->power
= data
;
352 resource
->sensors_valid
= 1;
353 resource
->sensors_last_updated
= jiffies
;
357 static ssize_t
show_power(struct device
*dev
,
358 struct device_attribute
*devattr
,
361 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
362 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
364 mutex_lock(&resource
->lock
);
365 update_meter(resource
);
366 mutex_unlock(&resource
->lock
);
368 return sprintf(buf
, "%llu\n", resource
->power
* 1000);
372 static ssize_t
show_str(struct device
*dev
,
373 struct device_attribute
*devattr
,
376 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
377 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
378 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
381 switch (attr
->index
) {
383 val
= resource
->model_number
;
386 val
= resource
->serial_number
;
389 val
= resource
->oem_info
;
395 return sprintf(buf
, "%s\n", val
);
398 static ssize_t
show_val(struct device
*dev
,
399 struct device_attribute
*devattr
,
402 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
403 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
404 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
405 acpi_integer val
= 0;
407 switch (attr
->index
) {
409 val
= resource
->caps
.min_avg_interval
;
412 val
= resource
->caps
.max_avg_interval
;
415 val
= resource
->caps
.min_cap
* 1000;
418 val
= resource
->caps
.max_cap
* 1000;
421 if (resource
->caps
.hysteresis
== UNKNOWN_HYSTERESIS
)
422 return sprintf(buf
, "unknown\n");
424 val
= resource
->caps
.hysteresis
* 1000;
427 if (resource
->caps
.flags
& POWER_METER_IS_BATTERY
)
433 if (resource
->power
> resource
->cap
)
440 if (resource
->trip
[attr
->index
- 7] < 0)
441 return sprintf(buf
, "unknown\n");
443 val
= resource
->trip
[attr
->index
- 7] * 1000;
449 return sprintf(buf
, "%llu\n", val
);
452 static ssize_t
show_accuracy(struct device
*dev
,
453 struct device_attribute
*devattr
,
456 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
457 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
458 unsigned int acc
= resource
->caps
.accuracy
;
460 return sprintf(buf
, "%u.%u%%\n", acc
/ 1000, acc
% 1000);
463 static ssize_t
show_name(struct device
*dev
,
464 struct device_attribute
*devattr
,
467 return sprintf(buf
, "%s\n", ACPI_POWER_METER_NAME
);
470 /* Sensor descriptions. If you add a sensor, update NUM_SENSORS above! */
471 static struct ro_sensor_template meter_ro_attrs
[] = {
472 {POWER_AVERAGE_NAME
, show_power
, 0},
473 {"power1_accuracy", show_accuracy
, 0},
474 {"power1_average_interval_min", show_val
, 0},
475 {"power1_average_interval_max", show_val
, 1},
476 {"power1_is_battery", show_val
, 5},
480 static struct rw_sensor_template meter_rw_attrs
[] = {
481 {POWER_AVG_INTERVAL_NAME
, show_avg_interval
, set_avg_interval
, 0},
482 {NULL
, NULL
, NULL
, 0},
485 static struct ro_sensor_template misc_cap_attrs
[] = {
486 {"power1_cap_min", show_val
, 2},
487 {"power1_cap_max", show_val
, 3},
488 {"power1_cap_hyst", show_val
, 4},
489 {POWER_ALARM_NAME
, show_val
, 6},
493 static struct ro_sensor_template ro_cap_attrs
[] = {
494 {POWER_CAP_NAME
, show_cap
, 0},
498 static struct rw_sensor_template rw_cap_attrs
[] = {
499 {POWER_CAP_NAME
, show_cap
, set_cap
, 0},
500 {NULL
, NULL
, NULL
, 0},
503 static struct rw_sensor_template trip_attrs
[] = {
504 {"power1_average_min", show_val
, set_trip
, 7},
505 {"power1_average_max", show_val
, set_trip
, 8},
506 {NULL
, NULL
, NULL
, 0},
509 static struct ro_sensor_template misc_attrs
[] = {
510 {"name", show_name
, 0},
511 {"power1_model_number", show_str
, 0},
512 {"power1_oem_info", show_str
, 2},
513 {"power1_serial_number", show_str
, 1},
517 /* Read power domain data */
518 static void remove_domain_devices(struct acpi_power_meter_resource
*resource
)
522 if (!resource
->num_domain_devices
)
525 for (i
= 0; i
< resource
->num_domain_devices
; i
++) {
526 struct acpi_device
*obj
= resource
->domain_devices
[i
];
530 sysfs_remove_link(resource
->holders_dir
,
531 kobject_name(&obj
->dev
.kobj
));
532 put_device(&obj
->dev
);
535 kfree(resource
->domain_devices
);
536 kobject_put(resource
->holders_dir
);
539 static int read_domain_devices(struct acpi_power_meter_resource
*resource
)
543 struct acpi_buffer buffer
= { ACPI_ALLOCATE_BUFFER
, NULL
};
544 union acpi_object
*pss
;
547 status
= acpi_evaluate_object(resource
->acpi_dev
->handle
, "_PMD", NULL
,
549 if (ACPI_FAILURE(status
)) {
550 ACPI_EXCEPTION((AE_INFO
, status
, "Evaluating _PMD"));
554 pss
= buffer
.pointer
;
556 pss
->type
!= ACPI_TYPE_PACKAGE
) {
557 dev_err(&resource
->acpi_dev
->dev
, ACPI_POWER_METER_NAME
558 "Invalid _PMD data\n");
563 if (!pss
->package
.count
)
566 resource
->domain_devices
= kzalloc(sizeof(struct acpi_device
*) *
567 pss
->package
.count
, GFP_KERNEL
);
568 if (!resource
->domain_devices
) {
573 resource
->holders_dir
= kobject_create_and_add("measures",
574 &resource
->acpi_dev
->dev
.kobj
);
575 if (!resource
->holders_dir
) {
580 resource
->num_domain_devices
= pss
->package
.count
;
582 for (i
= 0; i
< pss
->package
.count
; i
++) {
583 struct acpi_device
*obj
;
584 union acpi_object
*element
= &(pss
->package
.elements
[i
]);
586 /* Refuse non-references */
587 if (element
->type
!= ACPI_TYPE_LOCAL_REFERENCE
)
590 /* Create a symlink to domain objects */
591 resource
->domain_devices
[i
] = NULL
;
592 status
= acpi_bus_get_device(element
->reference
.handle
,
593 &resource
->domain_devices
[i
]);
594 if (ACPI_FAILURE(status
))
597 obj
= resource
->domain_devices
[i
];
598 get_device(&obj
->dev
);
600 res
= sysfs_create_link(resource
->holders_dir
, &obj
->dev
.kobj
,
601 kobject_name(&obj
->dev
.kobj
));
603 put_device(&obj
->dev
);
604 resource
->domain_devices
[i
] = NULL
;
612 kfree(resource
->domain_devices
);
614 kfree(buffer
.pointer
);
618 /* Registration and deregistration */
619 static int register_ro_attrs(struct acpi_power_meter_resource
*resource
,
620 struct ro_sensor_template
*ro
)
622 struct device
*dev
= &resource
->acpi_dev
->dev
;
623 struct sensor_device_attribute
*sensors
=
624 &resource
->sensors
[resource
->num_sensors
];
628 sensors
->dev_attr
.attr
.name
= ro
->label
;
629 sensors
->dev_attr
.attr
.mode
= S_IRUGO
;
630 sensors
->dev_attr
.show
= ro
->show
;
631 sensors
->index
= ro
->index
;
633 res
= device_create_file(dev
, &sensors
->dev_attr
);
635 sensors
->dev_attr
.attr
.name
= NULL
;
639 resource
->num_sensors
++;
647 static int register_rw_attrs(struct acpi_power_meter_resource
*resource
,
648 struct rw_sensor_template
*rw
)
650 struct device
*dev
= &resource
->acpi_dev
->dev
;
651 struct sensor_device_attribute
*sensors
=
652 &resource
->sensors
[resource
->num_sensors
];
656 sensors
->dev_attr
.attr
.name
= rw
->label
;
657 sensors
->dev_attr
.attr
.mode
= S_IRUGO
| S_IWUSR
;
658 sensors
->dev_attr
.show
= rw
->show
;
659 sensors
->dev_attr
.store
= rw
->set
;
660 sensors
->index
= rw
->index
;
662 res
= device_create_file(dev
, &sensors
->dev_attr
);
664 sensors
->dev_attr
.attr
.name
= NULL
;
668 resource
->num_sensors
++;
676 static void remove_attrs(struct acpi_power_meter_resource
*resource
)
680 for (i
= 0; i
< resource
->num_sensors
; i
++) {
681 if (!resource
->sensors
[i
].dev_attr
.attr
.name
)
683 device_remove_file(&resource
->acpi_dev
->dev
,
684 &resource
->sensors
[i
].dev_attr
);
687 remove_domain_devices(resource
);
689 resource
->num_sensors
= 0;
692 static int setup_attrs(struct acpi_power_meter_resource
*resource
)
696 res
= read_domain_devices(resource
);
700 if (resource
->caps
.flags
& POWER_METER_CAN_MEASURE
) {
701 res
= register_ro_attrs(resource
, meter_ro_attrs
);
704 res
= register_rw_attrs(resource
, meter_rw_attrs
);
709 if (resource
->caps
.flags
& POWER_METER_CAN_CAP
) {
710 if (!can_cap_in_hardware()) {
711 dev_err(&resource
->acpi_dev
->dev
,
712 "Ignoring unsafe software power cap!\n");
713 goto skip_unsafe_cap
;
716 if (resource
->caps
.configurable_cap
) {
717 res
= register_rw_attrs(resource
, rw_cap_attrs
);
721 res
= register_ro_attrs(resource
, ro_cap_attrs
);
725 res
= register_ro_attrs(resource
, misc_cap_attrs
);
731 if (resource
->caps
.flags
& POWER_METER_CAN_TRIP
) {
732 res
= register_rw_attrs(resource
, trip_attrs
);
737 res
= register_ro_attrs(resource
, misc_attrs
);
743 remove_domain_devices(resource
);
744 remove_attrs(resource
);
748 static void free_capabilities(struct acpi_power_meter_resource
*resource
)
753 str
= &resource
->model_number
;
754 for (i
= 0; i
< 3; i
++, str
++)
758 static int read_capabilities(struct acpi_power_meter_resource
*resource
)
762 struct acpi_buffer buffer
= { ACPI_ALLOCATE_BUFFER
, NULL
};
763 struct acpi_buffer state
= { 0, NULL
};
764 struct acpi_buffer format
= { sizeof("NNNNNNNNNNN"), "NNNNNNNNNNN" };
765 union acpi_object
*pss
;
769 status
= acpi_evaluate_object(resource
->acpi_dev
->handle
, "_PMC", NULL
,
771 if (ACPI_FAILURE(status
)) {
772 ACPI_EXCEPTION((AE_INFO
, status
, "Evaluating _PMC"));
776 pss
= buffer
.pointer
;
778 pss
->type
!= ACPI_TYPE_PACKAGE
||
779 pss
->package
.count
!= 14) {
780 dev_err(&resource
->acpi_dev
->dev
, ACPI_POWER_METER_NAME
781 "Invalid _PMC data\n");
786 /* Grab all the integer data at once */
787 state
.length
= sizeof(struct acpi_power_meter_capabilities
);
788 state
.pointer
= &resource
->caps
;
790 status
= acpi_extract_package(pss
, &format
, &state
);
791 if (ACPI_FAILURE(status
)) {
792 ACPI_EXCEPTION((AE_INFO
, status
, "Invalid data"));
797 if (resource
->caps
.units
) {
798 dev_err(&resource
->acpi_dev
->dev
, ACPI_POWER_METER_NAME
799 "Unknown units %llu.\n",
800 resource
->caps
.units
);
805 /* Grab the string data */
806 str
= &resource
->model_number
;
808 for (i
= 11; i
< 14; i
++) {
809 union acpi_object
*element
= &(pss
->package
.elements
[i
]);
811 if (element
->type
!= ACPI_TYPE_STRING
) {
816 *str
= kzalloc(sizeof(u8
) * (element
->string
.length
+ 1),
823 strncpy(*str
, element
->string
.pointer
, element
->string
.length
);
827 dev_info(&resource
->acpi_dev
->dev
, "Found ACPI power meter.\n");
830 str
= &resource
->model_number
;
831 for (i
= 0; i
< 3; i
++, str
++)
834 kfree(buffer
.pointer
);
838 /* Handle ACPI event notifications */
839 static void acpi_power_meter_notify(struct acpi_device
*device
, u32 event
)
841 struct acpi_power_meter_resource
*resource
;
844 if (!device
|| !acpi_driver_data(device
))
847 resource
= acpi_driver_data(device
);
849 mutex_lock(&resource
->lock
);
851 case METER_NOTIFY_CONFIG
:
852 free_capabilities(resource
);
853 res
= read_capabilities(resource
);
857 remove_attrs(resource
);
858 setup_attrs(resource
);
860 case METER_NOTIFY_TRIP
:
861 sysfs_notify(&device
->dev
.kobj
, NULL
, POWER_AVERAGE_NAME
);
862 update_meter(resource
);
864 case METER_NOTIFY_CAP
:
865 sysfs_notify(&device
->dev
.kobj
, NULL
, POWER_CAP_NAME
);
866 update_cap(resource
);
868 case METER_NOTIFY_INTERVAL
:
869 sysfs_notify(&device
->dev
.kobj
, NULL
, POWER_AVG_INTERVAL_NAME
);
870 update_avg_interval(resource
);
872 case METER_NOTIFY_CAPPING
:
873 sysfs_notify(&device
->dev
.kobj
, NULL
, POWER_ALARM_NAME
);
874 dev_info(&device
->dev
, "Capping in progress.\n");
879 mutex_unlock(&resource
->lock
);
881 acpi_bus_generate_netlink_event(ACPI_POWER_METER_CLASS
,
882 dev_name(&device
->dev
), event
, 0);
885 static int acpi_power_meter_add(struct acpi_device
*device
)
888 struct acpi_power_meter_resource
*resource
;
893 resource
= kzalloc(sizeof(struct acpi_power_meter_resource
),
898 resource
->sensors_valid
= 0;
899 resource
->acpi_dev
= device
;
900 mutex_init(&resource
->lock
);
901 strcpy(acpi_device_name(device
), ACPI_POWER_METER_DEVICE_NAME
);
902 strcpy(acpi_device_class(device
), ACPI_POWER_METER_CLASS
);
903 device
->driver_data
= resource
;
905 free_capabilities(resource
);
906 res
= read_capabilities(resource
);
910 resource
->trip
[0] = resource
->trip
[1] = -1;
912 res
= setup_attrs(resource
);
916 resource
->hwmon_dev
= hwmon_device_register(&device
->dev
);
917 if (IS_ERR(resource
->hwmon_dev
)) {
918 res
= PTR_ERR(resource
->hwmon_dev
);
926 remove_attrs(resource
);
933 static int acpi_power_meter_remove(struct acpi_device
*device
, int type
)
935 struct acpi_power_meter_resource
*resource
;
937 if (!device
|| !acpi_driver_data(device
))
940 resource
= acpi_driver_data(device
);
941 hwmon_device_unregister(resource
->hwmon_dev
);
943 free_capabilities(resource
);
944 remove_attrs(resource
);
950 static int acpi_power_meter_resume(struct acpi_device
*device
)
952 struct acpi_power_meter_resource
*resource
;
954 if (!device
|| !acpi_driver_data(device
))
957 resource
= acpi_driver_data(device
);
958 free_capabilities(resource
);
959 read_capabilities(resource
);
964 static struct acpi_driver acpi_power_meter_driver
= {
965 .name
= "power_meter",
966 .class = ACPI_POWER_METER_CLASS
,
967 .ids
= power_meter_ids
,
969 .add
= acpi_power_meter_add
,
970 .remove
= acpi_power_meter_remove
,
971 .resume
= acpi_power_meter_resume
,
972 .notify
= acpi_power_meter_notify
,
976 /* Module init/exit routines */
977 static int __init
enable_cap_knobs(const struct dmi_system_id
*d
)
983 static struct dmi_system_id __initdata pm_dmi_table
[] = {
985 enable_cap_knobs
, "IBM Active Energy Manager",
987 DMI_MATCH(DMI_SYS_VENDOR
, "IBM")
993 static int __init
acpi_power_meter_init(void)
1000 dmi_check_system(pm_dmi_table
);
1002 result
= acpi_bus_register_driver(&acpi_power_meter_driver
);
1009 static void __exit
acpi_power_meter_exit(void)
1011 acpi_bus_unregister_driver(&acpi_power_meter_driver
);
1014 MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>");
1015 MODULE_DESCRIPTION("ACPI 4.0 power meter driver");
1016 MODULE_LICENSE("GPL");
1018 module_param(force_cap_on
, bool, 0644);
1019 MODULE_PARM_DESC(force_cap_on
, "Enable power cap even it is unsafe to do so.");
1021 module_init(acpi_power_meter_init
);
1022 module_exit(acpi_power_meter_exit
);