2 * acpi_battery.c - ACPI Battery Driver ($Revision: 37 $)
4 * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
5 * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
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.
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.
23 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
26 #include <linux/kernel.h>
27 #include <linux/module.h>
28 #include <linux/init.h>
29 #include <linux/types.h>
30 #include <linux/proc_fs.h>
31 #include <linux/seq_file.h>
32 #include <asm/uaccess.h>
34 #include <acpi/acpi_bus.h>
35 #include <acpi/acpi_drivers.h>
37 #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
39 #define ACPI_BATTERY_FORMAT_BIF "NNNNNNNNNSSSS"
40 #define ACPI_BATTERY_FORMAT_BST "NNNN"
42 #define ACPI_BATTERY_COMPONENT 0x00040000
43 #define ACPI_BATTERY_CLASS "battery"
44 #define ACPI_BATTERY_HID "PNP0C0A"
45 #define ACPI_BATTERY_DEVICE_NAME "Battery"
46 #define ACPI_BATTERY_FILE_INFO "info"
47 #define ACPI_BATTERY_FILE_STATE "state"
48 #define ACPI_BATTERY_FILE_ALARM "alarm"
49 #define ACPI_BATTERY_NOTIFY_STATUS 0x80
50 #define ACPI_BATTERY_NOTIFY_INFO 0x81
51 #define ACPI_BATTERY_UNITS_WATTS "mW"
52 #define ACPI_BATTERY_UNITS_AMPS "mA"
54 #define _COMPONENT ACPI_BATTERY_COMPONENT
56 #define ACPI_BATTERY_UPDATE_TIME 0
58 #define ACPI_BATTERY_NONE_UPDATE 0
59 #define ACPI_BATTERY_EASY_UPDATE 1
60 #define ACPI_BATTERY_INIT_UPDATE 2
62 ACPI_MODULE_NAME("battery");
64 MODULE_AUTHOR("Paul Diefenbaugh");
65 MODULE_DESCRIPTION("ACPI Battery Driver");
66 MODULE_LICENSE("GPL");
68 static unsigned int update_time = ACPI_BATTERY_UPDATE_TIME;
70 /* 0 - every time, > 0 - by update_time */
71 module_param(update_time, uint, 0644);
73 extern struct proc_dir_entry *acpi_lock_battery_dir(void);
74 extern void *acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir);
76 static int acpi_battery_add(struct acpi_device *device);
77 static int acpi_battery_remove(struct acpi_device *device, int type);
78 static int acpi_battery_resume(struct acpi_device *device);
80 static struct acpi_driver acpi_battery_driver = {
82 .class = ACPI_BATTERY_CLASS,
83 .ids = ACPI_BATTERY_HID,
85 .add = acpi_battery_add,
86 .resume = acpi_battery_resume,
87 .remove = acpi_battery_remove,
91 struct acpi_battery_state {
93 acpi_integer present_rate;
94 acpi_integer remaining_capacity;
95 acpi_integer present_voltage;
98 struct acpi_battery_info {
99 acpi_integer power_unit;
100 acpi_integer design_capacity;
101 acpi_integer last_full_capacity;
102 acpi_integer battery_technology;
103 acpi_integer design_voltage;
104 acpi_integer design_capacity_warning;
105 acpi_integer design_capacity_low;
106 acpi_integer battery_capacity_granularity_1;
107 acpi_integer battery_capacity_granularity_2;
108 acpi_string model_number;
109 acpi_string serial_number;
110 acpi_string battery_type;
111 acpi_string oem_info;
114 struct acpi_battery_flags {
115 u8 battery_present_prev;
124 struct acpi_battery {
126 struct acpi_device *device;
127 struct acpi_battery_flags flags;
128 struct acpi_buffer bif_data;
129 struct acpi_buffer bst_data;
131 unsigned long info_update_time;
132 unsigned long state_update_time;
133 unsigned long alarm_update_time;
136 #define acpi_battery_present(battery) battery->device->status.battery_present
137 #define acpi_battery_present_prev(battery) battery->flags.battery_present_prev
138 #define acpi_battery_alarm_present(battery) battery->flags.alarm_present
139 #define acpi_battery_init_update_flag(battery) battery->flags.init_update
140 #define acpi_battery_info_update_flag(battery) battery->flags.info_update
141 #define acpi_battery_state_update_flag(battery) battery->flags.state_update
142 #define acpi_battery_alarm_update_flag(battery) battery->flags.alarm_update
143 #define acpi_battery_power_units(battery) battery->flags.power_unit ? \
144 ACPI_BATTERY_UNITS_AMPS : ACPI_BATTERY_UNITS_WATTS
145 #define acpi_battery_handle(battery) battery->device->handle
146 #define acpi_battery_inserted(battery) (!acpi_battery_present_prev(battery) & acpi_battery_present(battery))
147 #define acpi_battery_removed(battery) (acpi_battery_present_prev(battery) & !acpi_battery_present(battery))
148 #define acpi_battery_bid(battery) acpi_device_bid(battery->device)
149 #define acpi_battery_status_str(battery) acpi_battery_present(battery) ? "present" : "absent"
151 /* --------------------------------------------------------------------------
153 -------------------------------------------------------------------------- */
155 static void acpi_battery_mutex_lock(struct acpi_battery *battery)
157 mutex_lock(&battery->mutex);
160 static void acpi_battery_mutex_unlock(struct acpi_battery *battery)
162 mutex_unlock(&battery->mutex);
165 static void acpi_battery_check_result(struct acpi_battery *battery, int result)
171 acpi_battery_init_update_flag(battery) = 1;
175 static int acpi_battery_extract_package(struct acpi_battery *battery,
176 union acpi_object *package,
177 struct acpi_buffer *format,
178 struct acpi_buffer *data,
181 acpi_status status = AE_OK;
182 struct acpi_buffer data_null = { 0, NULL };
184 status = acpi_extract_package(package, format, &data_null);
185 if (status != AE_BUFFER_OVERFLOW) {
186 ACPI_EXCEPTION((AE_INFO, status, "Extracting size %s",
191 if (data_null.length != data->length) {
193 kfree(data->pointer);
195 data->pointer = kzalloc(data_null.length, GFP_KERNEL);
196 if (!data->pointer) {
197 ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY, "kzalloc()"));
200 data->length = data_null.length;
203 status = acpi_extract_package(package, format, data);
204 if (ACPI_FAILURE(status)) {
205 ACPI_EXCEPTION((AE_INFO, status, "Extracting %s",
213 static int acpi_battery_get_status(struct acpi_battery *battery)
217 result = acpi_bus_get_status(battery->device);
219 ACPI_EXCEPTION((AE_INFO, AE_ERROR, "Evaluating _STA"));
225 static int acpi_battery_get_info(struct acpi_battery *battery)
228 acpi_status status = 0;
229 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
230 struct acpi_buffer format = { sizeof(ACPI_BATTERY_FORMAT_BIF),
231 ACPI_BATTERY_FORMAT_BIF
233 union acpi_object *package = NULL;
234 struct acpi_buffer *data = NULL;
235 struct acpi_battery_info *bif = NULL;
237 battery->info_update_time = get_seconds();
239 if (!acpi_battery_present(battery))
245 acpi_evaluate_object(acpi_battery_handle(battery), "_BIF", NULL,
247 if (ACPI_FAILURE(status)) {
248 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _BIF"));
252 package = buffer.pointer;
254 data = &battery->bif_data;
256 /* Extract Package Data */
259 acpi_battery_extract_package(battery, package, &format, data,
266 if (buffer.pointer) {
267 kfree(buffer.pointer);
272 battery->flags.power_unit = bif->power_unit;
278 static int acpi_battery_get_state(struct acpi_battery *battery)
281 acpi_status status = 0;
282 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
283 struct acpi_buffer format = { sizeof(ACPI_BATTERY_FORMAT_BST),
284 ACPI_BATTERY_FORMAT_BST
286 union acpi_object *package = NULL;
287 struct acpi_buffer *data = NULL;
289 battery->state_update_time = get_seconds();
291 if (!acpi_battery_present(battery))
297 acpi_evaluate_object(acpi_battery_handle(battery), "_BST", NULL,
299 if (ACPI_FAILURE(status)) {
300 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _BST"));
304 package = buffer.pointer;
306 data = &battery->bst_data;
308 /* Extract Package Data */
311 acpi_battery_extract_package(battery, package, &format, data,
317 if (buffer.pointer) {
318 kfree(buffer.pointer);
324 static int acpi_battery_get_alarm(struct acpi_battery *battery)
326 battery->alarm_update_time = get_seconds();
331 static int acpi_battery_set_alarm(struct acpi_battery *battery,
334 acpi_status status = 0;
335 union acpi_object arg0 = { ACPI_TYPE_INTEGER };
336 struct acpi_object_list arg_list = { 1, &arg0 };
338 battery->alarm_update_time = get_seconds();
340 if (!acpi_battery_present(battery))
343 if (!acpi_battery_alarm_present(battery))
346 arg0.integer.value = alarm;
349 acpi_evaluate_object(acpi_battery_handle(battery), "_BTP",
351 if (ACPI_FAILURE(status))
354 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Alarm set to %d\n", (u32) alarm));
356 battery->alarm = alarm;
361 static int acpi_battery_init_alarm(struct acpi_battery *battery)
364 acpi_status status = AE_OK;
365 acpi_handle handle = NULL;
366 struct acpi_battery_info *bif = battery->bif_data.pointer;
367 unsigned long alarm = battery->alarm;
369 /* See if alarms are supported, and if so, set default */
371 status = acpi_get_handle(acpi_battery_handle(battery), "_BTP", &handle);
372 if (ACPI_SUCCESS(status)) {
373 acpi_battery_alarm_present(battery) = 1;
375 alarm = bif->design_capacity_warning;
377 result = acpi_battery_set_alarm(battery, alarm);
381 acpi_battery_alarm_present(battery) = 0;
389 static int acpi_battery_init_update(struct acpi_battery *battery)
393 result = acpi_battery_get_status(battery);
397 acpi_battery_present_prev(battery) = acpi_battery_present(battery);
399 if (acpi_battery_present(battery)) {
400 result = acpi_battery_get_info(battery);
403 result = acpi_battery_get_state(battery);
407 acpi_battery_init_alarm(battery);
413 static int acpi_battery_update(struct acpi_battery *battery,
414 int update, int *update_result_ptr)
417 int update_result = ACPI_BATTERY_NONE_UPDATE;
419 if (!acpi_battery_present(battery)) {
423 if (acpi_battery_init_update_flag(battery)) {
424 result = acpi_battery_init_update(battery);
427 update_result = ACPI_BATTERY_INIT_UPDATE;
429 result = acpi_battery_get_status(battery);
432 if (acpi_battery_inserted(battery)
433 || acpi_battery_removed(battery)) {
434 result = acpi_battery_init_update(battery);
437 update_result = ACPI_BATTERY_INIT_UPDATE;
439 update_result = ACPI_BATTERY_EASY_UPDATE;
445 acpi_battery_init_update_flag(battery) = (result != 0);
447 *update_result_ptr = update_result;
452 static void acpi_battery_notify_update(struct acpi_battery *battery)
454 acpi_battery_get_status(battery);
456 if (acpi_battery_init_update_flag(battery)) {
460 if (acpi_battery_inserted(battery) || acpi_battery_removed(battery)) {
461 acpi_battery_init_update_flag(battery) = 1;
463 acpi_battery_info_update_flag(battery) = 1;
464 acpi_battery_state_update_flag(battery) = 1;
465 acpi_battery_alarm_update_flag(battery) = 1;
469 /* --------------------------------------------------------------------------
471 -------------------------------------------------------------------------- */
473 static struct proc_dir_entry *acpi_battery_dir;
475 static int acpi_battery_read_info_print(struct seq_file *seq, int result)
477 struct acpi_battery *battery = seq->private;
478 struct acpi_battery_info *bif = NULL;
484 if (acpi_battery_present(battery))
485 seq_printf(seq, "present: yes\n");
487 seq_printf(seq, "present: no\n");
491 bif = battery->bif_data.pointer;
493 ACPI_EXCEPTION((AE_INFO, AE_ERROR, "BIF buffer is NULL"));
500 units = acpi_battery_power_units(battery);
502 if (bif->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
503 seq_printf(seq, "design capacity: unknown\n");
505 seq_printf(seq, "design capacity: %d %sh\n",
506 (u32) bif->design_capacity, units);
508 if (bif->last_full_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
509 seq_printf(seq, "last full capacity: unknown\n");
511 seq_printf(seq, "last full capacity: %d %sh\n",
512 (u32) bif->last_full_capacity, units);
514 switch ((u32) bif->battery_technology) {
516 seq_printf(seq, "battery technology: non-rechargeable\n");
519 seq_printf(seq, "battery technology: rechargeable\n");
522 seq_printf(seq, "battery technology: unknown\n");
526 if (bif->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
527 seq_printf(seq, "design voltage: unknown\n");
529 seq_printf(seq, "design voltage: %d mV\n",
530 (u32) bif->design_voltage);
531 seq_printf(seq, "design capacity warning: %d %sh\n",
532 (u32) bif->design_capacity_warning, units);
533 seq_printf(seq, "design capacity low: %d %sh\n",
534 (u32) bif->design_capacity_low, units);
535 seq_printf(seq, "capacity granularity 1: %d %sh\n",
536 (u32) bif->battery_capacity_granularity_1, units);
537 seq_printf(seq, "capacity granularity 2: %d %sh\n",
538 (u32) bif->battery_capacity_granularity_2, units);
539 seq_printf(seq, "model number: %s\n", bif->model_number);
540 seq_printf(seq, "serial number: %s\n", bif->serial_number);
541 seq_printf(seq, "battery type: %s\n", bif->battery_type);
542 seq_printf(seq, "OEM info: %s\n", bif->oem_info);
547 seq_printf(seq, "ERROR: Unable to read battery info\n");
552 static int acpi_battery_read_info(struct seq_file *seq, void *offset)
554 struct acpi_battery *battery = seq->private;
556 int update_result = ACPI_BATTERY_NONE_UPDATE;
559 acpi_battery_mutex_lock(battery);
561 update = (get_seconds() - battery->info_update_time >= update_time);
562 update = (update | acpi_battery_info_update_flag(battery));
564 result = acpi_battery_update(battery, update, &update_result);
568 /* Battery Info (_BIF) */
570 if (update_result == ACPI_BATTERY_EASY_UPDATE) {
571 result = acpi_battery_get_info(battery);
578 result = acpi_battery_read_info_print(seq, result);
580 acpi_battery_check_result(battery, result);
582 acpi_battery_info_update_flag(battery) = result;
584 acpi_battery_mutex_unlock(battery);
589 static int acpi_battery_info_open_fs(struct inode *inode, struct file *file)
591 return single_open(file, acpi_battery_read_info, PDE(inode)->data);
594 static int acpi_battery_read_state_print(struct seq_file *seq, int result)
596 struct acpi_battery *battery = seq->private;
597 struct acpi_battery_state *bst = NULL;
603 if (acpi_battery_present(battery))
604 seq_printf(seq, "present: yes\n");
606 seq_printf(seq, "present: no\n");
610 bst = battery->bst_data.pointer;
612 ACPI_EXCEPTION((AE_INFO, AE_ERROR, "BST buffer is NULL"));
619 units = acpi_battery_power_units(battery);
621 if (!(bst->state & 0x04))
622 seq_printf(seq, "capacity state: ok\n");
624 seq_printf(seq, "capacity state: critical\n");
626 if ((bst->state & 0x01) && (bst->state & 0x02)) {
628 "charging state: charging/discharging\n");
629 } else if (bst->state & 0x01)
630 seq_printf(seq, "charging state: discharging\n");
631 else if (bst->state & 0x02)
632 seq_printf(seq, "charging state: charging\n");
634 seq_printf(seq, "charging state: charged\n");
637 if (bst->present_rate == ACPI_BATTERY_VALUE_UNKNOWN)
638 seq_printf(seq, "present rate: unknown\n");
640 seq_printf(seq, "present rate: %d %s\n",
641 (u32) bst->present_rate, units);
643 if (bst->remaining_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
644 seq_printf(seq, "remaining capacity: unknown\n");
646 seq_printf(seq, "remaining capacity: %d %sh\n",
647 (u32) bst->remaining_capacity, units);
649 if (bst->present_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
650 seq_printf(seq, "present voltage: unknown\n");
652 seq_printf(seq, "present voltage: %d mV\n",
653 (u32) bst->present_voltage);
658 seq_printf(seq, "ERROR: Unable to read battery state\n");
664 static int acpi_battery_read_state(struct seq_file *seq, void *offset)
666 struct acpi_battery *battery = seq->private;
668 int update_result = ACPI_BATTERY_NONE_UPDATE;
671 acpi_battery_mutex_lock(battery);
673 update = (get_seconds() - battery->state_update_time >= update_time);
674 update = (update | acpi_battery_state_update_flag(battery));
676 result = acpi_battery_update(battery, update, &update_result);
680 /* Battery State (_BST) */
682 if (update_result == ACPI_BATTERY_EASY_UPDATE) {
683 result = acpi_battery_get_state(battery);
690 result = acpi_battery_read_state_print(seq, result);
692 acpi_battery_check_result(battery, result);
694 acpi_battery_state_update_flag(battery) = result;
696 acpi_battery_mutex_unlock(battery);
701 static int acpi_battery_state_open_fs(struct inode *inode, struct file *file)
703 return single_open(file, acpi_battery_read_state, PDE(inode)->data);
706 static int acpi_battery_read_alarm_print(struct seq_file *seq, int result)
708 struct acpi_battery *battery = seq->private;
714 if (!acpi_battery_present(battery)) {
715 seq_printf(seq, "present: no\n");
721 units = acpi_battery_power_units(battery);
723 seq_printf(seq, "alarm: ");
725 seq_printf(seq, "unsupported\n");
727 seq_printf(seq, "%lu %sh\n", battery->alarm, units);
732 seq_printf(seq, "ERROR: Unable to read battery alarm\n");
737 static int acpi_battery_read_alarm(struct seq_file *seq, void *offset)
739 struct acpi_battery *battery = seq->private;
741 int update_result = ACPI_BATTERY_NONE_UPDATE;
744 acpi_battery_mutex_lock(battery);
746 update = (get_seconds() - battery->alarm_update_time >= update_time);
747 update = (update | acpi_battery_alarm_update_flag(battery));
749 result = acpi_battery_update(battery, update, &update_result);
755 if (update_result == ACPI_BATTERY_EASY_UPDATE) {
756 result = acpi_battery_get_alarm(battery);
763 result = acpi_battery_read_alarm_print(seq, result);
765 acpi_battery_check_result(battery, result);
767 acpi_battery_alarm_update_flag(battery) = result;
769 acpi_battery_mutex_unlock(battery);
775 acpi_battery_write_alarm(struct file *file,
776 const char __user * buffer,
777 size_t count, loff_t * ppos)
780 char alarm_string[12] = { '\0' };
781 struct seq_file *m = file->private_data;
782 struct acpi_battery *battery = m->private;
783 int update_result = ACPI_BATTERY_NONE_UPDATE;
785 if (!battery || (count > sizeof(alarm_string) - 1))
788 acpi_battery_mutex_lock(battery);
790 result = acpi_battery_update(battery, 1, &update_result);
796 if (!acpi_battery_present(battery)) {
801 if (copy_from_user(alarm_string, buffer, count)) {
806 alarm_string[count] = '\0';
808 result = acpi_battery_set_alarm(battery,
809 simple_strtoul(alarm_string, NULL, 0));
815 acpi_battery_check_result(battery, result);
820 acpi_battery_mutex_unlock(battery);
825 static int acpi_battery_alarm_open_fs(struct inode *inode, struct file *file)
827 return single_open(file, acpi_battery_read_alarm, PDE(inode)->data);
830 static const struct file_operations acpi_battery_info_ops = {
831 .open = acpi_battery_info_open_fs,
834 .release = single_release,
835 .owner = THIS_MODULE,
838 static const struct file_operations acpi_battery_state_ops = {
839 .open = acpi_battery_state_open_fs,
842 .release = single_release,
843 .owner = THIS_MODULE,
846 static const struct file_operations acpi_battery_alarm_ops = {
847 .open = acpi_battery_alarm_open_fs,
849 .write = acpi_battery_write_alarm,
851 .release = single_release,
852 .owner = THIS_MODULE,
855 static int acpi_battery_add_fs(struct acpi_device *device)
857 struct proc_dir_entry *entry = NULL;
859 if (!acpi_device_dir(device)) {
860 acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
862 if (!acpi_device_dir(device))
864 acpi_device_dir(device)->owner = THIS_MODULE;
868 entry = create_proc_entry(ACPI_BATTERY_FILE_INFO,
869 S_IRUGO, acpi_device_dir(device));
873 entry->proc_fops = &acpi_battery_info_ops;
874 entry->data = acpi_driver_data(device);
875 entry->owner = THIS_MODULE;
879 entry = create_proc_entry(ACPI_BATTERY_FILE_STATE,
880 S_IRUGO, acpi_device_dir(device));
884 entry->proc_fops = &acpi_battery_state_ops;
885 entry->data = acpi_driver_data(device);
886 entry->owner = THIS_MODULE;
890 entry = create_proc_entry(ACPI_BATTERY_FILE_ALARM,
891 S_IFREG | S_IRUGO | S_IWUSR,
892 acpi_device_dir(device));
896 entry->proc_fops = &acpi_battery_alarm_ops;
897 entry->data = acpi_driver_data(device);
898 entry->owner = THIS_MODULE;
904 static int acpi_battery_remove_fs(struct acpi_device *device)
906 if (acpi_device_dir(device)) {
907 remove_proc_entry(ACPI_BATTERY_FILE_ALARM,
908 acpi_device_dir(device));
909 remove_proc_entry(ACPI_BATTERY_FILE_STATE,
910 acpi_device_dir(device));
911 remove_proc_entry(ACPI_BATTERY_FILE_INFO,
912 acpi_device_dir(device));
914 remove_proc_entry(acpi_device_bid(device), acpi_battery_dir);
915 acpi_device_dir(device) = NULL;
921 /* --------------------------------------------------------------------------
923 -------------------------------------------------------------------------- */
925 static void acpi_battery_notify(acpi_handle handle, u32 event, void *data)
927 struct acpi_battery *battery = data;
928 struct acpi_device *device = NULL;
933 device = battery->device;
936 case ACPI_BATTERY_NOTIFY_STATUS:
937 case ACPI_BATTERY_NOTIFY_INFO:
938 case ACPI_NOTIFY_BUS_CHECK:
939 case ACPI_NOTIFY_DEVICE_CHECK:
940 device = battery->device;
941 acpi_battery_notify_update(battery);
942 acpi_bus_generate_event(device, event,
943 acpi_battery_present(battery));
946 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
947 "Unsupported event [0x%x]\n", event));
954 static int acpi_battery_add(struct acpi_device *device)
957 acpi_status status = 0;
958 struct acpi_battery *battery = NULL;
963 battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL);
967 mutex_init(&battery->mutex);
969 acpi_battery_mutex_lock(battery);
971 battery->device = device;
972 strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME);
973 strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
974 acpi_driver_data(device) = battery;
976 result = acpi_battery_get_status(battery);
980 acpi_battery_init_update_flag(battery) = 1;
982 result = acpi_battery_add_fs(device);
986 status = acpi_install_notify_handler(device->handle,
988 acpi_battery_notify, battery);
989 if (ACPI_FAILURE(status)) {
990 ACPI_EXCEPTION((AE_INFO, status, "Installing notify handler"));
995 printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n",
996 ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
997 device->status.battery_present ? "present" : "absent");
1002 acpi_battery_remove_fs(device);
1006 acpi_battery_mutex_unlock(battery);
1011 static int acpi_battery_remove(struct acpi_device *device, int type)
1013 acpi_status status = 0;
1014 struct acpi_battery *battery = NULL;
1016 if (!device || !acpi_driver_data(device))
1019 battery = acpi_driver_data(device);
1021 acpi_battery_mutex_lock(battery);
1023 status = acpi_remove_notify_handler(device->handle,
1025 acpi_battery_notify);
1027 acpi_battery_remove_fs(device);
1029 if (battery->bif_data.pointer)
1030 kfree(battery->bif_data.pointer);
1032 if (battery->bst_data.pointer)
1033 kfree(battery->bst_data.pointer);
1035 acpi_battery_mutex_unlock(battery);
1037 mutex_destroy(&battery->mutex);
1044 /* this is needed to learn about changes made in suspended state */
1045 static int acpi_battery_resume(struct acpi_device *device)
1047 struct acpi_battery *battery;
1052 battery = device->driver_data;
1054 acpi_battery_init_update_flag(battery) = 1;
1059 static int __init acpi_battery_init(void)
1066 acpi_battery_dir = acpi_lock_battery_dir();
1067 if (!acpi_battery_dir)
1070 result = acpi_bus_register_driver(&acpi_battery_driver);
1072 acpi_unlock_battery_dir(acpi_battery_dir);
1079 static void __exit acpi_battery_exit(void)
1081 acpi_bus_unregister_driver(&acpi_battery_driver);
1083 acpi_unlock_battery_dir(acpi_battery_dir);
1088 module_init(acpi_battery_init);
1089 module_exit(acpi_battery_exit);