From: Aditya Dash <mradityadash@gmail.com>
To: "Derek J. Clark" <derekjohn.clark@gmail.com>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Armin Wolf" <W_Armin@gmx.de>, "Hans de Goede" <hansg@kernel.org>,
"Mark Pearson" <mpearson-lenovo@squebb.ca>
Cc: Guenter Roeck <linux@roeck-us.net>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
linux-doc@vger.kernel.org, linux-hwmon@vger.kernel.org,
linux-kernel@vger.kernel.org,
platform-driver-x86@vger.kernel.org
Subject: [RFC PATCH 2/3] platform/x86: lenovo-wmi-other: Add Legion Go fan RPM fallback
Date: Sat, 22 Aug 2026 03:17:26 +0530 [thread overview]
Message-ID: <20260821214728.87773-3-mradityadash@gmail.com> (raw)
In-Reply-To: <20260821214728.87773-1-mradityadash@gmail.com>
Some Legion Go firmware does not mark fan 1 RPM as readable in Capability
Data, although Other Mode feature 0x04030001 returns the current RPM. As a
result, lenovo-wmi-other hides fan1_input.
When the normal VALID and GET flags are missing on a supported product,
try one read from the Other Mode feature. Expose fan1_input as read-only
if the read succeeds and does not return 0xffffffff. Treat a later
0xffffffff reply as an unavailable reading.
Assisted-by: Pi:gpt-5.6-sol
Signed-off-by: Aditya Dash <mradityadash@gmail.com>
---
Documentation/wmi/devices/lenovo-wmi-other.rst | 4 ++++
drivers/platform/x86/lenovo/wmi-other.c | 14 +++++++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/Documentation/wmi/devices/lenovo-wmi-other.rst b/Documentation/wmi/devices/lenovo-wmi-other.rst
index 75f2deaaef16..c93e9e6f3fd0 100644
--- a/Documentation/wmi/devices/lenovo-wmi-other.rst
+++ b/Documentation/wmi/devices/lenovo-wmi-other.rst
@@ -56,6 +56,10 @@ On supported Legion Go models, Other Mode feature ``0x04020000`` controls
Full Speed mode in firmware. The driver exposes it as ``pwm1_enable``. Value 0
enables Full Speed, and value 2 returns fan control to firmware.
+Some Legion Go firmware does not advertise fan 1 RPM through Capability
+Data. In that case, the driver reads Other Mode feature ``0x04030001`` for
+``fan1_input``. Value ``0xffffffff`` means that RPM is unavailable.
+
LENOVO_CAPABILITY_DATA_01
-------------------------
diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86/lenovo/wmi-other.c
index c180933e1d18..b4be7739b243 100644
--- a/drivers/platform/x86/lenovo/wmi-other.c
+++ b/drivers/platform/x86/lenovo/wmi-other.c
@@ -98,6 +98,7 @@ enum lwmi_feature_id_psu {
#define LWMI_FAN_ID(x) ((x) + LWMI_FAN_ID_BASE)
#define LWMI_FAN_DIV 100
+#define LWMI_FAN_RPM_NORMAL_SUPPORT (LWMI_SUPP_VALID | LWMI_SUPP_GET)
#define LWMI_CHARGE_BEHAVIOR_DISCHARGE 0x00
#define LWMI_CHARGE_BEHAVIOR_AUTO 0x01
@@ -195,6 +196,7 @@ struct lwmi_om_priv {
struct lwmi_fan_info fan_info[LWMI_FAN_NR];
bool fullspeed_supported;
+ bool fan0_input_fallback;
struct {
bool capdata00_collected : 1;
@@ -343,6 +345,8 @@ static umode_t lwmi_om_hwmon_is_visible(const void *drvdata, enum hwmon_sensor_t
return 0644;
if (type == hwmon_fan) {
+ if (channel == 0 && priv->fan0_input_fallback && attr == hwmon_fan_input)
+ return 0444;
if (!(priv->fan_info[channel].supported & LWMI_SUPP_VALID))
return 0;
@@ -419,6 +423,8 @@ static int lwmi_om_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
err = lwmi_om_fan_get_set(priv, channel, &retval, false);
if (err)
return err;
+ if (channel == 0 && priv->fan0_input_fallback && retval == U32_MAX)
+ return -EIO;
*val = retval;
return 0;
@@ -542,6 +548,7 @@ static const struct hwmon_chip_info lwmi_om_hwmon_chip_info = {
*/
static void lwmi_om_hwmon_add(struct lwmi_om_priv *priv)
{
+ u32 rpm;
long enable;
int i, valid;
@@ -563,6 +570,11 @@ static void lwmi_om_hwmon_add(struct lwmi_om_priv *priv)
priv->fullspeed_supported =
lwmi_fan_supported() && !lwmi_om_fullspeed_get(priv, &enable);
+ priv->fan0_input_fallback =
+ lwmi_fan_supported() &&
+ (priv->fan_info[0].supported & LWMI_FAN_RPM_NORMAL_SUPPORT) !=
+ LWMI_FAN_RPM_NORMAL_SUPPORT &&
+ !lwmi_om_fan_get_set(priv, 0, &rpm, false) && rpm != U32_MAX;
valid = 0;
for (i = 0; i < LWMI_FAN_NR; i++) {
@@ -580,7 +592,7 @@ static void lwmi_om_hwmon_add(struct lwmi_om_priv *priv)
}
}
- if (valid == 0 && !priv->fullspeed_supported) {
+ if (valid == 0 && !priv->fullspeed_supported && !priv->fan0_input_fallback) {
dev_warn(&priv->wdev->dev,
"fan reporting/tuning is unsupported on this device\n");
return;
--
2.55.0
next prev parent reply other threads:[~2026-08-21 21:47 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-21 21:47 [RFC PATCH 0/3] platform/x86: lenovo: Add Legion Go fan controls Aditya Dash
2026-08-21 21:47 ` [RFC PATCH 1/3] platform/x86: lenovo-wmi-other: Add Legion Go Full Speed control Aditya Dash
2026-08-22 18:55 ` Antheas Kapenekakis
2026-08-23 19:55 ` Rong Zhang
2026-08-24 7:46 ` Ilpo Järvinen
2026-08-21 21:47 ` Aditya Dash [this message]
2026-08-22 18:50 ` [RFC PATCH 2/3] platform/x86: lenovo-wmi-other: Add Legion Go fan RPM fallback Antheas Kapenekakis
2026-08-23 20:23 ` Rong Zhang
2026-08-24 7:49 ` Ilpo Järvinen
2026-08-21 21:47 ` [RFC PATCH 3/3] platform/x86: lenovo: Add Legion Go Fan Method curve driver Aditya Dash
2026-08-22 18:47 ` Antheas Kapenekakis
2026-08-23 21:09 ` Rong Zhang
2026-08-24 8:10 ` Ilpo Järvinen
2026-08-22 18:33 ` [RFC PATCH 0/3] platform/x86: lenovo: Add Legion Go fan controls Antheas Kapenekakis
2026-08-23 19:32 ` Rong Zhang
2026-08-23 20:08 ` Derek J. Clark
2026-08-23 20:24 ` Rong Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260821214728.87773-3-mradityadash@gmail.com \
--to=mradityadash@gmail.com \
--cc=W_Armin@gmx.de \
--cc=corbet@lwn.net \
--cc=derekjohn.clark@gmail.com \
--cc=hansg@kernel.org \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=mpearson-lenovo@squebb.ca \
--cc=platform-driver-x86@vger.kernel.org \
--cc=skhan@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox