Linux Audio

Check our new training course

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