From nobody Fri Oct 2 01:07:29 2026 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2DCAB2EEE85 for ; Thu, 6 Aug 2026 13:11:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786021899; cv=none; b=jb5rTW9i7kfu2h2xfj0BXogYVpjBmOX/i6sBJkGGbM/IzqVPZwGQUw32Eku7LYWGPMBAGjt+lkTWkFnw2oL8/YomTAvIjMaXWMds50c5Dnn4eoVIp1Do+/e3jG3+KVNnA7sRG1yj/HrBYbt/LC7nZPZ94qiIx9kVCfMN5UzYt78= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786021899; c=relaxed/simple; bh=VzK4qojexuboL3VpoMnyV2AMCc5EduTmro1qeorD40k=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=KQjucY7u1ztDhNLeiqXXtc6tDoIm9cR36GhtL6WBXGXZqEhjsgA00/lN0iGzUYUIk7TZiw2Oo+JH03XaTOnxHRCLdbq/D3Qs7KPs7/NGjKzT+tMaFnmmO2HQOV1xOvQLb2hUnK3eD2CURzHKkmav+7KOnjBjdxSYNtwQUwEpbUY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dFTScEiQ; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dFTScEiQ" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-495590dde14so24856705e9.0 for ; Thu, 06 Aug 2026 06:11:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786021894; x=1786626694; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=n0pHhJAEbxEB36DnJm18OBb6C/yvqHWmDNcJLgn/xIo=; b=dFTScEiQcb1UlHFWG6o8PUmplWmjlh22c9niTMp1TKvRLDUofXIdvwmo8JxpkTmENH veo9KQtOavb7soCCmd8DFFRvJKV5Xs5zmPdM6S/tycc1g+vlb13Ge0hFKEjpd9jzSSCR noLlmAWRuzOX39CstuwrlPROGuNCYHUE00669Kckk2cG9wpqW22IXhH8RW1pJO/571z8 GZE6teHCduSSvF5Gvw0jane/s2zaiKUsukbrE6n121DNORqYfiOV7Uem7hEj66HdwBdz gtjy2V8UUmYi4QzEbnkBxlcGs2t8Ngt1HDd3esUjoY6JVTf8Zd5+eQuvrWLwCF6V9Z+c ejfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786021894; x=1786626694; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=n0pHhJAEbxEB36DnJm18OBb6C/yvqHWmDNcJLgn/xIo=; b=g3j1TunlZoLnHlB5Z3nJyPRKeQ0G6Wv2bxdUeA0PjeL7QU371qXfsbzwCxftnUHwlx PDKM6sXaaC9EDPja3yT8tTTLufoIK731LZuK/nTs5rlEvRNeVkjbavuK8Smpyg8v4mYC Qwv7RleUf0yEaFPzAqy3yD1drInzOzjIYkg99fozGtrNuPblgMxvRX1rs/RjX3P6++Vq hxjLrLpKIU6XRIhIhE4P/eOrzmwg8FLo89YIAps+M+wca9M5ewmXI0D3cZRA6kbknccN wfuEaReRakF42kymdnYSIVIP8hLrgzVPwJh3/T09aB08hUpivt08hmozIvdoPt+QCiFz firw== X-Forwarded-Encrypted: i=1; AHgh+Rr+DGfHJ9+PT1nsOgMcRpz9/NixB4EOF7xfMXdLfsSBba8anZvq5jiTzVt//Oby1RVM29xwbjwQCfMqWLg=@vger.kernel.org X-Gm-Message-State: AOJu0Yx0VZIszTuQqABOb9BjQvZP7MTUFsFVUu6E0UhKw0r36SJbdz5z FaeJ1/3fA48XLHXgAflSjot7qsXZLDcbe/j9Bxf2rfoc0tjSQ4sseIXo X-Gm-Gg: AR+sD11fKXShXSKjOLs+PArSilg3+xv6n8D3Bi4WvGpKiZNSz5i2d6hwro5khz5Cbp5 isxUjHXjKtKZB8lzfdFMfDyS4CKw8xxV93ebA/Eokqjq9m9W0l5i2+GPAeWs8YmrkTpKqRdguMt GOkOzq1p7L44elGcJqUEi95qT9h2GdOL929mydDDw4gTQYZohZ8A0JuGdpN3O+15MHjlOLTBN+y PFLZHcrOP+ZfzBSKY4GC34lObtrLQc95sorXcFlpn43OS6cKGew/jbvFp5H7SdNvJcruf6Ld/Gx 3Pk4pUnPfGuMlSgJOJkXQ3Pk4LsqieKU3rWvSs5MKa9EnakB9Ug+sUoE8BFzWftktHF65lU39mw 08k92kwqwTAmPy0kJJqrfeN+/kXNRdewMLfta3JC6emBdlEpICJRyhgoBLZ8yu+mq38FZDivJIK R7RPZwcFyQWU1SUpFEtjPqClRhsdkkH9UP3oV6H3ddzrLgHdiv8aybhiaFoLFfw2l3bGzVAA6fd 00= X-Received: by 2002:a05:600c:354a:b0:496:c249:dd9b with SMTP id 5b1f17b1804b1-4994e7c594dmr197099245e9.13.1786021893973; Thu, 06 Aug 2026 06:11:33 -0700 (PDT) Received: from sergio-82n7.fritz.box ([149.22.91.69]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49954213479sm59344035e9.6.2026.08.06.06.11.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Aug 2026 06:11:33 -0700 (PDT) From: Sergio Melas To: Guenter Roeck Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Sergio Melas Subject: [PATCH] hwmon: (yogafan) Add support for new Lenovo models Date: Thu, 6 Aug 2026 15:11:03 +0200 Message-ID: <20260806131103.19104-1-sergiomelas@gmail.com> X-Mailer: git-send-email 2.55.0 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 Content-Type: text/plain; charset="utf-8" Add DMI quirk entries and map correct ACPI paths and configurations for additional Lenovo laptop models including the LOQ 15IAX9,=20 XiaoXin Pro 13ARE 2020, IdeaPad 3 15ALC6, Legion Pro 7 16AFR10H,=20 Yoga Pro 7 14IAH10, and Yoga 7 16ARP8. Reorder the DMI quirk table to evaluate specific model matches before generic family fallbacks, preventing DMI shadowing. Signed-off-by: Sergio Melas --- Documentation/hwmon/yogafan.rst | 27 ++++++++++++- drivers/hwmon/yogafan.c | 69 +++++++++++++++++++++++++++++---- 2 files changed, 87 insertions(+), 9 deletions(-) diff --git a/Documentation/hwmon/yogafan.rst b/Documentation/hwmon/yogafan.= rst index 68761947a..6395c94f4 100644 --- a/Documentation/hwmon/yogafan.rst +++ b/Documentation/hwmon/yogafan.rst @@ -99,6 +99,11 @@ immediately to ensure the user knows the fan has stopped. 82XV / 83DV | LOQ 15/16 | 0xFE/0xFF | \_SB.PCI0.LPC0.EC0.FANS /= FA2S | 16-bit | 1 83AK | ThinkBook G6 | 0x06 | \_SB.PCI0.LPC0.EC0.FAN0 = | 8-bit | 100 81X1 | Flex 5 | 0x06 | \_SB.PCI0.LPC0.EC0.FAN0 = | 8-bit | 100 + 83KF | XiaoXinPro 13ARE | 0x06/0xFE | \_SB.PCI0.LPC0.EC0.FANS/F= A2S | 8-bit | 100 + 82KU | IdeaPad 3 15ALC6 | 0x06 | \_SB.PCI0.LPC0.EC0.FAN0 = | 8-bit | 100 + 83RU | Legion Pro 7 16 | 0x03/0x06 | \_SB.PCI0.LPC0.EC0.FANS/F= A2S | 8-bit | 100 + 83KF | Yoga Pro 7 14IAH | 0x06 | \_SB.PC00.LPCB.EC0.FANS = | 8-bit | 100 + 83BS | Yoga 7 16ARP8 | 0x03/0x06 | \_SB.PCI0.LPC0.EC0.FANS/F= A2S | 8-bit | 100 *Legacy* | Pre-2020 Models | 0x06 | \_SB.PCI0.LPC.EC.FAN0 = | 8-bit | 100 -------------------------------------------------------------------------= --------------------------- =20 @@ -117,7 +122,6 @@ METHODOLOGY & IDENTIFICATION: - 8-bit (Multiplier 100): Standard for Yoga/IdeaPad. Raw values (0-255). - 16-bit (Multiplier 1): Standard for Legion/LOQ. Two registers (0xFE/0= xFF). =20 - References ---------- =20 @@ -136,3 +140,24 @@ References 4. **Lenovo IdeaPad Laptop Driver:** Reference for DMI-based hardware feature gating in Lenovo laptops. https://github.com/torvalds/linux/blob/master/drivers/platform/x86/leno= vo/ideapad-laptop.c + +5. **Lenovo Product Specifications Reference (PSREF):** Official hardware = layout index + and spec sheets for active and withdrawn Lenovo laptop models. + https://psref.lenovo.com/l/withdrawn/ + +6. **Yogafan Master Quirk Database:** Master spreadsheet mapping Lenovo Pr= oduct + Specifications Reference (PSREF) to explicit EC offsets, register width= s, paths, and multipliers. + https://github.com/sergiomelas/lenovo-linux-drivers/blob/main/Lenovo_Dr= ivers/Prototype/PSREF/yogafan_v3_quirks_database.ods + +7. **Yogafan ACPI DSDT Repository:** Central repository containing user-co= ntributed raw + and decompiled ACPI DSDT firmware dumps used for path verification and = hardware expansions. + https://github.com/sergiomelas/lenovo-linux-drivers/tree/main/Lenovo_Dr= ivers/Prototype/DSDT + +Contributors & DSDT Providers: +------------------------------ +- **Sarbajit Sarkar** (Lenovo LOQ 15IAX9) +- **HinataKato** (XiaoXin Pro 13ARE 2020 - 83KF) +- **PenPenIsGod** (IdeaPad 3 15ALC6 - 82KU & Legion Pro 7 16AFR10H - 83RU) +- **unlockxiaom** (Legion Pro 7 16AFR10H - 83RU, Yoga Pro 7 14IAH10 - 83KF= , ThinkCentre M80q) +- **Phani Pavan K** (Yoga Pro 7 14IAH10 - 83KF) +- **Splarkszter** (Yoga 7 16ARP8 - 83BS) diff --git a/drivers/hwmon/yogafan.c b/drivers/hwmon/yogafan.c index 0a41b8672..48fa5148d 100644 --- a/drivers/hwmon/yogafan.c +++ b/drivers/hwmon/yogafan.c @@ -53,6 +53,7 @@ struct yoga_fan_data { }; =20 /* Specific configurations mapped via DMI */ + static const struct yogafan_config yoga_8bit_fans_cfg =3D { .multiplier =3D 100, .fan_count =3D 1, @@ -77,6 +78,18 @@ static const struct yogafan_config loq_15iax9_8bit_dual_= cfg =3D { .paths =3D { "\\_SB.PC00.LPCB.EC0.FA1S", "\\_SB.PC00.LPCB.EC0.FA2S" } }; =20 +static const struct yogafan_config xiaoxin_8bit_dual_cfg =3D { + .multiplier =3D 100, + .fan_count =3D 2, + .paths =3D { "\\_SB.PCI0.LPC0.EC0.FANS", "\\_SB.PCI0.LPC0.EC0.FA2S" } +}; + +static const struct yogafan_config yoga_pro_7_14iah10_cfg =3D { + .multiplier =3D 100, + .fan_count =3D 1, + .paths =3D { "\\_SB.PC00.LPCB.EC0.FANS", NULL } +}; + static void apply_rllag_filter(struct yoga_fan_data *data, int idx, long r= aw_rpm) { ktime_t now =3D ktime_get_boottime(); @@ -176,6 +189,54 @@ static const struct hwmon_chip_info yoga_fan_chip_info= =3D { }; =20 static const struct dmi_system_id yogafan_quirks[] =3D { + { + .ident =3D "Lenovo LOQ 15IAX9", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_FAMILY, "LOQ 15IAX9"), + }, + .driver_data =3D (void *)&loq_15iax9_8bit_dual_cfg, + }, + { + .ident =3D "Lenovo XiaoXin Pro 13ARE 2020", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_FAMILY, "XiaoXinPro-13ARE 2020"), + }, + .driver_data =3D (void *)&xiaoxin_8bit_dual_cfg, + }, + { + .ident =3D "Lenovo IdeaPad 3 15ALC6", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_FAMILY, "IdeaPad 3 15ALC6"), + }, + .driver_data =3D (void *)&ideapad_8bit_fan0_cfg, + }, + { + .ident =3D "Lenovo Legion Pro 7 16AFR10H", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_FAMILY, "Legion Pro 7 16AFR10H"), + }, + .driver_data =3D (void *)&xiaoxin_8bit_dual_cfg, + }, + { + .ident =3D "Lenovo Yoga Pro 7 14IAH10", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_FAMILY, "Yoga Pro 7 14IAH10"), + }, + .driver_data =3D (void *)&yoga_pro_7_14iah10_cfg, + }, + { + .ident =3D "Lenovo Yoga 7 16ARP8", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_FAMILY, "Yoga 7 16ARP8"), + }, + .driver_data =3D (void *)&xiaoxin_8bit_dual_cfg, + }, { .ident =3D "Lenovo Yoga", .matches =3D { @@ -200,14 +261,6 @@ static const struct dmi_system_id yogafan_quirks[] =3D= { }, .driver_data =3D (void *)&ideapad_8bit_fan0_cfg, }, - { - .ident =3D "Lenovo LOQ 15IAX9", - .matches =3D { - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), - DMI_MATCH(DMI_PRODUCT_FAMILY, "LOQ 15IAX9"), - }, - .driver_data =3D (void *)&loq_15iax9_8bit_dual_cfg, - }, { } }; MODULE_DEVICE_TABLE(dmi, yogafan_quirks); --=20 2.55.0