|
@@ -23,18 +23,18 @@
|
|
|
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
|
|
|
+#include <linux/async.h>
|
|
|
+#include <linux/delay.h>
|
|
|
+#include <linux/dmi.h>
|
|
|
+#include <linux/jiffies.h>
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/list.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/mutex.h>
|
|
|
-#include <linux/init.h>
|
|
|
-#include <linux/types.h>
|
|
|
-#include <linux/jiffies.h>
|
|
|
-#include <linux/async.h>
|
|
|
-#include <linux/dmi.h>
|
|
|
-#include <linux/delay.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/suspend.h>
|
|
|
+#include <linux/types.h>
|
|
|
+
|
|
|
#include <asm/unaligned.h>
|
|
|
|
|
|
#ifdef CONFIG_ACPI_PROCFS_POWER
|
|
@@ -364,6 +364,20 @@ static enum power_supply_property energy_battery_props[] = {
|
|
|
POWER_SUPPLY_PROP_SERIAL_NUMBER,
|
|
|
};
|
|
|
|
|
|
+static enum power_supply_property energy_battery_full_cap_broken_props[] = {
|
|
|
+ POWER_SUPPLY_PROP_STATUS,
|
|
|
+ POWER_SUPPLY_PROP_PRESENT,
|
|
|
+ POWER_SUPPLY_PROP_TECHNOLOGY,
|
|
|
+ POWER_SUPPLY_PROP_CYCLE_COUNT,
|
|
|
+ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
|
|
|
+ POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
|
|
+ POWER_SUPPLY_PROP_POWER_NOW,
|
|
|
+ POWER_SUPPLY_PROP_ENERGY_NOW,
|
|
|
+ POWER_SUPPLY_PROP_MODEL_NAME,
|
|
|
+ POWER_SUPPLY_PROP_MANUFACTURER,
|
|
|
+ POWER_SUPPLY_PROP_SERIAL_NUMBER,
|
|
|
+};
|
|
|
+
|
|
|
/* --------------------------------------------------------------------------
|
|
|
Battery Management
|
|
|
-------------------------------------------------------------------------- */
|
|
@@ -577,8 +591,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
|
|
|
battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN &&
|
|
|
(s16)(battery->rate_now) < 0) {
|
|
|
battery->rate_now = abs((s16)battery->rate_now);
|
|
|
- printk_once(KERN_WARNING FW_BUG
|
|
|
- "battery: (dis)charge rate invalid.\n");
|
|
|
+ pr_warn_once(FW_BUG "battery: (dis)charge rate invalid.\n");
|
|
|
}
|
|
|
|
|
|
if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
|
|
@@ -799,6 +812,11 @@ static int sysfs_add_battery(struct acpi_battery *battery)
|
|
|
battery->bat_desc.properties = charge_battery_props;
|
|
|
battery->bat_desc.num_properties =
|
|
|
ARRAY_SIZE(charge_battery_props);
|
|
|
+ } else if (battery->full_charge_capacity == 0) {
|
|
|
+ battery->bat_desc.properties =
|
|
|
+ energy_battery_full_cap_broken_props;
|
|
|
+ battery->bat_desc.num_properties =
|
|
|
+ ARRAY_SIZE(energy_battery_full_cap_broken_props);
|
|
|
} else {
|
|
|
battery->bat_desc.properties = energy_battery_props;
|
|
|
battery->bat_desc.num_properties =
|
|
@@ -918,10 +936,11 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
|
|
|
|
|
|
static int acpi_battery_update(struct acpi_battery *battery, bool resume)
|
|
|
{
|
|
|
- int result, old_present = acpi_battery_present(battery);
|
|
|
- result = acpi_battery_get_status(battery);
|
|
|
+ int result = acpi_battery_get_status(battery);
|
|
|
+
|
|
|
if (result)
|
|
|
return result;
|
|
|
+
|
|
|
if (!acpi_battery_present(battery)) {
|
|
|
sysfs_remove_battery(battery);
|
|
|
battery->update_time = 0;
|
|
@@ -931,8 +950,7 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume)
|
|
|
if (resume)
|
|
|
return 0;
|
|
|
|
|
|
- if (!battery->update_time ||
|
|
|
- old_present != acpi_battery_present(battery)) {
|
|
|
+ if (!battery->update_time) {
|
|
|
result = acpi_battery_get_info(battery);
|
|
|
if (result)
|
|
|
return result;
|
|
@@ -1021,7 +1039,7 @@ static int acpi_battery_info_proc_show(struct seq_file *seq, void *offset)
|
|
|
acpi_battery_units(battery));
|
|
|
|
|
|
seq_printf(seq, "battery technology: %srechargeable\n",
|
|
|
- (!battery->technology)?"non-":"");
|
|
|
+ battery->technology ? "" : "non-");
|
|
|
|
|
|
if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
|
|
|
seq_printf(seq, "design voltage: unknown\n");
|
|
@@ -1112,11 +1130,12 @@ static int acpi_battery_alarm_proc_show(struct seq_file *seq, void *offset)
|
|
|
goto end;
|
|
|
}
|
|
|
seq_printf(seq, "alarm: ");
|
|
|
- if (!battery->alarm)
|
|
|
- seq_printf(seq, "unsupported\n");
|
|
|
- else
|
|
|
+ if (battery->alarm) {
|
|
|
seq_printf(seq, "%u %sh\n", battery->alarm,
|
|
|
acpi_battery_units(battery));
|
|
|
+ } else {
|
|
|
+ seq_printf(seq, "unsupported\n");
|
|
|
+ }
|
|
|
end:
|
|
|
if (result)
|
|
|
seq_printf(seq, "ERROR: Unable to read battery alarm\n");
|
|
@@ -1149,9 +1168,9 @@ static ssize_t acpi_battery_write_alarm(struct file *file,
|
|
|
}
|
|
|
result = acpi_battery_set_alarm(battery);
|
|
|
end:
|
|
|
- if (!result)
|
|
|
- return count;
|
|
|
- return result;
|
|
|
+ if (result)
|
|
|
+ return result;
|
|
|
+ return count;
|
|
|
}
|
|
|
|
|
|
static int acpi_battery_alarm_proc_open(struct inode *inode, struct file *file)
|
|
@@ -1170,8 +1189,7 @@ static const struct file_operations acpi_battery_alarm_fops = {
|
|
|
|
|
|
static int acpi_battery_add_fs(struct acpi_device *device)
|
|
|
{
|
|
|
- printk(KERN_WARNING PREFIX "Deprecated procfs I/F for battery is loaded,"
|
|
|
- " please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
|
|
|
+ pr_warning(PREFIX "Deprecated procfs I/F for battery is loaded, please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
|
|
|
if (!acpi_device_dir(device)) {
|
|
|
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
|
|
|
acpi_battery_dir);
|
|
@@ -1247,7 +1265,9 @@ static int battery_notify(struct notifier_block *nb,
|
|
|
if (!acpi_battery_present(battery))
|
|
|
return 0;
|
|
|
|
|
|
- if (!battery->bat) {
|
|
|
+ if (battery->bat) {
|
|
|
+ acpi_battery_refresh(battery);
|
|
|
+ } else {
|
|
|
result = acpi_battery_get_info(battery);
|
|
|
if (result)
|
|
|
return result;
|
|
@@ -1255,8 +1275,7 @@ static int battery_notify(struct notifier_block *nb,
|
|
|
result = sysfs_add_battery(battery);
|
|
|
if (result)
|
|
|
return result;
|
|
|
- } else
|
|
|
- acpi_battery_refresh(battery);
|
|
|
+ }
|
|
|
|
|
|
acpi_battery_init_alarm(battery);
|
|
|
acpi_battery_get_state(battery);
|
|
@@ -1398,7 +1417,7 @@ static int acpi_battery_add(struct acpi_device *device)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
- printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n",
|
|
|
+ pr_info(PREFIX "%s Slot [%s] (battery %s)\n",
|
|
|
ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
|
|
|
device->status.battery_present ? "present" : "absent");
|
|
|
|