battery.c 26.2 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 *  battery.c - ACPI Battery Driver (Revision: 2.0)
L
Linus Torvalds 已提交
3
 *
4 5
 *  Copyright (C) 2007 Alexey Starikovskiy <astarikovskiy@suse.de>
 *  Copyright (C) 2004-2007 Vladimir Lebedev <vladimir.p.lebedev@intel.com>
L
Linus Torvalds 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or (at
 *  your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#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 41
#include <linux/power_supply.h>

42 43
#define PREFIX "ACPI: "

L
Linus Torvalds 已提交
44 45 46 47 48 49
#define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF

#define ACPI_BATTERY_CLASS		"battery"
#define ACPI_BATTERY_DEVICE_NAME	"Battery"
#define ACPI_BATTERY_NOTIFY_STATUS	0x80
#define ACPI_BATTERY_NOTIFY_INFO	0x81
50
#define ACPI_BATTERY_NOTIFY_THRESHOLD   0x82
L
Linus Torvalds 已提交
51

52 53 54
/* Battery power unit: 0 means mW, 1 means mA */
#define ACPI_BATTERY_POWER_UNIT_MA	1

L
Linus Torvalds 已提交
55
#define _COMPONENT		ACPI_BATTERY_COMPONENT
56

57
ACPI_MODULE_NAME("battery");
L
Linus Torvalds 已提交
58

59
MODULE_AUTHOR("Paul Diefenbaugh");
60
MODULE_AUTHOR("Alexey Starikovskiy <astarikovskiy@suse.de>");
61
MODULE_DESCRIPTION("ACPI Battery Driver");
L
Linus Torvalds 已提交
62 63
MODULE_LICENSE("GPL");

64
static int battery_bix_broken_package;
65 66 67
static unsigned int cache_time = 1000;
module_param(cache_time, uint, 0644);
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
68

69 70 71 72 73
static const struct acpi_device_id battery_device_ids[] = {
	{"PNP0C0A", 0},
	{"", 0},
};

74
MODULE_DEVICE_TABLE(acpi, battery_device_ids);
L
Linus Torvalds 已提交
75

76 77
enum {
	ACPI_BATTERY_ALARM_PRESENT,
78
	ACPI_BATTERY_XINFO_PRESENT,
79
	ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY,
80 81 82 83 84 85 86 87 88 89 90 91
	/* On Lenovo Thinkpad models from 2010 and 2011, the power unit
	   switches between mWh and mAh depending on whether the system
	   is running on battery or not.  When mAh is the unit, most
	   reported values are incorrect and need to be adjusted by
	   10000/design_voltage.  Verified on x201, t410, t410s, and x220.
	   Pre-2010 and 2012 models appear to always report in mWh and
	   are thus unaffected (tested with t42, t61, t500, x200, x300,
	   and x230).  Also, in mid-2012 Lenovo issued a BIOS update for
	   the 2011 models that fixes the issue (tested on x220 with a
	   post-1.29 BIOS), but as of Nov. 2012, no such update is
	   available for the 2010 models.  */
	ACPI_BATTERY_QUIRK_THINKPAD_MAH,
92
};
93

L
Linus Torvalds 已提交
94
struct acpi_battery {
95
	struct mutex lock;
96
	struct mutex sysfs_lock;
97
	struct power_supply bat;
98
	struct acpi_device *device;
99
	struct notifier_block pm_nb;
100
	unsigned long update_time;
101
	int revision;
102
	int rate_now;
103 104
	int capacity_now;
	int voltage_now;
105
	int design_capacity;
106
	int full_charge_capacity;
107 108 109 110
	int technology;
	int design_voltage;
	int design_capacity_warning;
	int design_capacity_low;
111 112 113 114 115 116
	int cycle_count;
	int measurement_accuracy;
	int max_sampling_time;
	int min_sampling_time;
	int max_averaging_interval;
	int min_averaging_interval;
117 118
	int capacity_granularity_1;
	int capacity_granularity_2;
119
	int alarm;
120 121 122 123
	char model_number[32];
	char serial_number[32];
	char type[32];
	char oem_info[32];
124 125
	int state;
	int power_unit;
126
	unsigned long flags;
L
Linus Torvalds 已提交
127 128
};

129
#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat)
130

131
static inline int acpi_battery_present(struct acpi_battery *battery)
132
{
133 134
	return battery->device->status.battery_present;
}
135

136 137 138 139 140 141 142 143
static int acpi_battery_technology(struct acpi_battery *battery)
{
	if (!strcasecmp("NiCd", battery->type))
		return POWER_SUPPLY_TECHNOLOGY_NiCd;
	if (!strcasecmp("NiMH", battery->type))
		return POWER_SUPPLY_TECHNOLOGY_NiMH;
	if (!strcasecmp("LION", battery->type))
		return POWER_SUPPLY_TECHNOLOGY_LION;
144
	if (!strncasecmp("LI-ION", battery->type, 6))
145
		return POWER_SUPPLY_TECHNOLOGY_LION;
146 147 148 149 150
	if (!strcasecmp("LiP", battery->type))
		return POWER_SUPPLY_TECHNOLOGY_LIPO;
	return POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
}

151
static int acpi_battery_get_state(struct acpi_battery *battery);
152

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
static int acpi_battery_is_charged(struct acpi_battery *battery)
{
	/* either charging or discharging */
	if (battery->state != 0)
		return 0;

	/* battery not reporting charge */
	if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN ||
	    battery->capacity_now == 0)
		return 0;

	/* good batteries update full_charge as the batteries degrade */
	if (battery->full_charge_capacity == battery->capacity_now)
		return 1;

	/* fallback to using design values for broken batteries */
	if (battery->design_capacity == battery->capacity_now)
		return 1;

	/* we don't do any sort of metric based on percentages */
	return 0;
}

176 177 178 179
static int acpi_battery_get_property(struct power_supply *psy,
				     enum power_supply_property psp,
				     union power_supply_propval *val)
{
180
	int ret = 0;
181 182
	struct acpi_battery *battery = to_acpi_battery(psy);

183 184 185 186
	if (acpi_battery_present(battery)) {
		/* run battery update only if it is present */
		acpi_battery_get_state(battery);
	} else if (psp != POWER_SUPPLY_PROP_PRESENT)
187 188 189 190 191 192 193
		return -ENODEV;
	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		if (battery->state & 0x01)
			val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
		else if (battery->state & 0x02)
			val->intval = POWER_SUPPLY_STATUS_CHARGING;
194
		else if (acpi_battery_is_charged(battery))
195
			val->intval = POWER_SUPPLY_STATUS_FULL;
196 197
		else
			val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
198 199 200 201 202 203 204
		break;
	case POWER_SUPPLY_PROP_PRESENT:
		val->intval = acpi_battery_present(battery);
		break;
	case POWER_SUPPLY_PROP_TECHNOLOGY:
		val->intval = acpi_battery_technology(battery);
		break;
205 206 207
	case POWER_SUPPLY_PROP_CYCLE_COUNT:
		val->intval = battery->cycle_count;
		break;
208
	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
209 210 211 212
		if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
			ret = -ENODEV;
		else
			val->intval = battery->design_voltage * 1000;
213 214
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
215 216 217 218
		if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN)
			ret = -ENODEV;
		else
			val->intval = battery->voltage_now * 1000;
219 220
		break;
	case POWER_SUPPLY_PROP_CURRENT_NOW:
221
	case POWER_SUPPLY_PROP_POWER_NOW:
222 223 224 225
		if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
			ret = -ENODEV;
		else
			val->intval = battery->rate_now * 1000;
226 227 228
		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
	case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
229 230 231 232
		if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
			ret = -ENODEV;
		else
			val->intval = battery->design_capacity * 1000;
233 234 235
		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL:
	case POWER_SUPPLY_PROP_ENERGY_FULL:
236 237 238 239
		if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
			ret = -ENODEV;
		else
			val->intval = battery->full_charge_capacity * 1000;
240 241 242
		break;
	case POWER_SUPPLY_PROP_CHARGE_NOW:
	case POWER_SUPPLY_PROP_ENERGY_NOW:
243 244 245 246
		if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN)
			ret = -ENODEV;
		else
			val->intval = battery->capacity_now * 1000;
247
		break;
248 249 250 251 252 253 254
	case POWER_SUPPLY_PROP_CAPACITY:
		if (battery->capacity_now && battery->full_charge_capacity)
			val->intval = battery->capacity_now * 100/
					battery->full_charge_capacity;
		else
			val->intval = 0;
		break;
255 256 257 258 259 260
	case POWER_SUPPLY_PROP_MODEL_NAME:
		val->strval = battery->model_number;
		break;
	case POWER_SUPPLY_PROP_MANUFACTURER:
		val->strval = battery->oem_info;
		break;
261 262 263
	case POWER_SUPPLY_PROP_SERIAL_NUMBER:
		val->strval = battery->serial_number;
		break;
264
	default:
265
		ret = -EINVAL;
266
	}
267
	return ret;
268 269 270 271 272 273
}

static enum power_supply_property charge_battery_props[] = {
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_TECHNOLOGY,
274
	POWER_SUPPLY_PROP_CYCLE_COUNT,
275 276 277 278 279 280
	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
	POWER_SUPPLY_PROP_CURRENT_NOW,
	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
	POWER_SUPPLY_PROP_CHARGE_FULL,
	POWER_SUPPLY_PROP_CHARGE_NOW,
281
	POWER_SUPPLY_PROP_CAPACITY,
282 283
	POWER_SUPPLY_PROP_MODEL_NAME,
	POWER_SUPPLY_PROP_MANUFACTURER,
284
	POWER_SUPPLY_PROP_SERIAL_NUMBER,
285 286 287 288 289 290
};

static enum power_supply_property energy_battery_props[] = {
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_TECHNOLOGY,
291
	POWER_SUPPLY_PROP_CYCLE_COUNT,
292 293
	POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
	POWER_SUPPLY_PROP_VOLTAGE_NOW,
294
	POWER_SUPPLY_PROP_POWER_NOW,
295 296 297
	POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
	POWER_SUPPLY_PROP_ENERGY_FULL,
	POWER_SUPPLY_PROP_ENERGY_NOW,
298
	POWER_SUPPLY_PROP_CAPACITY,
299 300
	POWER_SUPPLY_PROP_MODEL_NAME,
	POWER_SUPPLY_PROP_MANUFACTURER,
301
	POWER_SUPPLY_PROP_SERIAL_NUMBER,
302 303
};

304 305 306
/* --------------------------------------------------------------------------
                               Battery Management
   -------------------------------------------------------------------------- */
307 308 309 310
struct acpi_offsets {
	size_t offset;		/* offset inside struct acpi_sbs_battery */
	u8 mode;		/* int or string? */
};
311

312 313
static struct acpi_offsets state_offsets[] = {
	{offsetof(struct acpi_battery, state), 0},
314
	{offsetof(struct acpi_battery, rate_now), 0},
315 316
	{offsetof(struct acpi_battery, capacity_now), 0},
	{offsetof(struct acpi_battery, voltage_now), 0},
317
};
318

319 320 321
static struct acpi_offsets info_offsets[] = {
	{offsetof(struct acpi_battery, power_unit), 0},
	{offsetof(struct acpi_battery, design_capacity), 0},
322
	{offsetof(struct acpi_battery, full_charge_capacity), 0},
323 324 325 326 327 328 329 330 331 332 333
	{offsetof(struct acpi_battery, technology), 0},
	{offsetof(struct acpi_battery, design_voltage), 0},
	{offsetof(struct acpi_battery, design_capacity_warning), 0},
	{offsetof(struct acpi_battery, design_capacity_low), 0},
	{offsetof(struct acpi_battery, capacity_granularity_1), 0},
	{offsetof(struct acpi_battery, capacity_granularity_2), 0},
	{offsetof(struct acpi_battery, model_number), 1},
	{offsetof(struct acpi_battery, serial_number), 1},
	{offsetof(struct acpi_battery, type), 1},
	{offsetof(struct acpi_battery, oem_info), 1},
};
334

335
static struct acpi_offsets extended_info_offsets[] = {
336
	{offsetof(struct acpi_battery, revision), 0},
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
	{offsetof(struct acpi_battery, power_unit), 0},
	{offsetof(struct acpi_battery, design_capacity), 0},
	{offsetof(struct acpi_battery, full_charge_capacity), 0},
	{offsetof(struct acpi_battery, technology), 0},
	{offsetof(struct acpi_battery, design_voltage), 0},
	{offsetof(struct acpi_battery, design_capacity_warning), 0},
	{offsetof(struct acpi_battery, design_capacity_low), 0},
	{offsetof(struct acpi_battery, cycle_count), 0},
	{offsetof(struct acpi_battery, measurement_accuracy), 0},
	{offsetof(struct acpi_battery, max_sampling_time), 0},
	{offsetof(struct acpi_battery, min_sampling_time), 0},
	{offsetof(struct acpi_battery, max_averaging_interval), 0},
	{offsetof(struct acpi_battery, min_averaging_interval), 0},
	{offsetof(struct acpi_battery, capacity_granularity_1), 0},
	{offsetof(struct acpi_battery, capacity_granularity_2), 0},
	{offsetof(struct acpi_battery, model_number), 1},
	{offsetof(struct acpi_battery, serial_number), 1},
	{offsetof(struct acpi_battery, type), 1},
	{offsetof(struct acpi_battery, oem_info), 1},
};

358 359 360 361
static int extract_package(struct acpi_battery *battery,
			   union acpi_object *package,
			   struct acpi_offsets *offsets, int num)
{
362
	int i;
363 364 365 366 367 368 369 370
	union acpi_object *element;
	if (package->type != ACPI_TYPE_PACKAGE)
		return -EFAULT;
	for (i = 0; i < num; ++i) {
		if (package->package.count <= i)
			return -EFAULT;
		element = &package->package.elements[i];
		if (offsets[i].mode) {
371 372 373 374 375 376
			u8 *ptr = (u8 *)battery + offsets[i].offset;
			if (element->type == ACPI_TYPE_STRING ||
			    element->type == ACPI_TYPE_BUFFER)
				strncpy(ptr, element->string.pointer, 32);
			else if (element->type == ACPI_TYPE_INTEGER) {
				strncpy(ptr, (u8 *)&element->integer.value,
L
Lin Ming 已提交
377 378
					sizeof(u64));
				ptr[sizeof(u64)] = 0;
379 380
			} else
				*ptr = 0; /* don't have value */
381
		} else {
382 383 384
			int *x = (int *)((u8 *)battery + offsets[i].offset);
			*x = (element->type == ACPI_TYPE_INTEGER) ?
				element->integer.value : -1;
385
		}
386 387 388 389 390 391
	}
	return 0;
}

static int acpi_battery_get_status(struct acpi_battery *battery)
{
392
	if (acpi_bus_get_status(battery->device)) {
393 394 395
		ACPI_EXCEPTION((AE_INFO, AE_ERROR, "Evaluating _STA"));
		return -ENODEV;
	}
396
	return 0;
397 398 399
}

static int acpi_battery_get_info(struct acpi_battery *battery)
L
Linus Torvalds 已提交
400
{
401
	int result = -EFAULT;
L
Len Brown 已提交
402
	acpi_status status = 0;
403
	char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags) ?
404 405
			"_BIX" : "_BIF";

L
Len Brown 已提交
406
	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
L
Linus Torvalds 已提交
407

408 409
	if (!acpi_battery_present(battery))
		return 0;
410
	mutex_lock(&battery->lock);
411 412
	status = acpi_evaluate_object(battery->device->handle, name,
						NULL, &buffer);
413
	mutex_unlock(&battery->lock);
414

L
Linus Torvalds 已提交
415
	if (ACPI_FAILURE(status)) {
416
		ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s", name));
417
		return -ENODEV;
L
Linus Torvalds 已提交
418
	}
419 420 421 422 423 424

	if (battery_bix_broken_package)
		result = extract_package(battery, buffer.pointer,
				extended_info_offsets + 1,
				ARRAY_SIZE(extended_info_offsets) - 1);
	else if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
425 426 427 428 429 430
		result = extract_package(battery, buffer.pointer,
				extended_info_offsets,
				ARRAY_SIZE(extended_info_offsets));
	else
		result = extract_package(battery, buffer.pointer,
				info_offsets, ARRAY_SIZE(info_offsets));
431
	kfree(buffer.pointer);
432 433
	if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
		battery->full_charge_capacity = battery->design_capacity;
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
	if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) &&
	    battery->power_unit && battery->design_voltage) {
		battery->design_capacity = battery->design_capacity *
		    10000 / battery->design_voltage;
		battery->full_charge_capacity = battery->full_charge_capacity *
		    10000 / battery->design_voltage;
		battery->design_capacity_warning =
		    battery->design_capacity_warning *
		    10000 / battery->design_voltage;
		/* Curiously, design_capacity_low, unlike the rest of them,
		   is correct.  */
		/* capacity_granularity_* equal 1 on the systems tested, so
		   it's impossible to tell if they would need an adjustment
		   or not if their values were higher.  */
	}
449
	return result;
L
Linus Torvalds 已提交
450 451
}

452
static int acpi_battery_get_state(struct acpi_battery *battery)
L
Linus Torvalds 已提交
453
{
L
Len Brown 已提交
454 455 456
	int result = 0;
	acpi_status status = 0;
	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
L
Linus Torvalds 已提交
457

458 459
	if (!acpi_battery_present(battery))
		return 0;
L
Linus Torvalds 已提交
460

461 462 463 464 465
	if (battery->update_time &&
	    time_before(jiffies, battery->update_time +
			msecs_to_jiffies(cache_time)))
		return 0;

466
	mutex_lock(&battery->lock);
467
	status = acpi_evaluate_object(battery->device->handle, "_BST",
468 469
				      NULL, &buffer);
	mutex_unlock(&battery->lock);
470

L
Linus Torvalds 已提交
471
	if (ACPI_FAILURE(status)) {
472
		ACPI_EXCEPTION((AE_INFO, status, "Evaluating _BST"));
473
		return -ENODEV;
L
Linus Torvalds 已提交
474
	}
475

476 477
	result = extract_package(battery, buffer.pointer,
				 state_offsets, ARRAY_SIZE(state_offsets));
478
	battery->update_time = jiffies;
479
	kfree(buffer.pointer);
480

481 482 483 484 485 486 487
	/* For buggy DSDTs that report negative 16-bit values for either
	 * charging or discharging current and/or report 0 as 65536
	 * due to bad math.
	 */
	if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA &&
		battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN &&
		(s16)(battery->rate_now) < 0) {
488
		battery->rate_now = abs((s16)battery->rate_now);
489 490 491
		printk_once(KERN_WARNING FW_BUG "battery: (dis)charge rate"
			" invalid.\n");
	}
492

493 494 495 496
	if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
	    && battery->capacity_now >= 0 && battery->capacity_now <= 100)
		battery->capacity_now = (battery->capacity_now *
				battery->full_charge_capacity) / 100;
497 498 499 500 501
	if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) &&
	    battery->power_unit && battery->design_voltage) {
		battery->capacity_now = battery->capacity_now *
		    10000 / battery->design_voltage;
	}
502 503
	return result;
}
L
Linus Torvalds 已提交
504

505
static int acpi_battery_set_alarm(struct acpi_battery *battery)
L
Linus Torvalds 已提交
506
{
L
Len Brown 已提交
507
	acpi_status status = 0;
L
Linus Torvalds 已提交
508

509
	if (!acpi_battery_present(battery) ||
510
	    !test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags))
511
		return -ENODEV;
L
Linus Torvalds 已提交
512

513
	mutex_lock(&battery->lock);
514 515
	status = acpi_execute_simple_method(battery->device->handle, "_BTP",
					    battery->alarm);
516
	mutex_unlock(&battery->lock);
517

L
Linus Torvalds 已提交
518
	if (ACPI_FAILURE(status))
519
		return -ENODEV;
L
Linus Torvalds 已提交
520

521
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Alarm set to %d\n", battery->alarm));
522
	return 0;
L
Linus Torvalds 已提交
523 524
}

525
static int acpi_battery_init_alarm(struct acpi_battery *battery)
L
Linus Torvalds 已提交
526
{
527
	/* See if alarms are supported, and if so, set default */
528
	if (!acpi_has_method(battery->device->handle, "_BTP")) {
529
		clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
530
		return 0;
531
	}
532
	set_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
533 534
	if (!battery->alarm)
		battery->alarm = battery->design_capacity_warning;
535
	return acpi_battery_set_alarm(battery);
536
}
L
Linus Torvalds 已提交
537

538 539 540 541 542 543 544 545 546 547 548 549 550 551
static ssize_t acpi_battery_alarm_show(struct device *dev,
					struct device_attribute *attr,
					char *buf)
{
	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
	return sprintf(buf, "%d\n", battery->alarm * 1000);
}

static ssize_t acpi_battery_alarm_store(struct device *dev,
					struct device_attribute *attr,
					const char *buf, size_t count)
{
	unsigned long x;
	struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev));
552
	if (sscanf(buf, "%lu\n", &x) == 1)
553 554 555 556 557 558 559
		battery->alarm = x/1000;
	if (acpi_battery_present(battery))
		acpi_battery_set_alarm(battery);
	return count;
}

static struct device_attribute alarm_attr = {
560
	.attr = {.name = "alarm", .mode = 0644},
561 562 563 564 565 566 567 568
	.show = acpi_battery_alarm_show,
	.store = acpi_battery_alarm_store,
};

static int sysfs_add_battery(struct acpi_battery *battery)
{
	int result;

569
	if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) {
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
		battery->bat.properties = charge_battery_props;
		battery->bat.num_properties =
			ARRAY_SIZE(charge_battery_props);
	} else {
		battery->bat.properties = energy_battery_props;
		battery->bat.num_properties =
			ARRAY_SIZE(energy_battery_props);
	}

	battery->bat.name = acpi_device_bid(battery->device);
	battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
	battery->bat.get_property = acpi_battery_get_property;

	result = power_supply_register(&battery->device->dev, &battery->bat);
	if (result)
		return result;
	return device_create_file(battery->bat.dev, &alarm_attr);
}

static void sysfs_remove_battery(struct acpi_battery *battery)
{
591
	mutex_lock(&battery->sysfs_lock);
592
	if (!battery->bat.dev) {
593
		mutex_unlock(&battery->sysfs_lock);
594
		return;
595 596
	}

597 598
	device_remove_file(battery->bat.dev, &alarm_attr);
	power_supply_unregister(&battery->bat);
599
	battery->bat.dev = NULL;
600
	mutex_unlock(&battery->sysfs_lock);
601 602
}

603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620
static void find_battery(const struct dmi_header *dm, void *private)
{
	struct acpi_battery *battery = (struct acpi_battery *)private;
	/* Note: the hardcoded offsets below have been extracted from
	   the source code of dmidecode.  */
	if (dm->type == DMI_ENTRY_PORTABLE_BATTERY && dm->length >= 8) {
		const u8 *dmi_data = (const u8 *)(dm + 1);
		int dmi_capacity = get_unaligned((const u16 *)(dmi_data + 6));
		if (dm->length >= 18)
			dmi_capacity *= dmi_data[17];
		if (battery->design_capacity * battery->design_voltage / 1000
		    != dmi_capacity &&
		    battery->design_capacity * 10 == dmi_capacity)
			set_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH,
				&battery->flags);
	}
}

621 622 623 624 625 626 627 628 629 630 631 632
/*
 * According to the ACPI spec, some kinds of primary batteries can
 * report percentage battery remaining capacity directly to OS.
 * In this case, it reports the Last Full Charged Capacity == 100
 * and BatteryPresentRate == 0xFFFFFFFF.
 *
 * Now we found some battery reports percentage remaining capacity
 * even if it's rechargeable.
 * https://bugzilla.kernel.org/show_bug.cgi?id=15979
 *
 * Handle this correctly so that they won't break userspace.
 */
633
static void acpi_battery_quirks(struct acpi_battery *battery)
634 635
{
	if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
636
		return;
637

638 639 640
	if (battery->full_charge_capacity == 100 &&
		battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN &&
		battery->capacity_now >= 0 && battery->capacity_now <= 100) {
641 642 643 644 645
		set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags);
		battery->full_charge_capacity = battery->design_capacity;
		battery->capacity_now = (battery->capacity_now *
				battery->full_charge_capacity) / 100;
	}
646 647

	if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags))
648
		return;
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671

	if (battery->power_unit && dmi_name_in_vendors("LENOVO")) {
		const char *s;
		s = dmi_get_system_info(DMI_PRODUCT_VERSION);
		if (s && !strnicmp(s, "ThinkPad", 8)) {
			dmi_walk(find_battery, battery);
			if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH,
				     &battery->flags) &&
			    battery->design_voltage) {
				battery->design_capacity =
				    battery->design_capacity *
				    10000 / battery->design_voltage;
				battery->full_charge_capacity =
				    battery->full_charge_capacity *
				    10000 / battery->design_voltage;
				battery->design_capacity_warning =
				    battery->design_capacity_warning *
				    10000 / battery->design_voltage;
				battery->capacity_now = battery->capacity_now *
				    10000 / battery->design_voltage;
			}
		}
	}
672 673
}

674
static int acpi_battery_update(struct acpi_battery *battery)
675
{
676
	int result, old_present = acpi_battery_present(battery);
677
	result = acpi_battery_get_status(battery);
678
	if (result)
679
		return result;
680 681
	if (!acpi_battery_present(battery)) {
		sysfs_remove_battery(battery);
682
		battery->update_time = 0;
683
		return 0;
684
	}
685 686
	if (!battery->update_time ||
	    old_present != acpi_battery_present(battery)) {
687 688 689 690 691
		result = acpi_battery_get_info(battery);
		if (result)
			return result;
		acpi_battery_init_alarm(battery);
	}
692 693 694 695 696
	if (!battery->bat.dev) {
		result = sysfs_add_battery(battery);
		if (result)
			return result;
	}
697
	result = acpi_battery_get_state(battery);
698
	acpi_battery_quirks(battery);
699
	return result;
700 701
}

702 703
static void acpi_battery_refresh(struct acpi_battery *battery)
{
704 705
	int power_unit;

706 707 708
	if (!battery->bat.dev)
		return;

709 710
	power_unit = battery->power_unit;

711
	acpi_battery_get_info(battery);
712 713 714 715 716

	if (power_unit == battery->power_unit)
		return;

	/* The battery has changed its reporting units. */
717 718 719 720
	sysfs_remove_battery(battery);
	sysfs_add_battery(battery);
}

L
Linus Torvalds 已提交
721 722 723 724
/* --------------------------------------------------------------------------
                                 Driver Interface
   -------------------------------------------------------------------------- */

725
static void acpi_battery_notify(struct acpi_device *device, u32 event)
L
Linus Torvalds 已提交
726
{
727
	struct acpi_battery *battery = acpi_driver_data(device);
728
	struct device *old;
729

L
Linus Torvalds 已提交
730
	if (!battery)
731
		return;
732
	old = battery->bat.dev;
733 734
	if (event == ACPI_BATTERY_NOTIFY_INFO)
		acpi_battery_refresh(battery);
735 736
	acpi_battery_update(battery);
	acpi_bus_generate_netlink_event(device->pnp.device_class,
737
					dev_name(&device->dev), event,
V
Vladimir Lebedev 已提交
738
					acpi_battery_present(battery));
J
Justin P. Mattock 已提交
739
	/* acpi_battery_update could remove power_supply object */
740
	if (old && battery->bat.dev)
741
		power_supply_changed(&battery->bat);
L
Linus Torvalds 已提交
742 743
}

744 745 746 747 748 749
static int battery_notify(struct notifier_block *nb,
			       unsigned long mode, void *_unused)
{
	struct acpi_battery *battery = container_of(nb, struct acpi_battery,
						    pm_nb);
	switch (mode) {
750
	case PM_POST_HIBERNATION:
751
	case PM_POST_SUSPEND:
752 753 754 755
		if (battery->bat.dev) {
			sysfs_remove_battery(battery);
			sysfs_add_battery(battery);
		}
756 757 758 759 760 761
		break;
	}

	return 0;
}

762 763 764 765 766 767 768 769 770 771 772
static struct dmi_system_id bat_dmi_table[] = {
	{
		.ident = "NEC LZ750/LS",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
			DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"),
		},
	},
	{},
};

L
Len Brown 已提交
773
static int acpi_battery_add(struct acpi_device *device)
L
Linus Torvalds 已提交
774
{
L
Len Brown 已提交
775 776
	int result = 0;
	struct acpi_battery *battery = NULL;
777

L
Linus Torvalds 已提交
778
	if (!device)
779
		return -EINVAL;
780
	battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL);
L
Linus Torvalds 已提交
781
	if (!battery)
782
		return -ENOMEM;
783
	battery->device = device;
L
Linus Torvalds 已提交
784 785
	strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME);
	strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
786
	device->driver_data = battery;
787
	mutex_init(&battery->lock);
788
	mutex_init(&battery->sysfs_lock);
789
	if (acpi_has_method(battery->device->handle, "_BIX"))
790
		set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
791 792 793
	result = acpi_battery_update(battery);
	if (result)
		goto fail;
794

795 796 797 798
	printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n",
		ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
		device->status.battery_present ? "present" : "absent");

799 800 801
	battery->pm_nb.notifier_call = battery_notify;
	register_pm_notifier(&battery->pm_nb);

802
	return result;
803 804 805 806

fail:
	sysfs_remove_battery(battery);
	mutex_destroy(&battery->lock);
807
	mutex_destroy(&battery->sysfs_lock);
808 809
	kfree(battery);
	return result;
L
Linus Torvalds 已提交
810 811
}

812
static int acpi_battery_remove(struct acpi_device *device)
L
Linus Torvalds 已提交
813
{
L
Len Brown 已提交
814
	struct acpi_battery *battery = NULL;
L
Linus Torvalds 已提交
815 816

	if (!device || !acpi_driver_data(device))
817
		return -EINVAL;
818
	battery = acpi_driver_data(device);
819
	unregister_pm_notifier(&battery->pm_nb);
820
	sysfs_remove_battery(battery);
821
	mutex_destroy(&battery->lock);
822
	mutex_destroy(&battery->sysfs_lock);
L
Linus Torvalds 已提交
823
	kfree(battery);
824
	return 0;
L
Linus Torvalds 已提交
825 826
}

827
#ifdef CONFIG_PM_SLEEP
828
/* this is needed to learn about changes made in suspended state */
829
static int acpi_battery_resume(struct device *dev)
830 831
{
	struct acpi_battery *battery;
832 833

	if (!dev)
834
		return -EINVAL;
835 836 837 838 839

	battery = acpi_driver_data(to_acpi_device(dev));
	if (!battery)
		return -EINVAL;

840
	battery->update_time = 0;
841
	acpi_battery_update(battery);
842
	return 0;
843
}
844
#endif
845

846 847
static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume);

848 849 850 851
static struct acpi_driver acpi_battery_driver = {
	.name = "battery",
	.class = ACPI_BATTERY_CLASS,
	.ids = battery_device_ids,
852
	.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
853 854 855
	.ops = {
		.add = acpi_battery_add,
		.remove = acpi_battery_remove,
856
		.notify = acpi_battery_notify,
857
		},
858
	.drv.pm = &acpi_battery_pm,
859 860
};

861
static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
L
Linus Torvalds 已提交
862
{
P
Pavel Machek 已提交
863
	if (acpi_disabled)
864
		return;
865 866 867

	if (dmi_check_system(bat_dmi_table))
		battery_bix_broken_package = 1;
868
	acpi_bus_register_driver(&acpi_battery_driver);
869 870 871 872 873
}

static int __init acpi_battery_init(void)
{
	async_schedule(acpi_battery_init_async, NULL);
874
	return 0;
L
Linus Torvalds 已提交
875 876
}

L
Len Brown 已提交
877
static void __exit acpi_battery_exit(void)
L
Linus Torvalds 已提交
878 879 880 881 882 883
{
	acpi_bus_unregister_driver(&acpi_battery_driver);
}

module_init(acpi_battery_init);
module_exit(acpi_battery_exit);