battery.c 25.7 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

L
Linus Torvalds 已提交
39 40
#include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h>
41 42
#include <linux/power_supply.h>

43 44
#define PREFIX "ACPI: "

L
Linus Torvalds 已提交
45 46 47 48 49 50
#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
51
#define ACPI_BATTERY_NOTIFY_THRESHOLD   0x82
L
Linus Torvalds 已提交
52

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

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

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

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

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 425
	if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
		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));
426
	kfree(buffer.pointer);
427 428
	if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
		battery->full_charge_capacity = battery->design_capacity;
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
	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.  */
	}
444
	return result;
L
Linus Torvalds 已提交
445 446
}

447
static int acpi_battery_get_state(struct acpi_battery *battery)
L
Linus Torvalds 已提交
448
{
L
Len Brown 已提交
449 450 451
	int result = 0;
	acpi_status status = 0;
	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
L
Linus Torvalds 已提交
452

453 454
	if (!acpi_battery_present(battery))
		return 0;
L
Linus Torvalds 已提交
455

456 457 458 459 460
	if (battery->update_time &&
	    time_before(jiffies, battery->update_time +
			msecs_to_jiffies(cache_time)))
		return 0;

461
	mutex_lock(&battery->lock);
462
	status = acpi_evaluate_object(battery->device->handle, "_BST",
463 464
				      NULL, &buffer);
	mutex_unlock(&battery->lock);
465

L
Linus Torvalds 已提交
466
	if (ACPI_FAILURE(status)) {
467
		ACPI_EXCEPTION((AE_INFO, status, "Evaluating _BST"));
468
		return -ENODEV;
L
Linus Torvalds 已提交
469
	}
470

471 472
	result = extract_package(battery, buffer.pointer,
				 state_offsets, ARRAY_SIZE(state_offsets));
473
	battery->update_time = jiffies;
474
	kfree(buffer.pointer);
475

476 477 478 479 480 481 482
	/* 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) {
483
		battery->rate_now = abs((s16)battery->rate_now);
484 485 486
		printk_once(KERN_WARNING FW_BUG "battery: (dis)charge rate"
			" invalid.\n");
	}
487

488 489 490 491
	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;
492 493 494 495 496
	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;
	}
497 498
	return result;
}
L
Linus Torvalds 已提交
499

500
static int acpi_battery_set_alarm(struct acpi_battery *battery)
L
Linus Torvalds 已提交
501
{
L
Len Brown 已提交
502
	acpi_status status = 0;
L
Linus Torvalds 已提交
503

504
	if (!acpi_battery_present(battery) ||
505
	    !test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags))
506
		return -ENODEV;
L
Linus Torvalds 已提交
507

508
	mutex_lock(&battery->lock);
509 510
	status = acpi_execute_simple_method(battery->device->handle, "_BTP",
					    battery->alarm);
511
	mutex_unlock(&battery->lock);
512

L
Linus Torvalds 已提交
513
	if (ACPI_FAILURE(status))
514
		return -ENODEV;
L
Linus Torvalds 已提交
515

516
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Alarm set to %d\n", battery->alarm));
517
	return 0;
L
Linus Torvalds 已提交
518 519
}

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

533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
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));
	if (sscanf(buf, "%ld\n", &x) == 1)
		battery->alarm = x/1000;
	if (acpi_battery_present(battery))
		acpi_battery_set_alarm(battery);
	return count;
}

static struct device_attribute alarm_attr = {
555
	.attr = {.name = "alarm", .mode = 0644},
556 557 558 559 560 561 562 563
	.show = acpi_battery_alarm_show,
	.store = acpi_battery_alarm_store,
};

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

564
	if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) {
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
		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)
{
586
	mutex_lock(&battery->sysfs_lock);
587
	if (!battery->bat.dev) {
588
		mutex_unlock(&battery->sysfs_lock);
589
		return;
590 591
	}

592 593
	device_remove_file(battery->bat.dev, &alarm_attr);
	power_supply_unregister(&battery->bat);
594
	battery->bat.dev = NULL;
595
	mutex_unlock(&battery->sysfs_lock);
596 597
}

598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
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);
	}
}

616 617 618 619 620 621 622 623 624 625 626 627
/*
 * 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.
 */
628
static void acpi_battery_quirks(struct acpi_battery *battery)
629 630
{
	if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
631
		return;
632

633 634 635
	if (battery->full_charge_capacity == 100 &&
		battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN &&
		battery->capacity_now >= 0 && battery->capacity_now <= 100) {
636 637 638 639 640
		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;
	}
641 642

	if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags))
643
		return;
644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666

	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;
			}
		}
	}
667 668
}

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

697 698
static void acpi_battery_refresh(struct acpi_battery *battery)
{
699 700
	int power_unit;

701 702 703
	if (!battery->bat.dev)
		return;

704 705
	power_unit = battery->power_unit;

706
	acpi_battery_get_info(battery);
707 708 709 710 711

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

	/* The battery has changed its reporting units. */
712 713 714 715
	sysfs_remove_battery(battery);
	sysfs_add_battery(battery);
}

L
Linus Torvalds 已提交
716 717 718 719
/* --------------------------------------------------------------------------
                                 Driver Interface
   -------------------------------------------------------------------------- */

720
static void acpi_battery_notify(struct acpi_device *device, u32 event)
L
Linus Torvalds 已提交
721
{
722
	struct acpi_battery *battery = acpi_driver_data(device);
723
	struct device *old;
724

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

739 740 741 742 743 744
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) {
745
	case PM_POST_HIBERNATION:
746
	case PM_POST_SUSPEND:
747 748 749 750
		if (battery->bat.dev) {
			sysfs_remove_battery(battery);
			sysfs_add_battery(battery);
		}
751 752 753 754 755 756
		break;
	}

	return 0;
}

L
Len Brown 已提交
757
static int acpi_battery_add(struct acpi_device *device)
L
Linus Torvalds 已提交
758
{
L
Len Brown 已提交
759 760
	int result = 0;
	struct acpi_battery *battery = NULL;
761

L
Linus Torvalds 已提交
762
	if (!device)
763
		return -EINVAL;
764
	battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL);
L
Linus Torvalds 已提交
765
	if (!battery)
766
		return -ENOMEM;
767
	battery->device = device;
L
Linus Torvalds 已提交
768 769
	strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME);
	strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
770
	device->driver_data = battery;
771
	mutex_init(&battery->lock);
772
	mutex_init(&battery->sysfs_lock);
773
	if (acpi_has_method(battery->device->handle, "_BIX"))
774
		set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
775 776 777
	result = acpi_battery_update(battery);
	if (result)
		goto fail;
778

779 780 781 782
	printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n",
		ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
		device->status.battery_present ? "present" : "absent");

783 784 785
	battery->pm_nb.notifier_call = battery_notify;
	register_pm_notifier(&battery->pm_nb);

786
	return result;
787 788 789 790

fail:
	sysfs_remove_battery(battery);
	mutex_destroy(&battery->lock);
791
	mutex_destroy(&battery->sysfs_lock);
792 793
	kfree(battery);
	return result;
L
Linus Torvalds 已提交
794 795
}

796
static int acpi_battery_remove(struct acpi_device *device)
L
Linus Torvalds 已提交
797
{
L
Len Brown 已提交
798
	struct acpi_battery *battery = NULL;
L
Linus Torvalds 已提交
799 800

	if (!device || !acpi_driver_data(device))
801
		return -EINVAL;
802
	battery = acpi_driver_data(device);
803
	unregister_pm_notifier(&battery->pm_nb);
804
	sysfs_remove_battery(battery);
805
	mutex_destroy(&battery->lock);
806
	mutex_destroy(&battery->sysfs_lock);
L
Linus Torvalds 已提交
807
	kfree(battery);
808
	return 0;
L
Linus Torvalds 已提交
809 810
}

811
#ifdef CONFIG_PM_SLEEP
812
/* this is needed to learn about changes made in suspended state */
813
static int acpi_battery_resume(struct device *dev)
814 815
{
	struct acpi_battery *battery;
816 817

	if (!dev)
818
		return -EINVAL;
819 820 821 822 823

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

824
	battery->update_time = 0;
825
	acpi_battery_update(battery);
826
	return 0;
827
}
828
#endif
829

830 831
static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume);

832 833 834 835
static struct acpi_driver acpi_battery_driver = {
	.name = "battery",
	.class = ACPI_BATTERY_CLASS,
	.ids = battery_device_ids,
836
	.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
837 838 839
	.ops = {
		.add = acpi_battery_add,
		.remove = acpi_battery_remove,
840
		.notify = acpi_battery_notify,
841
		},
842
	.drv.pm = &acpi_battery_pm,
843 844
};

845
static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
L
Linus Torvalds 已提交
846
{
P
Pavel Machek 已提交
847
	if (acpi_disabled)
848
		return;
849
	acpi_bus_register_driver(&acpi_battery_driver);
850 851 852 853 854
}

static int __init acpi_battery_init(void)
{
	async_schedule(acpi_battery_init_async, NULL);
855
	return 0;
L
Linus Torvalds 已提交
856 857
}

L
Len Brown 已提交
858
static void __exit acpi_battery_exit(void)
L
Linus Torvalds 已提交
859 860 861 862 863 864
{
	acpi_bus_unregister_driver(&acpi_battery_driver);
}

module_init(acpi_battery_init);
module_exit(acpi_battery_exit);