Read/write battery charging limit using WMBB instead of WMAB for 2019 and newer models. Signed-off-by: Matan Ziv-Av <matan@xxxxxxxxxxx> --- drivers/platform/x86/lg-laptop.c | 40 +++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/drivers/platform/x86/lg-laptop.c b/drivers/platform/x86/lg-laptop.c index d4c49f822394..ccdc93be2a9b 100644 --- a/drivers/platform/x86/lg-laptop.c +++ b/drivers/platform/x86/lg-laptop.c @@ -75,6 +75,8 @@ static u32 inited; #define INIT_KBD_LED 0x10 #define INIT_SPARSE_KEYMAP 0x80 +static int battery_limit_use_wmbb; + static const struct key_entry wmi_keymap[] = { {KE_KEY, 0x70, {KEY_F15} }, /* LG control panel (F1) */ {KE_KEY, 0x74, {KEY_F13} }, /* Touchpad toggle (F5) */ @@ -466,7 +468,11 @@ static ssize_t battery_care_limit_store(struct device *dev, if (value == 100 || value == 80) { union acpi_object *r; - r = lg_wmab(WM_BATT_LIMIT, WM_SET, value); + if (!battery_limit_use_wmbb) + r = lg_wmab(WM_BATT_LIMIT, WM_SET, value); + else + r = lg_wmbb(WMBB_BATT_LIMIT, WM_SET, value); + if (!r) return -EIO; @@ -484,16 +490,29 @@ static ssize_t battery_care_limit_show(struct device *dev, unsigned int status; union acpi_object *r; - r = lg_wmab(WM_BATT_LIMIT, WM_GET, 0); - if (!r) - return -EIO; + if (!battery_limit_use_wmbb) { + r = lg_wmab(WM_BATT_LIMIT, WM_GET, 0); + if (!r) + return -EIO; - if (r->type != ACPI_TYPE_INTEGER) { - kfree(r); - return -EIO; - } + if (r->type != ACPI_TYPE_INTEGER) { + kfree(r); + return -EIO; + } + + status = r->integer.value; + } else { + r = lg_wmbb(WMBB_BATT_LIMIT, WM_GET, 0); + if (!r) + return -EIO; - status = r->integer.value; + if (r->type != ACPI_TYPE_BUFFER) { + kfree(r); + return -EIO; + } + + status = r->buffer.pointer[0x10]; + } kfree(r); if (status != 80 && status != 100) status = 0; @@ -648,6 +667,9 @@ static int acpi_add(struct acpi_device *device) } pr_info("product: %s year: %d debug v4\n", product, year); + if (year >= 2019) + battery_limit_use_wmbb = 1; + ret = sysfs_create_group(&pf_device->dev.kobj, &dev_attribute_group); if (ret) goto out_platform_device; -- 2.21.0