Linux Audio

Check our new training course

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