2 * acpi_sbs.c - ACPI Smart Battery System Driver ($Revision: 1.16 $)
4 * Copyright (c) 2005 Rich Townsend <rhdt@bartol.udel.edu>
6 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or (at
11 * your option) any later version.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25 #include <linux/init.h>
26 #include <linux/module.h>
27 #include <linux/moduleparam.h>
28 #include <linux/kernel.h>
29 #include <linux/proc_fs.h>
30 #include <linux/seq_file.h>
31 #include <asm/uaccess.h>
32 #include <linux/acpi.h>
33 #include <linux/timer.h>
34 #include <linux/jiffies.h>
35 #include <linux/delay.h>
39 #define ACPI_SBS_COMPONENT 0x00080000
40 #define ACPI_SBS_CLASS "sbs"
41 #define ACPI_AC_CLASS "ac_adapter"
42 #define ACPI_BATTERY_CLASS "battery"
43 #define ACPI_SBS_DEVICE_NAME "Smart Battery System"
44 #define ACPI_SBS_FILE_INFO "info"
45 #define ACPI_SBS_FILE_STATE "state"
46 #define ACPI_SBS_FILE_ALARM "alarm"
47 #define ACPI_BATTERY_DIR_NAME "BAT%i"
48 #define ACPI_AC_DIR_NAME "AC0"
49 #define ACPI_SBC_SMBUS_ADDR 0x9
50 #define ACPI_SBSM_SMBUS_ADDR 0xa
51 #define ACPI_SB_SMBUS_ADDR 0xb
52 #define ACPI_SBS_AC_NOTIFY_STATUS 0x80
53 #define ACPI_SBS_BATTERY_NOTIFY_STATUS 0x80
54 #define ACPI_SBS_BATTERY_NOTIFY_INFO 0x81
56 #define _COMPONENT ACPI_SBS_COMPONENT
58 ACPI_MODULE_NAME("sbs");
60 MODULE_AUTHOR("Rich Townsend");
61 MODULE_DESCRIPTION("Smart Battery System ACPI interface driver");
62 MODULE_LICENSE("GPL");
64 #define DEF_CAPACITY_UNIT 3
65 #define MAH_CAPACITY_UNIT 1
66 #define MWH_CAPACITY_UNIT 2
67 #define CAPACITY_UNIT DEF_CAPACITY_UNIT
69 #define REQUEST_UPDATE_MODE 1
70 #define QUEUE_UPDATE_MODE 2
72 #define DATA_TYPE_COMMON 0
73 #define DATA_TYPE_INFO 1
74 #define DATA_TYPE_STATE 2
75 #define DATA_TYPE_ALARM 3
76 #define DATA_TYPE_AC_STATE 4
78 extern struct proc_dir_entry *acpi_lock_ac_dir(void);
79 extern struct proc_dir_entry *acpi_lock_battery_dir(void);
80 extern void acpi_unlock_ac_dir(struct proc_dir_entry *acpi_ac_dir);
81 extern void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir);
84 #define ACPI_SBS_BLOCK_MAX 32
86 #define UPDATE_DELAY 10
88 /* 0 - every time, > 0 - by update_time */
89 static unsigned int update_time = 120;
91 static unsigned int capacity_mode = CAPACITY_UNIT;
93 module_param(update_time, uint, 0644);
94 module_param(capacity_mode, uint, 0444);
96 static int acpi_sbs_add(struct acpi_device *device);
97 static int acpi_sbs_remove(struct acpi_device *device, int type);
98 static int acpi_sbs_resume(struct acpi_device *device);
100 static const struct acpi_device_id sbs_device_ids[] = {
104 MODULE_DEVICE_TABLE(acpi, sbs_device_ids);
106 static struct acpi_driver acpi_sbs_driver = {
108 .class = ACPI_SBS_CLASS,
109 .ids = sbs_device_ids,
112 .remove = acpi_sbs_remove,
113 .resume = acpi_sbs_resume,
121 struct acpi_battery_info {
123 s16 full_charge_capacity;
129 char manufacturer_name[ACPI_SBS_BLOCK_MAX + 3];
130 char device_name[ACPI_SBS_BLOCK_MAX + 3];
131 char device_chemistry[ACPI_SBS_BLOCK_MAX + 3];
134 struct acpi_battery_state {
137 s16 remaining_capacity;
141 struct acpi_battery_alarm {
142 s16 remaining_capacity;
145 struct acpi_battery {
150 struct acpi_sbs *sbs;
151 struct acpi_battery_info info;
152 struct acpi_battery_state state;
153 struct acpi_battery_alarm alarm;
154 struct proc_dir_entry *battery_entry;
158 struct acpi_device *device;
159 struct acpi_smb_hc *hc;
162 int sbsm_batteries_supported;
163 struct proc_dir_entry *ac_entry;
165 struct acpi_battery battery[MAX_SBS_BAT];
167 struct timer_list update_timer;
172 static int acpi_sbs_update_run(struct acpi_sbs *sbs, int id, int data_type);
173 static void acpi_sbs_update_time(void *data);
175 static int sbs_zombie(struct acpi_sbs *sbs)
177 return (sbs->zombie);
180 static int sbs_mutex_lock(struct acpi_sbs *sbs)
182 if (sbs_zombie(sbs)) {
185 mutex_lock(&sbs->mutex);
189 static void sbs_mutex_unlock(struct acpi_sbs *sbs)
191 mutex_unlock(&sbs->mutex);
194 /* --------------------------------------------------------------------------
195 Smart Battery System Management
196 -------------------------------------------------------------------------- */
198 static int acpi_check_update_proc(struct acpi_sbs *sbs)
200 acpi_status status = AE_OK;
202 if (update_time == 0) {
203 sbs->update_proc_flg = 0;
206 if (sbs->update_proc_flg == 0) {
207 status = acpi_os_execute(OSL_GPE_HANDLER,
208 acpi_sbs_update_time, sbs);
209 if (status != AE_OK) {
210 ACPI_EXCEPTION((AE_INFO, status,
211 "acpi_os_execute() failed"));
214 sbs->update_proc_flg = 1;
219 static int acpi_battery_get_present(struct acpi_battery *battery)
225 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD,
226 ACPI_SBSM_SMBUS_ADDR, 0x01, (u8 *)&state);
228 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
229 "acpi_smbus_read() failed"));
232 is_present = (state & 0x000f) & (1 << battery->id);
234 battery->battery_present = is_present;
239 static int acpi_battery_select(struct acpi_battery *battery)
241 struct acpi_sbs *sbs = battery->sbs;
246 if (sbs->sbsm_present) {
248 /* Take special care not to knobble other nibbles of
249 * state (aka selector_state), since
250 * it causes charging to halt on SBSELs */
253 acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SBSM_SMBUS_ADDR, 0x01, (u8 *)&state);
255 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
256 "acpi_smbus_read() failed"));
260 foo = (state & 0x0fff) | (1 << (battery->id + 12));
262 acpi_smbus_write(battery->sbs->hc, SMBUS_WRITE_WORD, ACPI_SBSM_SMBUS_ADDR, 0x01, (u8 *)&foo, 2);
264 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
265 "acpi_smbus_write() failed"));
274 static int acpi_sbsm_get_info(struct acpi_sbs *sbs)
277 s16 battery_system_info;
279 result = acpi_smbus_read(sbs->hc, SMBUS_READ_WORD, ACPI_SBSM_SMBUS_ADDR, 0x04,
280 (u8 *)&battery_system_info);
282 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
283 "acpi_smbus_read() failed"));
286 sbs->sbsm_present = 1;
287 sbs->sbsm_batteries_supported = battery_system_info & 0x000f;
294 static int acpi_battery_get_info(struct acpi_battery *battery)
298 s16 specification_info;
300 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x03,
301 (u8 *)&battery_mode);
303 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
304 "acpi_smbus_read() failed"));
307 battery->info.capacity_mode = (battery_mode & 0x8000) >> 15;
309 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x10,
310 (u8 *)&battery->info.full_charge_capacity);
312 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
313 "acpi_smbus_read() failed"));
317 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x18,
318 (u8 *)&battery->info.design_capacity);
321 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
322 "acpi_smbus_read() failed"));
326 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x19,
327 (u8 *)&battery->info.design_voltage);
329 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
330 "acpi_smbus_read() failed"));
334 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x1a,
335 (u8 *)&specification_info);
337 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
338 "acpi_smbus_read() failed"));
342 switch ((specification_info & 0x0f00) >> 8) {
344 battery->info.vscale = 10;
347 battery->info.vscale = 100;
350 battery->info.vscale = 1000;
353 battery->info.vscale = 1;
356 switch ((specification_info & 0xf000) >> 12) {
358 battery->info.ipscale = 10;
361 battery->info.ipscale = 100;
364 battery->info.ipscale = 1000;
367 battery->info.ipscale = 1;
370 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x1c,
371 (u8 *)&battery->info.serial_number);
373 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
374 "acpi_smbus_read() failed"));
378 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_BLOCK, ACPI_SB_SMBUS_ADDR, 0x20,
379 (u8 *)battery->info.manufacturer_name);
381 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
382 "acpi_sbs_read_str() failed"));
386 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_BLOCK, ACPI_SB_SMBUS_ADDR, 0x21,
387 (u8 *)battery->info.device_name);
389 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
390 "acpi_sbs_read_str() failed"));
394 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_BLOCK, ACPI_SB_SMBUS_ADDR, 0x22,
395 (u8 *)battery->info.device_chemistry);
397 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
398 "acpi_sbs_read_str() failed"));
406 static int acpi_battery_get_state(struct acpi_battery *battery)
410 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x09,
411 (u8 *)&battery->state.voltage);
413 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
414 "acpi_smbus_read() failed"));
418 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x0a,
419 (u8 *)&battery->state.amperage);
421 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
422 "acpi_smbus_read() failed"));
426 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x0f,
427 (u8 *)&battery->state.remaining_capacity);
429 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
430 "acpi_smbus_read() failed"));
434 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x16,
435 (u8 *)&battery->state.battery_state);
437 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
438 "acpi_smbus_read() failed"));
446 static int acpi_battery_get_alarm(struct acpi_battery *battery)
450 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x01,
451 (u8 *)&battery->alarm.remaining_capacity);
453 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
454 "acpi_smbus_read() failed"));
463 static int acpi_battery_set_alarm(struct acpi_battery *battery,
470 result = acpi_battery_select(battery);
472 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
473 "acpi_battery_select() failed"));
477 /* If necessary, enable the alarm */
481 acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x03,
482 (u8 *)&battery_mode);
484 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
485 "acpi_smbus_read() failed"));
489 battery_mode &= 0xbfff;
491 acpi_smbus_write(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x01,
492 (u8 *)&battery_mode, 2);
494 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
495 "acpi_smbus_write() failed"));
500 foo = alarm / (battery->info.capacity_mode ? 10 : 1);
501 result = acpi_smbus_write(battery->sbs->hc, SMBUS_READ_WORD, ACPI_SB_SMBUS_ADDR, 0x01, (u8 *)&foo, 2);
503 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
504 "acpi_smbus_write() failed"));
513 static int acpi_battery_set_mode(struct acpi_battery *battery)
518 if (capacity_mode == DEF_CAPACITY_UNIT) {
522 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD,
523 ACPI_SB_SMBUS_ADDR, 0x03, (u8 *)&battery_mode);
525 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
526 "acpi_smbus_read() failed"));
530 if (capacity_mode == MAH_CAPACITY_UNIT) {
531 battery_mode &= 0x7fff;
533 battery_mode |= 0x8000;
535 result = acpi_smbus_write(battery->sbs->hc, SMBUS_READ_WORD,
536 ACPI_SB_SMBUS_ADDR, 0x03, (u8 *)&battery_mode, 2);
538 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
539 "acpi_smbus_write() failed"));
543 result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD,
544 ACPI_SB_SMBUS_ADDR, 0x03, (u8 *)&battery_mode);
546 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
547 "acpi_smbus_read() failed"));
555 static int acpi_battery_init(struct acpi_battery *battery)
559 result = acpi_battery_select(battery);
561 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
562 "acpi_battery_select() failed"));
566 result = acpi_battery_set_mode(battery);
568 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
569 "acpi_battery_set_mode() failed"));
573 result = acpi_battery_get_info(battery);
575 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
576 "acpi_battery_get_info() failed"));
580 result = acpi_battery_get_state(battery);
582 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
583 "acpi_battery_get_state() failed"));
587 result = acpi_battery_get_alarm(battery);
589 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
590 "acpi_battery_get_alarm() failed"));
598 static int acpi_ac_get_present(struct acpi_sbs *sbs)
603 result = acpi_smbus_read(sbs->hc, SMBUS_READ_WORD, ACPI_SBC_SMBUS_ADDR, 0x13,
604 (u8 *)&charger_status);
607 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
608 "acpi_smbus_read() failed"));
612 sbs->ac.ac_present = (charger_status & 0x8000) >> 15;
619 /* --------------------------------------------------------------------------
620 FS Interface (/proc/acpi)
621 -------------------------------------------------------------------------- */
623 /* Generic Routines */
626 acpi_sbs_generic_add_fs(struct proc_dir_entry **dir,
627 struct proc_dir_entry *parent_dir,
629 struct file_operations *info_fops,
630 struct file_operations *state_fops,
631 struct file_operations *alarm_fops, void *data)
633 struct proc_dir_entry *entry = NULL;
636 *dir = proc_mkdir(dir_name, parent_dir);
638 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
639 "proc_mkdir() failed"));
642 (*dir)->owner = THIS_MODULE;
647 entry = create_proc_entry(ACPI_SBS_FILE_INFO, S_IRUGO, *dir);
649 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
650 "create_proc_entry() failed"));
652 entry->proc_fops = info_fops;
654 entry->owner = THIS_MODULE;
660 entry = create_proc_entry(ACPI_SBS_FILE_STATE, S_IRUGO, *dir);
662 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
663 "create_proc_entry() failed"));
665 entry->proc_fops = state_fops;
667 entry->owner = THIS_MODULE;
673 entry = create_proc_entry(ACPI_SBS_FILE_ALARM, S_IRUGO, *dir);
675 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
676 "create_proc_entry() failed"));
678 entry->proc_fops = alarm_fops;
680 entry->owner = THIS_MODULE;
688 acpi_sbs_generic_remove_fs(struct proc_dir_entry **dir,
689 struct proc_dir_entry *parent_dir)
693 remove_proc_entry(ACPI_SBS_FILE_INFO, *dir);
694 remove_proc_entry(ACPI_SBS_FILE_STATE, *dir);
695 remove_proc_entry(ACPI_SBS_FILE_ALARM, *dir);
696 remove_proc_entry((*dir)->name, parent_dir);
702 /* Smart Battery Interface */
704 static struct proc_dir_entry *acpi_battery_dir = NULL;
706 static int acpi_battery_read_info(struct seq_file *seq, void *offset)
708 struct acpi_battery *battery = seq->private;
709 struct acpi_sbs *sbs = battery->sbs;
713 if (sbs_mutex_lock(sbs)) {
717 result = acpi_check_update_proc(sbs);
721 if (update_time == 0) {
722 result = acpi_sbs_update_run(sbs, battery->id, DATA_TYPE_INFO);
724 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
725 "acpi_sbs_update_run() failed"));
729 if (battery->battery_present) {
730 seq_printf(seq, "present: yes\n");
732 seq_printf(seq, "present: no\n");
736 if (battery->info.capacity_mode) {
737 cscale = battery->info.vscale * battery->info.ipscale;
739 cscale = battery->info.ipscale;
741 seq_printf(seq, "design capacity: %i%s\n",
742 battery->info.design_capacity * cscale,
743 battery->info.capacity_mode ? "0 mWh" : " mAh");
745 seq_printf(seq, "last full capacity: %i%s\n",
746 battery->info.full_charge_capacity * cscale,
747 battery->info.capacity_mode ? "0 mWh" : " mAh");
749 seq_printf(seq, "battery technology: rechargeable\n");
751 seq_printf(seq, "design voltage: %i mV\n",
752 battery->info.design_voltage * battery->info.vscale);
754 seq_printf(seq, "design capacity warning: unknown\n");
755 seq_printf(seq, "design capacity low: unknown\n");
756 seq_printf(seq, "capacity granularity 1: unknown\n");
757 seq_printf(seq, "capacity granularity 2: unknown\n");
759 seq_printf(seq, "model number: %s\n",
760 battery->info.device_name);
762 seq_printf(seq, "serial number: %i\n",
763 battery->info.serial_number);
765 seq_printf(seq, "battery type: %s\n",
766 battery->info.device_chemistry);
768 seq_printf(seq, "OEM info: %s\n",
769 battery->info.manufacturer_name);
773 sbs_mutex_unlock(sbs);
778 static int acpi_battery_info_open_fs(struct inode *inode, struct file *file)
780 return single_open(file, acpi_battery_read_info, PDE(inode)->data);
783 static int acpi_battery_read_state(struct seq_file *seq, void *offset)
785 struct acpi_battery *battery = seq->private;
786 struct acpi_sbs *sbs = battery->sbs;
791 if (sbs_mutex_lock(sbs)) {
795 result = acpi_check_update_proc(sbs);
799 if (update_time == 0) {
800 result = acpi_sbs_update_run(sbs, battery->id, DATA_TYPE_STATE);
802 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
803 "acpi_sbs_update_run() failed"));
807 if (battery->battery_present) {
808 seq_printf(seq, "present: yes\n");
810 seq_printf(seq, "present: no\n");
814 if (battery->info.capacity_mode) {
815 cscale = battery->info.vscale * battery->info.ipscale;
817 cscale = battery->info.ipscale;
820 if (battery->state.battery_state & 0x0010) {
821 seq_printf(seq, "capacity state: critical\n");
823 seq_printf(seq, "capacity state: ok\n");
826 foo = (s16) battery->state.amperage * battery->info.ipscale;
827 if (battery->info.capacity_mode) {
828 foo = foo * battery->info.design_voltage / 1000;
830 if (battery->state.amperage < 0) {
831 seq_printf(seq, "charging state: discharging\n");
832 seq_printf(seq, "present rate: %d %s\n",
833 -foo, battery->info.capacity_mode ? "mW" : "mA");
834 } else if (battery->state.amperage > 0) {
835 seq_printf(seq, "charging state: charging\n");
836 seq_printf(seq, "present rate: %d %s\n",
837 foo, battery->info.capacity_mode ? "mW" : "mA");
839 seq_printf(seq, "charging state: charged\n");
840 seq_printf(seq, "present rate: 0 %s\n",
841 battery->info.capacity_mode ? "mW" : "mA");
844 seq_printf(seq, "remaining capacity: %i%s\n",
845 battery->state.remaining_capacity * cscale,
846 battery->info.capacity_mode ? "0 mWh" : " mAh");
848 seq_printf(seq, "present voltage: %i mV\n",
849 battery->state.voltage * battery->info.vscale);
853 sbs_mutex_unlock(sbs);
858 static int acpi_battery_state_open_fs(struct inode *inode, struct file *file)
860 return single_open(file, acpi_battery_read_state, PDE(inode)->data);
863 static int acpi_battery_read_alarm(struct seq_file *seq, void *offset)
865 struct acpi_battery *battery = seq->private;
866 struct acpi_sbs *sbs = battery->sbs;
870 if (sbs_mutex_lock(sbs)) {
874 result = acpi_check_update_proc(sbs);
878 if (update_time == 0) {
879 result = acpi_sbs_update_run(sbs, battery->id, DATA_TYPE_ALARM);
881 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
882 "acpi_sbs_update_run() failed"));
886 if (!battery->battery_present) {
887 seq_printf(seq, "present: no\n");
891 if (battery->info.capacity_mode) {
892 cscale = battery->info.vscale * battery->info.ipscale;
894 cscale = battery->info.ipscale;
897 seq_printf(seq, "alarm: ");
898 if (battery->alarm.remaining_capacity) {
899 seq_printf(seq, "%i%s\n",
900 battery->alarm.remaining_capacity * cscale,
901 battery->info.capacity_mode ? "0 mWh" : " mAh");
903 seq_printf(seq, "disabled\n");
908 sbs_mutex_unlock(sbs);
914 acpi_battery_write_alarm(struct file *file, const char __user * buffer,
915 size_t count, loff_t * ppos)
917 struct seq_file *seq = file->private_data;
918 struct acpi_battery *battery = seq->private;
919 struct acpi_sbs *sbs = battery->sbs;
920 char alarm_string[12] = { '\0' };
921 int result, old_alarm, new_alarm;
923 if (sbs_mutex_lock(sbs)) {
927 result = acpi_check_update_proc(sbs);
931 if (!battery->battery_present) {
936 if (count > sizeof(alarm_string) - 1) {
941 if (copy_from_user(alarm_string, buffer, count)) {
946 alarm_string[count] = 0;
948 old_alarm = battery->alarm.remaining_capacity;
949 new_alarm = simple_strtoul(alarm_string, NULL, 0);
951 result = acpi_battery_set_alarm(battery, new_alarm);
953 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
954 "acpi_battery_set_alarm() failed"));
955 acpi_battery_set_alarm(battery, old_alarm);
958 result = acpi_battery_get_alarm(battery);
960 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
961 "acpi_battery_get_alarm() failed"));
962 acpi_battery_set_alarm(battery, old_alarm);
967 sbs_mutex_unlock(sbs);
976 static int acpi_battery_alarm_open_fs(struct inode *inode, struct file *file)
978 return single_open(file, acpi_battery_read_alarm, PDE(inode)->data);
981 static struct file_operations acpi_battery_info_fops = {
982 .open = acpi_battery_info_open_fs,
985 .release = single_release,
986 .owner = THIS_MODULE,
989 static struct file_operations acpi_battery_state_fops = {
990 .open = acpi_battery_state_open_fs,
993 .release = single_release,
994 .owner = THIS_MODULE,
997 static struct file_operations acpi_battery_alarm_fops = {
998 .open = acpi_battery_alarm_open_fs,
1000 .write = acpi_battery_write_alarm,
1001 .llseek = seq_lseek,
1002 .release = single_release,
1003 .owner = THIS_MODULE,
1006 /* Legacy AC Adapter Interface */
1008 static struct proc_dir_entry *acpi_ac_dir = NULL;
1010 static int acpi_ac_read_state(struct seq_file *seq, void *offset)
1012 struct acpi_sbs *sbs = seq->private;
1015 if (sbs_mutex_lock(sbs)) {
1019 if (update_time == 0) {
1020 result = acpi_sbs_update_run(sbs, -1, DATA_TYPE_AC_STATE);
1022 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1023 "acpi_sbs_update_run() failed"));
1027 seq_printf(seq, "state: %s\n",
1028 sbs->ac.ac_present ? "on-line" : "off-line");
1030 sbs_mutex_unlock(sbs);
1035 static int acpi_ac_state_open_fs(struct inode *inode, struct file *file)
1037 return single_open(file, acpi_ac_read_state, PDE(inode)->data);
1040 static struct file_operations acpi_ac_state_fops = {
1041 .open = acpi_ac_state_open_fs,
1043 .llseek = seq_lseek,
1044 .release = single_release,
1045 .owner = THIS_MODULE,
1048 /* --------------------------------------------------------------------------
1050 -------------------------------------------------------------------------- */
1054 static int acpi_battery_add(struct acpi_sbs *sbs, int id)
1059 struct acpi_battery *battery;
1061 battery = &sbs->battery[id];
1065 battery->init_state = 0;
1069 result = acpi_battery_select(battery);
1071 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1072 "acpi_battery_select() failed"));
1076 result = acpi_battery_get_present(battery);
1078 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1079 "acpi_battery_get_present() failed"));
1083 is_present = battery->battery_present;
1086 result = acpi_battery_init(battery);
1088 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1089 "acpi_battery_init() failed"));
1092 battery->init_state = 1;
1095 sprintf(dir_name, ACPI_BATTERY_DIR_NAME, id);
1097 result = acpi_sbs_generic_add_fs(&battery->battery_entry,
1100 &acpi_battery_info_fops,
1101 &acpi_battery_state_fops,
1102 &acpi_battery_alarm_fops, battery);
1104 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1105 "acpi_sbs_generic_add_fs() failed"));
1110 printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n",
1111 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device), dir_name,
1112 sbs->battery->battery_present ? "present" : "absent");
1118 static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
1121 if (sbs->battery[id].battery_entry) {
1122 acpi_sbs_generic_remove_fs(&(sbs->battery[id].battery_entry),
1127 static int acpi_ac_add(struct acpi_sbs *sbs)
1131 result = acpi_ac_get_present(sbs);
1133 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1134 "acpi_ac_get_present() failed"));
1138 result = acpi_sbs_generic_add_fs(&sbs->ac_entry,
1141 NULL, &acpi_ac_state_fops, NULL, sbs);
1143 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1144 "acpi_sbs_generic_add_fs() failed"));
1148 printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n",
1149 ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
1150 ACPI_AC_DIR_NAME, sbs->ac.ac_present ? "on-line" : "off-line");
1157 static void acpi_ac_remove(struct acpi_sbs *sbs)
1160 if (sbs->ac_entry) {
1161 acpi_sbs_generic_remove_fs(&sbs->ac_entry, acpi_ac_dir);
1165 static void acpi_sbs_update_time_run(unsigned long data)
1167 acpi_os_execute(OSL_GPE_HANDLER, acpi_sbs_update_time, (void *)data);
1170 static int acpi_sbs_update_run(struct acpi_sbs *sbs, int id, int data_type)
1172 struct acpi_battery *battery;
1173 int result = 0, cnt;
1174 int old_ac_present = -1;
1175 int old_battery_present = -1;
1176 int new_ac_present = -1;
1177 int new_battery_present = -1;
1178 int id_min = 0, id_max = MAX_SBS_BAT - 1;
1180 int do_battery_init = 0, do_ac_init = 0;
1181 int old_remaining_capacity = 0;
1182 int update_battery = 1;
1183 int up_tm = update_time;
1185 if (sbs_zombie(sbs)) {
1190 id_min = id_max = id;
1193 if (data_type == DATA_TYPE_COMMON && up_tm > 0) {
1194 cnt = up_tm / (up_tm > UPDATE_DELAY ? UPDATE_DELAY : up_tm);
1195 if (sbs->run_cnt % cnt != 0) {
1202 old_ac_present = sbs->ac.ac_present;
1204 result = acpi_ac_get_present(sbs);
1206 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1207 "acpi_ac_get_present() failed"));
1210 new_ac_present = sbs->ac.ac_present;
1212 do_ac_init = (old_ac_present != new_ac_present);
1213 if (sbs->run_cnt == 1 && data_type == DATA_TYPE_COMMON) {
1218 result = acpi_bus_generate_proc_event4(ACPI_AC_CLASS,
1220 ACPI_SBS_AC_NOTIFY_STATUS,
1223 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1224 "acpi_bus_generate_event4() failed"));
1226 acpi_bus_generate_netlink_event(ACPI_AC_CLASS, ACPI_AC_DIR_NAME,
1227 ACPI_SBS_AC_NOTIFY_STATUS,
1231 if (data_type == DATA_TYPE_COMMON) {
1232 if (!do_ac_init && !update_battery) {
1237 if (data_type == DATA_TYPE_AC_STATE && !do_ac_init) {
1241 for (id = id_min; id <= id_max; id++) {
1242 battery = &sbs->battery[id];
1243 if (battery->alive == 0) {
1247 old_remaining_capacity = battery->state.remaining_capacity;
1249 old_battery_present = battery->battery_present;
1251 result = acpi_battery_select(battery);
1253 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1254 "acpi_battery_select() failed"));
1257 result = acpi_battery_get_present(battery);
1259 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1260 "acpi_battery_get_present() failed"));
1263 new_battery_present = battery->battery_present;
1265 do_battery_init = ((old_battery_present != new_battery_present)
1266 && new_battery_present);
1267 if (!new_battery_present)
1269 if (do_ac_init || do_battery_init) {
1270 result = acpi_battery_init(battery);
1272 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1273 "acpi_battery_init() "
1277 if (sbs_zombie(sbs)) {
1281 if ((data_type == DATA_TYPE_COMMON
1282 || data_type == DATA_TYPE_INFO)
1283 && new_battery_present) {
1284 result = acpi_battery_get_info(battery);
1286 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1287 "acpi_battery_get_info() failed"));
1290 if (data_type == DATA_TYPE_INFO) {
1293 if (sbs_zombie(sbs)) {
1297 if ((data_type == DATA_TYPE_COMMON
1298 || data_type == DATA_TYPE_STATE)
1299 && new_battery_present) {
1300 result = acpi_battery_get_state(battery);
1302 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1303 "acpi_battery_get_state() failed"));
1306 if (data_type == DATA_TYPE_STATE) {
1309 if (sbs_zombie(sbs)) {
1313 if ((data_type == DATA_TYPE_COMMON
1314 || data_type == DATA_TYPE_ALARM)
1315 && new_battery_present) {
1316 result = acpi_battery_get_alarm(battery);
1318 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1319 "acpi_battery_get_alarm() "
1323 if (data_type == DATA_TYPE_ALARM) {
1326 if (sbs_zombie(sbs)) {
1332 if (old_battery_present != new_battery_present || do_ac_init ||
1333 old_remaining_capacity !=
1334 battery->state.remaining_capacity) {
1335 sprintf(dir_name, ACPI_BATTERY_DIR_NAME, id);
1336 result = acpi_bus_generate_proc_event4(ACPI_BATTERY_CLASS,
1338 ACPI_SBS_BATTERY_NOTIFY_STATUS,
1339 new_battery_present);
1340 acpi_bus_generate_netlink_event(ACPI_BATTERY_CLASS, dir_name,
1341 ACPI_SBS_BATTERY_NOTIFY_STATUS,
1342 new_battery_present);
1344 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1345 "acpi_bus_generate_proc_event4() "
1356 static void acpi_sbs_update_time(void *data)
1358 struct acpi_sbs *sbs = data;
1359 unsigned long delay = -1;
1361 unsigned int up_tm = update_time;
1363 if (sbs_mutex_lock(sbs))
1366 result = acpi_sbs_update_run(sbs, -1, DATA_TYPE_COMMON);
1368 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1369 "acpi_sbs_update_run() failed"));
1372 if (sbs_zombie(sbs)) {
1377 if (timer_pending(&sbs->update_timer))
1378 del_timer(&sbs->update_timer);
1380 delay = (up_tm > UPDATE_DELAY ? UPDATE_DELAY : up_tm);
1381 delay = jiffies + HZ * delay;
1382 if (timer_pending(&sbs->update_timer)) {
1383 mod_timer(&sbs->update_timer, delay);
1385 sbs->update_timer.data = (unsigned long)data;
1386 sbs->update_timer.function = acpi_sbs_update_time_run;
1387 sbs->update_timer.expires = delay;
1388 add_timer(&sbs->update_timer);
1394 sbs_mutex_unlock(sbs);
1397 static int acpi_sbs_add(struct acpi_device *device)
1399 struct acpi_sbs *sbs = NULL;
1400 int result = 0, remove_result = 0;
1403 sbs = kzalloc(sizeof(struct acpi_sbs), GFP_KERNEL);
1405 ACPI_EXCEPTION((AE_INFO, AE_ERROR, "kzalloc() failed"));
1410 mutex_init(&sbs->mutex);
1412 sbs_mutex_lock(sbs);
1414 sbs->device = device;
1415 sbs->hc = acpi_driver_data(device->parent);
1417 strcpy(acpi_device_name(device), ACPI_SBS_DEVICE_NAME);
1418 strcpy(acpi_device_class(device), ACPI_SBS_CLASS);
1419 acpi_driver_data(device) = sbs;
1421 result = acpi_ac_add(sbs);
1423 ACPI_EXCEPTION((AE_INFO, AE_ERROR, "acpi_ac_add() failed"));
1427 acpi_sbsm_get_info(sbs);
1429 if (!sbs->sbsm_present) {
1430 result = acpi_battery_add(sbs, 0);
1432 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1433 "acpi_battery_add() failed"));
1437 for (id = 0; id < MAX_SBS_BAT; id++) {
1438 if ((sbs->sbsm_batteries_supported & (1 << id))) {
1439 result = acpi_battery_add(sbs, id);
1441 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1442 "acpi_battery_add() failed"));
1449 init_timer(&sbs->update_timer);
1450 result = acpi_check_update_proc(sbs);
1456 sbs_mutex_unlock(sbs);
1459 remove_result = acpi_sbs_remove(device, 0);
1460 if (remove_result) {
1461 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1462 "acpi_sbs_remove() failed"));
1469 static int acpi_sbs_remove(struct acpi_device *device, int type)
1471 struct acpi_sbs *sbs;
1478 sbs = acpi_driver_data(device);
1483 sbs_mutex_lock(sbs);
1486 del_timer_sync(&sbs->update_timer);
1487 acpi_os_wait_events_complete(NULL);
1488 del_timer_sync(&sbs->update_timer);
1490 for (id = 0; id < MAX_SBS_BAT; id++) {
1491 acpi_battery_remove(sbs, id);
1494 acpi_ac_remove(sbs);
1496 sbs_mutex_unlock(sbs);
1498 mutex_destroy(&sbs->mutex);
1505 static void acpi_sbs_rmdirs(void)
1508 acpi_unlock_ac_dir(acpi_ac_dir);
1511 if (acpi_battery_dir) {
1512 acpi_unlock_battery_dir(acpi_battery_dir);
1513 acpi_battery_dir = NULL;
1517 static int acpi_sbs_resume(struct acpi_device *device)
1519 struct acpi_sbs *sbs;
1524 sbs = device->driver_data;
1531 static int __init acpi_sbs_init(void)
1538 if (capacity_mode != DEF_CAPACITY_UNIT
1539 && capacity_mode != MAH_CAPACITY_UNIT
1540 && capacity_mode != MWH_CAPACITY_UNIT) {
1541 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1542 "invalid capacity_mode = %d", capacity_mode));
1546 acpi_ac_dir = acpi_lock_ac_dir();
1548 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1549 "acpi_lock_ac_dir() failed"));
1553 acpi_battery_dir = acpi_lock_battery_dir();
1554 if (!acpi_battery_dir) {
1555 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1556 "acpi_lock_battery_dir() failed"));
1561 result = acpi_bus_register_driver(&acpi_sbs_driver);
1563 ACPI_EXCEPTION((AE_INFO, AE_ERROR,
1564 "acpi_bus_register_driver() failed"));
1572 static void __exit acpi_sbs_exit(void)
1574 acpi_bus_unregister_driver(&acpi_sbs_driver);
1581 module_init(acpi_sbs_init);
1582 module_exit(acpi_sbs_exit);