From nobody Fri Jun 12 20:21:40 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 D0B6330F523; Tue, 12 May 2026 23:21:59 +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=1778628121; cv=none; b=goLOuaQmxrlgA9z7i3GfruRrmAPylPSld/R4OoTFZCM9d9wqcMPtLBzN3P5pmqq2yca2jh0KUndLnwG6vj98XZyMW2E1Hq1q8meqQGz262lnXGLJdWb5KJJQgAbp61YDXyeEVRZK908nyGtgu9KpY48QVWuvSKycwSYxtqtfowA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778628121; c=relaxed/simple; bh=I+UnSG560s8DA3WsEWEfeklcyTRSlA+TE9Wd2xzE19M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GANXQGcVH/ocAFJTgdbxm/CHeOqR9MmYwgtEh4/GK3lC1bmSiMYKVh/VYb0xG4qOXb1zh+ZlLbJTl+0xhvgxr9MXLN2zqL5t35PufkX2bgodVKYZipr2wnOqibD1S9074yXLswWfpa3r5DIwOTNG8pzraTFuBdGCoMXGyUFle5c= 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=pUBRRyPJ; 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="pUBRRyPJ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1778628114; x=1779232914; i=w_armin@gmx.de; bh=ma9YegZvKimvNcoUFnLpPQglceX9SLuALrtHiawenec=; 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=pUBRRyPJhUf8BskcF9o4DwPg2ricGHU1Qq4P3nlts2Es+vzSsM/0SKAXAWRpqdLV wRWrNCTdXOrd9EbBZBCgE8+wHUrfkrUwVp90Kk2ojHiXtMrL2N+yv27x0IPd0mSzd jvqsbNhKImnyCbFBiVEHTdf0kRuaTnJy383x/G4n5u3REQzB44q65NqZA2WtyLYVj XQqLlW3VHkNz5GsBpm47/XIgmkJJ4A9N/ipgvO4k+b+IBqRzH7vXp9I0tyyeAoT8k FayuA+IHk2nnxt092r3ARTizJGC7kwxEEtqj1X0GxalBnX3mqpfV/LzcXKvfkoGjL afjOTnOvV5EVK+macA== 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 1MTiTt-1wqP9A36Yn-00KP40; Wed, 13 May 2026 01:21:53 +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 v3 1/8] platform/x86: uniwill-laptop: Properly initialize charging threshold Date: Wed, 13 May 2026 01:21:38 +0200 Message-Id: <20260512232145.329260-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260512232145.329260-1-W_Armin@gmx.de> References: <20260512232145.329260-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:8l+rSwVorEA5Bnj92J7V7BOP7fMh2fzF8jQ64IiwGQkU3kYJB4Z HaGdZkWGDsuP2YN3gIxpTGBolTY418Sf78NeJQOYXbymbO9enbWAIQIlD+TGklVIvA9MvAD ThjqtUqxj1ImGmOFpXnfeZyushK3W8CuQcX2JaGGd0kWkx07ic9k+EHwMVnN3U4t5ZqsuL8 cUgG0vdO0FpYQfF8lEgGg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:7jMT2w9BwOY=;/sFfaxNCSJ9ryH9ZnJwovaDhfyI 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 BJxZyg== 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 | 35 ++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 945df5092637..d9c202fc8c71 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -1359,6 +1359,16 @@ static int uniwill_led_init(struct uniwill_data *dat= a) &init_data); } =20 +static unsigned int uniwill_sanitize_battery_threshold(unsigned int value) +{ + /* 0 means "charging threshold not active" */ + if (!value) + return 100; + + /* Guard against invalid values */ + return min(value, 100); +} + 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) @@ -1405,7 +1415,8 @@ 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); + val->intval =3D uniwill_sanitize_battery_threshold(regval); return 0; default: return -EINVAL; @@ -1500,11 +1511,33 @@ 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, sanitized; 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 placeholder value with a valid one (100) + * to signal that we want to take control of battery charging. + * For the sake of completeness we also apply this to other + * invalid threshold values. + */ + threshold =3D FIELD_GET(CHARGE_CTRL_MASK, value); + sanitized =3D uniwill_sanitize_battery_threshold(threshold); + if (threshold !=3D sanitized) { + FIELD_MODIFY(CHARGE_CTRL_MASK, &value, sanitized); + 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 Fri Jun 12 20:21:40 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 492CA33EF; Tue, 12 May 2026 23:21:55 +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=1778628118; cv=none; b=HCEhRbG2yI4gHWRfivsrPmx6aPCOGm96aHnTOsYmBGkn0g21Zs5aybIKwTbrEsgrflYnEmJSoC6LiSP6ftSz2bnRp7dBr3UOmnpss45lsHLznfHiFoZDjrpwDTkiJq+Q4ERARPeJnMbHAj+HITgDUZScTClWl6HwSfwl/oFiT7I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778628118; c=relaxed/simple; bh=v3IFBmtOeIcc0a9aW7NXXZAzzOEkDQx9iFXRoQXWY4w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=OQhb6M6Alq8L8L3LVOkPNkr4ZNt4P0t9iZf84Yx6+PsLfiEUfgHLVeRXxnKXCgSeSkqd3qxz98mDicjDd17lsn2HuB6Z1qIhJAaxUzrPi6akBYWOodZTGtECbCpcSakdWHUVydysj/sBQpSa8xig61RtFo0E3QvBmjvNMLsNXi8= 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=fXSwN2Rx; 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="fXSwN2Rx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1778628114; x=1779232914; i=w_armin@gmx.de; bh=z0MgPVIY+bb6DSeoL8Ys7o7emdpNgOzL7fIUDnErw7I=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Type:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=fXSwN2Rx8FWLqU96z+YMGn3aDLmm/co/bsQhxzfQ3noIQ9Wi0PWEqf6OyeGiKsFy wyRGQQKGra8FbwtsvrarAqJVVzePNbDeflG/CZeuuxkSMUFzTZ2rrvZIwotX62xn3 pstZSPtC55JuUpDc0iDqXvl8ThwnMd73YsI5FJYDmCWxS/iK4DQ7PwjQ0D4fg/t1d uo7TKLnNN7Bo17J1LjP5yCcRVTciQPAm0v8ppOH0MJ+6uvoiuVtxmLKbv+PAAl4Xb 81g3r0yYGNXOLvwUqXnlTitcVm0e5TpnyqDszlWI6YxbFeDr1wjoKwWV+9zLy5poY LpNSQa01pFPfSU+Xwg== 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 1MmUHp-1x4UeR22qH-00hlDK; Wed, 13 May 2026 01:21:54 +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 v3 2/8] platform/x86: uniwill-laptop: Accept charging threshold of 0 Date: Wed, 13 May 2026 01:21:39 +0200 Message-Id: <20260512232145.329260-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260512232145.329260-1-W_Armin@gmx.de> References: <20260512232145.329260-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:yB00ah4Iig00iTbDyWfX8ggwnz7pqzCHFWj7gKLCrG4E0Hv+eGB aYZL3zKWCWKyOcuLhKBXnKybUws2VKkN1+0DT1BVIbzlEX8Y/MxAXkAPCtdznf8CdwxWyPg XXLeQlQJjRmnYJtAD1L/eipXJ/+c1smBZD3cagpqFmtxz6e8WSokGQ+NqgZlVBvFKHGPi49 ljdvaPffwjqlQOYWzfing== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:qIk1/HJuv7Q=;3fpSVojSnEYPTKAnlb0ExIW+DZx IpCQMA6xdN8Gor4APWPfEXkIKfA5Io/emhVpb6LqYiNI3LiwR+OoAJ9mVWVS3e49wNbkcFLVv bi+RgL1gYfLfPGZAe7yWhUMECFo6O91CP1G/4Vl5MCOnBZxArZT9TDrcWA5+Hk0Mwz46mj02i e4/aI/r51057gT9TbCOJZ4MUjtyvWS0ciLBKYoM1viqNSg1Rz/93qBrB4ejuSMp0y7iPnOWwe /+t8/kQ+A0ooEVffbamymek5BD17D3zphoGfho8jPeUyIdFC11Y19Qv1V0LW/CcJyTtOEMSAO OGmUiVvVVp6/1F9QiwJVr/UlyXqYq6Th56+SJ+kVXJEtkt5ZUJhxntT3aJXw+TJmqg2JX6W7L zWXAGjR7sKHmMoYtTmsFM8oSJRCCX4ohLTpaBtGKMFAdiqjWXtWHFcTaaQFDeBk96iWyMDu+8 AUMO71sUfzXZ906ANfhBZY8kx5Jq6s9qGPQ94b6hTsPb3SradqCr5aS1DTeg5b6f4coM2LAEj tjor93VIGaN32+0K6Qqzsr+v7vpjex3ZnHctwEcvc1g+TE5Rp9wQIviYp/rLFjI4r7PodexDM jmbnXqBQg0+7ykSCYuFPHvyi6Qht3Y2h4HG6sjsJ9MQ5ysioo18/qBLFdCrk84ZsllStVhNf7 1E66UxsCaoymWBCw0Bm1YeP4mfjQcpndwcud3yCsmw+37SDeoU/sHdinE5g4CP5oMIdfltuD2 rUpnd+s0eNx7B7DbdEdYg8Y9MfocOY2H2mbS7fWxwKj78GZ+x4hbmMqwLQZdw0e/hUBlrp0Zp 1Fqgs18A9OqtS8wt5WmH11d+MQH6zeBiganE4QO+BHMiyvYqEUDdjvdB52fgfk58SbCkyC6LY BMv3nRQp+TWJYZPn4IfXHT5Lvn8sjDg1XwV6lISTiDeZuP9oPX38S2qEwDlot/vtLbdlwZXgb ehLmPZ+aSj+CGlEpsmhjcGeWAhZ6GeZiRaL17y0kaXkKZDkLYhxjB+FNxil8fWT8PZFBvlNMq WhMpD93UQE89HbS9KL+nqNHJ6/B7BQ3DtkmAzkqnZLDdzsz5JS5IFLxyB5Z6RzzV0bByOe6IJ H8KlxM0QiUvpE/KmwML/PqY+aE1pnrt8Ut/dafTSq7KDLtnzRPs1XaiElLR/6yTjjWgFWcRPU iFNZYVQA/jILMCMK4e/m0Xngp2gab1Vm8fjN/L2oUXDCMo/tf1Z9axFznWpEaRUa4mm/xLAJW Xe1BbCpsqHjZ7fABBqgLoiOjstZRiPdGz4fMEnYbLf1QoRrJqmNaPUWMSLgmt/5kU2nD21pDe OgBisn5tth0o/uF3EMlzZ9AfJ4bL0LvGwuiwOpOMSGSPpu+J7zAbPjMswNS8e3T7tHy2xjy8v hvfgRTE5+M7wG9OVpc6XmuhSGsbjBghTtzQpecLYF5PV8XrXWK/9diriFqyt1sc+JG28KD0xV w/6OAa9PmtEcDdn4VP8YvqyHV8E2HwnqWQZqgIVVeK0+hzyH3Q2nMP10skuQDgdgFljX3E01x inzibWRYdwAtm68uPDy2hY7mGH3bliObsDa+Pz2P1pzinJOWAL9QnnbWBtgLjKPsmL5i51Mce mUGYJ/I8rH8dpnOguEkhrU3PsJ2pWSuqOSbG3LPZpYxm3HDwee/AhlZcwS6sFj5q9Qo1Nhjxi hJFkV10QKnewMkNlj1Kp7LmjSZjM616dnUQWfwcapsPKPTYX/We9zI6PFcKY2KK+X1tclsV8P HUgYLXh1SoxrgYSCMrxL1dDcnoWE5AWMPdXV/2Kk3AwTGvMo7GDyyNf5V9CGzHRE5gYvoqE4l FpF1D8EjOKqVbYmhJZGkKorf72bqP/N0WpxRs5DFmodA4LiNnOuycN6nkzWWcnJF2i6H53ajw w0b+h3K9EuSC8h/On1dq6nNPxRyUXVxYqAjhkZizmw8txdQT+MpVbMmW7ZlkqM3qPGLivFVXc WGaOTPSvXB8XufJi1qwAXITN90wHYYuq+aicn0rJOp/2eY4eyCOdLwyb8v8g9b7n/tiEI88XU +OgOKxUUo6fVysssILemlcXpFDpNUdujpXJs/Qd+W1HbJnPkkCljqruwtvVPdEvIPOwZvQhxb vl5qGYi8x82N9JVRWxPDNKAiBWRxHczSDtDqcv6n+1dLP6Te99l6VLHGEWRBax425r5otmYmK wHfiNws+SZGn33OJJW6hnguYT/wUxfmxbaG/KuiNruTCvKUJefwjcuWJtGH1KQmaOfAjHrUOR EDezuJzAzDGNN9VDOdTNLArJW50PO/3klZnqp0fBU7ajrzdygGTNPylIKMCtoyt+C4f+eVous uNPxkK4mRx9WouJkwTioNg0iyZrOZEzD6x8xuRiOPgHbPou3x5Dx3xx2oo11SPzsgCVMJM0Yq ZEU+HlsoQchxwQR7PphGHaYpMuL6a/EQM+Q4tKQJ0ABeJZt/JogUEuZuOLggOWo/v4XhWleGD 8mLBfZgNV22jxPIhFO508+dgN/k+vCzCaFsHASZ2O+op067/93/YFRKoC97edrkelt6v9a01r DXEiDQS3IEEVgJZbOf3UjKQB47vjYbXQsE6iNK6M6IZIrZkS8CpMG+o7SmpI9BskjbFh+HhFn BPZ/l9jOd9kQ59C2VMjbkEAv9HXbKSbj67gHB6BinL6d8lGpOD2OwvCzUxGp111BAv7JhuDuw PcCVDdfGuxfrGwmcFawo9eRq2muBpa6YViTEo5ygRtYAfyRflXJmjutToiM6sQZ/nWGVS+tw4 ZLbhl0eDpUzDOMtKhKckaDXHM9pbFHx1GrVCQAt7SLy7dZ7ZsNaWHu0E2H7zTLiHGY+GDefrn 6HK5qjg5+AIT3oR5M84JAFsM3eikIXZ1WYjYSEY+CVVy/AbgBsRmRsdmMBNSAc1qGjsgX5BNC BRotWPHDsxMV41L3eMW2RR/6w42CB9w4MwIvz9vW0Oub0clHzQAGv0SLQ9HCLBjUtORv2GJG9 zfYGE5aLBJugn4fAVwd6OJj2EGj+D7fiD7nX+rHyEsLXjuWSZ7k+WCOdbVJk6MpfGMyTM+kMf YDxyePNjDCr54nVyo/ltL5+342g7SywtPhrGDZCZFGN80hYCp9jpJNqlRMigkrsKzfnJYMyg/ zA5Ku44nl4mfg0hh0U18QqzcDpLHWj4cSAfimJLniffM4YXyWy6sm3afzfqPhX2pzO6cmpN9u 8m940Lv3W6yQvuFgGHFuXx0avjPJni88EaA9PpyrxxA7SaqjNEHwlyCLMu+w12O9SiZEq5vXL W42rpqmZ2F2AybclbLPhwLw45oFcYMECJ1uWnSSjwWBQC7qHut9egR+HbdRmx0TasFTwKrwes /PZI2ZuLMzdt55h1RQn11/tAAe+ujrNdJNPxWhK7fWlLIUK+jM2YyzScF635QVs3x3/vgktL+ VthTxAeRNWnquFf/PNAGG5ucidKmp+KcVxJEa7loPswWHfOfX+4eTvPgZwSJIIVHDgXCvF4OS +0j+KhDxlC+7nUX571QK5CSxbeTGrDZ9TbUE5RJw0uL40DJ1Y4x9XHTqqbs+YJUd/EQFBLeQ7 yUNkSt4lvw/2Y5LuVGqyJzd9Mu2lV3kPfPDrzbB7KCh1IXocetG/mkGyndhrh47/fidoBBhOG I2aKB655wsLgsjA/NU/iXYkO9X8WIeWZKD1fzTVvr5H2G27fOa4x4/V5iF8bUIUr8JDQhhW6e p/G8HVZ4p4BgRovuMBXVC0tl7592q3lIYAdGw2LVT3dOYoQ+buqhi3N6O9T/F+xxPUXqznyt2 4dcup9UEdT9P9ITdrdh5dshI7okxzKRclhSSE5Q+gCweqkcAjZS5K0yf+gYklbuSmQECHdilO juihyDNcVFrNtO4ePRfX6M/Z/r3pdr7sN60hxY7Q4Zho9npVi3oH0okii8+01OxWXgh4lm3T4 8nDtlRo+bCxbJUxwoHUJnKMcLzHtYC26Ppf+Ub5qFWeZXtZ23AcwGxijpDfh9K367ZiAsjdeB g4Vj8NZKLIhR5xRdeaQ4nOYGt1STJFlu6Dc3Z+4UCTLU8IVk9vAcmOG7PKDrh/WyaIo19BYav 8Z4qWhbOF93LDb2o8bDtjQgF4uv0PqrxEQ+UeIwTWsWnnfi5fwI0QzpJqAzrhIaL9YYL5Wey4 KkvPyBf2EJfC1S+nNmXSmcUBacoW6ruZHhCKR1evEA9ge3fNgrosYn3Z0+763pBHkFQBaWXo3 lIOiDO1osSPJE+1yE2Fomj5YfgUrseJbxl6qwzWBeC54eLS0E7bOdh8m7OwHDiYkBhrybwBJ5 UKNjLy8XxUYXmz6JMi4uZUh9dTXL3uGOx6x+ZHpW0fgGazlL4gkYltJslRbzSi5iEP8gkT7zE nua6wl6mG0W27WJthoizbgg7u+qdntW3oicgipKEVCq7TIxscJ0Q9e80zxFNAlubvrboTHq5v vCCO+HabN/5XFN1lABsLZann7gKqu6XfDvnapYY7JowdoAB/sN6d3hQbEXU/kDZwEvE1ybsIz 1m3AJwRSeN3iMyNkbbVhjMIAm4SYVS5Upn7hpJPB/7v3eyBX/aDmoyYDeDQoZRsFOcFvAgiBK dIasj9Yi3KR5Nho5TFGnU47OmdWwWyxdSXpCWJdY5hgmkqKZCAfBr8YP8vdI+c5wY8Wh7Blfm 5mYT9bc+N2QJb/7jNbo3Cwu4273L2Q8iwr3VANB7AriNoA9O+SZm0j/4fLWY4bEanVHP7VHnn rhW9rDr8gpwVXjStBaYrSMHCOo+iyIRjasDpn+h7KymO1gClZBgZ75G7DvEGApg6uXJduEqdy cEejlsRB1Zinkme888y8a8LODt2+SLe27ia3KKiwu33PHyBTZCDBTy2LWWZE5azoxrVjmpC7S IiT31vMSY74UZdv4fiNoC/1zgwa34Ouww3fWygyZLcPQdPkMDpclJo/p0uRVmlttF+hrGddLY cgdOXhybb4B2p08pFf16BddjneF0l6ymPeu8gINN7Ue+gMlpaNkTfNqXxDvLH5TOA0qJjcn0e IfR+zulpGqXzDm5yBsFdVuP6iVa0EaBbMK2XqbNRnsa0eWvRaojH29+Skol4dR4bTsVhls1KP IFFTSinLLeeO9Fs9rDCIn2/bM3AeZRAa8MUE8uqjA1Upb2LbU6GnwUaWM699+yF10ln3teARD O2xVT4ZskYld5pu8fw/Y9iAMfdDmgx2G2x2S/S85rRcH2lzue+2nLLpi3oOfHJKB0W3LeFCXU 3Kqb9n1GeGFWCqxpotd9DH1V89ao1I0zgxRrfQsuVfnKK48Ugve63+IpY2/nDXOve9asPVzjv 5geWpLddle57gMPOh4AKbHis2TH48GEgonQeeIe4bFTRpZTSeAxzIul1rF2h4BMmuOJdFNioU 7CvWnNRJMW0EU2IuVY9E/ebv1TUUeHXVfBNfSbTboVsfZvoDSYu3FXY5Ejgo7zO07A9a95Qnj HPAdQMuP3r7Jf6muGWsWPbZSiOCb4jhE69JnO48ZYpLKaKWZDbu4i5GzSLyruQ36hhdpyPLJg Ba6VEUJ2X1NJm2egFp6KfuHNDG1URXfmAXzE= 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 Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Armin Wolf --- 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 d9c202fc8c71..1f9e9f61d387 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -1431,11 +1431,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 Fri Jun 12 20:21:40 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 8FA343A63E1; Tue, 12 May 2026 23:21:59 +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=1778628121; cv=none; b=ZEd800e1JhQ26tc7HRYypR5IzbEmX0S0knoVe3hzua4jtUcMpjqNv9Z5it42AHMhQbbrx3KGXVyGjXJR6Urnqc/W8REg1UuLGNU9STGL/8IhcYhQFow3VOG7l6RAcfYcCZNTqoNI8Hw7X1MHXr0fDBjWRwd8LxkXFMSvwNNrPjw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778628121; c=relaxed/simple; bh=rk5O/CMw7BNnxWUzO3RD/iMGFqaktUS/1bt25yd8o/8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=eZ+Aah1bS3Q2O5ldLGEt6QhFjp4+tYu6t8chjl+g09bb2iJlRXKhgKEovFxM3pXAmUnleAjM5/LP+Dky+Sb3/EHPYruCLIskfO3fG9ssLGpVEoW/DY+rlpy03eNLoH1rAxU2FswvJz9CdUlhmwE3NT9ZtWUGr56wzTPgMY6x440= 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=trnSztVw; 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="trnSztVw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1778628115; x=1779232915; i=w_armin@gmx.de; bh=eEC9gWugQxNClrbYg85LopIodWlPek2+IpMeQQK3uec=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Type:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=trnSztVwPMb3Zs97Zp5IjWTeiZxDJBPhg+5x39ErZWA8JY3BT1CpZ9ukNVuBiD4H E4Y35zjMItvGX5aUG8mH9qrLmdAmKiHuG/ctwkd0Gco9Cp88NQ/G/YqGEbniYj/y0 5HhL3YagIRMoOscGnQPnS6EPshCxykrWzbV7GwBTJ6+b6sto2tEpPK36lYrbHRlPZ hVPqyRxLy98Tnu6VmWqqm2IQgDpaNFk+gbJENECjAWYa6uP00z/su9KSHpURvjplj 345GCh3mJTzVEqVTgz65zXNQsFQ2uMmUW7+HOsW9XJOzomLX4ffqmG7uGtBA2YF1r LbWH9lVApEEWPOzH0A== 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 1Mnaof-1x5aa60xVt-00ZxWB; Wed, 13 May 2026 01:21:55 +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 v3 3/8] platform/x86: uniwill-laptop: Fix behavior of "force" module param Date: Wed, 13 May 2026 01:21:40 +0200 Message-Id: <20260512232145.329260-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260512232145.329260-1-W_Armin@gmx.de> References: <20260512232145.329260-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:+n0KrsIAP063gCRP4Wx+/joJcLKdxGZUoilpnHVuexrRiDWe1jK Vpch0fra4WCeFJeZioG3AZbqnJAGicwon2WZXzsttS5EK5TggVj+IUN1a4eEqraDVgD+34z 8jMhX5i7PMua66TyRjECWB398zKjlC2APclYNJfyfS51ZEkQXeQNBpgg+5qol5Ng/5vLYfn /zMZbCQrVUml6nVQROL1g== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:1xWfCC4aDk8=;BawMSOOpbOVSVnrk2nB70kCZ0AO q+eacRpuTWgPtHyiDhf+F+ZNlSM8RYccw5iGW0P0TvXNaIU8DpM3sxl/FnUmUyLuXUWnIlM8p y53QP46JLhYOyjPs1Szn76DULNNfnb08/VXti3KyCMfLSNftxz3RtM+XHxdbFePlyPf7G74+m uJkJWCoJoTlSToV20m9OZWH1fUSmOsnJqj0vcL3wzfSJG77Th74FAJf1CGVD+0vJ0nx2Bjtzt nZnh+lqMLOZ1xm2Ttw4QJzWaQyrWqRsDWo0YdNzeUkzmk53JJQ4yliWn3UxTNlk+DQAM+uCeB Edk08pQSjJnEyx9Y4R4NyPiPaAXawxQhx8arjqQDRL3HcWuMv/aMd04yTXDUH1/0SGSPeJ+MR KV6BlOHDa5UIbMDF6UGlnAcMdaCTsv4NR3reuxkaCiLhgee8z2Nhqzx6LHP7p63cWhFoY0HtH 6JOScuiH7kbPO8groThBlxt6nCVu4ElqV47o0LBDksAerpJcqOKCj53bNER4ueoHKpksCOIjG 8OOrQRRf2GdFaLKXUqmEq1toKHAOVbpWMd+wUPmyjz3GRpldIehN664E/HxmpbAYpCI838Vgu PlGRiTgFzqXfzBWWxdpHe+1m0mhURmrhGFxEyYS4HMeZQlmOOSWb1o5//jZk7MGcofaXesGoK j/uDhDyFsXYumHEQM6vpVsvmVu0LERGsb9Uh+E/2IKUcLYozY5RwctUVqClcUDPR55ufc18T/ OVt9vsb/ecXJXpmG79dG+DN3bJt8MFqyq4PZbrRfMHgy//32M7eQwioOy9OGRpNN/UQGwg0Xu N5MNq1CjyMyaDEBb8/MlfGxx0wYKDOBgzNgpGHlNVPc6qn8YvqoLk/cFz/mTDil4JU40MK+bt qHXpBWFQ6OG+XH3UZlZ4rCRFKckjLtjgCmZilhfkXm85NjmHchP+05RdXeByDXv8sk5zWASrr iQBhJOdjGb4Jxf+dC7+ZuMSHkvQSQQJIhxDe7cirXktSmnuNNYZRB+tW4NRGssJYeyHGPGW4a pqlF/IgPSsUAWrBUlGHT2rciQfPxBSr3W1yXNpaCGOyeUvOz1VSK8cy1MQ9LDTbZYS5tvMh+G G6qj6ruqg5nQj/lZUaTdU2FCr6tVT3CYy/KEWX6NH50aJqKvzQX0PNXhygkepOya6Qn81xHzL yCSi4BUV81/sCbWA4V1/aOtoflsjoZixtX8lTfUBsReFsCuFLK0FMVaxBg5UorKRRwsBv9Olz KztBHQXPZ/aSbPdJDsGMajojndUCFP8wh5hQ+ahMwJgjgMVSgTkQpTlcYTE0IwszofJDj2UYl VRBpFYS3OFcQHwe7xI0ZDJyA8crKowmIsD4vBkoBgxbWtQyNlOsD6iNo/vllYCQW5KDZryWDD JXhm9ANleUFHSgA5t5iHP53IkMD/I9skdc3GAQVIHpqN5ZYoj+RKNAy8rxHmOB4tMO0h02JBo U5LyjOhSMN9+8X/lIPpf9YR3FIh6u0X0mRoImGKaUcrnTuUIFX+ioHu8iVy/7nezuo407qHu5 HMhW1XgSuC0hlCzs0UdcZLUnPR78bRUXkTZtIb+RzCnuCGOPS8vPmykC3YENAkBKhZ96jMl7A CMM6TdOununvkBEgx+WOErlGDSQKplqDa5cq26ZBupn7E9az8xgAyFcJweojbprxWt1lW8mwA 68NYtDBUl45hmc7Zk3CszfiI+b9+HW7uHZrREFr+eCC5Z0N7CLbcR0bIkGeQacQjiPnqDETRQ ZhIEfB1A945hZZJzhfTHgmYeMJsWJLEq6fc33K9tAv3/MIKGDf/qNokYvOS4MHz8A0jhU7LNC LNH3F2PggZZ8hBKt6Jy8zFmYV13w9Sz2Y70EfWzA3VPRaG+AFy6KLzrQhy+AwU/yAejJdseWT P44cCh7X5Uk7lcB9wYxOAdQvMhH+MBzqwGdGLGEHvDmq06rtdASXHAG2KwqN0lC5bB3bGWDMj EQACfGBGq2h1auZ7gFtdaUHNDPwidBh1I6eJDqZ13cR/zqpC21VHyNBduDAhxOfQp6o3y7wtj yJ0s6uxYbUPis6VwC3J0GwhdY/iQSeG0M58IYBEBC1xGjmwtzxVvMjnyC957CXufvmIMXXQtV wPTfgUXX41TVOBqz4+04jLqNP+Jlsoy6wJH3KwnJHEpJcIMjh+mXTKBEb1NrSt4k99V6xPHen 1rW1y5ZCj7X5xg+RLVGOw2Q+8HKW90Yj92VrQdvw8zDTNG8ea9FQLF9qKs6VpoHpB/uB6JVa9 HtxYLUHzpQFK3BqDmZT7eOIn4w/xEqJaZlLUq6l5PfLNu12fawfea1aG+qnAjplRAYZJSi0CI R/Pk4Bcgb7UN2wfWlamPeGFgPuzjikpXeBObRz0fJX0FlaUnyqsCIXe6qBr3xtmFWM5pOq0fQ CNEb2cRaueWxCHZeoJwvVqREiLWN+sLCXxjyzqjoY8PasVYhmW98g3w4TNL7rAmNNZgz1aBHw G4ICfCk907gQzPzHL38nvpRAjDRhHF2GBUsLC0V1gCN5J5wac3ME9+4e11ETpm4upkf3kc8M2 umY/19JNveHJDJEfE6yf5sPm8ztwDWoB9LKRdmAYhpnZhZrF7ipBkwrnbbCcz4oHyBPauNzGT JPzXRg2mto/fyqD6j68co6oQjfQU/qmt/hGFTnW49VUzEg8pdwRz8aM6ZValKcEzH/qHDWv2A +Ct4OgCy5R/3C6F8SVeW9Fpg27jhUfJrM/x/dGqscUA/li2RWenW4cEZuS7hl6g7kprAUqY16 hJb2n/BObK4lr71yltegVynmFfJqjD9bisz1X7Gi2a2KTwUxC0wzeJHy5OQJavFrtZDHcHSh3 MXlWZZnofM3hFtPdA3j2sVtwEtCb1mXB7AGE71chx/C4FurvRoacS6w6+/y6ghIQdt34DvaDc ZlXUKihQqBenBdeSgjevLOnFn8NfPIalxldOd+k5QS46X6ctCjozh93ixypn1WRnp6DaQ2u+8 gYTtZdNSuS1zC4I98duALMYfntB2oRp/4sUqe+gZL6+wcI3pmdhA/OpMmc2EB/0RmTgofAsqA 4xbFA9g1/H1mueboPO8xBEYlX92rOWCJKiaATw5uTRpyGp4hjhGX+SRf4b81gtokC1Mh3GQuh b/fV531BnV3MfQBhpeuQnxeXBM0NYTONU4hHXNby9RCdWlz6VkqY0TMzAr6TsbS9ktJOxM1kh 1qeAk/PBlq5ZiZMcT2eA6CF6Y56Cpux+7tIO2CJzGcG6vJlMKrnBZHOERr7I6yyM7bJarXhP9 hU12alT/hHYmJNlfb/H/4Mrn0I0gzYwQ2ur55Nu0nJYLfknEknXgUcY8mKDg39aFn05V3RCGk n6PjPL0vfQPuxpAINoGIyory3BY7IWZXbiCVNX/iVfRD7ZBUtxFgs28eA6c3I63mSPalu+oH5 6QiYhoRQT5CWkfnFh/9Y8YRqUY6ROIaIvBwxmi8pNZcnPEVZtNkWjb/2OZ86OoENyK+JDRBrU 0vl4LXLzdhW4rDu8PxEKOAh/MtRKOr4wkWST1c+Al/Bi/1/r+HslTsqrqa7Tbz5Zjm/0TuAK9 wGqb1LVXxGlkLx/hDYwvJDe4l0ahuRStWLZKxObs6yEbsMq57s9U38QAPdMNFyOqVBLheoT1n rxYsBhNd7VDAh32Qybcvy3BJGsH0xm+/Efw/wH5CyaA98B/jPPl1vHOSPs03sA3ei4KfeStOa Efo0crkrwtd5KQc0k69IFIpaX7NbOW5iDQLuCVrJi/eISRMDJ9g+EA1U0VBXqjbRxqwQo7Tbt /zWDg8ykyX8XMCORLoBP0d5awnxSjQQ/LDormw8V2o0e/JXQq8KdH5U0ghSCRMkRtgklKc+lA 3AuXbnDbdFSBKTEaME8GVzJACysx9PEd+AkI56XcMVD042b3gvhLrqnV65/DIxbE0fMx0542/ LxTgbN65dmghK1UWN1tyxQ11q2Fuh9dyhcE7l8WpL9MhD7xNINsmUH3kn8o25jtNFPJr9HoE7 aaWJAGyHeZYFk6wHLFJB6TgBTluKpOmrBEV1ca5GvPXnRR2s9ffR52iEAocj3lx74olnTJqDw M+kZIevPP7fouOqPujQIlbYvzRBm8e+PVH3EoLOYIu65dHhZIJdCKF0Miu//UOCOr6uhMQl91 oal1PeCxZfjDB4wQiglR3Jps302OdAenTCfebVjN06CM9OU7cKM0XOY3s6Y8kn3w6eKNWP/Sw etFbPHjnOvkN+tEsffw7gZThSNz6mMazZFZBAThwqVYm7t6rEOyJDn6juf35kW08nboeu4aeK nasTXjgNJ3KL6FqmYNI3WvA5DAaqkjgFZW1sHp0XSWpXQI7YVORLDKfnN664pwUCeeA9VW7G+ 47bhA13hQTTZjvOK6Tqy74v3xHPtos/iMsbPgbKmCVRKRNzkDWo6Ux6Yv1tX5itv6x6SlYP2H 2NykjyhQFgqNJZo0AQYvmGLn4KAq5V1wa8Z3XIzJnlxzTquhanj8yNzvaiIWJm5C/hYVaI64d d9IlkjhQNpxLym9qLK1UmkubCFvovaFAZCjAR1ucSmCL9Ia8g92cma12JnF/hPhoOWEitmF1+ 4x4jQkTrTd1Avm2KbZZmkyk6jv9yr8hXFExVvn5JRtyq6+T66k1QlqAuZ5OHMCXAh7mNv3Lyj KN15Aga9juvF/wjmlzzvZ/1+sW1FW9e+8U8/DW8NijfRR4zS8t0uzRgLiwtKsefOzwXSrG+7w CWiDan+0G409ZaTlYaqcQOIWEHeJQgh0zqEX6uMTIkXJJxddB53htsUpvvE2heCRsTwqOkBfA BlPVQHTDTi+w0LKP5EkXlvmqIzi52y7wBf5f1KMJpw5ysuhhPpCo21aN3Voo4hSTkBVk1Wtxc yjcT2+O8LIPVXYDjJEuD13sHkmh4H5cMmO5iysDJyuIDxeQqjJ9XyxBNcWSZCGGPBTMMCFno+ 2S3he4gc3LG+/Bh6gx0s9vH8vIYOgVUmY9/CBBJH3tSbKCommXOg8/0NOHQfrs7UO5Qq1SLvV /2h+carMJxpsZWbpNZ44h7wv9+r5PAWbHJG5JriyfGkuU0Vi1RZf2LYEfVHpasrrIQK/0IzZH qa2yiJmfeu3bZbx7aqWEyA00biR4gXPbpLPZAEvaurq9hfEw4E/AdyQjUm1+msmTKIlDD5lmA Qs8ruD7IiG1vDPhyhe/l3XAxJt1kRnVoCtOeevZ9VyBdAWeyloJz9ptcWWCM0Mnr5qlCBP/nP Qs2aP5ifwOXGPXhKyLY/lJwqzDqBJi2A6GuJ6SERDfr+v3tqEjiEEIEuZXz8uwj0knA52vIcA T7ZIvcNNJsE8tR9CyNDLBvI9TrWCQFv3UDV2WBhMwjCpzHTtnCi3lCLkCLlIOH/JbjQWFO+R1 yl+DWMOEPwM/RSRtC7XggWui1sFxhRJpVipFw8jJ1mgj8OdcPs/bYHONncWE1gl53YsjNqfLY 5gcQLK5kJnrw4na43BzrjjkCEyhYoKzcvO1Szjv+yYog2MtxpJ3x78T8nAUjZ8+NIeOJnZ1If yJsILinxRnGa/3UzAKkpnvHzNa/txZCIHsK0VmXA7CW7Y6+k7hGiuEnBsTMDy6olL9rX9kdH9 qalVdoFnhIxjE7pDmfNzNZuOKT4= 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") Reviewed-by: Werner Sembach Reviewed-by: Ilpo J=C3=A4rvinen 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 1f9e9f61d387..481c4cf46e63 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -2489,8 +2489,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 { /* @@ -2508,6 +2506,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 Fri Jun 12 20:21:40 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 CBE403A8759; Tue, 12 May 2026 23:22:02 +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=1778628125; cv=none; b=maT087wpnjLfVxu/IMfg7RrvuoQP53Q/QWzqs8zyK0hluiAyL7sEuQUwddHO4Bn+eLfsRJWNOv6JKM4kg5LWkAW3UUUt+qf4y35SnHUirvapt0W5NmRRTgYwto8uZHevpRIgCUFw2OPDGydz5rC74jbsTF+oON4uVN8EhbEDjA8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778628125; c=relaxed/simple; bh=6PV5mQWjOgH9CsK/3wKmyzANg7RvhXANujK3cgKcwWA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=S7WMw+PblUz6dwl1304WUk/QuIsZbpapkCsalFObVhUOpMBKgEQ65tKj15yQ9SM+VtNINuxZvWCip+Oh6VmkFepLL3QW0bbOj2CVzuStiwfn259MfhfjuFslkaBKU59NQ+NywhUHBB9jlwTg1Xp+DlIUFZMEQy8Kj6nWmlF4YlQ= 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=p33KMaaw; 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="p33KMaaw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1778628116; x=1779232916; i=w_armin@gmx.de; bh=wZZOuBsI2MqZ5pp2vS5sZHg9Xe+oq4OXZ3rl1pE+/vA=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Type:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=p33KMaaw3sefHVzIZByrlyc1GJ+Lh7uuf3bIlRk7JjUUhsmbbBoPktvidAolp/JR IWG8YcJEUgzULJbviZIISLiD7nBIVxXdcPISmBL1zUVQi7NRNFSqtyTtBaLuoMP87 2r3ZBHUJXUO/miP/3IBSFb/O3sfFv4YPAbZJHXBsiGfuA0D353EpbGCkgt/fIKf/6 4eK7hXDg8RgQpyAoqSEH/x+NNXqq5MJlanIIY59xf2H2x7MGVvjZyQXkspzVEnLnP YJ4sHEwiSqtnnM6S4e8SnKGa7y32aaYC+wQF4UuU+4/2w4wswQmVATvbDcJe8esW4 1YtECFfIiWR1+VaMFg== 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 1Mw9QC-1xElWx3VUS-010arM; Wed, 13 May 2026 01:21:55 +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 v3 4/8] platform/x86: uniwill-laptop: Do not enable the charging limit even when forced Date: Wed, 13 May 2026 01:21:41 +0200 Message-Id: <20260512232145.329260-5-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260512232145.329260-1-W_Armin@gmx.de> References: <20260512232145.329260-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:ibuU8ZphqtPZ+paD710BfS+ZYczQI1ldgibIYzxnBDqagD4fb8V x/Fb2B61mfXQ/+KKi5JtKT2D6FaUYNajsmqayTJ8g1jN2u684MUiYib1AT44SCGkIWZazaY crp6Lazwk+VzzI/egFNG97dvJrO7VvlUmm1dWWelaIycelNhuqVQXPtEStLDuthSawM2p+m ITnN/F6DQsz8rx2B0vvmA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:zuBWU3fr2XA=;pshgam8MU75HQoEeC3cOE2OZle+ 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 H4jnni0A4x4NnDr7/9xZlw4znAA= 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/ Reviewed-by: Werner Sembach Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Armin Wolf --- 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 481c4cf46e63..8cc01bec77b9 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -2507,8 +2507,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 Fri Jun 12 20:21:40 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 336B13AB26B; Tue, 12 May 2026 23:22:04 +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=1778628127; cv=none; b=N7ZrdEQu2maSuKEfjTWDD7lwm6cMKSC6DMlbUOH9P1/o9BFQeFm70Q2VC19QpSh/d/hoHJE31miOR+gnBAFTXvKhUiBjxMZ6yRwQJk40ebxuTl9gQFMbFWhlr+FA5YVEaFgaS2XtsnRJxL7SIyNLOAEMTXZu5AnmkD+cKl72X+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778628127; c=relaxed/simple; bh=KpBew3LPN5Kt1RkK5urtax7zZazRJunhyU1iLqYK9mA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=Whgl6feE3hGkbQuYkT4R5zpbiSVR6q+kcgZemHUDXEPCRdxwVLhNzbCh8uomjdd3i98wVEjKlZ7od96YF1+g1eBztPwniteid/pWWmaD+BuNbPZPLRwqQ+lmizUE2Ao/iwbsDYGUzE7+PemLm41PIXtJdYrmDTeWqXGK5QoZFj4= 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=MaEU++Bb; 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="MaEU++Bb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1778628116; x=1779232916; i=w_armin@gmx.de; bh=vgSeByYt3HduI9qwuNRC0RK1o8v0kGzzs1/YyeR97a4=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Type:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=MaEU++BbqTSJjJjb2YrtbBCgZCNsWsP8S3lqhVpO90pjsZHNydmcaGIHvJEeLAH2 5HB8uV/sRKDbtOVeGwC4Fd3fyTyxODKJ2iMXBjmV4lPywYTDT0a3BQGz4o6fHHwFT 9bV9oCnNdANh5SxvCQqXmMJikODh6Nsjs2t2Uu8ByQ5hzmBaFyODI3yDv+1+se54k mKwOH8/IJvie+waROmxQhEk2mQPDazc/4CB0o1WZvojigvx73sMVUwlhHM8SuCXSS aavGIphREp/+9Bg4aZrL3Nc92ge9jua6yn2+qZRkIYyaybyrom/m87UJqP58oFFgD Dtsw1XxTreAyUNP9Ig== 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 1MgvrB-1x3PmD2Zfp-00iqtc; Wed, 13 May 2026 01:21:56 +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 v3 5/8] platform/x86: uniwill-laptop: Rework FN lock/super key suspend handling Date: Wed, 13 May 2026 01:21:42 +0200 Message-Id: <20260512232145.329260-6-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260512232145.329260-1-W_Armin@gmx.de> References: <20260512232145.329260-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:OtA0Kr37UUygrWS+VcuEm0AYzmKa6wicKnxAA/KXSZg3ddAVfj8 gQkVvmRRUXowEcEotTdZfvl/D7A1XwMI9nmdo7rmJrw8odmcKBReLeXcPttSDtt2CMOXaFG ZyTfDnHCYHZ+n3DiRqMIPiiEb7ko5Lk9DJASVNubKqbeLpEDRmcU3V9XJnv1RbmIycAmEAb MVDh4wDTFiCO7ZxSR+nhg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:G1K14DUoR3M=;2jEG5IRadF3G5d8Pe52i1fsR71d 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 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 Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Armin Wolf --- 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 8cc01bec77b9..c73e280a58bd 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); @@ -1723,10 +1764,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) @@ -1735,10 +1776,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) @@ -1795,27 +1836,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 Fri Jun 12 20:21:40 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 4D1D33A545D; Tue, 12 May 2026 23:21:59 +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=1778628121; cv=none; b=t9NYnssd2xTuwMlGHcMfg+Xl98yCkG+Cm2M+GdQ5cI95dBKTboDussicAzv0RpSUoYf5Q62mA4XIA96J9Nu3zRGjmmMwWM9n1cpSpVAPZ2HEjuxLamSIQaLpdfH9pR7p0kK7c+CwXwnA5DO/XC/RfXEEU252EAyVeGt6YyR5tjM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778628121; c=relaxed/simple; bh=TnWj3P+YprYNb4NlTShgbAtxqkHhc25ERkgzf8oikh4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=cBUwNmomb43zJBW7ReQj2unBHCwLXPlvQVyx+mlTXL/G8BtgfmJP6X/MfD19LUt4zyA6ZRQYNa+ps78/9wzd+qTEogbWQA4JOIG/VV4oAY9tB26chcRODhuAwsz80r4sW07AjfiaqsttPA60k0jD4MA24f203jRV/FVJodZsb6M= 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=mgAbJZ88; 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="mgAbJZ88" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1778628117; x=1779232917; i=w_armin@gmx.de; bh=qFJkvD+yM7d33VkQRo+rIC4x2CIaJTf8AUJEj1UCK3w=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Type:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=mgAbJZ88FvKdNBzf8tl+0L/EE/fN1XxHop4LGCKdigGwoNKI1jGQyqjX+/30Paw+ 14/2/QfVQI+1NXKfhxEocv2zc6j4ZlAa1VzjSf8Lh2zGrUQ2aGr4ihkkBIsviaKLt 9vohHcy2xvZUobQXvSAWEoWLsjGKMQUEEx9FsK5JL4hkb9i50uOIAsbE7MQEcWqb6 JExPkKNU8ZBFgfmarQiXAzsjfJShndPLN81U8p1+gIyaYseQJbyTdUjxC912aMHGu sX5r4DDzmrLWVMIDN/i+iOUWptAvpJ+kwYKzha/oJCfZFeuGaO5A4eB27joPJNaF0 hAinRIk2sgH6/9QTkg== 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 1MryTF-1x9yIC1WLd-00cHJc; Wed, 13 May 2026 01:21:57 +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 v3 6/8] platform/x86: uniwill-laptop: Mark EC_ADDR_OEM_4 as volatile Date: Wed, 13 May 2026 01:21:43 +0200 Message-Id: <20260512232145.329260-7-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260512232145.329260-1-W_Armin@gmx.de> References: <20260512232145.329260-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:ETMa3J6ez+1XQtE0w+DLv87O6iPV2/3EpUTQl0UfUio50ddCl5m i1YPDwITXCdlgcBR0uDtK1AdN0Y6tQUxwrGuBfDvNtN7yKYAZTeD9QzoVUYYvhDkoTyhM/R wH+SIw25lCyh9o1pEVpLluuQyfEZUVyrVXEfYZJEBDscuN3N2gH6l/cVTk1kQ6H6JxdKXIk a54zDK0yo2OmBbGuAVc+A== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:EDSs41HVaXY=;ug6RVGNcKlwYlfWCrusjXEHy5if mlWxFOW1wbstuEdz6lPEeM2EN6XaORqp/1o/tOuOiIyZ6noyvsWDKeQS+IZBk1e1jqxJFKHgY xbKkKV2O2+YbMvqhTXBY9sIL9bdAbj/rcCLqTsfOajYtYRWDAMtXi/Ld3Na1aCSbqWEoejgJH X9IpQCV3zA4D4DLMgWYKwdxPDkgGe+JpS6IzpL8YsXXSTNZ7q1jMdPgaCNAbdUBCtZ7GDEO/3 MfXuHrN018zErUG9NRkyJLU5zNSttNrtruSotjt2x0dJG8jOt8F8QthQTzAgdSyLipPG8anBq HDs4wxbMV2C5du7h9z4R/BXcFtfOJZCQniYcD+qD2ucljXHDtb60rA9jvYwqO0j0iWVxfbmbk IiXXqRLTuLCV0hTrz2mzPcmqKT6U/i1licjvjDZl2tmi9dakQ197TqF3WekKe5rkV5I8ELvMj zF9sm12GcxBZ1KnbORTAoPD6S3iqh+3pn6OcddOK0YtlyuXzAUlbmFclaNUE3cY8yqAV8kzh7 jLQlX0RdbISW50ws/NIau4fFa/DXaJgVmSgkJyu6RqKASiK787sVr+Bt/xka3Cd8W8JEfGMTH C7HvCA3UYsRfkr095/C8qpGwv4DwSm2OfMmH5OcpYXlZkWpagnsrf4DHjB9zmv4rKQflpzEPM mYTlBo+9KRg96yX06/m21W6u0eLHk/eTGX+Aj4Gc9dV+5aOuOcnnU4lo/q0h6GNIJ/xfwnQAF bhjTUmDYT1q8DKa4x5hIJMiej6J5jfaFH5WuHOFToYYhPi/gLRk3hhsReVgIgPBEDAa9TztI/ wNmGSod50baaj6M/zD+TZPEWDAgYQxcOkmCqKQnjAm80by4UpJx/gclhoa0cpDBxmeCgVjDIA OjY7kn9qA/Aad1CWjGuNT3DO6o7SegWJtWOI/HzAAvXW1bZSO1mzRXfyKp09XMdUO+aDbcjot SLMthEysYVsebAB3jCPXucQpoNnjYwoe5UYOSd6SVPhHnDQAIhU1iDzt3cKHL13K8fh2o11o4 jvzRullApWbCMWF4pGoiUU+fl+XNZyhmzWjX+GdIoheTK8vL/QUw9qJg+5rO9kOnPBUY3VFRf bZWiG1kYtj0E7UUF9FIpZsePiVVaoYPB5UYT0ef+4If9dkOMiQPDYnxQYpeyvuH9ilFxunfHK UnOyiQJ9tIOlbibSVKzfCACcgp2ww+hE5yhUhfQWTxKNS+oJcLBHWJXLeV7EJ2YJvmc2kqgQn EbPKJIalEmzUFToMixxpcAVvnvaq19MhrwLo2+6EA59kq3+eFF2PBhpvvbv8OcZSfNcKbrl+4 eRNKE63zVKuZFuKBwP4v9PZVElfGJFnesWiLxJrkR9S5IqFVMlkeo5lOF7Wa4yItpE+EgIfXV Dxj3IK3I8G1NmkiN8MFE85n6xy3knSRu7gNrkWO0pQRhT4RUtYBETd4OdgUEbLvtv3oejeyME 6Hcy/+HvbY9en8sC8pBhvyXcpyIXsMoYHq3fR+bDlg66wqAJT8Il3WJrSVdh7vApTSQj6Ee7i ALTuqF4dso0BeyuRnXF4ejoBX2ymXOSE0AwRh5wUl0ekCOd2Rrb0BMPhMszGMOJUbOx0oOzPB Wjc7SDc60XEDf6530p31qbNUT3k0sJLNg/+I8aCBEtOEaorsSBL8MeEUthun4F+eqcFS3wJpr ZyV5stoTkRfYXzpoqX8ke+4/vTPxHaC8iPx6pJxG08PDwWPXU6ShGPstEi2pe9TbPhi2llN0u yX0gEAby83FuvZ8qNYpVU5u1WmnTgZbcjuhv4pgcFO6gohP6TzEltoAaKaulb+5oiRZWfRkXY etXvIfwcYxOhhPlaCm7ZyS1+4oMRA1cUA5FY6ar5rSKbsWw++hxxtb+tZQdMqKceBQAEjs4Ib j31EQ4Or1IkAiq+iTTof66yzV9J1azanBrtZfb8Vww5wNFxwbARs+GNmGSVTlfEnLpSBg8nB+ /R9aUgtEVIs5297BIIz+tdckviATxwI5bA5Swp2MTy9FPp55lTqXxquGh53FnveKjV/Hpzo2I Tb+fpaewhPquvjiFVwVcRxiTn+dAIUUm9B43oHvOG9JqwGyLN+/XOaMoEvsVoh3h2FmVoF8t3 imkz3ZK0YWw2x3rIET+OQdI7qv3sSVEjeimcZM4x4vclgNTuufaCJaILUI6AMfnvsxOK+faj2 XRaE4oLadqkf2OBy6mXJhf1C3d+AMJc/hnzccAaWSFwXfXNkITMxqzom5SXRAETP2ip3l58s0 40o3Z74A1RPkpOBK/IajJKqgMRjXHJ5o722GgzX/lTRKYkWuyiJvYKAmNJ8iceszphUCz7yKw 9SXSMnP8JJ2c4JVPbbCKHVvQIkw3TIVAQ6wFObvjVnoVq387+85dyW9XFloEZvQevwlxZfoNY ivOJ659yVocs2hlNZdOnmKSajWDpN5+APvScpNX7boAq/vlLat4UsOqZmZghmmGRqQa//QnIE wH4qHAK2J0OIScvUFWpoG3kvJ96yZ0HkoS7ybYv7TF1unEQKJSom/HVUq+VhHhUqFLAystHDz DQVa02KIV6xl6h/FDZVMMwY46yFyuTsUW9YAt/cKRM3jQya2q42rC3KAgPiQlTABvSJ192BK+ fYgRzvVPisAlELXVoJWyoR03TwoseFMlR7oQIXVi+FJFkPFFy5sG+NK+zu9rPUUtmwfpj4ovS x3SRgjVH0Ggc//0tT8DBSCqETAGmDlbcnqpvoLbeeoZSiXI5vEBkfGGTDKzqn3pfxk2dq4mfq f5ITL53BLBOPlKufkW1HB+HyVwM7J7gKkEcub5Yk4J3KD+j2Je4ClHlRDU8MnIb1AUy06grwH IrCL/pZwGoxx32xd8Qiy2gC5SqAfx+qzWdHprjA7tsMz4CYeHfq2UgoX+VMVnfJwnTOCZo9Ec +VA+bPm5crhOHEzPs/+/dMRCTrFAKXI8oXRjkgxnwxpi2go3fdXdLnwLnPHNk+Mreqlcb/v83 Jz7gN+p9lQJJgl4gCk1p5+FhzPGeYyzvUFk7E0mfd0VbxjypsN1nPbMMRariuNk7uhqYB3m2R +FyH3bmv5taFb07pm/mPUmVfu2AyrhpeohzPo1tdQPxCFfLUZSz78qVzNzM9SvmDczqJA+4fE gL4NPfEgyJYK4dD3ljlOUY7BzrQUpJb9NwLnAcg2qVG9UUQ2FEbztoJE69r9fJmkwqxjwRMD5 hB9KpeK2iUsDdO6kxHnrlBAk76SPJ79qiOY0stM3Oj6vWLdk4Dubk5DLpe0d020GiwGAhLfXF S69xHvdx+Ey+UIB1zHE1HcE2sTlT0c3LpIfKo9+ImpDu1eycbQ9KuScRSWfTKvTngrTb14VND fYYMDMyRcgUIKR1rILCCTp3gHUKMz1KnTR+dc2gZF6vDxoB5cBtlOnQc+QStNOOyBcNL8CjEN fUi5dIel4umChXTUv86cfsMNaSGpaIG+fu2Rh0xxzdPCLVLRb8dMHNucWrnYSuvYpMi5WXQcg RRN9TGMxJ+L3cdOlPao7Dlg9A2EBFTpBE6CWngUfzKez944aDcAU9oObLlbZm9y8RL5biajCp ng62e1eq1vAZjrlyn9NqI+5EKNhyulfj0swXks9xeWPMyTQMb0lXjg1vigJQzOkLcGqFLX5ol eZNVNhHiCcpxOfvy5cET+jgDj4yTZ+bRWRRl8pNkR8BueMFk+p12QtUR0CV01jj5Fh6CYISVl AOKtoLsTphxCMDZRrs/Z7AC0hgfjvPK3GFHA/L9nWDjTaqFoFZxBMdYqK5yV8Ko0EDXQtZnm6 paU25sursa4wjfAdCLNDjH+524LiU8XnSlQ8iTGQW6pfrJUtqJnsW6FY4VRFKKbRVdyLIPXAE 6+jPo9FMHv2Fupiy1/qNm/mjRkYqjkDlAC4IM0iTvRhAJJNY/vuTPyNXkID0ARmhGq7wW4vMW O69Qz53Q86MnZ+1Gzt1VntLsrXpsXRBowqDtZH9iWhmgMFZnHlE17+0hQf+T0JeiFt7v/H4/X bTPyKsyES0XsVNMrVv3WgyAI28TuQ5rt25OAZuQkgqlI2KLvNvIE+4MvL2h009avaRWVKiDOw VAVARJeUuWPgslkOGH5mWDX70s2ss0NPv0lJdQJALecYnicKGzGrTgEGOoX79GgiEw0RvkHuK bKxKm3D2H8IRhAxKk4g8NGK5ftwoK7BxtNtB3vQ1YpiFdcdhVbLh7JrOtVnPI305dKkFs65k2 +44VTzfivhQcEpILOy9JTokHA2+vXHat7e5/ei6SDaK/fOflkvpA5x+yR+1nhUcLr8BJvpjNj 6Guog3cbWt34n0EJtKlXsw2lmopx+a+Iy6VZoqyVkT+d42/p7IuQnQgGa5SV4z4Zcvzq3LPkU w8gkyg9UqSIetYSk6FmP2gllPsV7gjpRVS0KbNHaw58zYPnoy8E7d0bFD8acjsZ8WRQnYX2TS tpIUtRJlSH3uNVDjwXVAZ9CIGmvfXq08q7+SbGvhJ9QkMPKukCbzXe7iY3pNxgHIEHigIWLK9 iXBs+TmGkFDhaJr8B+sDfzvLuiIG7SLmhyxcFhv3FcKVfwiP1WVimI7pSHBMRIP/QNklqXlr9 R4HTCktTUbRmUKdzDHkAXh5WIETGrscJyJvSaSEVQViAv9aqiNWOrri0Pk5fbPhO81ikLD48d dwVx+sbLYSCPHYH4Jhajb64ipo1pTorEOH/g03EFOi4QSLJNE94heUArufSq5EYavYTKlpKYf I6hFwkY36GovJbbM/whdjQd2hKGK77ufZzh7JBbvbYEwhfnWgZ91OHS8BR7FSf4608zsyRrcr iDzjforG7M1HIuXefpwLayzf2CDWjVgQ5X61tu4Bp+tWupaq87WpIT8U5+s62wRc+AAZFS8aW fRSxDoUxrJA0S/hGldQGh+IWI5w36KDoT+I3MpLweH1CNXoSQoX9f7Zc8WmkyELCk9YTZi5JK VpPWHsULQ/BqgrMQ+dv9ybxA5GFk9ZpgqETOjTCRBzvcMgi1d0trja8N95cjf2+X5EZDCuJuM zchSPqe8uQ0rxB9MCuXl6eVbe/75hnDglGacMi7rUdzR9eCOFGsjOWHy9NOlz8wDS5BhrOm// 4mg9zw1n5HyFAdDGb0dJTXXZB9tk9F7U08pWCfxM/xuqFqeunPlc6epvXFakJ7/EquBLDcsTD PfTsrgzp+WrcsOJs7YkLkvKs7dVU1QfhFFggzpfR7LNzNgvWa1MxxWLW1ylOz0IfjfirUDK0R n45Hr7uJWV74qF0hvhYVRTgVMVXuxlpbqHNVv2+cWY9GrFu94nC1uBypaQNBw+uHnFxvRUG7r UHY5NHPn0G4VfLAd9XO6jytAFJgUGKbV898B0BoDMM9ldPJp9wapegYXfILZoikgQHCigr44V Gq+TQUE15Yyor6MV5YhzQLoD0YbK5N2iSacpnXnHMP6pi+bEQDA5/eukai2sW98PjCt3yJxJm 68QUlv2IkWBxAP69tlKmh45M+QYq3XURQvB3zdWYJcKf9Pye5vLheDP5/5dwtxR03dm7WbRSH mhcFzZ+stfV7P5w== 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 Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Armin Wolf --- 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 c73e280a58bd..b08aa3a3f89d 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); @@ -1782,6 +1804,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)) @@ -1817,6 +1851,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; @@ -1847,6 +1885,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)) @@ -1892,6 +1938,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 Fri Jun 12 20:21:40 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 D3BC0383985; Tue, 12 May 2026 23:21:59 +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=1778628122; cv=none; b=OrHHjtldgx6R7n9yb4q7Xwxk66ATgEUdDTnZX5BwTNa8+Wo/d8VIcrVs/Kox2buCi/UJ7IMd/u8u6p9v0hwZjLTt0ne/lNCUcgsu2Q7zEDTO2C6vufpZx3VvG0tFSiiOvcYkk6P7iVSbGs9bL/Ez8mCxZ00lcdf1EDjXLLpqu48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778628122; c=relaxed/simple; bh=FOztAJiQOMIP0E+tvEKeKclzXBIzq5ZIazQ4mUgPFgU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=ZvKFfBXSBzsYMNgWDYFvdrWgG+u2fGWaL48AhwrqaQoj/ywDwLGZX6l+kVJb0kAjc2xw72ilhgVoSJ30qD+g3hqCUhymcl84ULuVE6cfLdDeUo/JDJ5D4IdeWijIgXTvuN59vnPPku/QM8qX88xK1zQVEZOz5TGqXk8umeCSraM= 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=acElVWik; 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="acElVWik" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1778628118; x=1779232918; i=w_armin@gmx.de; bh=WEEag9jOz+loIAJCGVDX9smWXuMtiGq/48fppDaoezo=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Type:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=acElVWik7lP2UbdltN/DnDT4uw5NRrSKPbetBvDhkzuVWstfy7FWgoTLaUppfk2t pFQ2bXbuKg+YpUxr1qNn4y9183WynAqn8Iknh6lsqWeULyEKhZCBO75Fk/SZPfXw/ yN4oB1HNKLSb1WSg77HX156zf+2fG8vok88KNlHkFFsBM5wY379Mg958xqhZBTQPa QfjiY5uepUbW7tOhoozqZ2eEl0JNkPxtKMmuRPKvahwzINI7EtrH3ybHRe6UUDYP0 k2Lp1kAjgHLXZZBqOjvYbzSkGtPhFmMOC6EbBhAcDGIIsUIGk76OJw+wBDuFRd6em BHPG5Cy4wi4inoOZMA== 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 1MBUqF-1wYBVR0SeF-002HaX; Wed, 13 May 2026 01:21:58 +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 v3 7/8] platform/x86: uniwill-laptop: Add support for battery charge modes Date: Wed, 13 May 2026 01:21:44 +0200 Message-Id: <20260512232145.329260-8-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260512232145.329260-1-W_Armin@gmx.de> References: <20260512232145.329260-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:w9ZLWlgT4Fq8+Tn3lhLr1FbBqPMLlJAJLpk+DT4kZZzvfje5lLq sRxZ489KXZHxZTLbrsvi4gqMdcLxUdzy00MLBKKBhOSzVrCSD/V8DD9KfgzcrxLQsI97Lev B2Av7DXCUtoB/Hegv780b6ZHgNA6pKlTtTIwn+a7J2YRhilYWLb/dpJmzHRVajDDp8DDK8V oic73l+/84x/TKHsAHv7g== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:z3sPx/nG09Q=;mEH7zefC2cxPfOBuCMussUbxFRn dfp+UiiRESSt8qb1zOtZYB84f0ySIH6AauLCNvJY8mn347DTFfZ+4QL2E8TQiNeGtrAQDPTER TNn3qF/xxOxn7L592imnG9+EVPxlzKxe8LvIvntRQIsdSGFTE4YsGJG7mrf4r1zpVg6ElfDmF NqM7fxDaLG2MSKVrMgzHUw+51OOKMdkdwRMMUcEWYve4zp9vBx5D/hD3J+M18BnwbAlrflyR5 b7IY3/Ep6qHyLzHtxeH21ApUFreEpF/Q0o2VUW01sxoI/1LFsU1Suic1hB0/C6xab0ejkdq3e UxP2nEeOvPYmK8egOGjMrrxqESnvcCJv59oTZ0aPgVo5/VrbSDcM4i96FLWmV8LEznYByKqBG iHvSiiXZCZvrBa5r4DcQnyd2WVOuicQuH4qvHIhYrvVmdHTsiY6G+HN48dPSVaeFWW1iymE3i 8M/aGQKPZXJvjYrg18M1IfRh97wRF6TukQWAdAhdg1AVAVhub44sklN3viUk59GkbGzA3Cs7/ fi0ys4ATto1A1EVsp3wzp/63Fok4zRbDBWNJctJ4EercBB61SXIclKyBBsDjZqjMjY3a8LeET YTwru1/CmaLDSl14jAmOckJO7nlt8QxLijsrrHcFdRf6xn3YlVNdHgJRnn60drcLTOrmHclLg 9yGiaybISIJPYygtDwdIne0ldyGUeyDv0DqKkl/tOjA999HFtWNYU16CkT8FKRbMYQOvkflGE Wk4SPzdtIC7nX9zSuOzej5tQixYg6xl/QMsu/k6woSbV4umVq4AbldcFKKDWt9woSdWHK021r pSAAtO5/qCShqWYjv/MDQ1IMTNBShMmWXNYG3um/jdcPgIH9pKu6tMUM+fJ5tc8zsuof4JXGz vjkgAGID+L+/8lowpJWaSQcnk/X+jsOasEQ/ZY4e7d7pcWZ4f+YBqRVqEVVXHar4lMzpxJrEW rjJrxIU89QtLk3RBNEZFmRTfSpe41j9g8/gtscYsKV4k62BL1Xny+FfkOlh/QPG/QJoCbud1T nEzlpPyxTYtTA77E3SJPa0/NYu1A5Ebd69t2RxdNyi9fjCzVKf6l9m16Rg13XZNIxx9y4Ako5 hay5zIo9CvwuwzZp+7Z0ndHVIdZk8tOZRWWRNBMbejwXw938lVlgqPweQZIeyU6ELoBoLDFCb NvOsUUrcjETGrV4VVGt2ERJuh0y5C+DtmPMVj/oCKsPujlFKnShyloG6URYSckZTCDxk192Wl FESUK/9aET4srl83uTiUxAinJE7wWkdwQUZfr2UNKaYIT2M84HoP/u4M8mUjbvkBTJ+801rTw SLppEedoyTkXz+hBprw5rP0dHouwnrZzWM6Zx/d0mzBWkGX00qri/Eb/0YwsrUbjpmoF9IMza kj2UimULLHZFeK9iFPYg3qbDnEUG18blXb/VB9vP6yEhbAOHA8XGmG0J1p1PIx/xw/2TdcHaG VGLVtmlOLc6H8o/Q0T4KZM5tfbjhLzO5cW/cAbBiczVHVaPzJN0eMb+BOibBB3qTGLf1vEb1H GaqiTyu2vT2ZepMPi8FlKslX8ABC1/eUngbwLy4rZLsld1Dp38lZd0L6ULtaqepyM0YrhNbII itfYhA4W5f7Tm70UJWMb8KGiGjCxnmhbz8isXEuzQy4N/EO7Utg3ll7kM1pmA1EVm/6+XekZK 8zpDf8SJsu6vHSd76i4WvutTQ0dKtAqi3VR+jWjOMdbNq+CIp38vOilxfs/PYMT4iFV2EZW7X sm+iCIE3R1DV27IhEaljF7VaU1EF98tcD8iEGRVvfoxeS3CMZLRcXEoWmP5P9a3KY7zAhCSkX ncGyjE0C+pxQnoS2rAXvjqcVrAB2MSPZ8XCAiU0cS+bLSklyhLPtOH6lsjqN5YbaVdZHs8AHG KqV0wqUXy38osrG+9WHeUuKQjqras2lNq62bFsyFOSh7uPKqezHBPJ3D/a4wXr04u4/jWWnRB OSWZDon3jAXyeWG0Gw/HeTxfaPoIvhJLJhLhC1Y7Lj0dENsH/4aT6e0LJhov3XHWE8JlkLsWl zNcbdTAdBa3FMyS+O2q9AN88i8u0YjTbflieliMz+fvhnwKLN7JMpuhlRKOsnWmGSOq+w6Gsf H9LOJl5BlbewhOYzZ7eIn0nRdZd7AE4Th4/Morfz+3ZNp04bvg4Zi6wkEcZQ3ocqHZbXO+dgA EeCFqEer8CuPoCTrPDWk6LZIjg15lHjdUduvCoViK2WBFt8RiA2mV82Lifial1ed513ycspwT fPxQnig34p0aoig65/P1SwZHg2GbB/ChCHwWZtRSU+/DZ+Nhrd5DkonR9iqgxwjs9FBeQNL2L y5BP5P2cPohRupCi9LJHnjUvHGe6dsNhnfQIJe/nZd9HVcJV1lq2SQtLyW6Frwj4GbjQ1wJif 6sYMwbM/VH0GTf0fa27bq8Vgam/KE+OxAfloolYRAJUT4ZhW/X/gLJmeMw7OSctDt3kSplLyq Yj0573oJQiEH5eXpUOXl8G+CgKtBptWTQ4mJb3WOB94WPxH5aT7d7+31QruPo9bJgnAJGnLU1 Q9WmiIyRvY1mju9AKQpnyQqgGNPJRW/Nwk5GkeYrZTwgeuvm/84YLkQQ2gs7sicUw8SNBJHsM NzoWWuJwv7b7OnVvmpY97PeQJmZjeQTe4bnGqM12l4VV50U1WE1riNmuxSXXZ78N0Ek6Iv7V1 qE3fKtRodbVNdG0lY1/RkY6bYiAkSoANBaaQhcMGMz4TvueaTUAi13S6clfv6gPkZg6ppfrAY Hr/5vXkhfrHLV0P3/480Py/UFdekOnsyZEvjNcEQzBzyke3Tq5aqMAq58s3n0w5aVmtef2EH2 /J+8JdNOiS5404JVU/i5NY/6NtIRU0JESbKSsFOyN+jUBtxKH4w/qDBZEjhORWXvMtIXAcdcC nivq+3pLwKzTARv0yPJPol5HSloQM0jKVswUHBW6m5gD4inO2ZJ6EHzNfxD+yiWtrmL9z3CCt xYPcCIfEApF/HZzQuoRAO90Spxw/j3kdlt0Egsq+h1T9Jn8xVKlMhrrUJeKifzG0yZZYZp9as FKTevcgDkvHU6vAGWjUCfbvNl2NUUvjaOClSDJ0zTbPcHO3X9SkSqoUXnEoojwqd4I1xCtx1+ 2lYIHJpMmPN/QwC4zqGJtIeNLqfTflw8Fwo9ZE1d7UVAwHZs8XmgHAHVesmbV+O4i0PyZ5ciH o6GLCYzDf4YBiGvXu28yzhR8s7dnLPSG1I6tYOunphC9ejN305UCzfftGjaIfG+f1f1y3CqvI tnFBgmxg+1VAc/d6QAJQRELaIGzD4qsWmAP2Kf+uTd/Df+eMFzu/WDU4evtL42Asys+87+xjQ NjiAahd9f3a1UEyMG9eIiGdW1Gb3D6pJimLEmDg+OOdtGr3v3HGDyFYk54G/THKdMxG741Tt0 KmtiC1qeWvE4oEFkp3tjGszT9icfwLpusiM0Qi+NKcip+qPLaBmlrNXE8rzvm1mLyA4j1u65+ oX//CW0e1aJQKca4+mIotDNpJJxUfH8XeXq6O1zpblSc/s2sh9eOlPkuGtUeNWh7N9U1P11gO 5/5UCDOpwMOUIivAMjtQtw0EIaSoA/S6vKmmj9DY3Er/ilMeuTWVqY2b62dv2x4gdnmpOEShw l/N2sQpm19QVHkOa+ZKwBH9hp9OiMZlR+llDnVIMs1YQN6yu8C976bb6DwTZIRq/Eu9SqsZQ/ tGGdwSZlT6490eoGiZthvV4rsmUQo3fAxbIfdleXcI/9DKD7sVRip110Ymi1ePmHm43porw44 CLpavTyrxCVbU2ap7pkuoZf/EXl37PUywaAdyxhZ8thaH1mXWZ743pKl2HcLz6DhjSALinOL0 SCScargJWKL6a39cbqUVLb/mHNn43iMuuHe96UJLIrhC8fHVM0uRMPG0yi02yzy+x7guMRmvo UIywHyMkcesnmzPhnS62FMM+tb8tLikkwelYC4aM451mVSSmpABNrQttNhg5f6YvVWO6gf2pM 9QKkoNzQfE2/Mmyzd3wUtxznn1NayVp+LM36zD+1FqtdMmxHyHjq3TOLooF8/LL0pTAZgcex1 xf08opS2pFFfqvogeH3mrgJTPuYW/KrAjTTbj/uJ8G3h2AqdAQ/5zg6CDtsx+f9qpLM6+3v7+ t5jQDZigi5s7mR8E98bMIui35u1KbD3q2FwLfA09pVerZ3hx/QvpmjCAOlXNB4Yq2cqcmfnk8 i40oLoRuDla/MIYgrjDoYpNZdpAYb8stHU/MT+ip4G9qjOk6+fLXGlqyzk+7Sd7XVMM6mUJVx cloYXFVxhsejz4vNf6+Wx8RZhD+5dDEf6nvH01jduDIHxcRUmdluOgeeSVLdncXmuygj1Le/m hJ7BorfZzNqkBI9ZrZ/U+Wk3oZ8FYc4YwElPKBJrVBwdAXvp63FHerHhAdzyB9XKlkCYD8j16 4FkPRe01Jf3Ow7uvDCcetR0sQrfdAEZApwRV9XlIaRRtCBmtYifP88pgLzPX8V+zlvuzGUQSf rP1F+sDUfIEbDx2c7yz+bzT1t4wzB3aExq/7h4V2ni3Jx3jZhsuy1wBRbw4yPHDts73uSeMbp cF7q9aYYhwh0O//3uu8FyadYJRuQweJvykyPnWeFlPq9WdxfZoLRFIJ6xbvgwiw9v+ZeLwlqG Di0V7eiIKIy1Ub1EfSMHKTIbp60njWZKs0aDQG37A0fnL4cklXouC7DHX7XyDv2x81GgAejtq nYCbIwjl3ZR2LAYDy+/DUr8x9YrC80Awo1r5V7Mdkby5dVze4zi0QNXaVWZyofxwgywy0fkml SdlXyC1+jmmAs8dZ60114YMe5o4HAG//0RXr5OyPmhInnHKj/juuPEpTYaAfjvEyyEsKiEGd0 B7UFfjqV20FzIVaF1iIU2b4GabnZTM+Rgrcl4UN/ILtk2RtDg5zVARfhNE+66SfDEJb0Y2iV1 UIvG7RFAHKHx5mO308XS/QMRXQAzi19tvwtoAgslCbuxDKJ9/EoxUIx2t8nh5qp1s2yCVH5zO jM395kz0IC7Z2JDNd7TeClhvktNLHBeMT1R1460n9/HJ0CUbqskp0TBPfa+zck7DzNgRxnP4T LOzXA2cASeh5dZ5HWTDOZR2TRPjkzkkvGJnEjvK103QXHrajhAzuGQSWdH32gQ/Fx/Sfl9cNL H79ugOkkvZAoSI8fEr9y6ww7meG7tObk7lEROE1z/zujWDAd26LBdaQ3EGVGOlsZUhCwuOi0U MDdlSqjI+RFx1CmIfj2ZQUC7+6/nqzx/0dTUNLvjQ9n5fWUOKmn9B+raGV0FepStyFg+1ZK/L +hdjUeh04Rio4yhW9F8Sf3EpTjB00KJUNmxDod+EcOIEuW83Lb1vdG7beM9m3CH+u8fx07Qkr aOgi05iw0PbvHeuRg6uXC/q//3lVZduij3/cAtMy3eIMVE4QDDOaftVdGie9MBQHB22afp1g8 74emXDu5lGgTOwSKxeLI3K1VzLI22pljB6th/C77MCxPI0Tg6fGvkC4/pSShEOH7vv6dApgpO 6VLhq5upwp4tUidoJqB4v9q6xWOwM7VScbK/k0/WOL1TsGoqKq3WA11tcxJQFjzlkjULvlTrR XgrI2+h0W0DS3N5vvmV5BG8Z4YtBiarmq/aV+dEmvggsVlmh 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. Reviewed-by: Werner Sembach Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Armin Wolf --- .../admin-guide/laptops/uniwill-laptop.rst | 19 +- drivers/platform/x86/uniwill/uniwill-acpi.c | 244 ++++++++++++++---- drivers/platform/x86/uniwill/uniwill-wmi.c | 5 +- 3 files changed, 215 insertions(+), 53 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 b08aa3a3f89d..53a05a05c594 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 { @@ -1432,6 +1451,30 @@ static unsigned int uniwill_sanitize_battery_thresho= ld(unsigned int value) return min(value, 100); } =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) @@ -1442,6 +1485,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) @@ -1486,13 +1539,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; @@ -1508,21 +1600,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, @@ -1538,7 +1650,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; @@ -1567,7 +1685,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; } @@ -1577,28 +1698,37 @@ static int uniwill_battery_init(struct uniwill_data= *data) unsigned int value, threshold, sanitized; 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 placeholder value with a valid one (100) + * to signal that we want to take control of battery charging. + * For the sake of completeness we also apply this to other + * invalid threshold values. + */ + threshold =3D FIELD_GET(CHARGE_CTRL_MASK, value); + sanitized =3D uniwill_sanitize_battery_threshold(threshold); + if (threshold !=3D sanitized) { + FIELD_MODIFY(CHARGE_CTRL_MASK, &value, sanitized); + 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 placeholder value with a valid one (100) - * to signal that we want to take control of battery charging. - * For the sake of completeness we also apply this to other - * invalid threshold values. - */ - threshold =3D FIELD_GET(CHARGE_CTRL_MASK, value); - sanitized =3D uniwill_sanitize_battery_threshold(threshold); - if (threshold !=3D sanitized) { - FIELD_MODIFY(CHARGE_CTRL_MASK, &value, sanitized); - 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); @@ -1617,10 +1747,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); @@ -1631,10 +1764,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; @@ -1818,7 +1965,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 /* @@ -1895,11 +2042,14 @@ 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; + if (uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY_CHARGE_MODES)) + return uniwill_restore_charge_type(data); =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_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) @@ -1978,7 +2128,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 | @@ -1989,7 +2139,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 | @@ -2001,7 +2151,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 | @@ -2587,7 +2737,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 097882f10b1e..e97aa988a90c 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 From nobody Fri Jun 12 20:21:40 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 392CE3A962C; Tue, 12 May 2026 23:22:02 +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=1778628125; cv=none; b=gMCJQlF8bdbvHMmG1AuaNCzEcVryHD9Dj0VSSUMfvQEBqKO/jj+fWvHw1sSSHLJutt6JYqHlpxyU7CEcgyXuI+i/4LYUfo0KlymE12aG74PnqCsG3AZcp4FaNSBT8XyQkMjbfliPQCsGFVINWnaWsIjc1xeJw2k4hIbjAtL/k1I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778628125; c=relaxed/simple; bh=F6ZE0Mvz6ffWTpIEfMhgI5RNj/+43rVdZwkE8Hb2/LU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=pAfC4AB2jZJOZLW3jYRVIZ+7AkyOV19yU0sJNOTpq0itajm6fQYXEusJDEv/tRuslfq1RnVs+8Vgn6d4ZJhyDa0wcuv8XqOgKVFBIH6MjjutdSyzwUz+riMDcbUIq3POfJxNX6jKfMn6CPVtKj2wJAsTEVo70f8gFHwbZkMo/gQ= 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=YdSam0Pk; 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="YdSam0Pk" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1778628119; x=1779232919; i=w_armin@gmx.de; bh=RQUKQGjCSjVT3Q8m2h4mwRJvQmrU3ttiGWv8bSvc+is=; 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=YdSam0Pkv2KdihC4v5ylmnLQ+/SPJQ5yODrJdUUIKwqQfzCyYfjwE53W0NgTaAYQ hYKDR6lp1CeC3y3Aj1o5TrhxR+KpbZlGImEPV73b/Y/jUavRJ5sy/F33L9b+R59xn ObaNkHn9ZoUKQIV7+Y6ljjhESi9V89RQIzBJCdBRG2EFtEbENmKq0EFIvWgZn34K4 Uw/1S9SwppCvUm+HyoqPeCbqk2SiUXpCwA90z/Z38CQ/bpzmkMD+lohnaXeuamwwb QLtHeiswVI8Up05YzkIJxX/j2Ehg3YEa8KcMHGm5P3gr+6Ovaf2d3OvNvGNXZEQFA qkVg+DdtylBg+CBLGQ== 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 1Mdvqg-1wwXtA3gzm-00obF7; Wed, 13 May 2026 01:21:58 +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 v3 8/8] platform/x86: uniwill-laptop: Enable battery charge modes on supported devices Date: Wed, 13 May 2026 01:21:45 +0200 Message-Id: <20260512232145.329260-9-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260512232145.329260-1-W_Armin@gmx.de> References: <20260512232145.329260-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:wDa/N7qw7hF9I4PKD6/+JCoDTAYBDMrQsGp8Cv1L9vH6qjEFkEb nowf0zEvIbCUDoILMLzS6NQsX7KjIRs8EyEuDZJ3snkrfJDVwsL/q29mUSzvjmNqQ5VSlcV 3u+Z1kCKy8UGG8nRnARne7Ln1ol8OJs2eTUxtp64DY58ovqdo0qR6YC4F2rIJFKugUQlPGL yU+qR1gVRefd0xWsJ7PcA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:wE8n502MglQ=;/jWDqPRL2j0gJvyNvh/ZMs8412p R60RejTST8w9EuP9QIVFvzFQrMOdlUbUSu/8NG82IHnTX5R9EH3RuUDS+qMWOc9DfO/Sj+Tsk bxe3ON/i5yktaHyF9bKrLpTZa0wYiClZXY9+v0q0vDfWkbAxi1PnT+ce6o/g9c6buhphyW3ZN zlbWHBRE3GxfhnODjsGYUabES9fPsJ89NDX+4JJcTdTqNXZUF9e79zT5qK3tFagaLW4kZS5aJ QpPw0xunGyeLL4bY94hTlqiRmg2EG2m1jtCEu2iQhCZn83hCFGClC2qY6XYj3GzwsPqe7UCxU E2rPW9/mpJ9N2MfiIL7lgWrVsp2fJhoRuSJiyqmJhIuTjuETW0G0xRMRaD0nAHOtHVGfHm5HF mbyRz30+0sTl+WWtxjM2PIeZAWZW9WzX/v05vMCUZSGA9UVJTrfuuXue0wTTS95z4GD0pmjQJ xE5JWRowNKdULix9yWLKmCM06xUFjBaYS4h/FN/LdUI9kSZOXJwki/Jic6YowLolcLtPnSHZ4 /RLg7OUvNXhtsI51cH31M4BJPQfUs0NZCcRjbFmOJSAIZhB2ruy1w1eXy7TGnwAzOpqu2ersC UqzKLBcZPx6r1wuPAd7X6MHCSfjItSyFLrEOc0SSP91AcQcJV7snhFM9rZNZ4+KbxBRzdI5u+ 6fMklCtNyCyWogr+9U9cJ6CfMq13Iw6TMP+Li9QcT9Vdr0Zc/+cZ4Z/nDmTNBx84/ybepmSW7 PN9lqS+WvgslFEaLJl00QjJyKWqZ9o7I1RN7v/KvDSwXHDhHazwjmqx1isH+dzTa3EC/n7bDl k00z6G5md0DccHpfYtcZXeUOMHpNK9tiCTqQBH+ahMui2I5VuTse2xLsketaFONth5IZ6tkvX 8pIOpWilTOfBqfQ4CFw0iBFXHxmwswiUbdVn9jjaE4mvt+frgFB+uv8j43kBwmBeZOofAfdF2 i2QabjNevbJCoxt4fL5Vnb4BC8qm2Vjyg+BzDV8xhdjDmKpWzx5HoWzoOQQu1w47TkoJBm0KR g0bzeyKTifksiYiKrNMkueBvJvuo4m1uHIVhNiP8AvM0oIaeBENzMy20O8BNvgAWy+WujM3c0 Ig8fMHoNMaimB2MLgBv1Qgq4i+8C30nVnwHhkI5UWsrXmraXB2op1piSNGlAnr0leLE2ILCQr sywOxWKW/mlOGwvb27chqi/XZgKheIZQSOXkXbwWIlOvllgfQSeHDIWdrEtgj5U8ShZi8fC/e Xu2k90WuRw1YBVNIVE2KV0bdL8JRLREcN/iy2HQiclQnBtV0YQ0SMaex/AMnLDrSOb8ln61jj lJDgKwEeNJGvP5itKMpHJcydSSKxW2NR96Up3CJ+TEnQOGYS/8geFs37MpVaZZclUfpQRITvV xMvQPC53OhRnhpYUXAJUriOlocc8GKj8RDRg5xy6I/7rg67akvCn9okFgwiX0l46GMUriRTlf dlu04LU/7BLi6qUlFxEl15lyatJW20Thp5a3JP0wI0fxZ37ix7HDYecIllNw5n6LyGOooLgO2 MvJjJ2DludYFvJG3aby+IBLEPx0QAfQ6eqPKcdAZw+4qdPILpm6eJ7sb1X8cfQZu5ye4jAcqi SsAEzA0Zcx91etIiXCGO9o0sCN4lHpCANpI2pOpSnTHRvE5b2VAdI2X2k+vZgD/NJSZ9fhYem QoQc/dD0ldAownj6IEfQimYMHWPQtPVsB9zeEbRMPZDYgDAvq9YC0fxRLep96dWzCBqKBpzKQ LCK3DixbY24khpPnkyf9yu+lcwZq060GGQNeeXzK+pae3aUmX54sD1fAdwy2w+azwDus6UN8a r8YiNpqCCtmSJqw538W56xk21bwc5a8SOjCXdmp7N+EEDbB6SWQ7kp8/+hCzlVpQdZfnsMzv1 3bFoaFGYo4Ryn6Rr2Bf4lp1Lrm+vKmpDxEvavTXkf8uKHbfqVVwxF6nUdgII+1doMjZbdh641 x40viYp1jCxlq8fh+EiJEdVm9proVo1dZorzexhc7+dAj0mH61OzvM2rj0Hdg+r7508sREjSl gjr3AWP28S91jhLGtnS9zwK+vyQJvC0qLRVu2ScCS3LYRFlSAcsjadOCsTzAyXuUeHdXP61jM v8JS374NRSL4ScUCvPunn7vsJKdZyutA1YYUvTJKgakUbcRHBUKVKV5OqCj82y4nIcbbSiFwT pFZE1rCtg+RmTHzERHEdzDnUj1PSJoLjCx3uALsSlcEQgJTv55TuEOPGg82n04D/6cmv+RjbK 6B6ySHidhCqzJonMuIeZDZKUowLoAKeksCToFvNLp9H1l127j+CHnjEUuBbpdYbr7uJSXZOQ6 MWgOYyS81KBmajO0/oXD+FOUpSQCuqrb/yHpSZSDYR7Iw30Saka7MHl6IVCuOvX5lBhAen/eL hwNNU2/9s2WqT5gsKUcgvLlHLN3lkW43R8/Nv1tcwY5nJzk0jL+oY0QRDFGKPYU87vMZcwKsO neZVw6Jol+HjzyOIWnYwZRpRDXUOzkiKFG2QUzGxnWCOGlc04Yc6BVgTElOwRkSLe3DGBrcXU V1L5Iep+9mRdZ2TpfpDrMoMkb1AGieqDZEQVkqMsTc7Rerm88XPLrl5qXHyx5I01dC6FGWQGW VR3o3NDx5t7JbU95x0kQRo1xgZAQlqFsaERheE4oGPTxWO1nkLCXFPYfIL+pYxLRsWbkdYgD8 WsauKMD+ga0K7bWNpLqNFe6fyJoczK5VCbmyBl59S4ufyYZ0dzwJpng+tNbr0AMbAAwWLpBGR kXWNEq4K+w+1Nxc/AEDrxxSzrcjukY13ezhN1k+PWNJEuhcdiRbp47vxqucJecMMh1euMUu79 kQ/2Cx/Ce0VpH0z06iarNQxUFNlFSm5WLBYHGhrWlUWCtK46BvcW1Ov3iLIM9QoNCPEbgGzJv xuTR+Ma84cG0LbXHR+bMFYO0LzE+HyzBfewcDA5KXDFJxRgcZhFYBen0u8+A9TVtYE+itqQE9 n7Nyquy2YjtZjIWBxpgU5ZOfemAz94H87tkSxsVLwuUBXQyV6JhCpoV8HcHUof8rX7tEsSpTN oo4lqm6sbC+TqbcTMpLz21KrWME+KhW8Pzan2wVsfppJPnt5bsvNt6A+IIV6YKPWfINNLbNm6 pMqygbbqRzwgbJAuXGCreZ7GFnr2k+Do1fq6h7UxXJ8hoboD+5tnLKzyfWnbcn68GLAuOukZM JlNpxmKLiZT+yPOHNrzKeKvU5eAovJF/HFqv/q+ayAHxmQj8ohbwetPUhvV3GKgmcbaHMlqPP tFfa6z+ifPptlTB+Bu6gBWHI71lM2AlXRlcd3EVxrWudnf8srsw3GSy7uCVJkF7+N8JNpKXbe C6VfnhdvW0ozAz7U8Z+wNVcplfMPmuJAnGkGZN9QayWR5ZjoKp3BXDuLhcDM7ch1SXxwtvsIS YaBiNwKMq27AtM4Nhh3nDWPVZKpz6jA9+neSZ4jzdCwbZq4Rf90/Xtpyy+4o1zACAiWIj871i DiYg2tAKVxNKN3OwS800gfCYLjIMyRNwnzVASokatP1YXgkixanSreACewvqt3TrAdwy7Cq2k u2v2T1zkaDquRNEkAmwKg6BrwAL1X6r9ZybzrWoFLKVNWXMII0eRSNLaA8aLw0mg/9YOsLkYG +2PAcuumy+r0ICUqeLdEjvpMlCBE7Yv1hh1ttxfHgVETmeNrL8BBg7gKRtaxSQI32b+u+oGLV kPRSsxJSZO4R2r1rPRpmC1i4WbCxk5fMPWK07a8bcpL5tn1wPaLvk6yP8/V0vaNLJuSTk7fqP Fwh28XkwF/E4cfiRYRwyCmtPF7djWGuh6Un7CBV8+tm9uqyVLsci9RXY3HkTCSEL3G8IWwgNo 1uyIBUHHcSFvp0Ozrph7xqwF8PgkVK5edAG0WnIZrWPc0mnyJycl/H7Y5kePcrkdgxfYu9y6a IFB0H16AT+h7P5PSkfoDwtHy1ozZOXf2T59bZigaAemp9UV62z/I55OhAzQ0BSUclTKECS6X+ ZSsYBJw2HZCzv268E0tLdl+bWJCDO53Na+rURd4vY9TuogCIDJ6gJoq+J7BExnFjp+rPf3Pd8 s3XZ5uFsqFEem0r8LbIfDDNAKcF9onzb3cEZAHTNbBBnC/ZyTrlHVJ5hxLYqnXdCx0tFa4qcP 5jQSgzRdI/rlDHDaPjNOBAZnseXPKL5dgrmg3Jk78qh8hkCtMdYQhVGG3GDPZ7ND6Ry+oyjQF lmnmCFNkuuQ7Fo3REfasVmxZMKvflITHg/Xx1GKhQ3SbgJP2KN3O53MrIPPEoc8j79PGa4SSQ ZAdSTk2/HUH11oN7PXmI2IOP0x1+qR6+9hCyYsvk6V1RWvb5GZe8kPfpjqOs3yuKgiY2XTCh2 zzFNtIG+c4HBP9GmkIx701D3Hk0IHQRzgkxt4RYifAclXC0qsQuqKzsHgHNK14X6QoZkqRLDP jYaZnBmyxB2pngX4n56CEjGgLIJTCSTVKPDR01nfR1u2XAbv83AhB1D/bInbU5WCHbTNtbKBz BTwqib7MgTUid4tcSUHLhjtzOpa4eA4hjkyoLlYbr8NCLdWahmVUIeKMsKHWuZkct1BR6EPPl Ss+VQrIHiNmYLfk114MpIhGP/GvobgcpgQMSC4uBedwTtfNqoYukNu8hVPP9cRZt5px1EkGI1 Tms/tNMrtkUPl9y6DCk2wGkQwuPDPcG7eGuv+xzh9qv8DfBOS6VaVb8jd0Lns6R195imW4bRs GbUrZra8xG5E0cunFIjTzZhtm9Kz9NbnqEO2reNqPqSMYcgDJcIv1sL+CqVGxJpY/t4kOpGY2 DAQ9AMeSSVPzyLsfYDt2+Hdbd7MKnDzkMPTkxJGxxg+oOEvQwur4mUJEw6oRYrjHy7pzlUEkv PH9eKxgMYIu/RYj8FKjYksnox/bmj3fuCgPC7+RaVZs2RG2fy9vJ8RuA3Vc+yWFfjrIyUwTvJ nNf+sGd4LwNcabiVDG6QrpyL2icblqwwpQM/jQkSY2wcxdkdNOOhYuu0bdbi2xD16F1xYY0ns G7i1xjj0/hxv5IEzxljgjZp2Dudxa7PISivJxdPJiGTBzTeGMEOWXHHgzp4wNCna7lzRmmWuX CgJKfExGyic0xzdUQESXVsD+mBeY62ZFIPm9IRKLuOiII1+Zedy+1wc+Nc4tNnW5/NA940CMa A850bzYPW2+nQgWjEjebG4TGqrFrgOdq4gLBAOrUhpv8j5f12THgGQuxcjbGrhZBSVYKv04tX 9GP2VF3TrPUjuWr+ooZz8bC6P2nGhXxMqBllzMXfUjkJTIhrUUmaouiUu3pWuE6f1kALBzzP4 SXnb2xVg09+JmQyWcTplK+BDC/hV/bqkA3fFNiY64ZAJd0TG5X08pjPWROdvCAXducuGarh2I uYkIh1+luOP4WS1xvLTuXeLYqr/0CqB62j96/4y+sG2JdM9/WyCVhrX8UO8oH5u/+md6WQUKH HAgfzJe0Dj7nxVCplSVRTqRy8QRIDuYw7jvm4C/0S47Qu67/crF4hLZa73s5T3rgw9NJY9S0z GhgDqp0bPU4uRcwSZ8DkXpucAgI5bih9tAH8afgzUusKNP5s1qBUukk8v Content-Type: text/plain; charset="utf-8" From: Werner Sembach Enable battery charge modes on supported TUXEDO devices by adding the feature bit to the respective device descriptors. Signed-off-by: Werner Sembach --- drivers/platform/x86/uniwill/uniwill-acpi.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 53a05a05c594..ab063ead45b9 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -2168,6 +2168,7 @@ static struct uniwill_device_descriptor lapkc71f_desc= riptor __initdata =3D { static struct uniwill_device_descriptor tux_featureset_1_descriptor __init= data =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | UNIWILL_FEATURE_SECONDARY_FAN | @@ -2177,6 +2178,7 @@ static struct uniwill_device_descriptor tux_featurese= t_1_descriptor __initdata =3D static struct uniwill_device_descriptor tux_featureset_1_nvidia_descriptor= __initdata =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | @@ -2187,6 +2189,7 @@ static struct uniwill_device_descriptor tux_featurese= t_1_nvidia_descriptor __ini static struct uniwill_device_descriptor tux_featureset_2_nvidia_descriptor= __initdata =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | @@ -2198,6 +2201,7 @@ static struct uniwill_device_descriptor tux_featurese= t_2_nvidia_descriptor __ini static struct uniwill_device_descriptor tux_featureset_3_descriptor __init= data =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | UNIWILL_FEATURE_SECONDARY_FAN, @@ -2206,6 +2210,7 @@ static struct uniwill_device_descriptor tux_featurese= t_3_descriptor __initdata =3D static struct uniwill_device_descriptor tux_featureset_3_nvidia_descriptor= __initdata =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | @@ -2231,6 +2236,7 @@ static int phxtxx1_probe(struct uniwill_data *data) static struct uniwill_device_descriptor phxtxx1_descriptor __initdata =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | UNIWILL_FEATURE_USB_C_POWER_PRIORITY, @@ -2256,6 +2262,7 @@ static int phxarx1_phxaqf1_probe(struct uniwill_data = *data) static struct uniwill_device_descriptor phxarx1_phxaqf1_descriptor __initd= ata =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_BATTERY_CHARGE_MODES | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | UNIWILL_FEATURE_SECONDARY_FAN | --=20 2.39.5