diff mbox

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

Message ID 1401822083-4866-2-git-send-email-mezin.alexander@gmail.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Aleksandr Mezin June 3, 2014, 7:01 p.m. UTC
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: Alexander Mezin <mezin.alexander@gmail.com>
---
 drivers/acpi/battery.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

Comments

Tianyu Lan June 10, 2014, 2:15 a.m. UTC | #1
2014-06-04 3:01 GMT+08:00 Alexander Mezin <mezin.alexander@gmail.com>:
> 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.

Could you provide the output of acpidump?

>
> Signed-off-by: Alexander Mezin <mezin.alexander@gmail.com>
> ---
>  drivers/acpi/battery.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
>
> diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
> index f17bc7e..87d26c3 100644
> --- a/drivers/acpi/battery.c
> +++ b/drivers/acpi/battery.c
> @@ -32,6 +32,7 @@
>  #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 <asm/unaligned.h>
> @@ -66,6 +67,7 @@ MODULE_DESCRIPTION("ACPI Battery Driver");
>  MODULE_LICENSE("GPL");
>
>  static int battery_bix_broken_package;
> +static int battery_notification_delay_ms;
>  static unsigned int cache_time = 1000;
>  module_param(cache_time, uint, 0644);
>  MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
> @@ -1028,6 +1030,14 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
>         if (!battery)
>                 return;
>         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)
>                 acpi_battery_refresh(battery);
>         acpi_battery_update(battery);
> @@ -1064,6 +1074,12 @@ static int battery_bix_broken_package_quirk(const struct dmi_system_id *d)
>         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[] = {
>         {
>                 .callback = battery_bix_broken_package_quirk,
> @@ -1073,6 +1089,14 @@ static struct dmi_system_id bat_dmi_table[] = {
>                         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"),
> +               },
> +       },
>         {},
>  };
>
> --
> 2.0.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tianyu Lan June 13, 2014, 8:46 a.m. UTC | #2
2014-06-10 22:38 GMT+08:00 Alexander Mezin <mezin.alexander@gmail.com>:
> 2014-06-10 9:15 GMT+07:00 Lan Tianyu <lantianyu1986@gmail.com>:
>> 2014-06-04 3:01 GMT+08:00 Alexander Mezin <mezin.alexander@gmail.com>:
>>> 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.
>>

From the ACPI table, battery status is read from EC and the notification is
also triggered from EC Query event. The status should be updated at that
point but ... Have no better idea.

Acked-by: Lan Tianyu <tianyu.lan@intel.com>

>> Could you provide the output of acpidump?
> Attached
>>
>>>
>>> Signed-off-by: Alexander Mezin <mezin.alexander@gmail.com>
>>> ---
>>>  drivers/acpi/battery.c | 24 ++++++++++++++++++++++++
>>>  1 file changed, 24 insertions(+)
>>>
>>> diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
>>> index f17bc7e..87d26c3 100644
>>> --- a/drivers/acpi/battery.c
>>> +++ b/drivers/acpi/battery.c
>>> @@ -32,6 +32,7 @@
>>>  #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 <asm/unaligned.h>
>>> @@ -66,6 +67,7 @@ MODULE_DESCRIPTION("ACPI Battery Driver");
>>>  MODULE_LICENSE("GPL");
>>>
>>>  static int battery_bix_broken_package;
>>> +static int battery_notification_delay_ms;
>>>  static unsigned int cache_time = 1000;
>>>  module_param(cache_time, uint, 0644);
>>>  MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
>>> @@ -1028,6 +1030,14 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
>>>         if (!battery)
>>>                 return;
>>>         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)
>>>                 acpi_battery_refresh(battery);
>>>         acpi_battery_update(battery);
>>> @@ -1064,6 +1074,12 @@ static int battery_bix_broken_package_quirk(const struct dmi_system_id *d)
>>>         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[] = {
>>>         {
>>>                 .callback = battery_bix_broken_package_quirk,
>>> @@ -1073,6 +1089,14 @@ static struct dmi_system_id bat_dmi_table[] = {
>>>                         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"),
>>> +               },
>>> +       },
>>>         {},
>>>  };
>>>
>>> --
>>> 2.0.0
>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>>
>>
>> --
>> Best regards
>> Tianyu Lan
diff mbox

Patch

diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index f17bc7e..87d26c3 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -32,6 +32,7 @@ 
 #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 <asm/unaligned.h>
@@ -66,6 +67,7 @@  MODULE_DESCRIPTION("ACPI Battery Driver");
 MODULE_LICENSE("GPL");
 
 static int battery_bix_broken_package;
+static int battery_notification_delay_ms;
 static unsigned int cache_time = 1000;
 module_param(cache_time, uint, 0644);
 MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
@@ -1028,6 +1030,14 @@  static void acpi_battery_notify(struct acpi_device *device, u32 event)
 	if (!battery)
 		return;
 	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)
 		acpi_battery_refresh(battery);
 	acpi_battery_update(battery);
@@ -1064,6 +1074,12 @@  static int battery_bix_broken_package_quirk(const struct dmi_system_id *d)
 	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[] = {
 	{
 		.callback = battery_bix_broken_package_quirk,
@@ -1073,6 +1089,14 @@  static struct dmi_system_id bat_dmi_table[] = {
 			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"),
+		},
+	},
 	{},
 };