xref: /openbmc/linux/drivers/acpi/battery.c (revision afb46f79)
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/slab.h>
36 #include <linux/suspend.h>
37 #include <asm/unaligned.h>
38 
39 #include <linux/acpi.h>
40 #include <linux/power_supply.h>
41 
42 #include "battery.h"
43 
44 #define PREFIX "ACPI: "
45 
46 #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
47 
48 #define ACPI_BATTERY_DEVICE_NAME	"Battery"
49 
50 /* Battery power unit: 0 means mW, 1 means mA */
51 #define ACPI_BATTERY_POWER_UNIT_MA	1
52 
53 #define _COMPONENT		ACPI_BATTERY_COMPONENT
54 
55 ACPI_MODULE_NAME("battery");
56 
57 MODULE_AUTHOR("Paul Diefenbaugh");
58 MODULE_AUTHOR("Alexey Starikovskiy <astarikovskiy@suse.de>");
59 MODULE_DESCRIPTION("ACPI Battery Driver");
60 MODULE_LICENSE("GPL");
61 
62 static int battery_bix_broken_package;
63 static unsigned int cache_time = 1000;
64 module_param(cache_time, uint, 0644);
65 MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
66 
67 static const struct acpi_device_id battery_device_ids[] = {
68 	{"PNP0C0A", 0},
69 	{"", 0},
70 };
71 
72 MODULE_DEVICE_TABLE(acpi, battery_device_ids);
73 
74 enum {
75 	ACPI_BATTERY_ALARM_PRESENT,
76 	ACPI_BATTERY_XINFO_PRESENT,
77 	ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY,
78 	/* On Lenovo Thinkpad models from 2010 and 2011, the power unit
79 	   switches between mWh and mAh depending on whether the system
80 	   is running on battery or not.  When mAh is the unit, most
81 	   reported values are incorrect and need to be adjusted by
82 	   10000/design_voltage.  Verified on x201, t410, t410s, and x220.
83 	   Pre-2010 and 2012 models appear to always report in mWh and
84 	   are thus unaffected (tested with t42, t61, t500, x200, x300,
85 	   and x230).  Also, in mid-2012 Lenovo issued a BIOS update for
86 	   the 2011 models that fixes the issue (tested on x220 with a
87 	   post-1.29 BIOS), but as of Nov. 2012, no such update is
88 	   available for the 2010 models.  */
89 	ACPI_BATTERY_QUIRK_THINKPAD_MAH,
90 };
91 
92 struct acpi_battery {
93 	struct mutex lock;
94 	struct mutex sysfs_lock;
95 	struct power_supply bat;
96 	struct acpi_device *device;
97 	struct notifier_block pm_nb;
98 	unsigned long update_time;
99 	int revision;
100 	int rate_now;
101 	int capacity_now;
102 	int voltage_now;
103 	int design_capacity;
104 	int full_charge_capacity;
105 	int technology;
106 	int design_voltage;
107 	int design_capacity_warning;
108 	int design_capacity_low;
109 	int cycle_count;
110 	int measurement_accuracy;
111 	int max_sampling_time;
112 	int min_sampling_time;
113 	int max_averaging_interval;
114 	int min_averaging_interval;
115 	int capacity_granularity_1;
116 	int capacity_granularity_2;
117 	int alarm;
118 	char model_number[32];
119 	char serial_number[32];
120 	char type[32];
121 	char oem_info[32];
122 	int state;
123 	int power_unit;
124 	unsigned long flags;
125 };
126 
127 #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat)
128 
129 static inline int acpi_battery_present(struct acpi_battery *battery)
130 {
131 	return battery->device->status.battery_present;
132 }
133 
134 static int acpi_battery_technology(struct acpi_battery *battery)
135 {
136 	if (!strcasecmp("NiCd", battery->type))
137 		return POWER_SUPPLY_TECHNOLOGY_NiCd;
138 	if (!strcasecmp("NiMH", battery->type))
139 		return POWER_SUPPLY_TECHNOLOGY_NiMH;
140 	if (!strcasecmp("LION", battery->type))
141 		return POWER_SUPPLY_TECHNOLOGY_LION;
142 	if (!strncasecmp("LI-ION", battery->type, 6))
143 		return POWER_SUPPLY_TECHNOLOGY_LION;
144 	if (!strcasecmp("LiP", battery->type))
145 		return POWER_SUPPLY_TECHNOLOGY_LIPO;
146 	return POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
147 }
148 
149 static int acpi_battery_get_state(struct acpi_battery *battery);
150 
151 static int acpi_battery_is_charged(struct acpi_battery *battery)
152 {
153 	/* either charging or discharging */
154 	if (battery->state != 0)
155 		return 0;
156 
157 	/* battery not reporting charge */
158 	if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN ||
159 	    battery->capacity_now == 0)
160 		return 0;
161 
162 	/* good batteries update full_charge as the batteries degrade */
163 	if (battery->full_charge_capacity == battery->capacity_now)
164 		return 1;
165 
166 	/* fallback to using design values for broken batteries */
167 	if (battery->design_capacity == battery->capacity_now)
168 		return 1;
169 
170 	/* we don't do any sort of metric based on percentages */
171 	return 0;
172 }
173 
174 static int acpi_battery_get_property(struct power_supply *psy,
175 				     enum power_supply_property psp,
176 				     union power_supply_propval *val)
177 {
178 	int ret = 0;
179 	struct acpi_battery *battery = to_acpi_battery(psy);
180 
181 	if (acpi_battery_present(battery)) {
182 		/* run battery update only if it is present */
183 		acpi_battery_get_state(battery);
184 	} else if (psp != POWER_SUPPLY_PROP_PRESENT)
185 		return -ENODEV;
186 	switch (psp) {
187 	case POWER_SUPPLY_PROP_STATUS:
188 		if (battery->state & 0x01)
189 			val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
190 		else if (battery->state & 0x02)
191 			val->intval = POWER_SUPPLY_STATUS_CHARGING;
192 		else if (acpi_battery_is_charged(battery))
193 			val->intval = POWER_SUPPLY_STATUS_FULL;
194 		else
195 			val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
196 		break;
197 	case POWER_SUPPLY_PROP_PRESENT:
198 		val->intval = acpi_battery_present(battery);
199 		break;
200 	case POWER_SUPPLY_PROP_TECHNOLOGY:
201 		val->intval = acpi_battery_technology(battery);
202 		break;
203 	case POWER_SUPPLY_PROP_CYCLE_COUNT:
204 		val->intval = battery->cycle_count;
205 		break;
206 	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
207 		if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
208 			ret = -ENODEV;
209 		else
210 			val->intval = battery->design_voltage * 1000;
211 		break;
212 	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
213 		if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN)
214 			ret = -ENODEV;
215 		else
216 			val->intval = battery->voltage_now * 1000;
217 		break;
218 	case POWER_SUPPLY_PROP_CURRENT_NOW:
219 	case POWER_SUPPLY_PROP_POWER_NOW:
220 		if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
221 			ret = -ENODEV;
222 		else
223 			val->intval = battery->rate_now * 1000;
224 		break;
225 	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
226 	case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
227 		if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
228 			ret = -ENODEV;
229 		else
230 			val->intval = battery->design_capacity * 1000;
231 		break;
232 	case POWER_SUPPLY_PROP_CHARGE_FULL:
233 	case POWER_SUPPLY_PROP_ENERGY_FULL:
234 		if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
235 			ret = -ENODEV;
236 		else
237 			val->intval = battery->full_charge_capacity * 1000;
238 		break;
239 	case POWER_SUPPLY_PROP_CHARGE_NOW:
240 	case POWER_SUPPLY_PROP_ENERGY_NOW:
241 		if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN)
242 			ret = -ENODEV;
243 		else
244 			val->intval = battery->capacity_now * 1000;
245 		break;
246 	case POWER_SUPPLY_PROP_CAPACITY:
247 		if (battery->capacity_now && battery->full_charge_capacity)
248 			val->intval = battery->capacity_now * 100/
249 					battery->full_charge_capacity;
250 		else
251 			val->intval = 0;
252 		break;
253 	case POWER_SUPPLY_PROP_MODEL_NAME:
254 		val->strval = battery->model_number;
255 		break;
256 	case POWER_SUPPLY_PROP_MANUFACTURER:
257 		val->strval = battery->oem_info;
258 		break;
259 	case POWER_SUPPLY_PROP_SERIAL_NUMBER:
260 		val->strval = battery->serial_number;
261 		break;
262 	default:
263 		ret = -EINVAL;
264 	}
265 	return ret;
266 }
267 
268 static enum power_supply_property charge_battery_props[] = {
269 	POWER_SUPPLY_PROP_STATUS,
270 	POWER_SUPPLY_PROP_PRESENT,
271 	POWER_SUPPLY_PROP_TECHNOLOGY,
272 	POWER_SUPPLY_PROP_CYCLE_COUNT,
273 	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
274 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
275 	POWER_SUPPLY_PROP_CURRENT_NOW,
276 	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
277 	POWER_SUPPLY_PROP_CHARGE_FULL,
278 	POWER_SUPPLY_PROP_CHARGE_NOW,
279 	POWER_SUPPLY_PROP_CAPACITY,
280 	POWER_SUPPLY_PROP_MODEL_NAME,
281 	POWER_SUPPLY_PROP_MANUFACTURER,
282 	POWER_SUPPLY_PROP_SERIAL_NUMBER,
283 };
284 
285 static enum power_supply_property energy_battery_props[] = {
286 	POWER_SUPPLY_PROP_STATUS,
287 	POWER_SUPPLY_PROP_PRESENT,
288 	POWER_SUPPLY_PROP_TECHNOLOGY,
289 	POWER_SUPPLY_PROP_CYCLE_COUNT,
290 	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
291 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
292 	POWER_SUPPLY_PROP_POWER_NOW,
293 	POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
294 	POWER_SUPPLY_PROP_ENERGY_FULL,
295 	POWER_SUPPLY_PROP_ENERGY_NOW,
296 	POWER_SUPPLY_PROP_CAPACITY,
297 	POWER_SUPPLY_PROP_MODEL_NAME,
298 	POWER_SUPPLY_PROP_MANUFACTURER,
299 	POWER_SUPPLY_PROP_SERIAL_NUMBER,
300 };
301 
302 /* --------------------------------------------------------------------------
303                                Battery Management
304    -------------------------------------------------------------------------- */
305 struct acpi_offsets {
306 	size_t offset;		/* offset inside struct acpi_sbs_battery */
307 	u8 mode;		/* int or string? */
308 };
309 
310 static struct acpi_offsets state_offsets[] = {
311 	{offsetof(struct acpi_battery, state), 0},
312 	{offsetof(struct acpi_battery, rate_now), 0},
313 	{offsetof(struct acpi_battery, capacity_now), 0},
314 	{offsetof(struct acpi_battery, voltage_now), 0},
315 };
316 
317 static struct acpi_offsets info_offsets[] = {
318 	{offsetof(struct acpi_battery, power_unit), 0},
319 	{offsetof(struct acpi_battery, design_capacity), 0},
320 	{offsetof(struct acpi_battery, full_charge_capacity), 0},
321 	{offsetof(struct acpi_battery, technology), 0},
322 	{offsetof(struct acpi_battery, design_voltage), 0},
323 	{offsetof(struct acpi_battery, design_capacity_warning), 0},
324 	{offsetof(struct acpi_battery, design_capacity_low), 0},
325 	{offsetof(struct acpi_battery, capacity_granularity_1), 0},
326 	{offsetof(struct acpi_battery, capacity_granularity_2), 0},
327 	{offsetof(struct acpi_battery, model_number), 1},
328 	{offsetof(struct acpi_battery, serial_number), 1},
329 	{offsetof(struct acpi_battery, type), 1},
330 	{offsetof(struct acpi_battery, oem_info), 1},
331 };
332 
333 static struct acpi_offsets extended_info_offsets[] = {
334 	{offsetof(struct acpi_battery, revision), 0},
335 	{offsetof(struct acpi_battery, power_unit), 0},
336 	{offsetof(struct acpi_battery, design_capacity), 0},
337 	{offsetof(struct acpi_battery, full_charge_capacity), 0},
338 	{offsetof(struct acpi_battery, technology), 0},
339 	{offsetof(struct acpi_battery, design_voltage), 0},
340 	{offsetof(struct acpi_battery, design_capacity_warning), 0},
341 	{offsetof(struct acpi_battery, design_capacity_low), 0},
342 	{offsetof(struct acpi_battery, cycle_count), 0},
343 	{offsetof(struct acpi_battery, measurement_accuracy), 0},
344 	{offsetof(struct acpi_battery, max_sampling_time), 0},
345 	{offsetof(struct acpi_battery, min_sampling_time), 0},
346 	{offsetof(struct acpi_battery, max_averaging_interval), 0},
347 	{offsetof(struct acpi_battery, min_averaging_interval), 0},
348 	{offsetof(struct acpi_battery, capacity_granularity_1), 0},
349 	{offsetof(struct acpi_battery, capacity_granularity_2), 0},
350 	{offsetof(struct acpi_battery, model_number), 1},
351 	{offsetof(struct acpi_battery, serial_number), 1},
352 	{offsetof(struct acpi_battery, type), 1},
353 	{offsetof(struct acpi_battery, oem_info), 1},
354 };
355 
356 static int extract_package(struct acpi_battery *battery,
357 			   union acpi_object *package,
358 			   struct acpi_offsets *offsets, int num)
359 {
360 	int i;
361 	union acpi_object *element;
362 	if (package->type != ACPI_TYPE_PACKAGE)
363 		return -EFAULT;
364 	for (i = 0; i < num; ++i) {
365 		if (package->package.count <= i)
366 			return -EFAULT;
367 		element = &package->package.elements[i];
368 		if (offsets[i].mode) {
369 			u8 *ptr = (u8 *)battery + offsets[i].offset;
370 			if (element->type == ACPI_TYPE_STRING ||
371 			    element->type == ACPI_TYPE_BUFFER)
372 				strncpy(ptr, element->string.pointer, 32);
373 			else if (element->type == ACPI_TYPE_INTEGER) {
374 				strncpy(ptr, (u8 *)&element->integer.value,
375 					sizeof(u64));
376 				ptr[sizeof(u64)] = 0;
377 			} else
378 				*ptr = 0; /* don't have value */
379 		} else {
380 			int *x = (int *)((u8 *)battery + offsets[i].offset);
381 			*x = (element->type == ACPI_TYPE_INTEGER) ?
382 				element->integer.value : -1;
383 		}
384 	}
385 	return 0;
386 }
387 
388 static int acpi_battery_get_status(struct acpi_battery *battery)
389 {
390 	if (acpi_bus_get_status(battery->device)) {
391 		ACPI_EXCEPTION((AE_INFO, AE_ERROR, "Evaluating _STA"));
392 		return -ENODEV;
393 	}
394 	return 0;
395 }
396 
397 static int acpi_battery_get_info(struct acpi_battery *battery)
398 {
399 	int result = -EFAULT;
400 	acpi_status status = 0;
401 	char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags) ?
402 			"_BIX" : "_BIF";
403 
404 	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
405 
406 	if (!acpi_battery_present(battery))
407 		return 0;
408 	mutex_lock(&battery->lock);
409 	status = acpi_evaluate_object(battery->device->handle, name,
410 						NULL, &buffer);
411 	mutex_unlock(&battery->lock);
412 
413 	if (ACPI_FAILURE(status)) {
414 		ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s", name));
415 		return -ENODEV;
416 	}
417 
418 	if (battery_bix_broken_package)
419 		result = extract_package(battery, buffer.pointer,
420 				extended_info_offsets + 1,
421 				ARRAY_SIZE(extended_info_offsets) - 1);
422 	else if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
423 		result = extract_package(battery, buffer.pointer,
424 				extended_info_offsets,
425 				ARRAY_SIZE(extended_info_offsets));
426 	else
427 		result = extract_package(battery, buffer.pointer,
428 				info_offsets, ARRAY_SIZE(info_offsets));
429 	kfree(buffer.pointer);
430 	if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
431 		battery->full_charge_capacity = battery->design_capacity;
432 	if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) &&
433 	    battery->power_unit && battery->design_voltage) {
434 		battery->design_capacity = battery->design_capacity *
435 		    10000 / battery->design_voltage;
436 		battery->full_charge_capacity = battery->full_charge_capacity *
437 		    10000 / battery->design_voltage;
438 		battery->design_capacity_warning =
439 		    battery->design_capacity_warning *
440 		    10000 / battery->design_voltage;
441 		/* Curiously, design_capacity_low, unlike the rest of them,
442 		   is correct.  */
443 		/* capacity_granularity_* equal 1 on the systems tested, so
444 		   it's impossible to tell if they would need an adjustment
445 		   or not if their values were higher.  */
446 	}
447 	return result;
448 }
449 
450 static int acpi_battery_get_state(struct acpi_battery *battery)
451 {
452 	int result = 0;
453 	acpi_status status = 0;
454 	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
455 
456 	if (!acpi_battery_present(battery))
457 		return 0;
458 
459 	if (battery->update_time &&
460 	    time_before(jiffies, battery->update_time +
461 			msecs_to_jiffies(cache_time)))
462 		return 0;
463 
464 	mutex_lock(&battery->lock);
465 	status = acpi_evaluate_object(battery->device->handle, "_BST",
466 				      NULL, &buffer);
467 	mutex_unlock(&battery->lock);
468 
469 	if (ACPI_FAILURE(status)) {
470 		ACPI_EXCEPTION((AE_INFO, status, "Evaluating _BST"));
471 		return -ENODEV;
472 	}
473 
474 	result = extract_package(battery, buffer.pointer,
475 				 state_offsets, ARRAY_SIZE(state_offsets));
476 	battery->update_time = jiffies;
477 	kfree(buffer.pointer);
478 
479 	/* For buggy DSDTs that report negative 16-bit values for either
480 	 * charging or discharging current and/or report 0 as 65536
481 	 * due to bad math.
482 	 */
483 	if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA &&
484 		battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN &&
485 		(s16)(battery->rate_now) < 0) {
486 		battery->rate_now = abs((s16)battery->rate_now);
487 		printk_once(KERN_WARNING FW_BUG "battery: (dis)charge rate"
488 			" invalid.\n");
489 	}
490 
491 	if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
492 	    && battery->capacity_now >= 0 && battery->capacity_now <= 100)
493 		battery->capacity_now = (battery->capacity_now *
494 				battery->full_charge_capacity) / 100;
495 	if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) &&
496 	    battery->power_unit && battery->design_voltage) {
497 		battery->capacity_now = battery->capacity_now *
498 		    10000 / battery->design_voltage;
499 	}
500 	return result;
501 }
502 
503 static int acpi_battery_set_alarm(struct acpi_battery *battery)
504 {
505 	acpi_status status = 0;
506 
507 	if (!acpi_battery_present(battery) ||
508 	    !test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags))
509 		return -ENODEV;
510 
511 	mutex_lock(&battery->lock);
512 	status = acpi_execute_simple_method(battery->device->handle, "_BTP",
513 					    battery->alarm);
514 	mutex_unlock(&battery->lock);
515 
516 	if (ACPI_FAILURE(status))
517 		return -ENODEV;
518 
519 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Alarm set to %d\n", battery->alarm));
520 	return 0;
521 }
522 
523 static int acpi_battery_init_alarm(struct acpi_battery *battery)
524 {
525 	/* See if alarms are supported, and if so, set default */
526 	if (!acpi_has_method(battery->device->handle, "_BTP")) {
527 		clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
528 		return 0;
529 	}
530 	set_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
531 	if (!battery->alarm)
532 		battery->alarm = battery->design_capacity_warning;
533 	return acpi_battery_set_alarm(battery);
534 }
535 
536 static ssize_t acpi_battery_alarm_show(struct device *dev,
537 					struct device_attribute *attr,
538 					char *buf)
539 {
540 	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
541 	return sprintf(buf, "%d\n", battery->alarm * 1000);
542 }
543 
544 static ssize_t acpi_battery_alarm_store(struct device *dev,
545 					struct device_attribute *attr,
546 					const char *buf, size_t count)
547 {
548 	unsigned long x;
549 	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
550 	if (sscanf(buf, "%lu\n", &x) == 1)
551 		battery->alarm = x/1000;
552 	if (acpi_battery_present(battery))
553 		acpi_battery_set_alarm(battery);
554 	return count;
555 }
556 
557 static struct device_attribute alarm_attr = {
558 	.attr = {.name = "alarm", .mode = 0644},
559 	.show = acpi_battery_alarm_show,
560 	.store = acpi_battery_alarm_store,
561 };
562 
563 static int sysfs_add_battery(struct acpi_battery *battery)
564 {
565 	int result;
566 
567 	if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) {
568 		battery->bat.properties = charge_battery_props;
569 		battery->bat.num_properties =
570 			ARRAY_SIZE(charge_battery_props);
571 	} else {
572 		battery->bat.properties = energy_battery_props;
573 		battery->bat.num_properties =
574 			ARRAY_SIZE(energy_battery_props);
575 	}
576 
577 	battery->bat.name = acpi_device_bid(battery->device);
578 	battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
579 	battery->bat.get_property = acpi_battery_get_property;
580 
581 	result = power_supply_register(&battery->device->dev, &battery->bat);
582 	if (result)
583 		return result;
584 	return device_create_file(battery->bat.dev, &alarm_attr);
585 }
586 
587 static void sysfs_remove_battery(struct acpi_battery *battery)
588 {
589 	mutex_lock(&battery->sysfs_lock);
590 	if (!battery->bat.dev) {
591 		mutex_unlock(&battery->sysfs_lock);
592 		return;
593 	}
594 
595 	device_remove_file(battery->bat.dev, &alarm_attr);
596 	power_supply_unregister(&battery->bat);
597 	battery->bat.dev = NULL;
598 	mutex_unlock(&battery->sysfs_lock);
599 }
600 
601 static void find_battery(const struct dmi_header *dm, void *private)
602 {
603 	struct acpi_battery *battery = (struct acpi_battery *)private;
604 	/* Note: the hardcoded offsets below have been extracted from
605 	   the source code of dmidecode.  */
606 	if (dm->type == DMI_ENTRY_PORTABLE_BATTERY && dm->length >= 8) {
607 		const u8 *dmi_data = (const u8 *)(dm + 1);
608 		int dmi_capacity = get_unaligned((const u16 *)(dmi_data + 6));
609 		if (dm->length >= 18)
610 			dmi_capacity *= dmi_data[17];
611 		if (battery->design_capacity * battery->design_voltage / 1000
612 		    != dmi_capacity &&
613 		    battery->design_capacity * 10 == dmi_capacity)
614 			set_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH,
615 				&battery->flags);
616 	}
617 }
618 
619 /*
620  * According to the ACPI spec, some kinds of primary batteries can
621  * report percentage battery remaining capacity directly to OS.
622  * In this case, it reports the Last Full Charged Capacity == 100
623  * and BatteryPresentRate == 0xFFFFFFFF.
624  *
625  * Now we found some battery reports percentage remaining capacity
626  * even if it's rechargeable.
627  * https://bugzilla.kernel.org/show_bug.cgi?id=15979
628  *
629  * Handle this correctly so that they won't break userspace.
630  */
631 static void acpi_battery_quirks(struct acpi_battery *battery)
632 {
633 	if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
634 		return;
635 
636 	if (battery->full_charge_capacity == 100 &&
637 		battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN &&
638 		battery->capacity_now >= 0 && battery->capacity_now <= 100) {
639 		set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags);
640 		battery->full_charge_capacity = battery->design_capacity;
641 		battery->capacity_now = (battery->capacity_now *
642 				battery->full_charge_capacity) / 100;
643 	}
644 
645 	if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags))
646 		return;
647 
648 	if (battery->power_unit && dmi_name_in_vendors("LENOVO")) {
649 		const char *s;
650 		s = dmi_get_system_info(DMI_PRODUCT_VERSION);
651 		if (s && !strnicmp(s, "ThinkPad", 8)) {
652 			dmi_walk(find_battery, battery);
653 			if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH,
654 				     &battery->flags) &&
655 			    battery->design_voltage) {
656 				battery->design_capacity =
657 				    battery->design_capacity *
658 				    10000 / battery->design_voltage;
659 				battery->full_charge_capacity =
660 				    battery->full_charge_capacity *
661 				    10000 / battery->design_voltage;
662 				battery->design_capacity_warning =
663 				    battery->design_capacity_warning *
664 				    10000 / battery->design_voltage;
665 				battery->capacity_now = battery->capacity_now *
666 				    10000 / battery->design_voltage;
667 			}
668 		}
669 	}
670 }
671 
672 static int acpi_battery_update(struct acpi_battery *battery)
673 {
674 	int result, old_present = acpi_battery_present(battery);
675 	result = acpi_battery_get_status(battery);
676 	if (result)
677 		return result;
678 	if (!acpi_battery_present(battery)) {
679 		sysfs_remove_battery(battery);
680 		battery->update_time = 0;
681 		return 0;
682 	}
683 	if (!battery->update_time ||
684 	    old_present != acpi_battery_present(battery)) {
685 		result = acpi_battery_get_info(battery);
686 		if (result)
687 			return result;
688 		acpi_battery_init_alarm(battery);
689 	}
690 	if (!battery->bat.dev) {
691 		result = sysfs_add_battery(battery);
692 		if (result)
693 			return result;
694 	}
695 	result = acpi_battery_get_state(battery);
696 	acpi_battery_quirks(battery);
697 	return result;
698 }
699 
700 static void acpi_battery_refresh(struct acpi_battery *battery)
701 {
702 	int power_unit;
703 
704 	if (!battery->bat.dev)
705 		return;
706 
707 	power_unit = battery->power_unit;
708 
709 	acpi_battery_get_info(battery);
710 
711 	if (power_unit == battery->power_unit)
712 		return;
713 
714 	/* The battery has changed its reporting units. */
715 	sysfs_remove_battery(battery);
716 	sysfs_add_battery(battery);
717 }
718 
719 /* --------------------------------------------------------------------------
720                                  Driver Interface
721    -------------------------------------------------------------------------- */
722 
723 static void acpi_battery_notify(struct acpi_device *device, u32 event)
724 {
725 	struct acpi_battery *battery = acpi_driver_data(device);
726 	struct device *old;
727 
728 	if (!battery)
729 		return;
730 	old = battery->bat.dev;
731 	if (event == ACPI_BATTERY_NOTIFY_INFO)
732 		acpi_battery_refresh(battery);
733 	acpi_battery_update(battery);
734 	acpi_bus_generate_netlink_event(device->pnp.device_class,
735 					dev_name(&device->dev), event,
736 					acpi_battery_present(battery));
737 	acpi_notifier_call_chain(device, event, acpi_battery_present(battery));
738 	/* acpi_battery_update could remove power_supply object */
739 	if (old && battery->bat.dev)
740 		power_supply_changed(&battery->bat);
741 }
742 
743 static int battery_notify(struct notifier_block *nb,
744 			       unsigned long mode, void *_unused)
745 {
746 	struct acpi_battery *battery = container_of(nb, struct acpi_battery,
747 						    pm_nb);
748 	switch (mode) {
749 	case PM_POST_HIBERNATION:
750 	case PM_POST_SUSPEND:
751 		if (battery->bat.dev) {
752 			sysfs_remove_battery(battery);
753 			sysfs_add_battery(battery);
754 		}
755 		break;
756 	}
757 
758 	return 0;
759 }
760 
761 static struct dmi_system_id bat_dmi_table[] = {
762 	{
763 		.ident = "NEC LZ750/LS",
764 		.matches = {
765 			DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
766 			DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"),
767 		},
768 	},
769 	{},
770 };
771 
772 static int acpi_battery_add(struct acpi_device *device)
773 {
774 	int result = 0;
775 	struct acpi_battery *battery = NULL;
776 
777 	if (!device)
778 		return -EINVAL;
779 	battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL);
780 	if (!battery)
781 		return -ENOMEM;
782 	battery->device = device;
783 	strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME);
784 	strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
785 	device->driver_data = battery;
786 	mutex_init(&battery->lock);
787 	mutex_init(&battery->sysfs_lock);
788 	if (acpi_has_method(battery->device->handle, "_BIX"))
789 		set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
790 	result = acpi_battery_update(battery);
791 	if (result)
792 		goto fail;
793 
794 	printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n",
795 		ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
796 		device->status.battery_present ? "present" : "absent");
797 
798 	battery->pm_nb.notifier_call = battery_notify;
799 	register_pm_notifier(&battery->pm_nb);
800 
801 	return result;
802 
803 fail:
804 	sysfs_remove_battery(battery);
805 	mutex_destroy(&battery->lock);
806 	mutex_destroy(&battery->sysfs_lock);
807 	kfree(battery);
808 	return result;
809 }
810 
811 static int acpi_battery_remove(struct acpi_device *device)
812 {
813 	struct acpi_battery *battery = NULL;
814 
815 	if (!device || !acpi_driver_data(device))
816 		return -EINVAL;
817 	battery = acpi_driver_data(device);
818 	unregister_pm_notifier(&battery->pm_nb);
819 	sysfs_remove_battery(battery);
820 	mutex_destroy(&battery->lock);
821 	mutex_destroy(&battery->sysfs_lock);
822 	kfree(battery);
823 	return 0;
824 }
825 
826 #ifdef CONFIG_PM_SLEEP
827 /* this is needed to learn about changes made in suspended state */
828 static int acpi_battery_resume(struct device *dev)
829 {
830 	struct acpi_battery *battery;
831 
832 	if (!dev)
833 		return -EINVAL;
834 
835 	battery = acpi_driver_data(to_acpi_device(dev));
836 	if (!battery)
837 		return -EINVAL;
838 
839 	battery->update_time = 0;
840 	acpi_battery_update(battery);
841 	return 0;
842 }
843 #else
844 #define acpi_battery_resume NULL
845 #endif
846 
847 static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume);
848 
849 static struct acpi_driver acpi_battery_driver = {
850 	.name = "battery",
851 	.class = ACPI_BATTERY_CLASS,
852 	.ids = battery_device_ids,
853 	.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
854 	.ops = {
855 		.add = acpi_battery_add,
856 		.remove = acpi_battery_remove,
857 		.notify = acpi_battery_notify,
858 		},
859 	.drv.pm = &acpi_battery_pm,
860 };
861 
862 static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
863 {
864 	if (acpi_disabled)
865 		return;
866 
867 	if (dmi_check_system(bat_dmi_table))
868 		battery_bix_broken_package = 1;
869 	acpi_bus_register_driver(&acpi_battery_driver);
870 }
871 
872 static int __init acpi_battery_init(void)
873 {
874 	async_schedule(acpi_battery_init_async, NULL);
875 	return 0;
876 }
877 
878 static void __exit acpi_battery_exit(void)
879 {
880 	acpi_bus_unregister_driver(&acpi_battery_driver);
881 }
882 
883 module_init(acpi_battery_init);
884 module_exit(acpi_battery_exit);
885