From nobody Sat Jun 20 09:28:46 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 78B97367F4D; Fri, 17 Apr 2026 05:09:31 +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=1776402573; cv=none; b=NkTU6eAbiMz9tPybgGaleHVSG9GnIrsU66avftgGQJkOastVYfnCD9coSStPS56gPUlwgQDT+F8FZc+BHwN7NCpQvfzUlmQ6rReHRDcIdlbXpI2crWQW0vG+sdndIyoWDcZBIgOxvNdYgMwXfwEPuCbbyQuGzuEvw+JdSbNdSUg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776402573; c=relaxed/simple; bh=7PbMEasotSm7RIuXjoGjBoF6N6OfOLMDB+LK8yUqSls=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LA0rcuJHT5SE10QtxJv2wYH+Vn5YUXX5Nv7+aadkM2K7pMkyezhyj5kvOE6TtWtTVWbsa1eWubIZ/V1tb3hwV/0qM8m4ObQRvObW766PUsZeRFMO5nqWgb40LhbLrVw/4KCP6XF2kd6H3n8RJbQZ2iPvxokBNjNpQkSk2ooUF3Q= 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=JpTZcJqh; 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="JpTZcJqh" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1776402562; x=1777007362; i=w_armin@gmx.de; bh=CkJY7ADe2YDlFSPTDzNgOOuqVXOYCA0xLCfweDsnxuE=; 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=JpTZcJqh1ekdqGK3lnvTbFozGt3fy7P4IMewu8VDlsWO9dmDAFLR9fQznL83o3W8 mFXEja/ztMwD4+szylWph2EZHJCO1edqRhednMu4Dlb+UxgzgGA76bLOLAxoeQNVi B1XASDKYyDHRBw3w5ZNjlvNSrwJ/elV1osn172BHsIf/suOdzLRAzffL+Py0FiIHe HiJki1edt2grhLxx6adfknc7kfxGRVypXtRR6O/2Jh9f32y60szvIkK20sDJKXReb OXR/xFSS0jfdNOKEVReJYJcWvFnsbUTwLzDY08sQiqyyMRLM3s6Ld2yWD5l8syMl2 KA7wV7eOjZTKggEj8Q== 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 1MgesG-1vlzsU0BIK-00k0rJ; Fri, 17 Apr 2026 07:09:22 +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 v2 1/7] platform/x86: uniwill-laptop: Properly initialize charging threshold Date: Fri, 17 Apr 2026 07:09:06 +0200 Message-Id: <20260417050912.5582-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260417050912.5582-1-W_Armin@gmx.de> References: <20260417050912.5582-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:TW5uEeKqY52BKwqPTzVk8IMl6NkX0wMRj9ddkVjF6/BrwbgElYE 3CkS8OBsPur4vQj3Be7fRXRzE3fifW3ikQe3xDVBgwyJkDv2xVJIAcuKw6A5I7hizpChucP KF1IAoytmqSSr3snm+KEld0YXsuMtYJiCTdFLmMJRdg0J/XwqSPjqHY4FO5nog9vOAYosJw JZ6uRhCRASqIx9r7x3Knw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:LpH/0HcnwNY=;FMETB3emcpDOJFRuPb72GvMz0GI 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 2aDhPmm1pLN41BFigwvOAHzpQeMiWUtwWBTI= 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") Reviewed-by: Werner Sembach Signed-off-by: Armin Wolf --- 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 Sat Jun 20 09:28:46 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 440F6364EB1; Fri, 17 Apr 2026 05:09:32 +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=1776402581; cv=none; b=lVH9mImddWXpA4iK6onF4wNJd67VEBbh9xf4vyXzIfe0TObOmPl9KbnWOKxRJVbd/on+zgLe+bQLbCodtgr80ECc+oQjkx92stmDPfPyVt/kTzKhAYu+vItMUF9JERdYNy3f/0XEO2wB5S7PTwm8eF8221iUDlgd6rqMf3l3Eco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776402581; c=relaxed/simple; bh=IQOaukCuOKVQcr5hapHpIcBkscfL8ANWwa7KceBMt98=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=C5F85C5oDLW5ufMfZnh3KKwwGrP9Lxybe5qWdAXIwS0O91XqBmcStqNZEJWziBO0ir+CwFPgOcnB+bU5cMZBTB4cfgv02yyk0uWs+BCLSAI/9vJwL1SdT1ttY1nmFIX/P8P2DxfmKY2tuGCmK4c5iTa/CsZ8PXzqLSssW1ZvZgU= 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=AUXwsJUi; 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="AUXwsJUi" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1776402563; x=1777007363; i=w_armin@gmx.de; bh=vGpbr0VrFDI/3GnPOZoF/vWye2wxtvZkGuSUYvsplsk=; 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=AUXwsJUirQZHE7AM+nkjX0r1jbs2PeFRZ7d4u7B5EJPukY6ka8JiAWZYb3K0GUGj 62xdTqVQMZKujI5LiPgCFzCTS5Qtl9UIWYuMaHAh9F5XHV81OFq5MHr3rK/Fh03Wt SJ2P3BzMp7lKYWH6Kw/fPNAGhBtGNxUkg2cX4llBvOy8+yWCqxDClSLsDeuXuoF4p nDPlnW0L4BXEQ71R34HuwJnUR1Jf+bSKCCjHuTBvZ8SzoWFXvNXtB7g3Rmkt1a+kn qRqTrXwRxvxiUObMDmF4SC9vGNJA8krHoNJMrGBbsxiYzddH37ZPacT+U7pujLDXE iUeDLGJuQq4c+4/b+g== 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 1Mqb1c-1vZv3y3PtI-00cLcp; Fri, 17 Apr 2026 07:09:22 +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 v2 2/7] platform/x86: uniwill-laptop: Accept charging threshold of 0 Date: Fri, 17 Apr 2026 07:09:07 +0200 Message-Id: <20260417050912.5582-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260417050912.5582-1-W_Armin@gmx.de> References: <20260417050912.5582-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:iHuNoNtdTmPBJ4YGwierEk7tiNUgemo3cmPEWsZxbnxeZ6BzsN5 TFEa/cG8TTLw++YxGNvsWpMvN72tyxaNeQk3bybRYIgawojYRMtsNAT0HdZlUjFtxEF+uPb JMtmjzWs2U4J3OODr4C/BDAfRBJgwLah3f0duIq4K1qrQp4vJcS1W1pE5snCuNbLQfQxysP Hthh8R7AFwOlccMZs26mw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:WLrKpCDy9/c=;PQ9ZvM1oZdJrrE1TlJQOH/jmUXv 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 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") Reviewed-by: Werner Sembach Signed-off-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen --- 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 Sat Jun 20 09:28:46 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 E012E3612E8; Fri, 17 Apr 2026 05:09:25 +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=1776402567; cv=none; b=L/dyH2p6m5BQbOu4/WCnihTkddUxVYXQNRsmqCu1mCLx5sQKPlk5GpvODMwQIbhXiURVP5ZFOBu9RDD7Ci2MPPJgj95TlR7NY/UfocS1Jw9qBhC1AdF+mb6rvgm3hZtjRnwGhYhErGgq0rU01vrAIe+4LDCwuJqGFmHtYNpU4ss= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776402567; c=relaxed/simple; bh=/GHcXEpHI4q28HOLkAa7hpPbMfQFN2h8/D8fV255OJk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=n5YfufgIiLBxJrJk2MGUayCqkLOB9zJeCvBvlHKD5BoK/qGQP8ELffN1wJOsvh8BJ3bUs0O69DgopqKBNLHNf2MHkjGbAadcgK9Bo7PrxCrAraolZqac2BylBwwOsHPLdGaxsjdPYGaHAQ/Li/oVcARWyHDxnalO18GO2SOeOLo= 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=hl7TExtp; 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="hl7TExtp" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1776402564; x=1777007364; 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=hl7TExtplJTFTWimfqUp9jzeH4XB4CtfbEWg2D4MlYWxu9scsC9NhZgGtrLx3DXF Ewa+O9g4V98RTYfAka4xgum4F8rZnJd07Mq17ortBUkx+Tu7/+wjvvkKCsHHwst9U ofEgQWlElXzfHqv3O8Z3qapRSlcHLv7CfcxQmFnBTgDnzY3ALw3KNDgko7CxcwRk0 rCDwIp4QWo7hUtdUyu+SlB9VO+nACb0fGa0KAOnUX66mNkCriTvwy+eepm0LdQJRc XbR59t+w6PuNCWPxJpUnmrDFMUUFKmeely3qzeYlth3/kDWTdoRrYRngTbsL7qoco zA9DgMxgjo7tRBIjXw== 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 1N3se8-1vDppr3wP2-00wEJe; Fri, 17 Apr 2026 07:09:24 +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 v2 3/7] platform/x86: uniwill-laptop: Fix behavior of "force" module param Date: Fri, 17 Apr 2026 07:09:08 +0200 Message-Id: <20260417050912.5582-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260417050912.5582-1-W_Armin@gmx.de> References: <20260417050912.5582-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:iAKWSKOtIBw8hSLUqemeCOqGrnYMMmlPJvMfVbXI6srXpIHojNg h3A6sGxFqA3RALBYvtJuS8j4e75kDFxsHD+krc91eevESexGofxDQYXAtFPWDzY9auQRoq7 8N6SJkeUQDEawaq6eMMtafUJuX29RmnZrD9kfaptl6EX3kix40rogUz+/C4Y8VYGILG2OF6 A8JCFuXaittzYoNRXnCDA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:QMwyGgPsHBM=;0YPZ2Ohnr4B+++5SMVDeXXewiLy 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 EhhShA== 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 Reviewed-by: Ilpo J=C3=A4rvinen Reviewed-by: Werner Sembach --- 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 Sat Jun 20 09:28:46 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 674D836166F; Fri, 17 Apr 2026 05:09:26 +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=1776402568; cv=none; b=cZsaEYA7QeQMllDOEF9PD5TdZ7oDYC3WLYWZg8gLSPn9sciWLxaGhg8uz4ANgE7910MOBL/wWA/L/vO02xY+7vsMlvVLJzM/YyepmPtz/Ke0RIvTqVIB1KfZojjTJ9/49jAZztREuUmNWmUP+zcCWBnYTzvy9m0xvnV/U4wCPjo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776402568; c=relaxed/simple; bh=9iElMnyTDA1HQ2mQi9Vgz/eyi5hn4di+8COSXstqYac=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Ns9AcminRtgS1fK7VUJ4s3iAXWBz9NmvQU/NModbO0fgnHajbz2lsBltm/KioRUSkt+7R7iGGVVOfjQOBNVzUYzIC3YewbgS+7LsbLsoQKLePnVaPVoPcrxzdMjVIaUp5dkSXJUKiKgp6Z/HfScQC4U65cSZZJU15RErTtcpmyY= 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=CDHkrinf; 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="CDHkrinf" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1776402564; x=1777007364; i=w_armin@gmx.de; bh=MUsHJqZ6nDyjtc+Y8zkYlJar3rm+lY60Udg1hSdYzYQ=; 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=CDHkrinfbi7ka3GD/wtKS8GyQSJLqcKcTrwAy1DK5J5j3Ky9lxnFHLv+XjREWgmr /Mfjm7hAO50XQWPjNnIOZZDw7n4b3U7UkJ/bd+prXn8Kg5DnQG5294KvO1FQMplfk 8Sx7KVOzakfNUBhkTWuUy1MZF9yyQWZMnlRITFNgTDrP6pTsepHJTd6cBxOr4cpM0 EWxtfPAZW7v3/Sx3bZm2TVELA87kPk1gyt2W6RG+BvxkmwcN/eDc1mgLdTy6XUzIs 98kCuNqiGtfsMzI0O1aXiq1CwNoEWOret6Tpul+m5mlcGtXNyOEwvrb5Mw6YKtrwd kAE3Pz3ypAnaRrXr7Q== 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 1Mw9UK-1vNhiq2ofU-0188Vl; Fri, 17 Apr 2026 07:09:24 +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 v2 4/7] platform/x86: uniwill-laptop: Do not enable the charging limit even when forced Date: Fri, 17 Apr 2026 07:09:09 +0200 Message-Id: <20260417050912.5582-5-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260417050912.5582-1-W_Armin@gmx.de> References: <20260417050912.5582-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:eiFdKlUBv16tlBZyJREgaCatwwayabectOvY3KY0MUum7n5IQdr DI5pJ1tbcO+Hvr7ADrWFl6mYV5xKSVfIJvidMk+a671ZkKcwWj+5B0lnIpfNrBx5iskLyC8 R3DK+NxSW/YM2kxc9s20BOsNyYZlUwrCXAOUCWijuzOmzSFihwFlyW2RwHFDPoyC89bp6kx QI5NOJE9O561UvpdNYrJw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:rDsAaoLYxS0=;SAMR4Gb3GG2rwBUz7TIS1wPGiqV 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 4yXV/Q== Content-Type: text/plain; charset="utf-8" It seems that on some older models (~2020) the battery charging limit can permanently damage the battery. Prevent users from enabling this feature thru the "force" module parameter to avoid causing permanent hardware damage on such devices. Fixes: d050479693bb ("platform/x86: Add Uniwill laptop driver") Link: https://www.reddit.com/r/XMG_gg/comments/ld9yyf/battery_limit_hidden_= function_discovered_on/ Signed-off-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen Reviewed-by: Werner Sembach --- Documentation/admin-guide/laptops/uniwill-laptop.rst | 10 ++++++++++ drivers/platform/x86/uniwill/uniwill-acpi.c | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Documentation/admin-guide/laptops/uniwill-laptop.rst b/Documen= tation/admin-guide/laptops/uniwill-laptop.rst index 561334865feb..1f3ca84c7d88 100644 --- a/Documentation/admin-guide/laptops/uniwill-laptop.rst +++ b/Documentation/admin-guide/laptops/uniwill-laptop.rst @@ -43,6 +43,11 @@ Support for changing the platform performance mode is cu= rrently not implemented. Battery Charging Control ------------------------ =20 +.. 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 ``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. @@ -70,3 +75,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 7c7ea0e76966..dac80c78ca0b 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -2499,8 +2499,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; pr_warn("Enabling potentially unsupported features\n"); } =20 --=20 2.39.5 From nobody Sat Jun 20 09:28:46 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 34876361DB5; Fri, 17 Apr 2026 05:09:26 +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=1776402569; cv=none; b=aZFomGhaDk5MGx+PBgVjRPDBj9JZGyeMQfC2pp6NEWahDFKLkhVlCjLqOE2ATO9ga2hQAwGAf6vsta0wQFZz9GNvvbYtEkEdVb8H/EHb/9JIFzUKKF9ywuH1TZMWlk42mJEbOHzYl/IrVFpSVB6JUD6jfXwl2EsmOyXgV3S/5d0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776402569; c=relaxed/simple; bh=7zRHg+u58keCGXWSvMzUsxUcGETy1PO1afLAvG0gy9c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NEmVzRUL4xp1siJZfhNGObytdDdsFoiY2nRC6xdmo5KeUkixy7wFEcmGyYHBJPm1p+hL3nP7EPXDnm8d0bPrxQCJ2I2y6x5m94zoM09/FxVYtRDbKLtKPWJk7Ic2ZSG+Fpe7C7Dfn9B37ndKkSgcJGLoM3UHvgXQDzVm1NRWbQs= 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=kwQm90EC; 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="kwQm90EC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1776402565; x=1777007365; i=w_armin@gmx.de; bh=4bdMC9ZLX4Xl7jAnbQO+DB5XAtMQn/m8uDMrwzGxS8U=; 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=kwQm90ECddoX8kOQxYaLSpH+HtuKSia4e2oSqJwkv+kaXuSAlv0wc09F4t5DN1r2 /KFcGlNpx8qC/5jyRHkMnPwjK42W367449p68omrw8obTYiFSuWFOhjKGVdPND1eJ LvNwBkl4XB4FfX7rajcX48RZ20MX+9N/Ro/1NNiwabRZP/gpkRVGlnuKveJNB7hBx kikxEU0FLzVZ1XXyPVxccEIed6R6s4eJKSD/FKsbH2rK47NTd2QWX4VJtkfbhwGsP Pvsgf/JtMejZ7WwydXiX+eKIwqK/5ej8EEUmJ+AJo7nendYEdmOj+0SRW6d5Qw9FT F4fDUin0PGorTrho4A== 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 1MkYXm-1vZMpX1ine-00hKG3; Fri, 17 Apr 2026 07:09:25 +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 v2 5/7] platform/x86: uniwill-laptop: Rework FN lock/super key suspend handling Date: Fri, 17 Apr 2026 07:09:10 +0200 Message-Id: <20260417050912.5582-6-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260417050912.5582-1-W_Armin@gmx.de> References: <20260417050912.5582-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:LCsyggqmUvh9t4tUyXGT1ufYSzMMCMRssAlKPvN5qkzVBixkPA5 MS2n8gmgM+Z81EV7tDOw2kG2uXggDr2UN28GkAMbTImxuAb/RHQ2ZwJnxdote5B0Y+kIUFZ 2jF3efKzHsNbh6GdMTDNxEKb4l0YB3WIQeglTMjc28u1mero43gwCsTptD2dWKwFv/cCoQW qtCi9YZ/NkuJyKrzOd/8A== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:0wp4dtm0Wng=;UGcPjYrdRVk3b+6DgmHdvrs99R4 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 5mec4rvk7Na/Jcql5VMVVD/h3eY= Content-Type: text/plain; charset="utf-8" Currently the suspend 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. Reviewed-by: Werner Sembach Signed-off-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen --- 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 dac80c78ca0b..8c00d762ab08 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 Sat Jun 20 09:28:46 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 84342364E9A; Fri, 17 Apr 2026 05:09:38 +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=1776402584; cv=none; b=be/GG8O8gRz1tneopzTsRHlPC8371B8RIYMshWW7jbJLpD2PIeyYEYXTOPLEZmdJwSngqt2A41Z55ME3yTNeBFNitsa4pGRA4Mdejlz2/l2Qs4YRRb1OkX4FKtrxRuHkeURtELDKGDgcOJdzkiMtJ2oU6u+9Og8cBG0r9MUkNKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776402584; c=relaxed/simple; bh=pLU84bt5JDfx48jzemJz/pRusWR/Ek8PM+ig0RdVMIg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=B8sv21nlcczSZgVYNXXS/UASuovZKA+vm4p+pLEap52oCfwa+iL/DYIZqyIi+Yt9VPyGGBxYnJ9hr6Bv13XAG/56x/c5Sn0SjGtjSnlvjgdPCZJApjDooXaAULNfEl/gM+lXtXP5YYWZY/AfudJ15VQ6FwCajUR2shEXDRYwgEo= 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=Y6UXu6KU; 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="Y6UXu6KU" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1776402566; x=1777007366; i=w_armin@gmx.de; bh=CT3LUk+B3I5ICPdtI7tnPJwg13IEnNXomld1pkqvUYU=; 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=Y6UXu6KUuFqGmByXD1YZDHhwam73vXisjpFo/5sDxXCRmpJYezbz4wDVMhJsVgue mm6OyglQaoEigce5ZoTlB0a3KHgEAKyZEgM+JbGjd6sk8YybO3Nbj5oLXCFB3NmDd amE1QS0UlRXsrfjL197k3KZSJ6LktrdXW6HC6TVemuRsexPnBHFkUhlMp4mYov/Ur SXkyR+CyOGnclds/aSsMjm6wnXPwJKQ9gmuS1Jvt8u82zzs7YYtEIhCXqHU4Dw24/ rd4nGCRH1o/MNS3NXFNqc3HUzEwXBsSWrSIeDxIYTDAIxwgFo+OuuPeqZoKa1eZKM bSdbjgIwPEUTaidPdw== 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 1MC30P-1w7sR10o1d-006IVC; Fri, 17 Apr 2026 07:09:26 +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 v2 6/7] platform/x86: uniwill-laptop: Mark EC_ADDR_OEM_4 as volatile Date: Fri, 17 Apr 2026 07:09:11 +0200 Message-Id: <20260417050912.5582-7-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260417050912.5582-1-W_Armin@gmx.de> References: <20260417050912.5582-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:SE5nxONcuRj8p6DpJc9C2ZgyoGmazxdF8vCgfTvPRNP8cwtZVun P7537WbSncLHypdtw+nY33OAp1S+EQl5uVer89ozY7KglqO3IzJUnFFSumFW2FheYcZ9PVD 6MqWCSCAtk/2n2OHNZ8zbVulNxEF/zfQiNXTdHw2xlpaeJ99AE9SOvfb44HZgmwAX8oRxvK PRFDazm7QL93NKhjN81yQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:F7gr5m7hkVU=;AzftiSPPuCJxomPQ1udVMd2lG5u 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 w7aQPKx1WrAR4Bw== 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. Reviewed-by: Werner Sembach Signed-off-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen --- 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 8c00d762ab08..d4abcaf87e39 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 Sat Jun 20 09:28:46 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 F02FB364032; Fri, 17 Apr 2026 05:09:28 +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=1776402571; cv=none; b=SAIfXaxbQiww3wbOT1wojvwmqXmawvxSWkcRQJlZY/HXMc5350662yD+3rtW8GwgN6SJFo+QeM9L9nfA0tT+Pi35r9AyqDFKwzv/6jVYDeNAQ1bpSIcZLuCX3ZHM23Pocp0R6X3mu53lEJCRRHVc2lcZoYw/wVmZ0H5v1Btg4sA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776402571; c=relaxed/simple; bh=yB7fUc5Xxgui9Pe7n0AYKIP+VCWdZfdmApiwDbP4380=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CUqEnXkNh/GpTanBX8I/uCLrKew+0sc/jwAqX9SVqVgG6MeLsfAhzDaqe4iaPCkKR7LpaJNdOCY9mMKB6v6o3+JshimiXbG+jd+hWSHQ8GsubPCNFfdKju5+82Kf+2HxJkSxbCRi/HALz7+zzG4WpsJDvfrjlCfvjtcZtqJFhKU= 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=lqsPT5QR; 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="lqsPT5QR" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1776402567; x=1777007367; i=w_armin@gmx.de; bh=QIOb8YAdSV2+WPDZ2PPXOqqYMy2bEvLuv2dkve5/8y4=; 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=lqsPT5QRg1Q3fwc4ZouDN5OXOalbA6sa7MzF7Y8Am3cdto6kn+gehMxfF1BeAqdN M1ipHnbTpCTPuy7JiOeZmdCYfUx+UA/20r5H/FwaMr48B9ZBWuONzoIww90UnzbOy lgWIe685vaWPoUL2YPACVj5mQ4b2mxPp//6YD5vjI8hUCeFtMUmhWAtPnvE480bWz mlDI6VoKvTR9Bo5EXongXieN6puLkOlOVMGXiLx5eZL8o1igH/VZSFzmDhk8ECtps L5dBcTTjnHYJw+4pmN2kyK1eK3p15VyAP4RruN51TwH5/WQA9cOUgtfseznWwAoly R1fX5LCwJhIrTSzpJQ== 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 1M42jQ-1wDbSI3toW-00E45r; Fri, 17 Apr 2026 07:09:27 +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 v2 7/7] platform/x86: uniwill-laptop: Add support for battery charge modes Date: Fri, 17 Apr 2026 07:09:12 +0200 Message-Id: <20260417050912.5582-8-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260417050912.5582-1-W_Armin@gmx.de> References: <20260417050912.5582-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:Bj1385uLYp5l9hUJqkjPSNRKk0Wnbzz32CVVrqnUKao1NkwhVd1 zLWSJYe64OTKt2fFyFZ3K6sujAMde5MOLO6K9z0ribHaGgtZbUICV9ml0VRXR5dtuW0+sAe aBSO27R6TI3qw3kIP+70WvtGR9Y7f1VHU0I0yugtb/l8ZqxB2eDomQuiN8/c8rPfj6tirnY d1ZIx3ze2tyJBbv5e0uUQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:VWdXtg7Bn7o=;4wA2vS90kBwytn7/hHkDn8fL5oQ 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 I8RVuZmb1WPu6TE5h2tJAHDgkQ0= 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 Reviewed-by: Werner Sembach --- .../admin-guide/laptops/uniwill-laptop.rst | 19 +- drivers/platform/x86/uniwill/uniwill-acpi.c | 243 ++++++++++++++---- drivers/platform/x86/uniwill/uniwill-wmi.c | 5 +- 3 files changed, 215 insertions(+), 52 deletions(-) diff --git a/Documentation/admin-guide/laptops/uniwill-laptop.rst b/Documen= tation/admin-guide/laptops/uniwill-laptop.rst index 1f3ca84c7d88..24b41dbab886 100644 --- a/Documentation/admin-guide/laptops/uniwill-laptop.rst +++ b/Documentation/admin-guide/laptops/uniwill-laptop.rst @@ -46,11 +46,20 @@ Battery Charging Control .. 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 ``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. + 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. diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index d4abcaf87e39..e11b6c8aeb0d 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_properties, - .num_properties =3D ARRAY_SIZE(uniwill_properties), + .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, + .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,27 +1691,36 @@ 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_M= ODES)) { + ret =3D devm_mutex_init(data->dev, &data->charge_type_lock); + if (ret < 0) + return ret; =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 uniwill_read_charge_type(data, &data->last_charge_type); if (ret < 0) return ret; + } else { + return 0; } =20 ret =3D devm_mutex_init(data->dev, &data->battery_lock); @@ -1609,10 +1739,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 +1756,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 +1957,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,11 +2034,15 @@ static int uniwill_resume_touchpad_toggle(struct un= iwill_data *data) =20 static int uniwill_resume_battery(struct uniwill_data *data) { - if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY)) - return 0; =20 - return regmap_update_bits(data->regmap, EC_ADDR_CHARGE_CTRL, CHARGE_CTRL_= MASK, - data->last_charge_ctrl); + if (uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_MODES)) + return uniwill_restore_charge_type(data); + + if (uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT)) + return regmap_update_bits(data->regmap, EC_ADDR_CHARGE_CTRL, CHARGE_CTRL= _MASK, + data->last_charge_ctrl); + + return 0; } =20 static int uniwill_resume_nvidia_ctgp(struct uniwill_data *data) @@ -1970,7 +2121,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 +2132,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 +2144,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 | @@ -2579,7 +2730,7 @@ static int __init uniwill_init(void) =20 if (force) { /* Assume that the device supports all features except the charge limit = */ - device_descriptor.features =3D UINT_MAX & ~UNIWILL_FEATURE_BATTERY; + 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