aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOgnjen Galic <smclt30p@gmail.com>2018-02-07 09:59:36 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2018-02-21 17:27:14 -0500
commit91eea70e5e5ce12eb1c7cd922e561fab43e201bd (patch)
treed88311e951a7614f03b162379e8fc18688674314
parent2801b9683f740012863f7f0b1f0bc770c417fe72 (diff)
ACPI: battery: Add the ThinkPad "Not Charging" quirk
The EC/ACPI firmware on Lenovo ThinkPads used to report a status of "Unknown" when the battery is between the charge start and charge stop thresholds. On Windows, it reports "Not Charging" so the quirk has been added to also report correctly. Now the "status" attribute returns "Not Charging" when the battery on ThinkPads is not physicaly charging. Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Ognjen Galic <smclt30p@gmail.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/acpi/battery.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index f14a2bb1f7cd..cfdef4c1d097 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -74,6 +74,7 @@ static async_cookie_t async_cookie;
74static bool battery_driver_registered; 74static bool battery_driver_registered;
75static int battery_bix_broken_package; 75static int battery_bix_broken_package;
76static int battery_notification_delay_ms; 76static int battery_notification_delay_ms;
77static int battery_quirk_notcharging;
77static int battery_full_discharging; 78static int battery_full_discharging;
78static unsigned int cache_time = 1000; 79static unsigned int cache_time = 1000;
79module_param(cache_time, uint, 0644); 80module_param(cache_time, uint, 0644);
@@ -229,6 +230,8 @@ static int acpi_battery_get_property(struct power_supply *psy,
229 val->intval = POWER_SUPPLY_STATUS_CHARGING; 230 val->intval = POWER_SUPPLY_STATUS_CHARGING;
230 else if (acpi_battery_is_charged(battery)) 231 else if (acpi_battery_is_charged(battery))
231 val->intval = POWER_SUPPLY_STATUS_FULL; 232 val->intval = POWER_SUPPLY_STATUS_FULL;
233 else if (battery_quirk_notcharging)
234 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
232 else 235 else
233 val->intval = POWER_SUPPLY_STATUS_UNKNOWN; 236 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
234 break; 237 break;
@@ -707,7 +710,7 @@ EXPORT_SYMBOL_GPL(battery_hook_register);
707 * This function gets called right after the battery sysfs 710 * This function gets called right after the battery sysfs
708 * attributes have been added, so that the drivers that 711 * attributes have been added, so that the drivers that
709 * define custom sysfs attributes can add their own. 712 * define custom sysfs attributes can add their own.
710*/ 713 */
711static void battery_hook_add_battery(struct acpi_battery *battery) 714static void battery_hook_add_battery(struct acpi_battery *battery)
712{ 715{
713 struct acpi_battery_hook *hook_node; 716 struct acpi_battery_hook *hook_node;
@@ -1315,6 +1318,12 @@ static int __init battery_full_discharging_quirk(const struct dmi_system_id *d)
1315 return 0; 1318 return 0;
1316} 1319}
1317 1320
1321static int __init battery_quirk_not_charging(const struct dmi_system_id *d)
1322{
1323 battery_quirk_notcharging = 1;
1324 return 0;
1325}
1326
1318static const struct dmi_system_id bat_dmi_table[] __initconst = { 1327static const struct dmi_system_id bat_dmi_table[] __initconst = {
1319 { 1328 {
1320 .callback = battery_bix_broken_package_quirk, 1329 .callback = battery_bix_broken_package_quirk,
@@ -1364,6 +1373,19 @@ static const struct dmi_system_id bat_dmi_table[] __initconst = {
1364 DMI_MATCH(DMI_PRODUCT_NAME, "UX410UAK"), 1373 DMI_MATCH(DMI_PRODUCT_NAME, "UX410UAK"),
1365 }, 1374 },
1366 }, 1375 },
1376 {
1377 /*
1378 * On Lenovo ThinkPads the BIOS specification defines
1379 * a state when the bits for charging and discharging
1380 * are both set to 0. That state is "Not Charging".
1381 */
1382 .callback = battery_quirk_not_charging,
1383 .ident = "Lenovo ThinkPad",
1384 .matches = {
1385 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
1386 DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad"),
1387 },
1388 },
1367 {}, 1389 {},
1368}; 1390};
1369 1391