Commit f43691c6 authored by Alexander Mezin's avatar Alexander Mezin Committed by Rafael J. Wysocki

ACPI / battery: add quirk for Acer Aspire V5-573G

On Acer Aspire V5-573G battery notifications are sometimes
triggered too early. For example, when AC is unplugged and
notification is triggered, battery state is still reported as
"Full", and changes to "Discharging" only after short delay,
without any notification.

This patch solves the problem by adding 1 second sleep.
Similar quirk is already implemented in AC driver for other laptop.
Signed-off-by: default avatarAlexander Mezin <mezin.alexander@gmail.com>
Acked-by: default avatarLan Tianyu <tianyu.lan@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 3f5dc08f
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/async.h> #include <linux/async.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/delay.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
...@@ -70,6 +71,7 @@ MODULE_DESCRIPTION("ACPI Battery Driver"); ...@@ -70,6 +71,7 @@ MODULE_DESCRIPTION("ACPI Battery Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static int battery_bix_broken_package; static int battery_bix_broken_package;
static int battery_notification_delay_ms;
static unsigned int cache_time = 1000; static unsigned int cache_time = 1000;
module_param(cache_time, uint, 0644); module_param(cache_time, uint, 0644);
MODULE_PARM_DESC(cache_time, "cache time in milliseconds"); MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
...@@ -1062,6 +1064,14 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) ...@@ -1062,6 +1064,14 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
if (!battery) if (!battery)
return; return;
old = battery->bat.dev; old = battery->bat.dev;
/*
* On Acer Aspire V5-573G notifications are sometimes triggered too
* early. For example, when AC is unplugged and notification is
* triggered, battery state is still reported as "Full", and changes to
* "Discharging" only after short delay, without any notification.
*/
if (battery_notification_delay_ms > 0)
msleep(battery_notification_delay_ms);
if (event == ACPI_BATTERY_NOTIFY_INFO) if (event == ACPI_BATTERY_NOTIFY_INFO)
acpi_battery_refresh(battery); acpi_battery_refresh(battery);
acpi_battery_update(battery, false); acpi_battery_update(battery, false);
...@@ -1112,6 +1122,12 @@ static int battery_bix_broken_package_quirk(const struct dmi_system_id *d) ...@@ -1112,6 +1122,12 @@ static int battery_bix_broken_package_quirk(const struct dmi_system_id *d)
return 0; return 0;
} }
static int battery_notification_delay_quirk(const struct dmi_system_id *d)
{
battery_notification_delay_ms = 1000;
return 0;
}
static struct dmi_system_id bat_dmi_table[] = { static struct dmi_system_id bat_dmi_table[] = {
{ {
.callback = battery_bix_broken_package_quirk, .callback = battery_bix_broken_package_quirk,
...@@ -1121,6 +1137,14 @@ static struct dmi_system_id bat_dmi_table[] = { ...@@ -1121,6 +1137,14 @@ static struct dmi_system_id bat_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"), DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"),
}, },
}, },
{
.callback = battery_notification_delay_quirk,
.ident = "Acer Aspire V5-573G",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-573G"),
},
},
{}, {},
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment