aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouke Witteveen <j.witteveen@gmail.com>2018-07-11 05:45:36 -0400
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>2018-07-18 06:29:12 -0400
commit1a32ebb26ba9adc9a3fe59079b79a82f6bbec34e (patch)
tree3878e8875f182b88eacd7410cedc0a8c7e633568
parent846a416b4630fc960c10500b4194ad504bc22d4b (diff)
platform/x86: thinkpad_acpi: Support battery quirk
Some Thinkpads have a single battery, but expose it as BAT1. Use the quirks engine to force these machines into always addressing the primary battery. Without this, the battery name would resolve to the non-existent secondary battery and ACPI calls would fail. Signed-off-by: Jouke Witteveen <j.witteveen@gmail.com> Acked-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index a3fc235c23d7..3dbff2dda9be 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -335,6 +335,7 @@ static struct {
335 u32 second_fan:1; 335 u32 second_fan:1;
336 u32 beep_needs_two_args:1; 336 u32 beep_needs_two_args:1;
337 u32 mixer_no_level_control:1; 337 u32 mixer_no_level_control:1;
338 u32 battery_force_primary:1;
338 u32 input_device_registered:1; 339 u32 input_device_registered:1;
339 u32 platform_drv_registered:1; 340 u32 platform_drv_registered:1;
340 u32 platform_drv_attrs_registered:1; 341 u32 platform_drv_attrs_registered:1;
@@ -343,7 +344,6 @@ static struct {
343 u32 sensors_pdev_attrs_registered:1; 344 u32 sensors_pdev_attrs_registered:1;
344 u32 hotkey_poll_active:1; 345 u32 hotkey_poll_active:1;
345 u32 has_adaptive_kbd:1; 346 u32 has_adaptive_kbd:1;
346 u32 battery:1;
347} tp_features; 347} tp_features;
348 348
349static struct { 349static struct {
@@ -471,6 +471,12 @@ do { \
471 .ec = TPACPI_MATCH_ANY, \ 471 .ec = TPACPI_MATCH_ANY, \
472 .quirks = (__quirk) } 472 .quirks = (__quirk) }
473 473
474#define TPACPI_Q_LNV3(__id1, __id2, __id3, __quirk) \
475 { .vendor = PCI_VENDOR_ID_LENOVO, \
476 .bios = TPID3(__id1, __id2, __id3), \
477 .ec = TPACPI_MATCH_ANY, \
478 .quirks = (__quirk) }
479
474#define TPACPI_QEC_LNV(__id1, __id2, __quirk) \ 480#define TPACPI_QEC_LNV(__id1, __id2, __quirk) \
475 { .vendor = PCI_VENDOR_ID_LENOVO, \ 481 { .vendor = PCI_VENDOR_ID_LENOVO, \
476 .bios = TPACPI_MATCH_ANY, \ 482 .bios = TPACPI_MATCH_ANY, \
@@ -9423,7 +9429,8 @@ static int tpacpi_battery_probe(int battery)
9423static int tpacpi_battery_get_id(const char *battery_name) 9429static int tpacpi_battery_get_id(const char *battery_name)
9424{ 9430{
9425 9431
9426 if (strcmp(battery_name, "BAT0") == 0) 9432 if (strcmp(battery_name, "BAT0") == 0 ||
9433 tp_features.battery_force_primary)
9427 return BAT_PRIMARY; 9434 return BAT_PRIMARY;
9428 if (strcmp(battery_name, "BAT1") == 0) 9435 if (strcmp(battery_name, "BAT1") == 0)
9429 return BAT_SECONDARY; 9436 return BAT_SECONDARY;
@@ -9599,8 +9606,20 @@ static struct acpi_battery_hook battery_hook = {
9599 9606
9600/* Subdriver init/exit */ 9607/* Subdriver init/exit */
9601 9608
9609static const struct tpacpi_quirk battery_quirk_table[] __initconst = {
9610 /*
9611 * Individual addressing is broken on models that expose the
9612 * primary battery as BAT1.
9613 */
9614 TPACPI_Q_LNV3('R', '0', 'C', true), /* Thinkpad 13 */
9615};
9616
9602static int __init tpacpi_battery_init(struct ibm_init_struct *ibm) 9617static int __init tpacpi_battery_init(struct ibm_init_struct *ibm)
9603{ 9618{
9619 tp_features.battery_force_primary = tpacpi_check_quirks(
9620 battery_quirk_table,
9621 ARRAY_SIZE(battery_quirk_table));
9622
9604 battery_hook_register(&battery_hook); 9623 battery_hook_register(&battery_hook);
9605 return 0; 9624 return 0;
9606} 9625}