From nobody Sun Jun 21 06:29:29 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4ACDA396D1F; Mon, 6 Apr 2026 19:37:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504234; cv=none; b=OPfUYYIWxhnKklcSGh6tdvk8U1QLOAHxmrEU788sbj1TxVEDM+nPKNsIYTRVPAWGin+znrjjLOZZHsP8OE65WxC88nzZuowGUTkMnLEgYu+Kt/8j28oTlvFwwqHS9iRPJ+Li22C3nfwx/otQDh/dKSFELBAUnC3kO+51hUCXHxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504234; c=relaxed/simple; bh=5TC26Ptdx4tuYhuPqw0/YxBA1olP5iJIEZiKBC9B8DY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ohN6v4qwyuMfAOsWBsI2uyArJ5I8oUp6f96d3AijzkiHC25QzD+KKbdgi0Or+hqs6ei6cmhpkl5/c/Q/ry48ekDgCyDBYSgWOmwlmhJRV+sqbP7ggOt91spyVEe1K3Q0e4m980TWwHRaVzhxBH0Gv20qdpEzBKRpsOUYaaUIrxs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=Z9cpaX96; arc=none smtp.client-ip=212.227.17.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="Z9cpaX96" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1775504222; x=1776109022; i=w_armin@gmx.de; bh=Yl4RMfwPBmbVWShMGFLxwWCf0nqT2ef7m8wM5ZraTnc=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=Z9cpaX96GznuZ4Nd1Feo6TaV31XzXgJxaNeTz4JguYmHx+wooc/vqyNVMmQcVf+k Z47a19XAfSAAz3DmbM3OrRw7ZcPjUVzTyW5tjYFNNbDfYtoMuQEBLI7lB79QkDiPn 9Ny04mF39OeYa/grpHG+SjSIZnYvyJLJHjNI7M2aaG1RKX0So1riwu9pLFL7yeJ8+ rq/DdHI9N6ZK5mGAkdezSO2njUFRqR99cYB5DrFLX0rseI5frE761SxIPtXH5UnA8 vqw5LoydaX0qORDVPBmz8BkJr+ohqpzpClgN2hzYn/+THVkK4UMyA8AoFHkYjmDJ6 i8LFUyNakTgUq+h+vw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M4s51-1w9Ylt1LVv-004Sff; Mon, 06 Apr 2026 21:37:02 +0200 From: Armin Wolf To: hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: wse@tuxedocomputers.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/6] platform/x86: uniwill-laptop: Properly initialize charging threshold Date: Mon, 6 Apr 2026 21:36:48 +0200 Message-Id: <20260406193653.7799-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260406193653.7799-1-W_Armin@gmx.de> References: <20260406193653.7799-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:0LXu7fExgL7KYRO8cp/MQvVb6T75+SxZD6RknR+4vlt9vHxV0gB 4LH7NBUB4VVlB+063hAJcKHcNEgBnk+TXRGipBMxqh0XWPUHTdnarWIVz2VZ3HnADoXfR1U mDYt2gX9RwS7TvKgVyoLCTiO/8Px8g5m1yjF6xxedoy+Oi/a6+mX9rng8q//0JdNIfNRZe9 gxL9iSrhxgBcXzX5BHgGQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:7qJe7FCDRJA=;v4M7jjX9GSaT5UuaYlshV+hdBIE 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 Content-Type: text/plain; charset="utf-8" The EC might initialize the charge threshold with 0 to signal that said threshold is uninitialized. Detect this and replace said value with 100 to signal the EC that we want to take control of battery charging. Also set the threshold to 100 if the EC-provided value is invalid. Fixes: d050479693bb ("platform/x86: Add Uniwill laptop driver") Signed-off-by: Armin Wolf Reviewed-by: Werner Sembach --- drivers/platform/x86/uniwill/uniwill-acpi.c | 28 ++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index faade4cf08be..8f16c94221aa 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -1404,7 +1404,12 @@ static int uniwill_get_property(struct power_supply = *psy, const struct power_sup if (ret < 0) return ret; =20 - val->intval =3D clamp_val(FIELD_GET(CHARGE_CTRL_MASK, regval), 0, 100); + regval =3D FIELD_GET(CHARGE_CTRL_MASK, regval); + if (!regval) + val->intval =3D 100; + else + val->intval =3D min(regval, 100); + return 0; default: return -EINVAL; @@ -1499,11 +1504,32 @@ static int uniwill_remove_battery(struct power_supp= ly *battery, struct acpi_batt =20 static int uniwill_battery_init(struct uniwill_data *data) { + unsigned int value, threshold; int ret; =20 if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY)) return 0; =20 + ret =3D regmap_read(data->regmap, EC_ADDR_CHARGE_CTRL, &value); + if (ret < 0) + return ret; + + /* + * The charge control threshold might be initialized with 0 by + * the EC to signal that said threshold is uninitialized. We thus + * need to replace this value with 100 to signal that we want to + * take control of battery charging. For the sake of completeness + * we also set the charging threshold to 100 if the EC-provided + * value is invalid. + */ + threshold =3D FIELD_GET(CHARGE_CTRL_MASK, value); + if (threshold =3D=3D 0 || threshold > 100) { + FIELD_MODIFY(CHARGE_CTRL_MASK, &value, 100); + ret =3D regmap_write(data->regmap, EC_ADDR_CHARGE_CTRL, value); + if (ret < 0) + return ret; + } + ret =3D devm_mutex_init(data->dev, &data->battery_lock); if (ret < 0) return ret; --=20 2.39.5 From nobody Sun Jun 21 06:29:29 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 32281399011; Mon, 6 Apr 2026 19:37:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504237; cv=none; b=cPH23w3AJnKxdPghIcIsls/yE7PwAtCMrnKLZjy4K1Sip8abcrLtIFCdlT7UPkJlV/Y/ZR8QclQpAMaOQR2+ARmqErvKuOyrc+seY4NBjzjsdGYCUCmTc7IhR1KQSysJH77yyLO6mGYSLRNGO2VC8BaDvY8O0aefh+NXyvrz3yI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504237; c=relaxed/simple; bh=esCxLWYoA/+NjnyVT6NCeVZ6QXwR1EoDhdq7iYCVg2w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KGbKr7uRma+AXqWlqLudMwr1KKJ/ZEFurtWLaB24zqxaH0vwabXZK/nbqyNCOflnsfrB6pn7I+n3zth8eNHZ6o8b+2wy3zUF6WY/lOa5dOJCAeOZVBB6FAKBLa/bQAp6KgL+qsbmaaHX8b97S94EQGb4PD3dpQE6RHvOd4YfTcQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=NlqMReaZ; arc=none smtp.client-ip=212.227.17.21 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="NlqMReaZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1775504224; x=1776109024; i=w_armin@gmx.de; bh=ZcXNtNmzNBjAZ2ZObiILpn8jzc2kMCRBTDsRXRZKtso=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=NlqMReaZJrxd8FGN0FX41/6CvYjkh6F3RHnzfA5M9ufhn9bnxnD1RvKqFkAyhRNK lVR82PCVXH3/Kya27P52y6lZggxIaMCe4aKT1h4PJMeOKYOh6qqSQYuOl1Y+RfgN3 rauwWJXzhOibsbwqWGgiryjGEam5mIMgMe1TLIqJLMemjOGFnUvxs6OETgRRen/a5 m4Yp8uIaIm4RCfUEeiLQYytnhfceI03K4z8nQq1mMFOzSg2q7wsz5T1ZehGbI8oPj iN1ZOSrt5bxSAB+lLqS6QnZW3vCxFOoSM30gPfyp2y+HljRzyVCdmu4LCRwISKf4+ Gs/kKDRvxjRaBTHzJA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1N4hvb-1vRnsN2YA3-0172xQ; Mon, 06 Apr 2026 21:37:04 +0200 From: Armin Wolf To: hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: wse@tuxedocomputers.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/6] platform/x86: uniwill-laptop: Accept charging threshold of 0 Date: Mon, 6 Apr 2026 21:36:49 +0200 Message-Id: <20260406193653.7799-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260406193653.7799-1-W_Armin@gmx.de> References: <20260406193653.7799-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:85SOyyXnav0WRZktDtClvvKftjWnwXYdUWpTS8EsOgACBt0al7M FDuZi83+OvnZX0S+FAmVj0T/i/UYpkkhco9soBcebGs0gaP98tITQQC/YaQfspzP/nbGD+7 XipE22W5N9Y5R56E8NTjHsPAiPyiBS7saK87DnRD4HTLvClg0YCeKGg8eYArr3v5pyQqC9u xU7DJcircp9kz2QB6mh+Q== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:gR060QFszpY=;uwighYT4vJd46+BLraQ9lpCQBCr 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 gTKgPkCIvre Content-Type: text/plain; charset="utf-8" The power supply sysfs ABI states that: Not all hardware is capable of setting this to an arbitrary percentage. Drivers will round written values to the nearest supported value. Reading back the value will show the actual threshold set by the driver. The driver currently violates this ABI by rejecting a charging threshold of 0. Fix this by clamping this value to 1. Fixes: d050479693bb ("platform/x86: Add Uniwill laptop driver") Signed-off-by: Armin Wolf Reviewed-by: Werner Sembach --- drivers/platform/x86/uniwill/uniwill-acpi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 8f16c94221aa..5551f193c2c1 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -1424,11 +1424,11 @@ static int uniwill_set_property(struct power_supply= *psy, const struct power_sup =20 switch (psp) { case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD: - if (val->intval < 1 || val->intval > 100) + if (val->intval < 0 || val->intval > 100) return -EINVAL; =20 return regmap_update_bits(data->regmap, EC_ADDR_CHARGE_CTRL, CHARGE_CTRL= _MASK, - val->intval); + max(val->intval, 1)); default: return -EINVAL; } --=20 2.39.5 From nobody Sun Jun 21 06:29:29 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E5008397697; Mon, 6 Apr 2026 19:37:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504237; cv=none; b=JUH5xeK2KE589Xjn33VsVUZd4zaylUXEFz2QnYeSZFmi/hqYZuaPT6otF7YkI4Hc9LPu+qZYCxy94KLKTB/BZT4ni9tHKWj8vTcGG2XMfik8+v9jzFRUyXzTYW25xx3c4uUrNnZ0lD4NGXzQln2yze4GJolZ5eKTom0fb2Syo+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504237; c=relaxed/simple; bh=/GHcXEpHI4q28HOLkAa7hpPbMfQFN2h8/D8fV255OJk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Ctce8rW/Jr+5O6dg0Z31ifFokqQCMggTDuJrA3OSDNoONDsma3+9/TlInjOfbbF2tEsUAMHUDx0pzEhgd+WHuLd6MAoqHRmQjSLPQriTzEuiM5vJy1+0LmpUPy0OKcdFNct/9952oOM+ULV9+3Q3gX2W87dQ7lkSt3L7rupdGiM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=rr1s8eT9; arc=none smtp.client-ip=212.227.17.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="rr1s8eT9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1775504226; x=1776109026; i=w_armin@gmx.de; bh=h82fCWuRoIRPaLTJpQqASL0Fssnz7ZuXYX6XEbm5Wyw=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=rr1s8eT9iS0UNETsOEM5L7zYb6Un2YkaNrKbxBdfxTA0xOwbkYo5rE7HxlnGJ0Yo lNGw2sCQE1lHfAceXjxAc/MgRR38GIpeOC2tMn2h0Fc7JRXsa/bTRiBdserMVA/bx nX9cTubDCNfWaxcvsVdYR+PICLZ+/KD1HbtCRqWa9ea75qsVV+yigEARSE2OCwBwU NU7FrJd8CabXKsxK/JqkOFm5jf7TCL63xmLeJcKwKFnOzaYvTlXHNxnUinlxvehQh os1P4IJKQuOqUjuGJYALWBbR+5qkU5yVaRbp+av/D0fhdtL4gB/ySrSQOyESw0xIL 1R0AIufdMWuo3hOpuA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MDhlf-1wIOSj0kh5-00DJFL; Mon, 06 Apr 2026 21:37:06 +0200 From: Armin Wolf To: hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: wse@tuxedocomputers.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/6] platform/x86: uniwill-laptop: Fix behavior of "force" module param Date: Mon, 6 Apr 2026 21:36:50 +0200 Message-Id: <20260406193653.7799-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260406193653.7799-1-W_Armin@gmx.de> References: <20260406193653.7799-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:Qx5r4QbN88INLb4S2JkyI6lrD6hbIr6qLxCkQg+w9rXrqD0c81Z 2cMv9yzEotVj4lT4Rjl4mYN5uHjqI7PGNXo5HRtpfbCqT/VWOjzckHPcGpGFymzCsiWACY1 zFRHcyq6RJJoSIse6m0BYutu4Kiy0WIC2vjF8dC9Ef4lDYdGjSmCV1rdmNDt5dP7Jv5KZSc dC5aTSJave0x95ogtpDwg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:d7b9ANBpoRU=;28dsqzDYt8tQ/mlQDCSayjn1T54 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 Content-Type: text/plain; charset="utf-8" Users might want to force-enable all possible features even on machines with a valid device descriptor. Until now the "force" module param was ignored on such machines. Fix this to make it easier to test for support of new features. Fixes: d050479693bb ("platform/x86: Add Uniwill laptop driver") Signed-off-by: Armin Wolf --- drivers/platform/x86/uniwill/uniwill-acpi.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 5551f193c2c1..7c7ea0e76966 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -2481,8 +2481,6 @@ static int __init uniwill_init(void) if (!force) return -ENODEV; =20 - /* Assume that the device supports all features */ - device_descriptor.features =3D UINT_MAX; pr_warn("Loading on a potentially unsupported device\n"); } else { /* @@ -2500,6 +2498,12 @@ static int __init uniwill_init(void) device_descriptor =3D *descriptor; } =20 + if (force) { + /* Assume that the device supports all features */ + device_descriptor.features =3D UINT_MAX; + pr_warn("Enabling potentially unsupported features\n"); + } + ret =3D platform_driver_register(&uniwill_driver); if (ret < 0) return ret; --=20 2.39.5 From nobody Sun Jun 21 06:29:29 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C899D38D010; Mon, 6 Apr 2026 19:37:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504231; cv=none; b=oYk+isq7ViNsmipCT7azmIDWHscnemg6s5haUrnUSo8Zs7dQ9jnkKWTv19IpaKiqfuMOKvhz/VcsPdS5DPIECJlnuCgBEArDRzcp90S9LaADVUNewRG3ijeAdIrlruKn97frGtsfki5LgcMB2o4j8xK+JpIdqraCgtcb9FONmJI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504231; c=relaxed/simple; bh=y74qQIqEi3csafPQG6kDQYFn19R48VOTJNK1XYJr7Rs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jT/BJhWCVupJJbbKBQIL1fdcwnsJQF2950RTPAzo9faOwTxmjRabT81HivdlWzFrAhiIGhBQIu5B0ah30Wifzg05nX0cRMzsooFpC4BgButZL0zBLUKwDGYwIOKAxzsTRjthQXTtY3UIs3PwxSzvLXctpg40bLmkkYu1i4pK/2k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=e2nyHo6W; arc=none smtp.client-ip=212.227.17.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="e2nyHo6W" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1775504228; x=1776109028; i=w_armin@gmx.de; bh=+x3igDWEYVt+m3KEbk8uExBVUBQUDknkEFl0ZM2/lyQ=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=e2nyHo6Wkid9lLRIyNAWYV+Jib3vg+wgX3SE493UST3nWWEF6rRv2/rw4YiahjKx 1GzrYVQNHNVfkbHKJUotm7ZmR/EUewsl1KMGKo4zka6sIrDyKUnhSuj6pyH1JIkrj sJOem2GrItNsrxy5evgAQl4QuEz6BeNMv/E2LlfQAaRAGl2JzaJPpruW9W7K1a+Hd ixJ2t/jYyrLFUhKLn9GRJWeFQaZuoN1yYdsZfYEw0euat+5NjeeH6RYkPvFr7XTxd T96H2nCnJZy8ofjDfKJqP2dJuG3Ba/ONAtAOK0ZBuMmXgBUrmg6H2uxO5ew/DUSbj oK23B3Mp0cHPU660Ww== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MDhhX-1wIOSi3DT5-00GSUG; Mon, 06 Apr 2026 21:37:07 +0200 From: Armin Wolf To: hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: wse@tuxedocomputers.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/6] platform/x86: uniwill-laptop: Rework FN lock/super key suspend handling Date: Mon, 6 Apr 2026 21:36:51 +0200 Message-Id: <20260406193653.7799-5-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260406193653.7799-1-W_Armin@gmx.de> References: <20260406193653.7799-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:wKPJkNAEUBfu7uDT/TVnL8EfjgifSnbO5f5qmSoYNEQ5PSEfAEP RCujiU/IhaArjzfRRp2VdNnwhsqag4Ldw9mwJP7S+jn8v81Sck/seMBpK+rxDEQkJ+BxCka ahDvBzXW3uGFv7TTjHv01AJvtar9x+zkaZafSqO/Fbue/v6yU61b6MVoLbfhM0vU+KxnG2c Mk9cgixNBuNc0zBFN8BIQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:eowKAbmH4f0=;5zCOeowoFJbWXmT6+Fg/reJlc7x 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 Y3 Content-Type: text/plain; charset="utf-8" Currently the supend handling for the FN lock and super key enable features saves the whole values of the affected registers instead of the individual feature state. This duplicates the register access logic from the associated sysfs attributes. Rework the suspend handling to reuse said register access logic and only store the individual feature state as a boolean value. Signed-off-by: Armin Wolf Reviewed-by: Werner Sembach --- drivers/platform/x86/uniwill/uniwill-acpi.c | 117 ++++++++++++-------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 7c7ea0e76966..4d149b39d94e 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -341,8 +341,8 @@ struct uniwill_data { struct acpi_battery_hook hook; unsigned int last_charge_ctrl; struct mutex battery_lock; /* Protects the list of currently registered b= atteries */ - unsigned int last_status; - unsigned int last_switch_status; + bool last_fn_lock_state; + bool last_super_key_enable_state; struct mutex super_key_lock; /* Protects the toggling of the super key lo= ck state */ struct list_head batteries; struct mutex led_lock; /* Protects writes to the lightbar registers */ @@ -619,11 +619,22 @@ static const struct regmap_config uniwill_ec_config = =3D { .use_single_write =3D true, }; =20 +static int uniwill_write_fn_lock(struct uniwill_data *data, bool status) +{ + unsigned int value; + + if (status) + value =3D FN_LOCK_STATUS; + else + value =3D 0; + + return regmap_update_bits(data->regmap, EC_ADDR_BIOS_OEM, FN_LOCK_STATUS,= value); +} + static ssize_t fn_lock_store(struct device *dev, struct device_attribute *= attr, const char *buf, size_t count) { struct uniwill_data *data =3D dev_get_drvdata(dev); - unsigned int value; bool enable; int ret; =20 @@ -631,21 +642,15 @@ static ssize_t fn_lock_store(struct device *dev, stru= ct device_attribute *attr, if (ret < 0) return ret; =20 - if (enable) - value =3D FN_LOCK_STATUS; - else - value =3D 0; - - ret =3D regmap_update_bits(data->regmap, EC_ADDR_BIOS_OEM, FN_LOCK_STATUS= , value); + ret =3D uniwill_write_fn_lock(data, enable); if (ret < 0) return ret; =20 return count; } =20 -static ssize_t fn_lock_show(struct device *dev, struct device_attribute *a= ttr, char *buf) +static int uniwill_read_fn_lock(struct uniwill_data *data, bool *status) { - struct uniwill_data *data =3D dev_get_drvdata(dev); unsigned int value; int ret; =20 @@ -653,23 +658,31 @@ static ssize_t fn_lock_show(struct device *dev, struc= t device_attribute *attr, c if (ret < 0) return ret; =20 - return sysfs_emit(buf, "%d\n", !!(value & FN_LOCK_STATUS)); -} + *status =3D !!(value & FN_LOCK_STATUS); =20 -static DEVICE_ATTR_RW(fn_lock); + return 0; +} =20 -static ssize_t super_key_enable_store(struct device *dev, struct device_at= tribute *attr, - const char *buf, size_t count) +static ssize_t fn_lock_show(struct device *dev, struct device_attribute *a= ttr, char *buf) { struct uniwill_data *data =3D dev_get_drvdata(dev); - unsigned int value; - bool enable; + bool status; int ret; =20 - ret =3D kstrtobool(buf, &enable); + ret =3D uniwill_read_fn_lock(data, &status); if (ret < 0) return ret; =20 + return sysfs_emit(buf, "%d\n", status); +} + +static DEVICE_ATTR_RW(fn_lock); + +static int uniwill_write_super_key_enable(struct uniwill_data *data, bool = status) +{ + unsigned int value; + int ret; + guard(mutex)(&data->super_key_lock); =20 ret =3D regmap_read(data->regmap, EC_ADDR_SWITCH_STATUS, &value); @@ -680,20 +693,33 @@ static ssize_t super_key_enable_store(struct device *= dev, struct device_attribut * We can only toggle the super key lock, so we return early if the setti= ng * is already in the correct state. */ - if (enable =3D=3D !(value & SUPER_KEY_LOCK_STATUS)) - return count; + if (status =3D=3D !(value & SUPER_KEY_LOCK_STATUS)) + return 0; + + return regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, TRIGGER_SUPER_KEY= _LOCK, + TRIGGER_SUPER_KEY_LOCK); +} + +static ssize_t super_key_enable_store(struct device *dev, struct device_at= tribute *attr, + const char *buf, size_t count) +{ + struct uniwill_data *data =3D dev_get_drvdata(dev); + bool enable; + int ret; =20 - ret =3D regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, TRIGGER_SUPER_KE= Y_LOCK, - TRIGGER_SUPER_KEY_LOCK); + ret =3D kstrtobool(buf, &enable); + if (ret < 0) + return ret; + + ret =3D uniwill_write_super_key_enable(data, enable); if (ret < 0) return ret; =20 return count; } =20 -static ssize_t super_key_enable_show(struct device *dev, struct device_att= ribute *attr, char *buf) +static int uniwill_read_super_key_enable(struct uniwill_data *data, bool *= status) { - struct uniwill_data *data =3D dev_get_drvdata(dev); unsigned int value; int ret; =20 @@ -701,7 +727,22 @@ static ssize_t super_key_enable_show(struct device *de= v, struct device_attribute if (ret < 0) return ret; =20 - return sysfs_emit(buf, "%d\n", !(value & SUPER_KEY_LOCK_STATUS)); + *status =3D !(value & SUPER_KEY_LOCK_STATUS); + + return 0; +} + +static ssize_t super_key_enable_show(struct device *dev, struct device_att= ribute *attr, char *buf) +{ + struct uniwill_data *data =3D dev_get_drvdata(dev); + bool status; + int ret; + + ret =3D uniwill_read_super_key_enable(data, &status); + if (ret < 0) + return ret; + + return sysfs_emit(buf, "%d\n", status); } =20 static DEVICE_ATTR_RW(super_key_enable); @@ -1715,10 +1756,10 @@ static int uniwill_suspend_fn_lock(struct uniwill_d= ata *data) return 0; =20 /* - * The EC_ADDR_BIOS_OEM is marked as volatile, so we have to restore it + * EC_ADDR_BIOS_OEM is marked as volatile, so we have to restore it * ourselves. */ - return regmap_read(data->regmap, EC_ADDR_BIOS_OEM, &data->last_status); + return uniwill_read_fn_lock(data, &data->last_fn_lock_state); } =20 static int uniwill_suspend_super_key(struct uniwill_data *data) @@ -1727,10 +1768,10 @@ static int uniwill_suspend_super_key(struct uniwill= _data *data) return 0; =20 /* - * The EC_ADDR_SWITCH_STATUS is marked as volatile, so we have to restore= it + * EC_ADDR_SWITCH_STATUS is marked as volatile, so we have to restore it * ourselves. */ - return regmap_read(data->regmap, EC_ADDR_SWITCH_STATUS, &data->last_switc= h_status); + return uniwill_read_super_key_enable(data, &data->last_super_key_enable_s= tate); } =20 static int uniwill_suspend_battery(struct uniwill_data *data) @@ -1787,27 +1828,15 @@ static int uniwill_resume_fn_lock(struct uniwill_da= ta *data) if (!uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK)) return 0; =20 - return regmap_update_bits(data->regmap, EC_ADDR_BIOS_OEM, FN_LOCK_STATUS, - data->last_status); + return uniwill_write_fn_lock(data, data->last_fn_lock_state); } =20 static int uniwill_resume_super_key(struct uniwill_data *data) { - unsigned int value; - int ret; - if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY)) return 0; =20 - ret =3D regmap_read(data->regmap, EC_ADDR_SWITCH_STATUS, &value); - if (ret < 0) - return ret; - - if ((data->last_switch_status & SUPER_KEY_LOCK_STATUS) =3D=3D (value & SU= PER_KEY_LOCK_STATUS)) - return 0; - - return regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, TRIGGER_SUPER_KEY= _LOCK, - TRIGGER_SUPER_KEY_LOCK); + return uniwill_write_super_key_enable(data, data->last_super_key_enable_s= tate); } =20 static int uniwill_resume_battery(struct uniwill_data *data) --=20 2.39.5 From nobody Sun Jun 21 06:29:29 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 69E7332ED29; Mon, 6 Apr 2026 19:37:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504233; cv=none; b=aVWtjg1B/a97M0PlUSf60lli5j+R1rE+Vlak2hrnqTfTt2MHLLziP2Xz5kLV4j5ofR7hzfm0Y1fD6CxYflm0XUVbSpdD5sHNsPUaYT+MPaIWC/y4Z/D7kTQ7xgE0SU2Umt1woXpWfx/cXR11jTKvVZQXifEiy6UM7tAynyvJAgw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504233; c=relaxed/simple; bh=MeNhhhpS4+DknzpsFdCdkE0SU3Krx643NQcWp3tYrAc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=hqHd5WGwdtTXZzQTg4bnTwpjS6aUbTmSZ/BxCAsO9ylPR0mZAUg8I2fD8tQWqzwq77CPV+JSX7WoFRBIJgQ8LgiXUh/pvPIhkEbVrfn5nqJZkx2tzr9jcM6un8hMk+kmSh8Q1jaVUakAgO71As4hy47obcFgsUSHq8J1b7/aAwM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=H3fF0+fH; arc=none smtp.client-ip=212.227.17.21 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="H3fF0+fH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1775504229; x=1776109029; i=w_armin@gmx.de; bh=xVuqGfJ0cGF24Izj0Ye+GFBoBKemKHuXB+COrZ4xdbM=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=H3fF0+fHBVJMhG5/+1Y10w73D9BeHMugoV+88fkA1uaq52saYVD7WrIN4+2eOQ7U Z3oBj0SiEA9fz06qZEHJ1dDo0FIvOoQYHWURPBexzp0VgOKooKowkhqTp2ICIK7Fv 3lsjcJK5pcif+j03WZhxtfigtQZfLr3tqoPh+gYjDltHNL4EvgBPMgY6kOkcYT/Ip +ZiP75cV3o8IpW1x3x9Md5q72fNTBYUJKpsiTvVLRFVztxDCneM4vz6vMULmQs+eI oTzsUMVB05aGZuVhGVpJrY5ISBJWRVrFwATbOFWMUAZzreVG15HWNOhP0W5VEqI1D UzMxsmPJkajfhrs00A== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1Mq2nK-1vflzj1ffe-00lvKq; Mon, 06 Apr 2026 21:37:09 +0200 From: Armin Wolf To: hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: wse@tuxedocomputers.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/6] platform/x86: uniwill-laptop: Mark EC_ADDR_OEM_4 as volatile Date: Mon, 6 Apr 2026 21:36:52 +0200 Message-Id: <20260406193653.7799-6-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260406193653.7799-1-W_Armin@gmx.de> References: <20260406193653.7799-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:JfuX4NW3GAT5agy0sPS+RVWB08wkXGkAo2CrBPXTV11qMe0FNEX dwULHzq4kjYrMNTnaJsThYkaFVPDAi7yeiES5LzvxLn/a5HFV+XlfT6P55nGkPG1XwBZ7oC 4TYo1P7ZoSMa6YJrsNELDAOW5/NziqbVlqtZPw/hgWVfdUg6V+rqb6mdkBRqSjCzRwxqMz/ EAErcqRSXyfZ1SoLrRo6A== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:G9gAY1Fu2QQ=;CsD1i3eKa0Am/S51gL/oaw2ruyE 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 8cZNBrR26HW Content-Type: text/plain; charset="utf-8" It turned out that EC_ADDR_OEM_4 also contains bits with a volatile nature. Mark the whole register as volatile to prepare for the usage of said bits. This also means that we now have to save/restore the touchpad toggle state ourself. Signed-off-by: Armin Wolf Reviewed-by: Werner Sembach --- drivers/platform/x86/uniwill/uniwill-acpi.c | 70 ++++++++++++++++++--- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 4d149b39d94e..a116e2ec6453 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -343,6 +343,7 @@ struct uniwill_data { struct mutex battery_lock; /* Protects the list of currently registered b= atteries */ bool last_fn_lock_state; bool last_super_key_enable_state; + bool last_touchpad_toggle_enable_state; struct mutex super_key_lock; /* Protects the toggling of the super key lo= ck state */ struct list_head batteries; struct mutex led_lock; /* Protects writes to the lightbar registers */ @@ -598,6 +599,7 @@ static bool uniwill_volatile_reg(struct device *dev, un= signed int reg) case EC_ADDR_PWM_2: case EC_ADDR_TRIGGER: case EC_ADDR_SWITCH_STATUS: + case EC_ADDR_OEM_4: case EC_ADDR_CHARGE_CTRL: case EC_ADDR_USB_C_POWER_PRIORITY: return true; @@ -747,11 +749,22 @@ static ssize_t super_key_enable_show(struct device *d= ev, struct device_attribute =20 static DEVICE_ATTR_RW(super_key_enable); =20 +static int uniwill_write_touchpad_toggle_enable(struct uniwill_data *data,= bool status) +{ + unsigned int value; + + if (status) + value =3D 0; + else + value =3D TOUCHPAD_TOGGLE_OFF; + + return regmap_update_bits(data->regmap, EC_ADDR_OEM_4, TOUCHPAD_TOGGLE_OF= F, value); +} + static ssize_t touchpad_toggle_enable_store(struct device *dev, struct dev= ice_attribute *attr, const char *buf, size_t count) { struct uniwill_data *data =3D dev_get_drvdata(dev); - unsigned int value; bool enable; int ret; =20 @@ -759,30 +772,39 @@ static ssize_t touchpad_toggle_enable_store(struct de= vice *dev, struct device_at if (ret < 0) return ret; =20 - if (enable) - value =3D 0; - else - value =3D TOUCHPAD_TOGGLE_OFF; - - ret =3D regmap_update_bits(data->regmap, EC_ADDR_OEM_4, TOUCHPAD_TOGGLE_O= FF, value); + ret =3D uniwill_write_touchpad_toggle_enable(data, enable); if (ret < 0) return ret; =20 return count; } =20 +static int uniwill_read_touchpad_toggle_enable(struct uniwill_data *data, = bool *status) +{ + unsigned int value; + int ret; + + ret =3D regmap_read(data->regmap, EC_ADDR_OEM_4, &value); + if (ret < 0) + return ret; + + *status =3D !(value & TOUCHPAD_TOGGLE_OFF); + + return 0; +} + static ssize_t touchpad_toggle_enable_show(struct device *dev, struct devi= ce_attribute *attr, char *buf) { struct uniwill_data *data =3D dev_get_drvdata(dev); - unsigned int value; + bool status; int ret; =20 - ret =3D regmap_read(data->regmap, EC_ADDR_OEM_4, &value); + ret =3D uniwill_read_touchpad_toggle_enable(data, &status); if (ret < 0) return ret; =20 - return sysfs_emit(buf, "%d\n", !(value & TOUCHPAD_TOGGLE_OFF)); + return sysfs_emit(buf, "%d\n", status); } =20 static DEVICE_ATTR_RW(touchpad_toggle_enable); @@ -1774,6 +1796,18 @@ static int uniwill_suspend_super_key(struct uniwill_= data *data) return uniwill_read_super_key_enable(data, &data->last_super_key_enable_s= tate); } =20 +static int uniwill_suspend_touchpad_toggle(struct uniwill_data *data) +{ + if (!uniwill_device_supports(data, UNIWILL_FEATURE_TOUCHPAD_TOGGLE)) + return 0; + + /* + * EC_ADDR_OEM_4 is marked as volatile, so we have to restore it + * ourselves. + */ + return uniwill_read_touchpad_toggle_enable(data, &data->last_touchpad_tog= gle_enable_state); +} + static int uniwill_suspend_battery(struct uniwill_data *data) { if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY)) @@ -1809,6 +1843,10 @@ static int uniwill_suspend(struct device *dev) if (ret < 0) return ret; =20 + ret =3D uniwill_suspend_touchpad_toggle(data); + if (ret < 0) + return ret; + ret =3D uniwill_suspend_battery(data); if (ret < 0) return ret; @@ -1839,6 +1877,14 @@ static int uniwill_resume_super_key(struct uniwill_d= ata *data) return uniwill_write_super_key_enable(data, data->last_super_key_enable_s= tate); } =20 +static int uniwill_resume_touchpad_toggle(struct uniwill_data *data) +{ + if (!uniwill_device_supports(data, UNIWILL_FEATURE_TOUCHPAD_TOGGLE)) + return 0; + + return uniwill_write_touchpad_toggle_enable(data, data->last_touchpad_tog= gle_enable_state); +} + static int uniwill_resume_battery(struct uniwill_data *data) { if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY)) @@ -1884,6 +1930,10 @@ static int uniwill_resume(struct device *dev) if (ret < 0) return ret; =20 + ret =3D uniwill_resume_touchpad_toggle(data); + if (ret < 0) + return ret; + ret =3D uniwill_resume_battery(data); if (ret < 0) return ret; --=20 2.39.5 From nobody Sun Jun 21 06:29:29 2026 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F4E93976A2; Mon, 6 Apr 2026 19:37:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504239; cv=none; b=d9qlInFUgNHfMppfpLrOfZwmIUD34GIjbtZl4x1un1L0CqJYd+yN/jd39I/mvd+QZR05Ek7n3r0gKOOeXMtDsoslNbf7NzQkzDffbdmWsSSd1VWXWvVK4L2rHgl46Uy6UygBz/O9Y/Ikit7qYcb/9Cc8FWjkctyN91bWlwXs0C8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775504239; c=relaxed/simple; bh=1lbc6QbeEBpMOKk8qmeXeHNc+dyKkpblDg6kUDR2f0c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=oRBCtjZtNndHnURYrw7XMeAbWcn0sSlaRUyGuQroGASI2EiNmMkrpycPzVpCksou+hag831buNgQeDFoZ3i45Zgq7JJx8npSeca5+NldgvXNertA5ubhOPmUeuFw0rUk4b60bq5pTqvMCwVMsZmiip2mH15ZHF3oXQFvtLIKIX8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=KoQbboBg; arc=none smtp.client-ip=212.227.17.20 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="KoQbboBg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1775504231; x=1776109031; i=w_armin@gmx.de; bh=J+sbSfQ2PJ2GtJr87UUtW4F0OrGa7T/YqE7V6Xb4Vx8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=KoQbboBgSVvAxgxRGXfzAqGBd+n+SCfpmYucV6tCHfLnePQ4xma3EZIFl/0bHWyh Pqcn2oyUiRnCiGBcxdOynPufu/df7GKbsROBtqWEHhayVAiCLzHQUvnQLqCnqV8iP HNxGVs+vNxqH+MZ9cBkZIc35N4kq2Z3qIpItqQ/inpT2YuFo8uZWD84gbfytQmPUs jSPxFk5b0zQ9exnMy8Wt+gwnQTBZ9XzsD+daBYanWfZF7tyRMv1S/U49G6Hvm+O3S BulheSYstYr2oi1+XfBLustKVrW890pfZUKvjyqZ+0HbdGg7EsofeAB2+uP6F8AnP QueAflFZQwkqCJnq0g== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from client.hidden.invalid by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MtfJX-1vLA2z49WB-00w4uU; Mon, 06 Apr 2026 21:37:11 +0200 From: Armin Wolf To: hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: wse@tuxedocomputers.com, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/6] platform/x86: uniwill-laptop: Add support for battery charge modes Date: Mon, 6 Apr 2026 21:36:53 +0200 Message-Id: <20260406193653.7799-7-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260406193653.7799-1-W_Armin@gmx.de> References: <20260406193653.7799-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:xSBU0l8Bf3deodaFvVzxPGn/iTNejxQ5T6t6NKlQfAR0g46JCZ0 j8Jm/vvAgwcSBF5Yymo0XKUnBZcQR6HIOy+2fUepe89sag8kPUZk01hw6OF/rO0B01r9i8P CeeHrfIlI0bkwqQAac0mQE7EGiZi04coWbDYkgt9F21sn4+xLMkPYimoeBUiDKe0c99Bs0G +WT41zbMF8kAbjn8JotJg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:OYF0my4hVuk=;IYQpNLlK/amxkvqRVdekjhaDux3 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 fx/MH0KZIJAoJkpXIGdES7kQ== Content-Type: text/plain; charset="utf-8" Many Uniwill-based devices do not supports the already existing charge limit functionality, but instead support an alternative interface for controlling the battery charge algorithm. Add support for this interface and update the documentation. Signed-off-by: Armin Wolf --- .../admin-guide/laptops/uniwill-laptop.rst | 25 +- drivers/platform/x86/uniwill/uniwill-acpi.c | 244 ++++++++++++++---- drivers/platform/x86/uniwill/uniwill-wmi.c | 5 +- 3 files changed, 226 insertions(+), 48 deletions(-) diff --git a/Documentation/admin-guide/laptops/uniwill-laptop.rst b/Documen= tation/admin-guide/laptops/uniwill-laptop.rst index 561334865feb..24b41dbab886 100644 --- a/Documentation/admin-guide/laptops/uniwill-laptop.rst +++ b/Documentation/admin-guide/laptops/uniwill-laptop.rst @@ -43,9 +43,23 @@ Support for changing the platform performance mode is cu= rrently not implemented. Battery Charging Control ------------------------ =20 -The ``uniwill-laptop`` driver supports controlling the battery charge limi= t. This happens over -the standard ``charge_control_end_threshold`` power supply sysfs attribute= . All values -between 1 and 100 percent are supported. +.. warning:: Some devices do not properly implement the charging threshold= interface. Forcing + the driver to enable access to said interface on such devices= might damage the + battery [1]_. Because of this the driver will not enable said= feature even when + using the ``force`` module parameter. The charging profile in= terface will be + available instead. + +The ``uniwill-laptop`` driver supports controlling the battery charge limi= t. This either happens +over the standard ``charge_control_end_threshold`` or ``charge_types`` pow= er supply sysfs attribute, +depending on the device. When using the ``charge_control_end_threshold`` s= ysfs attribute, all values +between 1 and 100 percent are supported. When using the ``charge_types`` s= ysfs attribute, the driver +supports switching between the ``Standard``, ``Trickle`` and ``Long Life``= profiles. + +Keep in mind that when using the ``charge_types`` sysfs attribute, the EC = firmware will hide the +true charging status of the battery from the operating system, potentially= misleading users into +thinking that the charging profile does not work. Checking the ``current_n= ow`` sysfs attribute +tells you the true charging status of the battery even when using the ``ch= arge_types`` sysfs +attribute (0 means that the battery is currently not charging). =20 Additionally the driver signals the presence of battery charging issues th= rough the standard ``health`` power supply sysfs attribute. @@ -70,3 +84,8 @@ The ``uniwill-laptop`` driver allows to set the configura= ble TGP for devices wit allow it. =20 See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details. + +References +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +.. [1] https://www.reddit.com/r/XMG_gg/comments/ld9yyf/battery_limit_hidde= n_function_discovered_on/ diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index a116e2ec6453..fbf2e101a074 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -254,6 +254,10 @@ =20 #define EC_ADDR_OEM_4 0x07A6 #define OVERBOOST_DYN_TEMP_OFF BIT(1) +#define CHARGING_PROFILE_MASK GENMASK(5, 4) +#define CHARGING_PROFILE_HIGH_CAPACITY 0x00 +#define CHARGING_PROFILE_BALANCED 0x01 +#define CHARGING_PROFILE_STATIONARY 0x02 #define TOUCHPAD_TOGGLE_OFF BIT(6) =20 #define EC_ADDR_CHARGE_CTRL 0x07B9 @@ -320,13 +324,15 @@ #define UNIWILL_FEATURE_SUPER_KEY BIT(1) #define UNIWILL_FEATURE_TOUCHPAD_TOGGLE BIT(2) #define UNIWILL_FEATURE_LIGHTBAR BIT(3) -#define UNIWILL_FEATURE_BATTERY BIT(4) -#define UNIWILL_FEATURE_CPU_TEMP BIT(5) -#define UNIWILL_FEATURE_GPU_TEMP BIT(6) -#define UNIWILL_FEATURE_PRIMARY_FAN BIT(7) -#define UNIWILL_FEATURE_SECONDARY_FAN BIT(8) -#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(9) -#define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(10) +#define UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT BIT(4) +/* Mutually exclusive with the charge limit feature */ +#define UNIWILL_FEATURE_BATTERY_CHARGE_MODES BIT(5) +#define UNIWILL_FEATURE_CPU_TEMP BIT(6) +#define UNIWILL_FEATURE_GPU_TEMP BIT(7) +#define UNIWILL_FEATURE_PRIMARY_FAN BIT(8) +#define UNIWILL_FEATURE_SECONDARY_FAN BIT(9) +#define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(10) +#define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(11) =20 enum usb_c_power_priority_options { USB_C_POWER_PRIORITY_CHARGING =3D 0, @@ -339,8 +345,15 @@ struct uniwill_data { struct regmap *regmap; unsigned int features; struct acpi_battery_hook hook; - unsigned int last_charge_ctrl; struct mutex battery_lock; /* Protects the list of currently registered b= atteries */ + union { + struct { + /* Protects writes to last_charge_type */ + struct mutex charge_type_lock; + enum power_supply_charge_type last_charge_type; + }; + unsigned int last_charge_ctrl; + }; bool last_fn_lock_state; bool last_super_key_enable_state; bool last_touchpad_toggle_enable_state; @@ -447,6 +460,12 @@ static inline bool uniwill_device_supports(const struc= t uniwill_data *data, return (data->features & features) =3D=3D features; } =20 +static inline bool uniwill_device_supports_any(const struct uniwill_data *= data, + unsigned int features) +{ + return data->features & features; +} + static int uniwill_ec_reg_write(void *context, unsigned int reg, unsigned = int val) { union acpi_object params[2] =3D { @@ -1421,6 +1440,30 @@ static int uniwill_led_init(struct uniwill_data *dat= a) &init_data); } =20 +static int uniwill_read_charge_type(struct uniwill_data *data, enum power_= supply_charge_type *type) +{ + unsigned int value; + int ret; + + ret =3D regmap_read(data->regmap, EC_ADDR_OEM_4, &value); + if (ret < 0) + return ret; + + switch (FIELD_GET(CHARGING_PROFILE_MASK, value)) { + case CHARGING_PROFILE_HIGH_CAPACITY: + *type =3D POWER_SUPPLY_CHARGE_TYPE_STANDARD; + return 0; + case CHARGING_PROFILE_BALANCED: + *type =3D POWER_SUPPLY_CHARGE_TYPE_LONGLIFE; + return 0; + case CHARGING_PROFILE_STATIONARY: + *type =3D POWER_SUPPLY_CHARGE_TYPE_TRICKLE; + return 0; + default: + return -EPROTO; + } +} + static int uniwill_get_property(struct power_supply *psy, const struct pow= er_supply_ext *ext, void *drvdata, enum power_supply_property psp, union power_supply_propval *val) @@ -1431,6 +1474,16 @@ static int uniwill_get_property(struct power_supply = *psy, const struct power_sup int ret; =20 switch (psp) { + case POWER_SUPPLY_PROP_CHARGE_TYPES: + /* + * We need to use the cached value here because the charging mode + * reported by the EC might temporarily change when a external power + * source has been connected. + */ + mutex_lock(&data->charge_type_lock); + val->intval =3D data->last_charge_type; + mutex_unlock(&data->charge_type_lock); + return 0; case POWER_SUPPLY_PROP_HEALTH: ret =3D power_supply_get_property_direct(psy, POWER_SUPPLY_PROP_PRESENT,= &prop); if (ret < 0) @@ -1479,13 +1532,52 @@ static int uniwill_get_property(struct power_supply= *psy, const struct power_sup } } =20 +static int uniwill_write_charge_type(struct uniwill_data *data, enum power= _supply_charge_type type) +{ + unsigned int value; + + switch (type) { + case POWER_SUPPLY_CHARGE_TYPE_TRICKLE: + value =3D FIELD_PREP(CHARGING_PROFILE_MASK, CHARGING_PROFILE_STATIONARY); + break; + case POWER_SUPPLY_CHARGE_TYPE_STANDARD: + value =3D FIELD_PREP(CHARGING_PROFILE_MASK, CHARGING_PROFILE_HIGH_CAPACI= TY); + break; + case POWER_SUPPLY_CHARGE_TYPE_LONGLIFE: + value =3D FIELD_PREP(CHARGING_PROFILE_MASK, CHARGING_PROFILE_BALANCED); + break; + default: + return -EINVAL; + } + + return regmap_update_bits(data->regmap, EC_ADDR_OEM_4, CHARGING_PROFILE_M= ASK, value); +} + +static int uniwill_restore_charge_type(struct uniwill_data *data) +{ + guard(mutex)(&data->charge_type_lock); + + return uniwill_write_charge_type(data, data->last_charge_type); +} + static int uniwill_set_property(struct power_supply *psy, const struct pow= er_supply_ext *ext, void *drvdata, enum power_supply_property psp, const union power_supply_propval *val) { struct uniwill_data *data =3D drvdata; + int ret; =20 switch (psp) { + case POWER_SUPPLY_PROP_CHARGE_TYPES: + mutex_lock(&data->charge_type_lock); + + ret =3D uniwill_write_charge_type(data, val->intval); + if (ret >=3D 0) + data->last_charge_type =3D val->intval; + + mutex_unlock(&data->charge_type_lock); + + return ret; case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD: if (val->intval < 0 || val->intval > 100) return -EINVAL; @@ -1501,21 +1593,41 @@ static int uniwill_property_is_writeable(struct pow= er_supply *psy, const struct power_supply_ext *ext, void *drvdata, enum power_supply_property psp) { - if (psp =3D=3D POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD) + switch (psp) { + case POWER_SUPPLY_PROP_CHARGE_TYPES: + case POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD: return true; - - return false; + default: + return false; + } } =20 -static const enum power_supply_property uniwill_properties[] =3D { +static const enum power_supply_property uniwill_charge_limit_properties[] = =3D { POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD, }; =20 -static const struct power_supply_ext uniwill_extension =3D { +static const struct power_supply_ext uniwill_charge_limit_extension =3D { + .name =3D DRIVER_NAME, + .properties =3D uniwill_charge_limit_properties, + .num_properties =3D ARRAY_SIZE(uniwill_charge_limit_properties), + .get_property =3D uniwill_get_property, + .set_property =3D uniwill_set_property, + .property_is_writeable =3D uniwill_property_is_writeable, +}; + +static const enum power_supply_property uniwill_charge_modes_properties[] = =3D { + POWER_SUPPLY_PROP_CHARGE_TYPES, + POWER_SUPPLY_PROP_HEALTH, +}; + +static const struct power_supply_ext uniwill_charge_modes_extension =3D { .name =3D DRIVER_NAME, - .properties =3D uniwill_properties, - .num_properties =3D ARRAY_SIZE(uniwill_properties), + .charge_types =3D BIT(POWER_SUPPLY_CHARGE_TYPE_TRICKLE) | + BIT(POWER_SUPPLY_CHARGE_TYPE_STANDARD) | + BIT(POWER_SUPPLY_CHARGE_TYPE_LONGLIFE), + .properties =3D uniwill_charge_modes_properties, + .num_properties =3D ARRAY_SIZE(uniwill_charge_modes_properties), .get_property =3D uniwill_get_property, .set_property =3D uniwill_set_property, .property_is_writeable =3D uniwill_property_is_writeable, @@ -1531,7 +1643,13 @@ static int uniwill_add_battery(struct power_supply *= battery, struct acpi_battery if (!entry) return -ENOMEM; =20 - ret =3D power_supply_register_extension(battery, &uniwill_extension, data= ->dev, data); + if (uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT)) + ret =3D power_supply_register_extension(battery, &uniwill_charge_limit_e= xtension, + data->dev, data); + else + ret =3D power_supply_register_extension(battery, &uniwill_charge_modes_e= xtension, + data->dev, data); + if (ret < 0) { kfree(entry); return ret; @@ -1560,7 +1678,10 @@ static int uniwill_remove_battery(struct power_suppl= y *battery, struct acpi_batt } } =20 - power_supply_unregister_extension(battery, &uniwill_extension); + if (uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT)) + power_supply_unregister_extension(battery, &uniwill_charge_limit_extensi= on); + else + power_supply_unregister_extension(battery, &uniwill_charge_modes_extensi= on); =20 return 0; } @@ -1570,25 +1691,35 @@ static int uniwill_battery_init(struct uniwill_data= *data) unsigned int value, threshold; int ret; =20 - if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY)) - return 0; + if (uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT)) { + ret =3D regmap_read(data->regmap, EC_ADDR_CHARGE_CTRL, &value); + if (ret < 0) + return ret; =20 - ret =3D regmap_read(data->regmap, EC_ADDR_CHARGE_CTRL, &value); - if (ret < 0) - return ret; + /* + * The charge control threshold might be initialized with 0 by + * the EC to signal that said threshold is uninitialized. We thus + * need to replace this value with 100 to signal that we want to + * take control of battery charging. For the sake of completeness + * we also set the charging threshold to 100 if the EC-provided + * value is invalid. + */ + threshold =3D FIELD_GET(CHARGE_CTRL_MASK, value); + if (threshold =3D=3D 0 || threshold > 100) { + FIELD_MODIFY(CHARGE_CTRL_MASK, &value, 100); + ret =3D regmap_write(data->regmap, EC_ADDR_CHARGE_CTRL, value); + if (ret < 0) + return ret; + } + } else { + if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_MODES)) + return 0; =20 - /* - * The charge control threshold might be initialized with 0 by - * the EC to signal that said threshold is uninitialized. We thus - * need to replace this value with 100 to signal that we want to - * take control of battery charging. For the sake of completeness - * we also set the charging threshold to 100 if the EC-provided - * value is invalid. - */ - threshold =3D FIELD_GET(CHARGE_CTRL_MASK, value); - if (threshold =3D=3D 0 || threshold > 100) { - FIELD_MODIFY(CHARGE_CTRL_MASK, &value, 100); - ret =3D regmap_write(data->regmap, EC_ADDR_CHARGE_CTRL, value); + ret =3D devm_mutex_init(data->dev, &data->charge_type_lock); + if (ret < 0) + return ret; + + ret =3D uniwill_read_charge_type(data, &data->last_charge_type); if (ret < 0) return ret; } @@ -1609,10 +1740,13 @@ static int uniwill_notifier_call(struct notifier_bl= ock *nb, unsigned long action { struct uniwill_data *data =3D container_of(nb, struct uniwill_data, nb); struct uniwill_battery_entry *entry; + int ret; =20 switch (action) { case UNIWILL_OSD_BATTERY_ALERT: - if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY)) + if (!uniwill_device_supports_any(data, + UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES)) return NOTIFY_DONE; =20 mutex_lock(&data->battery_lock); @@ -1623,10 +1757,24 @@ static int uniwill_notifier_call(struct notifier_bl= ock *nb, unsigned long action =20 return NOTIFY_OK; case UNIWILL_OSD_DC_ADAPTER_CHANGED: - if (!uniwill_device_supports(data, UNIWILL_FEATURE_USB_C_POWER_PRIORITY)) + if (!uniwill_device_supports_any(data, + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | + UNIWILL_FEATURE_USB_C_POWER_PRIORITY)) return NOTIFY_DONE; =20 - return notifier_from_errno(usb_c_power_priority_restore(data)); + if (uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_MODES))= { + ret =3D uniwill_restore_charge_type(data); + if (ret < 0) + return notifier_from_errno(ret); + } + + if (uniwill_device_supports(data, UNIWILL_FEATURE_USB_C_POWER_PRIORITY))= { + ret =3D usb_c_power_priority_restore(data); + if (ret < 0) + return notifier_from_errno(ret); + } + + return NOTIFY_OK; case UNIWILL_OSD_FN_LOCK: if (!uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK)) return NOTIFY_DONE; @@ -1810,7 +1958,7 @@ static int uniwill_suspend_touchpad_toggle(struct uni= will_data *data) =20 static int uniwill_suspend_battery(struct uniwill_data *data) { - if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY)) + if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT)) return 0; =20 /* @@ -1887,7 +2035,15 @@ static int uniwill_resume_touchpad_toggle(struct uni= will_data *data) =20 static int uniwill_resume_battery(struct uniwill_data *data) { - if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY)) + int ret; + + if (uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_MODES)) { + ret =3D uniwill_restore_charge_type(data); + if (ret < 0) + return ret; + } + + if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT)) return 0; =20 return regmap_update_bits(data->regmap, EC_ADDR_CHARGE_CTRL, CHARGE_CTRL_= MASK, @@ -1970,7 +2126,7 @@ static struct platform_driver uniwill_driver =3D { =20 static struct uniwill_device_descriptor lapqc71a_lapqc71b_descriptor __ini= tdata =3D { .features =3D UNIWILL_FEATURE_SUPER_KEY | - UNIWILL_FEATURE_BATTERY | + UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | @@ -1981,7 +2137,7 @@ static struct uniwill_device_descriptor lapac71h_desc= riptor __initdata =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | UNIWILL_FEATURE_TOUCHPAD_TOGGLE | - UNIWILL_FEATURE_BATTERY | + UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | @@ -1993,7 +2149,7 @@ static struct uniwill_device_descriptor lapkc71f_desc= riptor __initdata =3D { UNIWILL_FEATURE_SUPER_KEY | UNIWILL_FEATURE_TOUCHPAD_TOGGLE | UNIWILL_FEATURE_LIGHTBAR | - UNIWILL_FEATURE_BATTERY | + UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | @@ -2578,8 +2734,8 @@ static int __init uniwill_init(void) } =20 if (force) { - /* Assume that the device supports all features */ - device_descriptor.features =3D UINT_MAX; + /* Assume that the device supports all features except the charge limit = */ + device_descriptor.features =3D UINT_MAX & ~UNIWILL_FEATURE_BATTERY_CHARG= E_LIMIT; pr_warn("Enabling potentially unsupported features\n"); } =20 diff --git a/drivers/platform/x86/uniwill/uniwill-wmi.c b/drivers/platform/= x86/uniwill/uniwill-wmi.c index 31d9c39f14ab..f1b89bc63df6 100644 --- a/drivers/platform/x86/uniwill/uniwill-wmi.c +++ b/drivers/platform/x86/uniwill/uniwill-wmi.c @@ -48,6 +48,7 @@ int devm_uniwill_wmi_register_notifier(struct device *dev= , struct notifier_block static void uniwill_wmi_notify(struct wmi_device *wdev, union acpi_object = *obj) { u32 value; + int ret; =20 if (obj->type !=3D ACPI_TYPE_INTEGER) return; @@ -56,7 +57,9 @@ static void uniwill_wmi_notify(struct wmi_device *wdev, u= nion acpi_object *obj) =20 dev_dbg(&wdev->dev, "Received WMI event %u\n", value); =20 - blocking_notifier_call_chain(&uniwill_wmi_chain_head, value, NULL); + ret =3D blocking_notifier_call_chain(&uniwill_wmi_chain_head, value, NULL= ); + if (notifier_to_errno(ret) < 0) + dev_err(&wdev->dev, "Failed to handle event %u\n", value); } =20 /* --=20 2.39.5