[go: nahoru, domu]

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