1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * A hwmon driver for ACPI 4.0 power meters
4 * Copyright (C) 2009 IBM
6 * Author: Darrick J. Wong <darrick.wong@oracle.com>
9 #include <linux/module.h>
10 #include <linux/hwmon.h>
11 #include <linux/hwmon-sysfs.h>
12 #include <linux/jiffies.h>
13 #include <linux/mutex.h>
14 #include <linux/dmi.h>
15 #include <linux/slab.h>
16 #include <linux/kdev_t.h>
17 #include <linux/sched.h>
18 #include <linux/time.h>
19 #include <linux/err.h>
20 #include <linux/acpi.h>
22 #define ACPI_POWER_METER_NAME "power_meter"
23 #define ACPI_POWER_METER_DEVICE_NAME "Power Meter"
24 #define ACPI_POWER_METER_CLASS "pwr_meter_resource"
26 #define NUM_SENSORS 17
28 #define POWER_METER_CAN_MEASURE (1 << 0)
29 #define POWER_METER_CAN_TRIP (1 << 1)
30 #define POWER_METER_CAN_CAP (1 << 2)
31 #define POWER_METER_CAN_NOTIFY (1 << 3)
32 #define POWER_METER_IS_BATTERY (1 << 8)
33 #define UNKNOWN_HYSTERESIS 0xFFFFFFFF
34 #define UNKNOWN_POWER 0xFFFFFFFF
36 #define METER_NOTIFY_CONFIG 0x80
37 #define METER_NOTIFY_TRIP 0x81
38 #define METER_NOTIFY_CAP 0x82
39 #define METER_NOTIFY_CAPPING 0x83
40 #define METER_NOTIFY_INTERVAL 0x84
42 #define POWER_AVERAGE_NAME "power1_average"
43 #define POWER_CAP_NAME "power1_cap"
44 #define POWER_AVG_INTERVAL_NAME "power1_average_interval"
45 #define POWER_ALARM_NAME "power1_alarm"
47 static int cap_in_hardware
;
48 static bool force_cap_on
;
50 static int can_cap_in_hardware(void)
52 return force_cap_on
|| cap_in_hardware
;
55 static const struct acpi_device_id power_meter_ids
[] = {
59 MODULE_DEVICE_TABLE(acpi
, power_meter_ids
);
61 struct acpi_power_meter_capabilities
{
75 struct acpi_power_meter_resource
{
76 struct acpi_device
*acpi_dev
;
79 struct device
*hwmon_dev
;
80 struct acpi_power_meter_capabilities caps
;
81 acpi_string model_number
;
82 acpi_string serial_number
;
88 unsigned long sensors_last_updated
;
89 struct sensor_device_attribute sensors
[NUM_SENSORS
];
92 int num_domain_devices
;
93 struct acpi_device
**domain_devices
;
94 struct kobject
*holders_dir
;
97 struct sensor_template
{
99 ssize_t (*show
)(struct device
*dev
,
100 struct device_attribute
*devattr
,
102 ssize_t (*set
)(struct device
*dev
,
103 struct device_attribute
*devattr
,
104 const char *buf
, size_t count
);
108 /* Averaging interval */
109 static int update_avg_interval(struct acpi_power_meter_resource
*resource
)
111 unsigned long long data
;
114 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_GAI",
116 if (ACPI_FAILURE(status
)) {
117 acpi_evaluation_failure_warn(resource
->acpi_dev
->handle
, "_GAI",
122 resource
->avg_interval
= data
;
126 static ssize_t
show_avg_interval(struct device
*dev
,
127 struct device_attribute
*devattr
,
130 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
131 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
133 mutex_lock(&resource
->lock
);
134 update_avg_interval(resource
);
135 mutex_unlock(&resource
->lock
);
137 return sprintf(buf
, "%llu\n", resource
->avg_interval
);
140 static ssize_t
set_avg_interval(struct device
*dev
,
141 struct device_attribute
*devattr
,
142 const char *buf
, size_t count
)
144 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
145 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
146 union acpi_object arg0
= { ACPI_TYPE_INTEGER
};
147 struct acpi_object_list args
= { 1, &arg0
};
150 unsigned long long data
;
153 res
= kstrtoul(buf
, 10, &temp
);
157 if (temp
> resource
->caps
.max_avg_interval
||
158 temp
< resource
->caps
.min_avg_interval
)
160 arg0
.integer
.value
= temp
;
162 mutex_lock(&resource
->lock
);
163 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_PAI",
165 if (ACPI_SUCCESS(status
))
166 resource
->avg_interval
= temp
;
167 mutex_unlock(&resource
->lock
);
169 if (ACPI_FAILURE(status
)) {
170 acpi_evaluation_failure_warn(resource
->acpi_dev
->handle
, "_PAI",
175 /* _PAI returns 0 on success, nonzero otherwise */
183 static int update_cap(struct acpi_power_meter_resource
*resource
)
185 unsigned long long data
;
188 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_GHL",
190 if (ACPI_FAILURE(status
)) {
191 acpi_evaluation_failure_warn(resource
->acpi_dev
->handle
, "_GHL",
196 resource
->cap
= data
;
200 static ssize_t
show_cap(struct device
*dev
,
201 struct device_attribute
*devattr
,
204 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
205 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
207 mutex_lock(&resource
->lock
);
208 update_cap(resource
);
209 mutex_unlock(&resource
->lock
);
211 return sprintf(buf
, "%llu\n", resource
->cap
* 1000);
214 static ssize_t
set_cap(struct device
*dev
, struct device_attribute
*devattr
,
215 const char *buf
, size_t count
)
217 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
218 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
219 union acpi_object arg0
= { ACPI_TYPE_INTEGER
};
220 struct acpi_object_list args
= { 1, &arg0
};
223 unsigned long long data
;
226 res
= kstrtoul(buf
, 10, &temp
);
230 temp
= DIV_ROUND_CLOSEST(temp
, 1000);
231 if (temp
> resource
->caps
.max_cap
|| temp
< resource
->caps
.min_cap
)
233 arg0
.integer
.value
= temp
;
235 mutex_lock(&resource
->lock
);
236 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_SHL",
238 if (ACPI_SUCCESS(status
))
239 resource
->cap
= temp
;
240 mutex_unlock(&resource
->lock
);
242 if (ACPI_FAILURE(status
)) {
243 acpi_evaluation_failure_warn(resource
->acpi_dev
->handle
, "_SHL",
248 /* _SHL returns 0 on success, nonzero otherwise */
255 /* Power meter trip points */
256 static int set_acpi_trip(struct acpi_power_meter_resource
*resource
)
258 union acpi_object arg_objs
[] = {
262 struct acpi_object_list args
= { 2, arg_objs
};
263 unsigned long long data
;
266 /* Both trip levels must be set */
267 if (resource
->trip
[0] < 0 || resource
->trip
[1] < 0)
270 /* This driver stores min, max; ACPI wants max, min. */
271 arg_objs
[0].integer
.value
= resource
->trip
[1];
272 arg_objs
[1].integer
.value
= resource
->trip
[0];
274 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_PTP",
276 if (ACPI_FAILURE(status
)) {
277 acpi_evaluation_failure_warn(resource
->acpi_dev
->handle
, "_PTP",
282 /* _PTP returns 0 on success, nonzero otherwise */
289 static ssize_t
set_trip(struct device
*dev
, struct device_attribute
*devattr
,
290 const char *buf
, size_t count
)
292 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
293 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
294 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
298 res
= kstrtoul(buf
, 10, &temp
);
302 temp
= DIV_ROUND_CLOSEST(temp
, 1000);
304 mutex_lock(&resource
->lock
);
305 resource
->trip
[attr
->index
- 7] = temp
;
306 res
= set_acpi_trip(resource
);
307 mutex_unlock(&resource
->lock
);
316 static int update_meter(struct acpi_power_meter_resource
*resource
)
318 unsigned long long data
;
320 unsigned long local_jiffies
= jiffies
;
322 if (time_before(local_jiffies
, resource
->sensors_last_updated
+
323 msecs_to_jiffies(resource
->caps
.sampling_time
)) &&
324 resource
->sensors_valid
)
327 status
= acpi_evaluate_integer(resource
->acpi_dev
->handle
, "_PMM",
329 if (ACPI_FAILURE(status
)) {
330 acpi_evaluation_failure_warn(resource
->acpi_dev
->handle
, "_PMM",
335 resource
->power
= data
;
336 resource
->sensors_valid
= 1;
337 resource
->sensors_last_updated
= jiffies
;
341 static ssize_t
show_power(struct device
*dev
,
342 struct device_attribute
*devattr
,
345 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
346 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
348 mutex_lock(&resource
->lock
);
349 update_meter(resource
);
350 mutex_unlock(&resource
->lock
);
352 if (resource
->power
== UNKNOWN_POWER
)
355 return sprintf(buf
, "%llu\n", resource
->power
* 1000);
359 static ssize_t
show_str(struct device
*dev
,
360 struct device_attribute
*devattr
,
363 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
364 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
365 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
369 mutex_lock(&resource
->lock
);
370 switch (attr
->index
) {
372 val
= resource
->model_number
;
375 val
= resource
->serial_number
;
378 val
= resource
->oem_info
;
381 WARN(1, "Implementation error: unexpected attribute index %d\n",
386 ret
= sprintf(buf
, "%s\n", val
);
387 mutex_unlock(&resource
->lock
);
391 static ssize_t
show_val(struct device
*dev
,
392 struct device_attribute
*devattr
,
395 struct sensor_device_attribute
*attr
= to_sensor_dev_attr(devattr
);
396 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
397 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
400 switch (attr
->index
) {
402 val
= resource
->caps
.min_avg_interval
;
405 val
= resource
->caps
.max_avg_interval
;
408 val
= resource
->caps
.min_cap
* 1000;
411 val
= resource
->caps
.max_cap
* 1000;
414 if (resource
->caps
.hysteresis
== UNKNOWN_HYSTERESIS
)
415 return sprintf(buf
, "unknown\n");
417 val
= resource
->caps
.hysteresis
* 1000;
420 if (resource
->caps
.flags
& POWER_METER_IS_BATTERY
)
426 if (resource
->power
> resource
->cap
)
433 if (resource
->trip
[attr
->index
- 7] < 0)
434 return sprintf(buf
, "unknown\n");
436 val
= resource
->trip
[attr
->index
- 7] * 1000;
439 WARN(1, "Implementation error: unexpected attribute index %d\n",
444 return sprintf(buf
, "%llu\n", val
);
447 static ssize_t
show_accuracy(struct device
*dev
,
448 struct device_attribute
*devattr
,
451 struct acpi_device
*acpi_dev
= to_acpi_device(dev
);
452 struct acpi_power_meter_resource
*resource
= acpi_dev
->driver_data
;
453 unsigned int acc
= resource
->caps
.accuracy
;
455 return sprintf(buf
, "%u.%u%%\n", acc
/ 1000, acc
% 1000);
458 static ssize_t
show_name(struct device
*dev
,
459 struct device_attribute
*devattr
,
462 return sprintf(buf
, "%s\n", ACPI_POWER_METER_NAME
);
465 #define RO_SENSOR_TEMPLATE(_label, _show, _index) \
472 #define RW_SENSOR_TEMPLATE(_label, _show, _set, _index) \
480 /* Sensor descriptions. If you add a sensor, update NUM_SENSORS above! */
481 static struct sensor_template meter_attrs
[] = {
482 RO_SENSOR_TEMPLATE(POWER_AVERAGE_NAME
, show_power
, 0),
483 RO_SENSOR_TEMPLATE("power1_accuracy", show_accuracy
, 0),
484 RO_SENSOR_TEMPLATE("power1_average_interval_min", show_val
, 0),
485 RO_SENSOR_TEMPLATE("power1_average_interval_max", show_val
, 1),
486 RO_SENSOR_TEMPLATE("power1_is_battery", show_val
, 5),
487 RW_SENSOR_TEMPLATE(POWER_AVG_INTERVAL_NAME
, show_avg_interval
,
488 set_avg_interval
, 0),
492 static struct sensor_template misc_cap_attrs
[] = {
493 RO_SENSOR_TEMPLATE("power1_cap_min", show_val
, 2),
494 RO_SENSOR_TEMPLATE("power1_cap_max", show_val
, 3),
495 RO_SENSOR_TEMPLATE("power1_cap_hyst", show_val
, 4),
496 RO_SENSOR_TEMPLATE(POWER_ALARM_NAME
, show_val
, 6),
500 static struct sensor_template ro_cap_attrs
[] = {
501 RO_SENSOR_TEMPLATE(POWER_CAP_NAME
, show_cap
, 0),
505 static struct sensor_template rw_cap_attrs
[] = {
506 RW_SENSOR_TEMPLATE(POWER_CAP_NAME
, show_cap
, set_cap
, 0),
510 static struct sensor_template trip_attrs
[] = {
511 RW_SENSOR_TEMPLATE("power1_average_min", show_val
, set_trip
, 7),
512 RW_SENSOR_TEMPLATE("power1_average_max", show_val
, set_trip
, 8),
516 static struct sensor_template misc_attrs
[] = {
517 RO_SENSOR_TEMPLATE("name", show_name
, 0),
518 RO_SENSOR_TEMPLATE("power1_model_number", show_str
, 0),
519 RO_SENSOR_TEMPLATE("power1_oem_info", show_str
, 2),
520 RO_SENSOR_TEMPLATE("power1_serial_number", show_str
, 1),
524 #undef RO_SENSOR_TEMPLATE
525 #undef RW_SENSOR_TEMPLATE
527 /* Read power domain data */
528 static void remove_domain_devices(struct acpi_power_meter_resource
*resource
)
532 if (!resource
->num_domain_devices
)
535 for (i
= 0; i
< resource
->num_domain_devices
; i
++) {
536 struct acpi_device
*obj
= resource
->domain_devices
[i
];
541 sysfs_remove_link(resource
->holders_dir
,
542 kobject_name(&obj
->dev
.kobj
));
546 kfree(resource
->domain_devices
);
547 kobject_put(resource
->holders_dir
);
548 resource
->num_domain_devices
= 0;
551 static int read_domain_devices(struct acpi_power_meter_resource
*resource
)
555 struct acpi_buffer buffer
= { ACPI_ALLOCATE_BUFFER
, NULL
};
556 union acpi_object
*pss
;
559 status
= acpi_evaluate_object(resource
->acpi_dev
->handle
, "_PMD", NULL
,
561 if (ACPI_FAILURE(status
)) {
562 acpi_evaluation_failure_warn(resource
->acpi_dev
->handle
, "_PMD",
567 pss
= buffer
.pointer
;
569 pss
->type
!= ACPI_TYPE_PACKAGE
) {
570 dev_err(&resource
->acpi_dev
->dev
, ACPI_POWER_METER_NAME
571 "Invalid _PMD data\n");
576 if (!pss
->package
.count
)
579 resource
->domain_devices
= kcalloc(pss
->package
.count
,
580 sizeof(struct acpi_device
*),
582 if (!resource
->domain_devices
) {
587 resource
->holders_dir
= kobject_create_and_add("measures",
588 &resource
->acpi_dev
->dev
.kobj
);
589 if (!resource
->holders_dir
) {
594 resource
->num_domain_devices
= pss
->package
.count
;
596 for (i
= 0; i
< pss
->package
.count
; i
++) {
597 struct acpi_device
*obj
;
598 union acpi_object
*element
= &pss
->package
.elements
[i
];
600 /* Refuse non-references */
601 if (element
->type
!= ACPI_TYPE_LOCAL_REFERENCE
)
604 /* Create a symlink to domain objects */
605 obj
= acpi_get_acpi_dev(element
->reference
.handle
);
606 resource
->domain_devices
[i
] = obj
;
610 res
= sysfs_create_link(resource
->holders_dir
, &obj
->dev
.kobj
,
611 kobject_name(&obj
->dev
.kobj
));
614 resource
->domain_devices
[i
] = NULL
;
622 kfree(resource
->domain_devices
);
624 kfree(buffer
.pointer
);
628 /* Registration and deregistration */
629 static int register_attrs(struct acpi_power_meter_resource
*resource
,
630 struct sensor_template
*attrs
)
632 struct device
*dev
= &resource
->acpi_dev
->dev
;
633 struct sensor_device_attribute
*sensors
=
634 &resource
->sensors
[resource
->num_sensors
];
637 while (attrs
->label
) {
638 sensors
->dev_attr
.attr
.name
= attrs
->label
;
639 sensors
->dev_attr
.attr
.mode
= 0444;
640 sensors
->dev_attr
.show
= attrs
->show
;
641 sensors
->index
= attrs
->index
;
644 sensors
->dev_attr
.attr
.mode
|= 0200;
645 sensors
->dev_attr
.store
= attrs
->set
;
648 sysfs_attr_init(&sensors
->dev_attr
.attr
);
649 res
= device_create_file(dev
, &sensors
->dev_attr
);
651 sensors
->dev_attr
.attr
.name
= NULL
;
655 resource
->num_sensors
++;
663 static void remove_attrs(struct acpi_power_meter_resource
*resource
)
667 for (i
= 0; i
< resource
->num_sensors
; i
++) {
668 if (!resource
->sensors
[i
].dev_attr
.attr
.name
)
670 device_remove_file(&resource
->acpi_dev
->dev
,
671 &resource
->sensors
[i
].dev_attr
);
674 remove_domain_devices(resource
);
676 resource
->num_sensors
= 0;
679 static int setup_attrs(struct acpi_power_meter_resource
*resource
)
683 /* _PMD method is optional. */
684 res
= read_domain_devices(resource
);
688 if (resource
->caps
.flags
& POWER_METER_CAN_MEASURE
) {
689 res
= register_attrs(resource
, meter_attrs
);
694 if (resource
->caps
.flags
& POWER_METER_CAN_CAP
) {
695 if (!can_cap_in_hardware()) {
696 dev_warn(&resource
->acpi_dev
->dev
,
697 "Ignoring unsafe software power cap!\n");
698 goto skip_unsafe_cap
;
701 if (resource
->caps
.configurable_cap
)
702 res
= register_attrs(resource
, rw_cap_attrs
);
704 res
= register_attrs(resource
, ro_cap_attrs
);
709 res
= register_attrs(resource
, misc_cap_attrs
);
715 if (resource
->caps
.flags
& POWER_METER_CAN_TRIP
) {
716 res
= register_attrs(resource
, trip_attrs
);
721 res
= register_attrs(resource
, misc_attrs
);
727 remove_attrs(resource
);
731 static void free_capabilities(struct acpi_power_meter_resource
*resource
)
736 str
= &resource
->model_number
;
737 for (i
= 0; i
< 3; i
++, str
++) {
743 static int read_capabilities(struct acpi_power_meter_resource
*resource
)
747 struct acpi_buffer buffer
= { ACPI_ALLOCATE_BUFFER
, NULL
};
748 struct acpi_buffer state
= { 0, NULL
};
749 struct acpi_buffer format
= { sizeof("NNNNNNNNNNN"), "NNNNNNNNNNN" };
750 union acpi_object
*pss
;
754 status
= acpi_evaluate_object(resource
->acpi_dev
->handle
, "_PMC", NULL
,
756 if (ACPI_FAILURE(status
)) {
757 acpi_evaluation_failure_warn(resource
->acpi_dev
->handle
, "_PMC",
762 pss
= buffer
.pointer
;
764 pss
->type
!= ACPI_TYPE_PACKAGE
||
765 pss
->package
.count
!= 14) {
766 dev_err(&resource
->acpi_dev
->dev
, ACPI_POWER_METER_NAME
767 "Invalid _PMC data\n");
772 /* Grab all the integer data at once */
773 state
.length
= sizeof(struct acpi_power_meter_capabilities
);
774 state
.pointer
= &resource
->caps
;
776 status
= acpi_extract_package(pss
, &format
, &state
);
777 if (ACPI_FAILURE(status
)) {
778 dev_err(&resource
->acpi_dev
->dev
, ACPI_POWER_METER_NAME
779 "_PMC package parsing failed: %s\n",
780 acpi_format_exception(status
));
785 if (resource
->caps
.units
) {
786 dev_err(&resource
->acpi_dev
->dev
, ACPI_POWER_METER_NAME
787 "Unknown units %llu.\n",
788 resource
->caps
.units
);
793 /* Grab the string data */
794 str
= &resource
->model_number
;
796 for (i
= 11; i
< 14; i
++) {
797 union acpi_object
*element
= &pss
->package
.elements
[i
];
799 if (element
->type
!= ACPI_TYPE_STRING
) {
804 *str
= kmemdup_nul(element
->string
.pointer
, element
->string
.length
,
814 dev_info(&resource
->acpi_dev
->dev
, "Found ACPI power meter.\n");
817 free_capabilities(resource
);
819 kfree(buffer
.pointer
);
823 /* Handle ACPI event notifications */
824 static void acpi_power_meter_notify(struct acpi_device
*device
, u32 event
)
826 struct acpi_power_meter_resource
*resource
;
829 if (!device
|| !acpi_driver_data(device
))
832 resource
= acpi_driver_data(device
);
835 case METER_NOTIFY_CONFIG
:
836 mutex_lock(&resource
->lock
);
837 free_capabilities(resource
);
838 res
= read_capabilities(resource
);
839 mutex_unlock(&resource
->lock
);
843 remove_attrs(resource
);
844 setup_attrs(resource
);
846 case METER_NOTIFY_TRIP
:
847 sysfs_notify(&device
->dev
.kobj
, NULL
, POWER_AVERAGE_NAME
);
849 case METER_NOTIFY_CAP
:
850 sysfs_notify(&device
->dev
.kobj
, NULL
, POWER_CAP_NAME
);
852 case METER_NOTIFY_INTERVAL
:
853 sysfs_notify(&device
->dev
.kobj
, NULL
, POWER_AVG_INTERVAL_NAME
);
855 case METER_NOTIFY_CAPPING
:
856 sysfs_notify(&device
->dev
.kobj
, NULL
, POWER_ALARM_NAME
);
857 dev_info(&device
->dev
, "Capping in progress.\n");
860 WARN(1, "Unexpected event %d\n", event
);
864 acpi_bus_generate_netlink_event(ACPI_POWER_METER_CLASS
,
865 dev_name(&device
->dev
), event
, 0);
868 static int acpi_power_meter_add(struct acpi_device
*device
)
871 struct acpi_power_meter_resource
*resource
;
876 resource
= kzalloc(sizeof(*resource
), GFP_KERNEL
);
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
;
887 #if IS_REACHABLE(CONFIG_ACPI_IPMI)
889 * On Dell systems several methods of acpi_power_meter access
890 * variables in IPMI region, so wait until IPMI space handler is
891 * installed by acpi_ipmi and also wait until SMI is selected to make
892 * the space handler fully functional.
894 if (dmi_match(DMI_SYS_VENDOR
, "Dell Inc.")) {
895 struct acpi_device
*ipi_device
= acpi_dev_get_first_match_dev("IPI0001", NULL
, -1);
897 if (ipi_device
&& acpi_wait_for_acpi_ipmi())
898 dev_warn(&device
->dev
, "Waiting for ACPI IPMI timeout");
899 acpi_dev_put(ipi_device
);
903 res
= read_capabilities(resource
);
907 resource
->trip
[0] = -1;
908 resource
->trip
[1] = -1;
910 res
= setup_attrs(resource
);
912 goto exit_free_capability
;
914 resource
->hwmon_dev
= hwmon_device_register(&device
->dev
);
915 if (IS_ERR(resource
->hwmon_dev
)) {
916 res
= PTR_ERR(resource
->hwmon_dev
);
924 remove_attrs(resource
);
925 exit_free_capability
:
926 free_capabilities(resource
);
933 static void acpi_power_meter_remove(struct acpi_device
*device
)
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 remove_attrs(resource
);
944 free_capabilities(resource
);
949 static int acpi_power_meter_resume(struct device
*dev
)
951 struct acpi_power_meter_resource
*resource
;
956 resource
= acpi_driver_data(to_acpi_device(dev
));
960 free_capabilities(resource
);
961 read_capabilities(resource
);
966 static DEFINE_SIMPLE_DEV_PM_OPS(acpi_power_meter_pm
, NULL
,
967 acpi_power_meter_resume
);
969 static struct acpi_driver acpi_power_meter_driver
= {
970 .name
= "power_meter",
971 .class = ACPI_POWER_METER_CLASS
,
972 .ids
= power_meter_ids
,
974 .add
= acpi_power_meter_add
,
975 .remove
= acpi_power_meter_remove
,
976 .notify
= acpi_power_meter_notify
,
978 .drv
.pm
= pm_sleep_ptr(&acpi_power_meter_pm
),
981 /* Module init/exit routines */
982 static int __init
enable_cap_knobs(const struct dmi_system_id
*d
)
988 static const struct dmi_system_id pm_dmi_table
[] __initconst
= {
990 enable_cap_knobs
, "IBM Active Energy Manager",
992 DMI_MATCH(DMI_SYS_VENDOR
, "IBM")
998 static int __init
acpi_power_meter_init(void)
1005 dmi_check_system(pm_dmi_table
);
1007 result
= acpi_bus_register_driver(&acpi_power_meter_driver
);
1014 static void __exit
acpi_power_meter_exit(void)
1016 acpi_bus_unregister_driver(&acpi_power_meter_driver
);
1019 MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");
1020 MODULE_DESCRIPTION("ACPI 4.0 power meter driver");
1021 MODULE_LICENSE("GPL");
1023 module_param(force_cap_on
, bool, 0644);
1024 MODULE_PARM_DESC(force_cap_on
, "Enable power cap even it is unsafe to do so.");
1026 module_init(acpi_power_meter_init
);
1027 module_exit(acpi_power_meter_exit
);