Version:  2.0.40 2.2.26 2.4.37 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2

Linux/drivers/acpi/battery.c

  1 /*
  2  *  battery.c - ACPI Battery Driver (Revision: 2.0)
  3  *
  4  *  Copyright (C) 2007 Alexey Starikovskiy <astarikovskiy@suse.de>
  5  *  Copyright (C) 2004-2007 Vladimir Lebedev <vladimir.p.lebedev@intel.com>
  6  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
  7  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
  8  *
  9  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 10  *
 11  *  This program is free software; you can redistribute it and/or modify
 12  *  it under the terms of the GNU General Public License as published by
 13  *  the Free Software Foundation; either version 2 of the License, or (at
 14  *  your option) any later version.
 15  *
 16  *  This program is distributed in the hope that it will be useful, but
 17  *  WITHOUT ANY WARRANTY; without even the implied warranty of
 18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 19  *  General Public License for more details.
 20  *
 21  *  You should have received a copy of the GNU General Public License along
 22  *  with this program; if not, write to the Free Software Foundation, Inc.,
 23  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 24  *
 25  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 26  */
 27 
 28 #include <linux/kernel.h>
 29 #include <linux/module.h>
 30 #include <linux/init.h>
 31 #include <linux/types.h>
 32 #include <linux/jiffies.h>
 33 #include <linux/async.h>
 34 #include <linux/dmi.h>
 35 #include <linux/delay.h>
 36 #include <linux/slab.h>
 37 #include <linux/suspend.h>
 38 #include <asm/unaligned.h>
 39 
 40 #ifdef CONFIG_ACPI_PROCFS_POWER
 41 #include <linux/proc_fs.h>
 42 #include <linux/seq_file.h>
 43 #include <asm/uaccess.h>
 44 #endif
 45 
 46 #include <linux/acpi.h>
 47 #include <linux/power_supply.h>
 48 
 49 #include "battery.h"
 50 
 51 #define PREFIX "ACPI: "
 52 
 53 #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
 54 
 55 #define ACPI_BATTERY_DEVICE_NAME        "Battery"
 56 
 57 /* Battery power unit: 0 means mW, 1 means mA */
 58 #define ACPI_BATTERY_POWER_UNIT_MA      1
 59 
 60 #define ACPI_BATTERY_STATE_DISCHARGING  0x1
 61 #define ACPI_BATTERY_STATE_CHARGING     0x2
 62 #define ACPI_BATTERY_STATE_CRITICAL     0x4
 63 
 64 #define _COMPONENT              ACPI_BATTERY_COMPONENT
 65 
 66 ACPI_MODULE_NAME("battery");
 67 
 68 MODULE_AUTHOR("Paul Diefenbaugh");
 69 MODULE_AUTHOR("Alexey Starikovskiy <astarikovskiy@suse.de>");
 70 MODULE_DESCRIPTION("ACPI Battery Driver");
 71 MODULE_LICENSE("GPL");
 72 
 73 static async_cookie_t async_cookie;
 74 static int battery_bix_broken_package;
 75 static int battery_notification_delay_ms;
 76 static unsigned int cache_time = 1000;
 77 module_param(cache_time, uint, 0644);
 78 MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
 79 
 80 #ifdef CONFIG_ACPI_PROCFS_POWER
 81 extern struct proc_dir_entry *acpi_lock_battery_dir(void);
 82 extern void *acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir);
 83 
 84 enum acpi_battery_files {
 85         info_tag = 0,
 86         state_tag,
 87         alarm_tag,
 88         ACPI_BATTERY_NUMFILES,
 89 };
 90 
 91 #endif
 92 
 93 static const struct acpi_device_id battery_device_ids[] = {
 94         {"PNP0C0A", 0},
 95         {"", 0},
 96 };
 97 
 98 MODULE_DEVICE_TABLE(acpi, battery_device_ids);
 99 
100 enum {
101         ACPI_BATTERY_ALARM_PRESENT,
102         ACPI_BATTERY_XINFO_PRESENT,
103         ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY,
104         /* On Lenovo Thinkpad models from 2010 and 2011, the power unit
105            switches between mWh and mAh depending on whether the system
106            is running on battery or not.  When mAh is the unit, most
107            reported values are incorrect and need to be adjusted by
108            10000/design_voltage.  Verified on x201, t410, t410s, and x220.
109            Pre-2010 and 2012 models appear to always report in mWh and
110            are thus unaffected (tested with t42, t61, t500, x200, x300,
111            and x230).  Also, in mid-2012 Lenovo issued a BIOS update for
112            the 2011 models that fixes the issue (tested on x220 with a
113            post-1.29 BIOS), but as of Nov. 2012, no such update is
114            available for the 2010 models.  */
115         ACPI_BATTERY_QUIRK_THINKPAD_MAH,
116 };
117 
118 struct acpi_battery {
119         struct mutex lock;
120         struct mutex sysfs_lock;
121         struct power_supply *bat;
122         struct power_supply_desc bat_desc;
123         struct acpi_device *device;
124         struct notifier_block pm_nb;
125         unsigned long update_time;
126         int revision;
127         int rate_now;
128         int capacity_now;
129         int voltage_now;
130         int design_capacity;
131         int full_charge_capacity;
132         int technology;
133         int design_voltage;
134         int design_capacity_warning;
135         int design_capacity_low;
136         int cycle_count;
137         int measurement_accuracy;
138         int max_sampling_time;
139         int min_sampling_time;
140         int max_averaging_interval;
141         int min_averaging_interval;
142         int capacity_granularity_1;
143         int capacity_granularity_2;
144         int alarm;
145         char model_number[32];
146         char serial_number[32];
147         char type[32];
148         char oem_info[32];
149         int state;
150         int power_unit;
151         unsigned long flags;
152 };
153 
154 #define to_acpi_battery(x) power_supply_get_drvdata(x)
155 
156 static inline int acpi_battery_present(struct acpi_battery *battery)
157 {
158         return battery->device->status.battery_present;
159 }
160 
161 static int acpi_battery_technology(struct acpi_battery *battery)
162 {
163         if (!strcasecmp("NiCd", battery->type))
164                 return POWER_SUPPLY_TECHNOLOGY_NiCd;
165         if (!strcasecmp("NiMH", battery->type))
166                 return POWER_SUPPLY_TECHNOLOGY_NiMH;
167         if (!strcasecmp("LION", battery->type))
168                 return POWER_SUPPLY_TECHNOLOGY_LION;
169         if (!strncasecmp("LI-ION", battery->type, 6))
170                 return POWER_SUPPLY_TECHNOLOGY_LION;
171         if (!strcasecmp("LiP", battery->type))
172                 return POWER_SUPPLY_TECHNOLOGY_LIPO;
173         return POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
174 }
175 
176 static int acpi_battery_get_state(struct acpi_battery *battery);
177 
178 static int acpi_battery_is_charged(struct acpi_battery *battery)
179 {
180         /* charging, discharging or critical low */
181         if (battery->state != 0)
182                 return 0;
183 
184         /* battery not reporting charge */
185         if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN ||
186             battery->capacity_now == 0)
187                 return 0;
188 
189         /* good batteries update full_charge as the batteries degrade */
190         if (battery->full_charge_capacity == battery->capacity_now)
191                 return 1;
192 
193         /* fallback to using design values for broken batteries */
194         if (battery->design_capacity == battery->capacity_now)
195                 return 1;
196 
197         /* we don't do any sort of metric based on percentages */
198         return 0;
199 }
200 
201 static int acpi_battery_get_property(struct power_supply *psy,
202                                      enum power_supply_property psp,
203                                      union power_supply_propval *val)
204 {
205         int ret = 0;
206         struct acpi_battery *battery = to_acpi_battery(psy);
207 
208         if (acpi_battery_present(battery)) {
209                 /* run battery update only if it is present */
210                 acpi_battery_get_state(battery);
211         } else if (psp != POWER_SUPPLY_PROP_PRESENT)
212                 return -ENODEV;
213         switch (psp) {
214         case POWER_SUPPLY_PROP_STATUS:
215                 if (battery->state & ACPI_BATTERY_STATE_DISCHARGING)
216                         val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
217                 else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
218                         val->intval = POWER_SUPPLY_STATUS_CHARGING;
219                 else if (acpi_battery_is_charged(battery))
220                         val->intval = POWER_SUPPLY_STATUS_FULL;
221                 else
222                         val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
223                 break;
224         case POWER_SUPPLY_PROP_PRESENT:
225                 val->intval = acpi_battery_present(battery);
226                 break;
227         case POWER_SUPPLY_PROP_TECHNOLOGY:
228                 val->intval = acpi_battery_technology(battery);
229                 break;
230         case POWER_SUPPLY_PROP_CYCLE_COUNT:
231                 val->intval = battery->cycle_count;
232                 break;
233         case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
234                 if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
235                         ret = -ENODEV;
236                 else
237                         val->intval = battery->design_voltage * 1000;
238                 break;
239         case POWER_SUPPLY_PROP_VOLTAGE_NOW:
240                 if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN)
241                         ret = -ENODEV;
242                 else
243                         val->intval = battery->voltage_now * 1000;
244                 break;
245         case POWER_SUPPLY_PROP_CURRENT_NOW:
246         case POWER_SUPPLY_PROP_POWER_NOW:
247                 if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
248                         ret = -ENODEV;
249                 else
250                         val->intval = battery->rate_now * 1000;
251                 break;
252         case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
253         case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
254                 if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
255                         ret = -ENODEV;
256                 else
257                         val->intval = battery->design_capacity * 1000;
258                 break;
259         case POWER_SUPPLY_PROP_CHARGE_FULL:
260         case POWER_SUPPLY_PROP_ENERGY_FULL:
261                 if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
262                         ret = -ENODEV;
263                 else
264                         val->intval = battery->full_charge_capacity * 1000;
265                 break;
266         case POWER_SUPPLY_PROP_CHARGE_NOW:
267         case POWER_SUPPLY_PROP_ENERGY_NOW:
268                 if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN)
269                         ret = -ENODEV;
270                 else
271                         val->intval = battery->capacity_now * 1000;
272                 break;
273         case POWER_SUPPLY_PROP_CAPACITY:
274                 if (battery->capacity_now && battery->full_charge_capacity)
275                         val->intval = battery->capacity_now * 100/
276                                         battery->full_charge_capacity;
277                 else
278                         val->intval = 0;
279                 break;
280         case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
281                 if (battery->state & ACPI_BATTERY_STATE_CRITICAL)
282                         val->intval = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
283                 else if (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
284                         (battery->capacity_now <= battery->alarm))
285                         val->intval = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
286                 else if (acpi_battery_is_charged(battery))
287                         val->intval = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
288                 else
289                         val->intval = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
290                 break;
291         case POWER_SUPPLY_PROP_MODEL_NAME:
292                 val->strval = battery->model_number;
293                 break;
294         case POWER_SUPPLY_PROP_MANUFACTURER:
295                 val->strval = battery->oem_info;
296                 break;
297         case POWER_SUPPLY_PROP_SERIAL_NUMBER:
298                 val->strval = battery->serial_number;
299                 break;
300         default:
301                 ret = -EINVAL;
302         }
303         return ret;
304 }
305 
306 static enum power_supply_property charge_battery_props[] = {
307         POWER_SUPPLY_PROP_STATUS,
308         POWER_SUPPLY_PROP_PRESENT,
309         POWER_SUPPLY_PROP_TECHNOLOGY,
310         POWER_SUPPLY_PROP_CYCLE_COUNT,
311         POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
312         POWER_SUPPLY_PROP_VOLTAGE_NOW,
313         POWER_SUPPLY_PROP_CURRENT_NOW,
314         POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
315         POWER_SUPPLY_PROP_CHARGE_FULL,
316         POWER_SUPPLY_PROP_CHARGE_NOW,
317         POWER_SUPPLY_PROP_CAPACITY,
318         POWER_SUPPLY_PROP_CAPACITY_LEVEL,
319         POWER_SUPPLY_PROP_MODEL_NAME,
320         POWER_SUPPLY_PROP_MANUFACTURER,
321         POWER_SUPPLY_PROP_SERIAL_NUMBER,
322 };
323 
324 static enum power_supply_property energy_battery_props[] = {
325         POWER_SUPPLY_PROP_STATUS,
326         POWER_SUPPLY_PROP_PRESENT,
327         POWER_SUPPLY_PROP_TECHNOLOGY,
328         POWER_SUPPLY_PROP_CYCLE_COUNT,
329         POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
330         POWER_SUPPLY_PROP_VOLTAGE_NOW,
331         POWER_SUPPLY_PROP_POWER_NOW,
332         POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
333         POWER_SUPPLY_PROP_ENERGY_FULL,
334         POWER_SUPPLY_PROP_ENERGY_NOW,
335         POWER_SUPPLY_PROP_CAPACITY,
336         POWER_SUPPLY_PROP_CAPACITY_LEVEL,
337         POWER_SUPPLY_PROP_MODEL_NAME,
338         POWER_SUPPLY_PROP_MANUFACTURER,
339         POWER_SUPPLY_PROP_SERIAL_NUMBER,
340 };
341 
342 /* --------------------------------------------------------------------------
343                                Battery Management
344    -------------------------------------------------------------------------- */
345 struct acpi_offsets {
346         size_t offset;          /* offset inside struct acpi_sbs_battery */
347         u8 mode;                /* int or string? */
348 };
349 
350 static const struct acpi_offsets state_offsets[] = {
351         {offsetof(struct acpi_battery, state), 0},
352         {offsetof(struct acpi_battery, rate_now), 0},
353         {offsetof(struct acpi_battery, capacity_now), 0},
354         {offsetof(struct acpi_battery, voltage_now), 0},
355 };
356 
357 static const struct acpi_offsets info_offsets[] = {
358         {offsetof(struct acpi_battery, power_unit), 0},
359         {offsetof(struct acpi_battery, design_capacity), 0},
360         {offsetof(struct acpi_battery, full_charge_capacity), 0},
361         {offsetof(struct acpi_battery, technology), 0},
362         {offsetof(struct acpi_battery, design_voltage), 0},
363         {offsetof(struct acpi_battery, design_capacity_warning), 0},
364         {offsetof(struct acpi_battery, design_capacity_low), 0},
365         {offsetof(struct acpi_battery, capacity_granularity_1), 0},
366         {offsetof(struct acpi_battery, capacity_granularity_2), 0},
367         {offsetof(struct acpi_battery, model_number), 1},
368         {offsetof(struct acpi_battery, serial_number), 1},
369         {offsetof(struct acpi_battery, type), 1},
370         {offsetof(struct acpi_battery, oem_info), 1},
371 };
372 
373 static const struct acpi_offsets extended_info_offsets[] = {
374         {offsetof(struct acpi_battery, revision), 0},
375         {offsetof(struct acpi_battery, power_unit), 0},
376         {offsetof(struct acpi_battery, design_capacity), 0},
377         {offsetof(struct acpi_battery, full_charge_capacity), 0},
378         {offsetof(struct acpi_battery, technology), 0},
379         {offsetof(struct acpi_battery, design_voltage), 0},
380         {offsetof(struct acpi_battery, design_capacity_warning), 0},
381         {offsetof(struct acpi_battery, design_capacity_low), 0},
382         {offsetof(struct acpi_battery, cycle_count), 0},
383         {offsetof(struct acpi_battery, measurement_accuracy), 0},
384         {offsetof(struct acpi_battery, max_sampling_time), 0},
385         {offsetof(struct acpi_battery, min_sampling_time), 0},
386         {offsetof(struct acpi_battery, max_averaging_interval), 0},
387         {offsetof(struct acpi_battery, min_averaging_interval), 0},
388         {offsetof(struct acpi_battery, capacity_granularity_1), 0},
389         {offsetof(struct acpi_battery, capacity_granularity_2), 0},
390         {offsetof(struct acpi_battery, model_number), 1},
391         {offsetof(struct acpi_battery, serial_number), 1},
392         {offsetof(struct acpi_battery, type), 1},
393         {offsetof(struct acpi_battery, oem_info), 1},
394 };
395 
396 static int extract_package(struct acpi_battery *battery,
397                            union acpi_object *package,
398                            const struct acpi_offsets *offsets, int num)
399 {
400         int i;
401         union acpi_object *element;
402         if (package->type != ACPI_TYPE_PACKAGE)
403                 return -EFAULT;
404         for (i = 0; i < num; ++i) {
405                 if (package->package.count <= i)
406                         return -EFAULT;
407                 element = &package->package.elements[i];
408                 if (offsets[i].mode) {
409                         u8 *ptr = (u8 *)battery + offsets[i].offset;
410                         if (element->type == ACPI_TYPE_STRING ||
411                             element->type == ACPI_TYPE_BUFFER)
412                                 strncpy(ptr, element->string.pointer, 32);
413                         else if (element->type == ACPI_TYPE_INTEGER) {
414                                 strncpy(ptr, (u8 *)&element->integer.value,
415                                         sizeof(u64));
416                                 ptr[sizeof(u64)] = 0;
417                         } else
418                                 *ptr = 0; /* don't have value */
419                 } else {
420                         int *x = (int *)((u8 *)battery + offsets[i].offset);
421                         *x = (element->type == ACPI_TYPE_INTEGER) ?
422                                 element->integer.value : -1;
423                 }
424         }
425         return 0;
426 }
427 
428 static int acpi_battery_get_status(struct acpi_battery *battery)
429 {
430         if (acpi_bus_get_status(battery->device)) {
431                 ACPI_EXCEPTION((AE_INFO, AE_ERROR, "Evaluating _STA"));
432                 return -ENODEV;
433         }
434         return 0;
435 }
436 
437 static int acpi_battery_get_info(struct acpi_battery *battery)
438 {
439         int result = -EFAULT;
440         acpi_status status = 0;
441         char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags) ?
442                         "_BIX" : "_BIF";
443 
444         struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
445 
446         if (!acpi_battery_present(battery))
447                 return 0;
448         mutex_lock(&battery->lock);
449         status = acpi_evaluate_object(battery->device->handle, name,
450                                                 NULL, &buffer);
451         mutex_unlock(&battery->lock);
452 
453         if (ACPI_FAILURE(status)) {
454                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s", name));
455                 return -ENODEV;
456         }
457 
458         if (battery_bix_broken_package)
459                 result = extract_package(battery, buffer.pointer,
460                                 extended_info_offsets + 1,
461                                 ARRAY_SIZE(extended_info_offsets) - 1);
462         else if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
463                 result = extract_package(battery, buffer.pointer,
464                                 extended_info_offsets,
465                                 ARRAY_SIZE(extended_info_offsets));
466         else
467                 result = extract_package(battery, buffer.pointer,
468                                 info_offsets, ARRAY_SIZE(info_offsets));
469         kfree(buffer.pointer);
470         if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
471                 battery->full_charge_capacity = battery->design_capacity;
472         if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) &&
473             battery->power_unit && battery->design_voltage) {
474                 battery->design_capacity = battery->design_capacity *
475                     10000 / battery->design_voltage;
476                 battery->full_charge_capacity = battery->full_charge_capacity *
477                     10000 / battery->design_voltage;
478                 battery->design_capacity_warning =
479                     battery->design_capacity_warning *
480                     10000 / battery->design_voltage;
481                 /* Curiously, design_capacity_low, unlike the rest of them,
482                    is correct.  */
483                 /* capacity_granularity_* equal 1 on the systems tested, so
484                    it's impossible to tell if they would need an adjustment
485                    or not if their values were higher.  */
486         }
487         return result;
488 }
489 
490 static int acpi_battery_get_state(struct acpi_battery *battery)
491 {
492         int result = 0;
493         acpi_status status = 0;
494         struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
495 
496         if (!acpi_battery_present(battery))
497                 return 0;
498 
499         if (battery->update_time &&
500             time_before(jiffies, battery->update_time +
501                         msecs_to_jiffies(cache_time)))
502                 return 0;
503 
504         mutex_lock(&battery->lock);
505         status = acpi_evaluate_object(battery->device->handle, "_BST",
506                                       NULL, &buffer);
507         mutex_unlock(&battery->lock);
508 
509         if (ACPI_FAILURE(status)) {
510                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _BST"));
511                 return -ENODEV;
512         }
513 
514         result = extract_package(battery, buffer.pointer,
515                                  state_offsets, ARRAY_SIZE(state_offsets));
516         battery->update_time = jiffies;
517         kfree(buffer.pointer);
518 
519         /* For buggy DSDTs that report negative 16-bit values for either
520          * charging or discharging current and/or report 0 as 65536
521          * due to bad math.
522          */
523         if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA &&
524                 battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN &&
525                 (s16)(battery->rate_now) < 0) {
526                 battery->rate_now = abs((s16)battery->rate_now);
527                 printk_once(KERN_WARNING FW_BUG
528                             "battery: (dis)charge rate invalid.\n");
529         }
530 
531         if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
532             && battery->capacity_now >= 0 && battery->capacity_now <= 100)
533                 battery->capacity_now = (battery->capacity_now *
534                                 battery->full_charge_capacity) / 100;
535         if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) &&
536             battery->power_unit && battery->design_voltage) {
537                 battery->capacity_now = battery->capacity_now *
538                     10000 / battery->design_voltage;
539         }
540         return result;
541 }
542 
543 static int acpi_battery_set_alarm(struct acpi_battery *battery)
544 {
545         acpi_status status = 0;
546 
547         if (!acpi_battery_present(battery) ||
548             !test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags))
549                 return -ENODEV;
550 
551         mutex_lock(&battery->lock);
552         status = acpi_execute_simple_method(battery->device->handle, "_BTP",
553                                             battery->alarm);
554         mutex_unlock(&battery->lock);
555 
556         if (ACPI_FAILURE(status))
557                 return -ENODEV;
558 
559         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Alarm set to %d\n", battery->alarm));
560         return 0;
561 }
562 
563 static int acpi_battery_init_alarm(struct acpi_battery *battery)
564 {
565         /* See if alarms are supported, and if so, set default */
566         if (!acpi_has_method(battery->device->handle, "_BTP")) {
567                 clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
568                 return 0;
569         }
570         set_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
571         if (!battery->alarm)
572                 battery->alarm = battery->design_capacity_warning;
573         return acpi_battery_set_alarm(battery);
574 }
575 
576 static ssize_t acpi_battery_alarm_show(struct device *dev,
577                                         struct device_attribute *attr,
578                                         char *buf)
579 {
580         struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
581         return sprintf(buf, "%d\n", battery->alarm * 1000);
582 }
583 
584 static ssize_t acpi_battery_alarm_store(struct device *dev,
585                                         struct device_attribute *attr,
586                                         const char *buf, size_t count)
587 {
588         unsigned long x;
589         struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
590         if (sscanf(buf, "%lu\n", &x) == 1)
591                 battery->alarm = x/1000;
592         if (acpi_battery_present(battery))
593                 acpi_battery_set_alarm(battery);
594         return count;
595 }
596 
597 static struct device_attribute alarm_attr = {
598         .attr = {.name = "alarm", .mode = 0644},
599         .show = acpi_battery_alarm_show,
600         .store = acpi_battery_alarm_store,
601 };
602 
603 static int sysfs_add_battery(struct acpi_battery *battery)
604 {
605         struct power_supply_config psy_cfg = { .drv_data = battery, };
606 
607         if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) {
608                 battery->bat_desc.properties = charge_battery_props;
609                 battery->bat_desc.num_properties =
610                         ARRAY_SIZE(charge_battery_props);
611         } else {
612                 battery->bat_desc.properties = energy_battery_props;
613                 battery->bat_desc.num_properties =
614                         ARRAY_SIZE(energy_battery_props);
615         }
616 
617         battery->bat_desc.name = acpi_device_bid(battery->device);
618         battery->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY;
619         battery->bat_desc.get_property = acpi_battery_get_property;
620 
621         battery->bat = power_supply_register_no_ws(&battery->device->dev,
622                                 &battery->bat_desc, &psy_cfg);
623 
624         if (IS_ERR(battery->bat)) {
625                 int result = PTR_ERR(battery->bat);
626 
627                 battery->bat = NULL;
628                 return result;
629         }
630         return device_create_file(&battery->bat->dev, &alarm_attr);
631 }
632 
633 static void sysfs_remove_battery(struct acpi_battery *battery)
634 {
635         mutex_lock(&battery->sysfs_lock);
636         if (!battery->bat) {
637                 mutex_unlock(&battery->sysfs_lock);
638                 return;
639         }
640 
641         device_remove_file(&battery->bat->dev, &alarm_attr);
642         power_supply_unregister(battery->bat);
643         battery->bat = NULL;
644         mutex_unlock(&battery->sysfs_lock);
645 }
646 
647 static void find_battery(const struct dmi_header *dm, void *private)
648 {
649         struct acpi_battery *battery = (struct acpi_battery *)private;
650         /* Note: the hardcoded offsets below have been extracted from
651            the source code of dmidecode.  */
652         if (dm->type == DMI_ENTRY_PORTABLE_BATTERY && dm->length >= 8) {
653                 const u8 *dmi_data = (const u8 *)(dm + 1);
654                 int dmi_capacity = get_unaligned((const u16 *)(dmi_data + 6));
655                 if (dm->length >= 18)
656                         dmi_capacity *= dmi_data[17];
657                 if (battery->design_capacity * battery->design_voltage / 1000
658                     != dmi_capacity &&
659                     battery->design_capacity * 10 == dmi_capacity)
660                         set_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH,
661                                 &battery->flags);
662         }
663 }
664 
665 /*
666  * According to the ACPI spec, some kinds of primary batteries can
667  * report percentage battery remaining capacity directly to OS.
668  * In this case, it reports the Last Full Charged Capacity == 100
669  * and BatteryPresentRate == 0xFFFFFFFF.
670  *
671  * Now we found some battery reports percentage remaining capacity
672  * even if it's rechargeable.
673  * https://bugzilla.kernel.org/show_bug.cgi?id=15979
674  *
675  * Handle this correctly so that they won't break userspace.
676  */
677 static void acpi_battery_quirks(struct acpi_battery *battery)
678 {
679         if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
680                 return;
681 
682         if (battery->full_charge_capacity == 100 &&
683                 battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN &&
684                 battery->capacity_now >= 0 && battery->capacity_now <= 100) {
685                 set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags);
686                 battery->full_charge_capacity = battery->design_capacity;
687                 battery->capacity_now = (battery->capacity_now *
688                                 battery->full_charge_capacity) / 100;
689         }
690 
691         if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags))
692                 return;
693 
694         if (battery->power_unit && dmi_name_in_vendors("LENOVO")) {
695                 const char *s;
696                 s = dmi_get_system_info(DMI_PRODUCT_VERSION);
697                 if (s && !strncasecmp(s, "ThinkPad", 8)) {
698                         dmi_walk(find_battery, battery);
699                         if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH,
700                                      &battery->flags) &&
701                             battery->design_voltage) {
702                                 battery->design_capacity =
703                                     battery->design_capacity *
704                                     10000 / battery->design_voltage;
705                                 battery->full_charge_capacity =
706                                     battery->full_charge_capacity *
707                                     10000 / battery->design_voltage;
708                                 battery->design_capacity_warning =
709                                     battery->design_capacity_warning *
710                                     10000 / battery->design_voltage;
711                                 battery->capacity_now = battery->capacity_now *
712                                     10000 / battery->design_voltage;
713                         }
714                 }
715         }
716 }
717 
718 static int acpi_battery_update(struct acpi_battery *battery, bool resume)
719 {
720         int result, old_present = acpi_battery_present(battery);
721         result = acpi_battery_get_status(battery);
722         if (result)
723                 return result;
724         if (!acpi_battery_present(battery)) {
725                 sysfs_remove_battery(battery);
726                 battery->update_time = 0;
727                 return 0;
728         }
729 
730         if (resume)
731                 return 0;
732 
733         if (!battery->update_time ||
734             old_present != acpi_battery_present(battery)) {
735                 result = acpi_battery_get_info(battery);
736                 if (result)
737                         return result;
738                 acpi_battery_init_alarm(battery);
739         }
740         if (!battery->bat) {
741                 result = sysfs_add_battery(battery);
742                 if (result)
743                         return result;
744         }
745         result = acpi_battery_get_state(battery);
746         if (result)
747                 return result;
748         acpi_battery_quirks(battery);
749 
750         /*
751          * Wakeup the system if battery is critical low
752          * or lower than the alarm level
753          */
754         if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) ||
755             (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
756             (battery->capacity_now <= battery->alarm)))
757                 pm_wakeup_event(&battery->device->dev, 0);
758 
759         return result;
760 }
761 
762 static void acpi_battery_refresh(struct acpi_battery *battery)
763 {
764         int power_unit;
765 
766         if (!battery->bat)
767                 return;
768 
769         power_unit = battery->power_unit;
770 
771         acpi_battery_get_info(battery);
772 
773         if (power_unit == battery->power_unit)
774                 return;
775 
776         /* The battery has changed its reporting units. */
777         sysfs_remove_battery(battery);
778         sysfs_add_battery(battery);
779 }
780 
781 /* --------------------------------------------------------------------------
782                               FS Interface (/proc)
783    -------------------------------------------------------------------------- */
784 
785 #ifdef CONFIG_ACPI_PROCFS_POWER
786 static struct proc_dir_entry *acpi_battery_dir;
787 
788 static const char *acpi_battery_units(const struct acpi_battery *battery)
789 {
790         return (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) ?
791                 "mA" : "mW";
792 }
793 
794 static int acpi_battery_print_info(struct seq_file *seq, int result)
795 {
796         struct acpi_battery *battery = seq->private;
797 
798         if (result)
799                 goto end;
800 
801         seq_printf(seq, "present:                 %s\n",
802                    acpi_battery_present(battery) ? "yes" : "no");
803         if (!acpi_battery_present(battery))
804                 goto end;
805         if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
806                 seq_printf(seq, "design capacity:         unknown\n");
807         else
808                 seq_printf(seq, "design capacity:         %d %sh\n",
809                            battery->design_capacity,
810                            acpi_battery_units(battery));
811 
812         if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
813                 seq_printf(seq, "last full capacity:      unknown\n");
814         else
815                 seq_printf(seq, "last full capacity:      %d %sh\n",
816                            battery->full_charge_capacity,
817                            acpi_battery_units(battery));
818 
819         seq_printf(seq, "battery technology:      %srechargeable\n",
820                    (!battery->technology)?"non-":"");
821 
822         if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
823                 seq_printf(seq, "design voltage:          unknown\n");
824         else
825                 seq_printf(seq, "design voltage:          %d mV\n",
826                            battery->design_voltage);
827         seq_printf(seq, "design capacity warning: %d %sh\n",
828                    battery->design_capacity_warning,
829                    acpi_battery_units(battery));
830         seq_printf(seq, "design capacity low:     %d %sh\n",
831                    battery->design_capacity_low,
832                    acpi_battery_units(battery));
833         seq_printf(seq, "cycle count:             %i\n", battery->cycle_count);
834         seq_printf(seq, "capacity granularity 1:  %d %sh\n",
835                    battery->capacity_granularity_1,
836                    acpi_battery_units(battery));
837         seq_printf(seq, "capacity granularity 2:  %d %sh\n",
838                    battery->capacity_granularity_2,
839                    acpi_battery_units(battery));
840         seq_printf(seq, "model number:            %s\n", battery->model_number);
841         seq_printf(seq, "serial number:           %s\n", battery->serial_number);
842         seq_printf(seq, "battery type:            %s\n", battery->type);
843         seq_printf(seq, "OEM info:                %s\n", battery->oem_info);
844       end:
845         if (result)
846                 seq_printf(seq, "ERROR: Unable to read battery info\n");
847         return result;
848 }
849 
850 static int acpi_battery_print_state(struct seq_file *seq, int result)
851 {
852         struct acpi_battery *battery = seq->private;
853 
854         if (result)
855                 goto end;
856 
857         seq_printf(seq, "present:                 %s\n",
858                    acpi_battery_present(battery) ? "yes" : "no");
859         if (!acpi_battery_present(battery))
860                 goto end;
861 
862         seq_printf(seq, "capacity state:          %s\n",
863                         (battery->state & 0x04) ? "critical" : "ok");
864         if ((battery->state & 0x01) && (battery->state & 0x02))
865                 seq_printf(seq,
866                            "charging state:          charging/discharging\n");
867         else if (battery->state & 0x01)
868                 seq_printf(seq, "charging state:          discharging\n");
869         else if (battery->state & 0x02)
870                 seq_printf(seq, "charging state:          charging\n");
871         else
872                 seq_printf(seq, "charging state:          charged\n");
873 
874         if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
875                 seq_printf(seq, "present rate:            unknown\n");
876         else
877                 seq_printf(seq, "present rate:            %d %s\n",
878                            battery->rate_now, acpi_battery_units(battery));
879 
880         if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN)
881                 seq_printf(seq, "remaining capacity:      unknown\n");
882         else
883                 seq_printf(seq, "remaining capacity:      %d %sh\n",
884                            battery->capacity_now, acpi_battery_units(battery));
885         if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN)
886                 seq_printf(seq, "present voltage:         unknown\n");
887         else
888                 seq_printf(seq, "present voltage:         %d mV\n",
889                            battery->voltage_now);
890       end:
891         if (result)
892                 seq_printf(seq, "ERROR: Unable to read battery state\n");
893 
894         return result;
895 }
896 
897 static int acpi_battery_print_alarm(struct seq_file *seq, int result)
898 {
899         struct acpi_battery *battery = seq->private;
900 
901         if (result)
902                 goto end;
903 
904         if (!acpi_battery_present(battery)) {
905                 seq_printf(seq, "present:                 no\n");
906                 goto end;
907         }
908         seq_printf(seq, "alarm:                   ");
909         if (!battery->alarm)
910                 seq_printf(seq, "unsupported\n");
911         else
912                 seq_printf(seq, "%u %sh\n", battery->alarm,
913                                 acpi_battery_units(battery));
914       end:
915         if (result)
916                 seq_printf(seq, "ERROR: Unable to read battery alarm\n");
917         return result;
918 }
919 
920 static ssize_t acpi_battery_write_alarm(struct file *file,
921                                         const char __user * buffer,
922                                         size_t count, loff_t * ppos)
923 {
924         int result = 0;
925         char alarm_string[12] = { '\0' };
926         struct seq_file *m = file->private_data;
927         struct acpi_battery *battery = m->private;
928 
929         if (!battery || (count > sizeof(alarm_string) - 1))
930                 return -EINVAL;
931         if (!acpi_battery_present(battery)) {
932                 result = -ENODEV;
933                 goto end;
934         }
935         if (copy_from_user(alarm_string, buffer, count)) {
936                 result = -EFAULT;
937                 goto end;
938         }
939         alarm_string[count] = '\0';
940         if (kstrtoint(alarm_string, 0, &battery->alarm)) {
941                 result = -EINVAL;
942                 goto end;
943         }
944         result = acpi_battery_set_alarm(battery);
945       end:
946         if (!result)
947                 return count;
948         return result;
949 }
950 
951 typedef int(*print_func)(struct seq_file *seq, int result);
952 
953 static print_func acpi_print_funcs[ACPI_BATTERY_NUMFILES] = {
954         acpi_battery_print_info,
955         acpi_battery_print_state,
956         acpi_battery_print_alarm,
957 };
958 
959 static int acpi_battery_read(int fid, struct seq_file *seq)
960 {
961         struct acpi_battery *battery = seq->private;
962         int result = acpi_battery_update(battery, false);
963         return acpi_print_funcs[fid](seq, result);
964 }
965 
966 #define DECLARE_FILE_FUNCTIONS(_name) \
967 static int acpi_battery_read_##_name(struct seq_file *seq, void *offset) \
968 { \
969         return acpi_battery_read(_name##_tag, seq); \
970 } \
971 static int acpi_battery_##_name##_open_fs(struct inode *inode, struct file *file) \
972 { \
973         return single_open(file, acpi_battery_read_##_name, PDE_DATA(inode)); \
974 }
975 
976 DECLARE_FILE_FUNCTIONS(info);
977 DECLARE_FILE_FUNCTIONS(state);
978 DECLARE_FILE_FUNCTIONS(alarm);
979 
980 #undef DECLARE_FILE_FUNCTIONS
981 
982 #define FILE_DESCRIPTION_RO(_name) \
983         { \
984         .name = __stringify(_name), \
985         .mode = S_IRUGO, \
986         .ops = { \
987                 .open = acpi_battery_##_name##_open_fs, \
988                 .read = seq_read, \
989                 .llseek = seq_lseek, \
990                 .release = single_release, \
991                 .owner = THIS_MODULE, \
992                 }, \
993         }
994 
995 #define FILE_DESCRIPTION_RW(_name) \
996         { \
997         .name = __stringify(_name), \
998         .mode = S_IFREG | S_IRUGO | S_IWUSR, \
999         .ops = { \
1000                 .open = acpi_battery_##_name##_open_fs, \
1001                 .read = seq_read, \
1002                 .llseek = seq_lseek, \
1003                 .write = acpi_battery_write_##_name, \
1004                 .release = single_release, \
1005                 .owner = THIS_MODULE, \
1006                 }, \
1007         }
1008 
1009 static const struct battery_file {
1010         struct file_operations ops;
1011         umode_t mode;
1012         const char *name;
1013 } acpi_battery_file[] = {
1014         FILE_DESCRIPTION_RO(info),
1015         FILE_DESCRIPTION_RO(state),
1016         FILE_DESCRIPTION_RW(alarm),
1017 };
1018 
1019 #undef FILE_DESCRIPTION_RO
1020 #undef FILE_DESCRIPTION_RW
1021 
1022 static int acpi_battery_add_fs(struct acpi_device *device)
1023 {
1024         struct proc_dir_entry *entry = NULL;
1025         int i;
1026 
1027         printk(KERN_WARNING PREFIX "Deprecated procfs I/F for battery is loaded,"
1028                         " please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
1029         if (!acpi_device_dir(device)) {
1030                 acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
1031                                                      acpi_battery_dir);
1032                 if (!acpi_device_dir(device))
1033                         return -ENODEV;
1034         }
1035 
1036         for (i = 0; i < ACPI_BATTERY_NUMFILES; ++i) {
1037                 entry = proc_create_data(acpi_battery_file[i].name,
1038                                          acpi_battery_file[i].mode,
1039                                          acpi_device_dir(device),
1040                                          &acpi_battery_file[i].ops,
1041                                          acpi_driver_data(device));
1042                 if (!entry)
1043                         return -ENODEV;
1044         }
1045         return 0;
1046 }
1047 
1048 static void acpi_battery_remove_fs(struct acpi_device *device)
1049 {
1050         int i;
1051         if (!acpi_device_dir(device))
1052                 return;
1053         for (i = 0; i < ACPI_BATTERY_NUMFILES; ++i)
1054                 remove_proc_entry(acpi_battery_file[i].name,
1055                                   acpi_device_dir(device));
1056 
1057         remove_proc_entry(acpi_device_bid(device), acpi_battery_dir);
1058         acpi_device_dir(device) = NULL;
1059 }
1060 
1061 #endif
1062 
1063 /* --------------------------------------------------------------------------
1064                                  Driver Interface
1065    -------------------------------------------------------------------------- */
1066 
1067 static void acpi_battery_notify(struct acpi_device *device, u32 event)
1068 {
1069         struct acpi_battery *battery = acpi_driver_data(device);
1070         struct power_supply *old;
1071 
1072         if (!battery)
1073                 return;
1074         old = battery->bat;
1075         /*
1076         * On Acer Aspire V5-573G notifications are sometimes triggered too
1077         * early. For example, when AC is unplugged and notification is
1078         * triggered, battery state is still reported as "Full", and changes to
1079         * "Discharging" only after short delay, without any notification.
1080         */
1081         if (battery_notification_delay_ms > 0)
1082                 msleep(battery_notification_delay_ms);
1083         if (event == ACPI_BATTERY_NOTIFY_INFO)
1084                 acpi_battery_refresh(battery);
1085         acpi_battery_update(battery, false);
1086         acpi_bus_generate_netlink_event(device->pnp.device_class,
1087                                         dev_name(&device->dev), event,
1088                                         acpi_battery_present(battery));
1089         acpi_notifier_call_chain(device, event, acpi_battery_present(battery));
1090         /* acpi_battery_update could remove power_supply object */
1091         if (old && battery->bat)
1092                 power_supply_changed(battery->bat);
1093 }
1094 
1095 static int battery_notify(struct notifier_block *nb,
1096                                unsigned long mode, void *_unused)
1097 {
1098         struct acpi_battery *battery = container_of(nb, struct acpi_battery,
1099                                                     pm_nb);
1100         int result;
1101 
1102         switch (mode) {
1103         case PM_POST_HIBERNATION:
1104         case PM_POST_SUSPEND:
1105                 if (!acpi_battery_present(battery))
1106                         return 0;
1107 
1108                 if (!battery->bat) {
1109                         result = acpi_battery_get_info(battery);
1110                         if (result)
1111                                 return result;
1112 
1113                         result = sysfs_add_battery(battery);
1114                         if (result)
1115                                 return result;
1116                 } else
1117                         acpi_battery_refresh(battery);
1118 
1119                 acpi_battery_init_alarm(battery);
1120                 acpi_battery_get_state(battery);
1121                 break;
1122         }
1123 
1124         return 0;
1125 }
1126 
1127 static int __init
1128 battery_bix_broken_package_quirk(const struct dmi_system_id *d)
1129 {
1130         battery_bix_broken_package = 1;
1131         return 0;
1132 }
1133 
1134 static int __init
1135 battery_notification_delay_quirk(const struct dmi_system_id *d)
1136 {
1137         battery_notification_delay_ms = 1000;
1138         return 0;
1139 }
1140 
1141 static const struct dmi_system_id bat_dmi_table[] __initconst = {
1142         {
1143                 .callback = battery_bix_broken_package_quirk,
1144                 .ident = "NEC LZ750/LS",
1145                 .matches = {
1146                         DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
1147                         DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"),
1148                 },
1149         },
1150         {
1151                 .callback = battery_notification_delay_quirk,
1152                 .ident = "Acer Aspire V5-573G",
1153                 .matches = {
1154                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
1155                         DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-573G"),
1156                 },
1157         },
1158         {},
1159 };
1160 
1161 /*
1162  * Some machines'(E,G Lenovo Z480) ECs are not stable
1163  * during boot up and this causes battery driver fails to be
1164  * probed due to failure of getting battery information
1165  * from EC sometimes. After several retries, the operation
1166  * may work. So add retry code here and 20ms sleep between
1167  * every retries.
1168  */
1169 static int acpi_battery_update_retry(struct acpi_battery *battery)
1170 {
1171         int retry, ret;
1172 
1173         for (retry = 5; retry; retry--) {
1174                 ret = acpi_battery_update(battery, false);
1175                 if (!ret)
1176                         break;
1177 
1178                 msleep(20);
1179         }
1180         return ret;
1181 }
1182 
1183 static int acpi_battery_add(struct acpi_device *device)
1184 {
1185         int result = 0;
1186         struct acpi_battery *battery = NULL;
1187 
1188         if (!device)
1189                 return -EINVAL;
1190 
1191         if (device->dep_unmet)
1192                 return -EPROBE_DEFER;
1193 
1194         battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL);
1195         if (!battery)
1196                 return -ENOMEM;
1197         battery->device = device;
1198         strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME);
1199         strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
1200         device->driver_data = battery;
1201         mutex_init(&battery->lock);
1202         mutex_init(&battery->sysfs_lock);
1203         if (acpi_has_method(battery->device->handle, "_BIX"))
1204                 set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
1205 
1206         result = acpi_battery_update_retry(battery);
1207         if (result)
1208                 goto fail;
1209 
1210 #ifdef CONFIG_ACPI_PROCFS_POWER
1211         result = acpi_battery_add_fs(device);
1212 #endif
1213         if (result) {
1214 #ifdef CONFIG_ACPI_PROCFS_POWER
1215                 acpi_battery_remove_fs(device);
1216 #endif
1217                 goto fail;
1218         }
1219 
1220         printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n",
1221                 ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
1222                 device->status.battery_present ? "present" : "absent");
1223 
1224         battery->pm_nb.notifier_call = battery_notify;
1225         register_pm_notifier(&battery->pm_nb);
1226 
1227         device_init_wakeup(&device->dev, 1);
1228 
1229         return result;
1230 
1231 fail:
1232         sysfs_remove_battery(battery);
1233         mutex_destroy(&battery->lock);
1234         mutex_destroy(&battery->sysfs_lock);
1235         kfree(battery);
1236         return result;
1237 }
1238 
1239 static int acpi_battery_remove(struct acpi_device *device)
1240 {
1241         struct acpi_battery *battery = NULL;
1242 
1243         if (!device || !acpi_driver_data(device))
1244                 return -EINVAL;
1245         device_init_wakeup(&device->dev, 0);
1246         battery = acpi_driver_data(device);
1247         unregister_pm_notifier(&battery->pm_nb);
1248 #ifdef CONFIG_ACPI_PROCFS_POWER
1249         acpi_battery_remove_fs(device);
1250 #endif
1251         sysfs_remove_battery(battery);
1252         mutex_destroy(&battery->lock);
1253         mutex_destroy(&battery->sysfs_lock);
1254         kfree(battery);
1255         return 0;
1256 }
1257 
1258 #ifdef CONFIG_PM_SLEEP
1259 /* this is needed to learn about changes made in suspended state */
1260 static int acpi_battery_resume(struct device *dev)
1261 {
1262         struct acpi_battery *battery;
1263 
1264         if (!dev)
1265                 return -EINVAL;
1266 
1267         battery = acpi_driver_data(to_acpi_device(dev));
1268         if (!battery)
1269                 return -EINVAL;
1270 
1271         battery->update_time = 0;
1272         acpi_battery_update(battery, true);
1273         return 0;
1274 }
1275 #else
1276 #define acpi_battery_resume NULL
1277 #endif
1278 
1279 static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume);
1280 
1281 static struct acpi_driver acpi_battery_driver = {
1282         .name = "battery",
1283         .class = ACPI_BATTERY_CLASS,
1284         .ids = battery_device_ids,
1285         .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
1286         .ops = {
1287                 .add = acpi_battery_add,
1288                 .remove = acpi_battery_remove,
1289                 .notify = acpi_battery_notify,
1290                 },
1291         .drv.pm = &acpi_battery_pm,
1292 };
1293 
1294 static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
1295 {
1296         int result;
1297 
1298         dmi_check_system(bat_dmi_table);
1299 
1300 #ifdef CONFIG_ACPI_PROCFS_POWER
1301         acpi_battery_dir = acpi_lock_battery_dir();
1302         if (!acpi_battery_dir)
1303                 return;
1304 #endif
1305         result = acpi_bus_register_driver(&acpi_battery_driver);
1306 #ifdef CONFIG_ACPI_PROCFS_POWER
1307         if (result < 0)
1308                 acpi_unlock_battery_dir(acpi_battery_dir);
1309 #endif
1310 }
1311 
1312 static int __init acpi_battery_init(void)
1313 {
1314         if (acpi_disabled)
1315                 return -ENODEV;
1316 
1317         async_cookie = async_schedule(acpi_battery_init_async, NULL);
1318         return 0;
1319 }
1320 
1321 static void __exit acpi_battery_exit(void)
1322 {
1323         async_synchronize_cookie(async_cookie);
1324         acpi_bus_unregister_driver(&acpi_battery_driver);
1325 #ifdef CONFIG_ACPI_PROCFS_POWER
1326         acpi_unlock_battery_dir(acpi_battery_dir);
1327 #endif
1328 }
1329 
1330 module_init(acpi_battery_init);
1331 module_exit(acpi_battery_exit);
1332 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us