public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Sergio Melas <sergiomelas@gmail.com>
To: Guenter Roeck <linux@roeck-us.net>, Jean Delvare <jdelvare@suse.com>
Cc: linux-hwmon@vger.kernel.org, platform-driver-x86@vger.kernel.org,
	linux-kernel@vger.kernel.org, Armin Wolf <W_Armin@gmx.de>,
	"Derek J . Clark" <derekjohn.clark@gmail.com>,
	Rong Zhang <i@rong.moe>, Sergio Melas <sergiomelas@gmail.com>
Subject: [PATCH v2 2/2] hwmon: (yogafan) Add support for new Yoga, Legion and LOQ models
Date: Fri, 17 Apr 2026 16:24:55 +0200	[thread overview]
Message-ID: <20260417142455.18806-2-sergiomelas@gmail.com> (raw)
In-Reply-To: <20260417142455.18806-1-sergiomelas@gmail.com>

Expand hardware support to cover a broad range of Lenovo consumer
laptops, including Yoga, Legion, LOQ, IdeaPad, and ThinkBook series.

This expansion utilizes the Hardware Abstraction Layer (HAL) profiles
defined in the previous patch to manage diverse Embedded Controller
behaviors. To maintain physical consistency of the RLLag filter across
the expanded hardware list, 15 distinct physical profiles are used.

Dynamics (Tau and Slew Rate) for these profiles are derived by scaling
reference measurements from a Yoga 14cACN based on fan diameter,
assuming the relationship for the moment of inertia is J ∝ d².

Assisted-by: Google:Gemini-3-Flash [DSDT/XML-Data-Aggregation & Formatting]
Signed-off-by: Sergio Melas <sergiomelas@gmail.com>

v2: Inprovements after feedback
 - Split patch into two parts for easier review
 - Enforced system vendor matching (LENOVO) in all DMI quirk entries.
 - Moved the polling interval check before ACPI calls in yoga_fan_read()
   to protect the EC from rapid polling spam.
 - Restored 'static const' qualifiers for hardware configuration
   profiles to ensure .rodata placement.
 - Cleaned up redundant logic and transitioned internal comments to
   English in yoga_fan_probe().
 - Dropped superlatives and simplified the commit message tone.

v1: Fresh baseline for HAL refactoring.
 - Integrated 7-section structural reorganization for both the
   DMI quirk table and the yogafan.rst HAL table to support 400+ models.
 - Added support for legacy discrete-step EC logic (Nmax > 0).
 - Integrated documentation markup improvements suggested by Randy Dunlap.
 - Resolved "phantom fan" issues by implementing deterministic ACPI path
   discovery that respects the expected fan count for each profile.
 - Physics Consistency: Modified the RLLag filter to use per-device
   constants (internal_tau_ms). Time parameters (Tau/Slew) were measured
   on a reference Yoga 14cACN; parameters for other models are currently
   estimations derived from fan-size scaling (J ∝ d²).
 - Mathematical Safety: Implemented safety clamps and used resolved
   device_max_rpm as a physical basis to prevent potential division-by-zero.
 - State Protection: yoga_fan_read() now handles static attributes (max)
   immediately to prevent corruption of the filter timing state.
 - Implemented WMI GUID detection in the probe sequence for WMI coexistence.

History:
 - Base Driver : Established the core RLLag filter logic and
   initial support for ~12 modern Yoga/Legion families.
---
 Documentation/hwmon/yogafan.rst |  77 +++-
 drivers/hwmon/yogafan.c         | 601 +++++++++++++++++++++++++++++++-
 2 files changed, 673 insertions(+), 5 deletions(-)

diff --git a/Documentation/hwmon/yogafan.rst b/Documentation/hwmon/yogafan.rst
index c07284acd..aa2545c1b 100644
--- a/Documentation/hwmon/yogafan.rst
+++ b/Documentation/hwmon/yogafan.rst
@@ -17,13 +17,37 @@ between 2011 and 2026. Hardware is categorized by the following
 series:
 
 * 1. YOGA SERIES (8-bit Continuous / Discrete Logic)
+  - Yoga Pro 7 (83E2)
+  - Yoga Slim 7, 7i, 7 Pro, 7 Carbon, 7 ProX
   - Yoga 14cACN (82N7), 14s, 13
+  - Yoga 710, 720, 510, 5 Pro
+  - Yoga 3 14, Yoga 2 13, Yoga 11s (Discrete Step Logic)
 
 * 2. IDEAPAD SERIES (8-bit Continuous / Discrete Logic)
-  - IdeaPad 5, 5i (81YM)
+  - IdeaPad 5, 5i, 5 Pro (81YM, 82FG)
+  - IdeaPad 3, 3i (Modern 8-bit variants)
+  - IdeaPad 500S, 510S, 710S
+  - IdeaPad Y580 (Discrete Step Logic)
 
-* 3. Legion SERIES (8-bit Continuous / 16-bit Logic)
-  - Legion 5 (82JW)
+* 3. FLEX SERIES (8-bit Continuous)
+  - Flex 5, 5i (81X1), Flex 6
+
+* 4. THINKPAD SERIES (8-bit Continuous / Discrete Logic)
+  - ThinkPad L-Series (L380, L390, L530)
+  - ThinkPad T/X/Edge Series (T430s, T440s, T540p, X220, X230)
+  - ThinkPad 13, Helix, x121e
+
+* 5. THINKBOOK SERIES (8-bit Continuous)
+  - ThinkBook 14, 16 (Plus, p series)
+  - ThinkBook 13s, 14s (83AK)
+
+* 6. V-SERIES (8-bit Continuous)
+  - V330-14, V330-15IKB (81AX)
+  - V580, V580c
+
+* 7. U-SERIES & LEGACY (Discrete Logic)
+  - U330p, U430p (High-resolution discrete)
+  - U31-70, U41-70, U160
 
     Prefix: 'yogafan'
 
@@ -244,8 +268,53 @@ Which gives the table here:
 	ID   FAMILY       OFF  PATH  WID NMAX RMAX MULT Tms SLW NOTES
 	==== ============ === ====== === ==== ==== ==== === === =============
 	82N7 Yoga 14cACN  06  .FANS  8b  0    5500 100  1k   4   **[REF]**
+	83E2 Yoga Pro 7   FE  .FANS  8b  0    6000 100  1.1k 4   Dual Fan
+	83CV Slim 7 (14") 06  .FANS  8b  0    5500 100  0.9k 3   Low Inertia
+	82A2 Slim 7       06  .FANS  8b  0    5500 100  0.9k 3   Low Inertia
+	82A3 Slim 7       06  .FANS  8b  0    5500 100  0.9k 3   Low Inertia
+	80V2 Yoga 710     06  .FAN0  8b  59   4500 0    1k   4   Discrete
+	81C3 Yoga 720     06  .FAN0  8b  59   4500 0    1k   4   Discrete
+	80S7 Yoga 510     06  .FAN0  8b  41   4500 0    1k   4   Discrete
+	80JH Yoga 3 (P1)  06  .FAN0  8b  80   5000 0    1k   4   Discrete
+	80JH Yoga 3 (P2)  06  .FANS  8b  80   5000 0    1k   4   Discrete
+	2034 Yoga 2 13    AB  .FANS  8b  8    4200 0    0.8k 3   Small Fan
+	2019 Yoga 13 (F1) F2  .FAN1  8b  0    5000 100  0.8k 3   Dual Small
+	2191 Yoga 13 (F2) F3  .FAN2  8b  0    5000 100  0.8k 3   Dual Small
+	Leg. 11s (P1)     56  .FAN0  8b  80   4500 0    0.6k 2   Ultra-port
+	Leg. 11s (P2)     56  .FANS  8b  80   4500 0    0.6k 2   Ultra-port
 	81YM IdeaPad 5    06  .FAN0  8b  0    4500 100  1k   4   Standard
-	82JW Legion 5     06  .FANS  8b  0    6500 1    1.3k 5   Gaming dual
+	82FG IdeaPad 5i   06  .FAN0  8b  0    4500 100  1k   4   Standard
+	80SR 500S-13      06  .FAN0  8b  44   5500 0    0.9k 3   Slim
+	80SX 500S-13      06  .FAN0  8b  44   5500 0    0.9k 3   Slim
+	80S1 500S-14      95  .FAN0  8b  116  5000 0    1k   4   Standard
+	80TK 510S         06  .FAN0  8b  41   5100 0    1k   4   Standard
+	80S9 710S         95  .FAN1  8b  0    5200 100  0.9k 3   Slim
+	81X1 Flex 5       06  .FAN0  8b  0    4500 100  1k   4   Standard
+	83AK ThinkBook G7 06  .FAN0  8b  0    5400 100  1k   4   Modern 8b
+	20GJ ThinkPad 13  85  .FAN0  8b  7    5500 0    0.8k 3   Compact
+	20GK ThinkPad 13  85  .FAN0  8b  7    5500 0    0.8k 3   Compact
+	3698 Helix        2F  .FANS  8b  7    4500 0    0.7  2   Hybrid
+	20M7 L380         95  .FAN1  8b  0    4600 100  1k   4   Standard
+	20M8 L380         95  .FAN1  8b  0    4600 100  1k   4   Standard
+	20NR L390         95  .FAN0  8b  0    5500 100  1k   4   Standard
+	20NS L390         95  .FAN0  8b  0    5500 100  1k   4   Standard
+	2464 L530         95  .FAN0  8b  0    4400 100  1.1k 4   Standard
+	2468 L530         95  .FAN0  8b  0    4400 100  1.1k 4   Standard
+	2356 T430s        2F  .FANS  8b  7    5000 0    1k   4   Discrete
+	20AQ T440s        4E  .FANS  8b  7    5200 0    1k   4   Discrete
+	20AR T440s        4E  .FANS  8b  7    5200 0    1k   4   Discrete
+	20BE T540p        2F  .FANS  8b  7    5500 0    1.1k 4   High Mass
+	20BF T540p        2F  .FANS  8b  7    5500 0    1.1k 4   High Mass
+	3051 x121e        2F  .FANS  8b  7    4500 0    0.6k 2   Small Fan
+	4290 x220i        2F  .FANS  8b  7    5000 0    0.8k 3   Compact
+	2324 x230         2F  .FANS  8b  7    5000 0    0.8k 3   Compact
+	2325 x230         2F  .FANS  8b  7    5000 0    0.8k 3   Compact
+	81AX V330-15IKB   95  .FAN0  8b  0    5100 100  1k   4   Standard
+	80KU U31-70       06  .FAN0  8b  44   5500 0    0.9k 3   Slim
+	80S1 U41-70       95  .FAN0  8b  116  5000 0    1k   4   Standard
+	U330p U330p       92  .FAN0  16b 768  5000 0    0.8k 3   Multi-Res
+	U430p U430p       92  .FAN0  16b 768  5000 0    0.8k 3   Multi-Res
+	Leg. U160         95  .FAN0  8b  64   4500 0    0.6  2   Small Fan
 	==== ============ === ===== === ==== ==== ==== === === =============
 
 
diff --git a/drivers/hwmon/yogafan.c b/drivers/hwmon/yogafan.c
index 9df42990b..de8d1f4cc 100644
--- a/drivers/hwmon/yogafan.c
+++ b/drivers/hwmon/yogafan.c
@@ -80,6 +80,20 @@ static const struct yogafan_config yoga_continuous_8bit_cfg = {
 	.paths = { "\\_SB.PCI0.LPC0.EC0.FANS", "\\_SB.PCI0.LPC0.EC0.FAN0" }
 };
 
+/* Yoga Slim Series (d=45mm) - Reduced inertia (J ∝ d²) */
+static const struct yogafan_config yoga_slim_cfg = {
+	.multiplier = 100, .fan_count = 1, .n_max = 0,
+	.r_max = 5500, .tau_ms = 900, .slew_time_s = 3, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FANS", NULL }
+};
+
+/* ThinkPad L-Series / V580 (d=50mm) - Standard inertia */
+static const struct yogafan_config thinkpad_l_cfg = {
+	.multiplier = 100, .fan_count = 1, .n_max = 0,
+	.r_max = 5500, .tau_ms = 1000, .slew_time_s = 4, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", "\\_SB.PCI0.LPC0.EC0.FAN1" }
+};
+
 /* 1.2 Dual-Fan Continuous (Gaming & Pro) */
 
 /* Legion 5 / GeekPro (d=60mm) - Gaming high inertia */
@@ -89,6 +103,118 @@ static const struct yogafan_config legion_5_cfg = {
 	.paths = { "\\_SB.PCI0.LPC0.EC0.FANS", "\\_SB.PCI0.LPC0.EC0.FA2S" }
 };
 
+/* Legion 7i / Yoga Pro 9i (d=65mm) - High inertia (Heavy blades) */
+static const struct yogafan_config legion_high_perf_cfg = {
+	.multiplier = 1, .fan_count = 2, .n_max = 0,
+	.r_max = 8000, .tau_ms = 1400, .slew_time_s = 6, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FANS", "\\_SB.PCI0.LPC0.EC0.FA2S" }
+};
+
+/* LOQ Series (d=55mm) - Medium-high inertia */
+static const struct yogafan_config loq_cfg = {
+	.multiplier = 1, .fan_count = 2, .n_max = 0,
+	.r_max = 6500, .tau_ms = 1200, .slew_time_s = 5, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FANS", "\\_SB.PCI0.LPC0.EC0.FA2S" }
+};
+
+/* Yoga Pro 7i Aura Edition (83KF) - Dual-fan 8-bit architecture (d=55mm) */
+static const struct yogafan_config yoga_aura_cfg = {
+	.multiplier = 100, .fan_count = 2, .n_max = 0,
+	.r_max = 6000, .tau_ms = 1100, .slew_time_s = 4, .stop_threshold = 50,
+	.paths = { "\\_SB.PC00.LPCB.EC0.FA1S", "\\_SB.PC00.LPCB.EC0.FA2S" }
+};
+
+/* Yoga 13 (d=40mm) - Dual small fans, low inertia */
+static const struct yogafan_config yoga13_continous_cfg = {
+	.multiplier = 100, .fan_count = 2, .n_max = 0,
+	.r_max = 5000, .tau_ms = 800, .slew_time_s = 3, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN1", "\\_SB.PCI0.LPC0.EC0.FAN2" }
+};
+
+/* Standard Dual-Fan (d=50/55mm) - Baseline inertia (Reference J) */
+static const struct yogafan_config yoga_dual_8bit_cfg = {
+	.multiplier = 100, .fan_count = 2, .n_max = 0,
+	.r_max = 6000, .tau_ms = 1100, .slew_time_s = 4, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FANS", "\\_SB.PCI0.LPC0.EC0.FA2S" }
+};
+
+/* 1.3 Triple-Fan Continuous */
+
+/* Legion 9i (d=70mm primary) - Massive inertia, triple assembly */
+static const struct yogafan_config legion_triple_16bit_cfg = {
+	.multiplier = 1, .fan_count = 3, .n_max = 0,
+	.r_max = 8000, .tau_ms = 1500, .slew_time_s = 6, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FANS"
+		 , "\\_SB.PCI0.LPC0.EC0.FA2S"
+		 , "\\_SB.PCI0.LPC0.EC0.FA3S" }
+};
+
+//* --- 2. DISCRETE ESTIMATION PROFILES (Nmax > 0) --- */
+
+/* 2.1 Single-Fan Discrete */
+
+/* Legacy Performance (d=55mm) - Higher inertia (J ∝ d²) */
+static const struct yogafan_config ideapad_y580_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 35, .r_max = 4800,
+	.tau_ms = 1100, .slew_time_s = 4, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", "\\_SB.PCI0.LPC0.EC0.FANS" }
+};
+
+/* Standard Legacy (d=50mm) - Baseline inertia (Reference J) */
+static const struct yogafan_config yoga_710_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 59, .r_max = 4500,
+	.tau_ms = 1000, .slew_time_s = 4, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", NULL }
+};
+
+static const struct yogafan_config yoga_510_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 41, .r_max = 4500,
+	.tau_ms = 1000, .slew_time_s = 4, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", NULL }
+};
+
+/* Slim Discrete Models (d=45mm) - Reduced inertia */
+static const struct yogafan_config ideapad_500s_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 44, .r_max = 5500,
+	.tau_ms = 900, .slew_time_s = 3, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", NULL }
+};
+
+/* Standard Discrete (d=50mm) */
+static const struct yogafan_config yoga3_14_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 80, .r_max = 5000,
+	.tau_ms = 1000, .slew_time_s = 4, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", "\\_SB.PCI0.LPC0.EC0.FANS" }
+};
+
+/* Ultra-portable (d=35mm) - Minimal inertia, fast response */
+static const struct yogafan_config yoga_11s_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 80, .r_max = 4500,
+	.tau_ms = 600, .slew_time_s = 2, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", "\\_SB.PCI0.LPC0.EC0.FANS" }
+};
+
+/* Small Discrete (d=45mm) */
+static const struct yogafan_config yoga2_13_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 8, .r_max = 4200,
+	.tau_ms = 800, .slew_time_s = 3, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", NULL }
+};
+
+/* Legacy U-Series / High-Res Discrete (d=40mm) - Small blade mass */
+static const struct yogafan_config legacy_u_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 768, .r_max = 5000,
+	.tau_ms = 800, .slew_time_s = 3, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", NULL }
+};
+
+/* ThinkPad Discrete (d=50mm) */
+static const struct yogafan_config thinkpad_discrete_cfg = {
+	.multiplier = 0, .fan_count = 1, .n_max = 7,
+	.r_max = 5500, .tau_ms = 1000, .slew_time_s = 4, .stop_threshold = 50,
+	.paths = { "\\_SB.PCI0.LPC0.EC0.FAN0", "\\_SB.PCI0.LPC0.EC0.FANS" }
+};
+
 /*
  * Filter Physics (RLLag) - Deterministic Telemetry
  * ---------------------
@@ -260,7 +386,79 @@ static const struct hwmon_ops yoga_fan_hwmon_ops = {
 
 static const struct dmi_system_id yogafan_quirks[] = {
 /* --- 1. YOGA SERIES --- */
-{
+	{
+		.ident = "Lenovo Yoga Pro 9i (83DN)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83DN")
+		},
+		.driver_data = (void *)&legion_high_perf_cfg, /* 16" Chassis - High Inertia */
+	},
+	{
+		.ident = "Lenovo Yoga Pro 9 (83CV) - Aura Edition",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83CV")
+		},
+		.driver_data = (void *)&yoga_slim_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga Pro 9i (83E2 - Alt)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83E2")
+		},
+		.driver_data = (void *)&yoga_dual_8bit_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga Pro 7i Aura (83KF)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83KF")
+		},
+		.driver_data = (void *)&yoga_aura_cfg, /* Aura Edition - Modern PC00 Path */
+	},
+	{
+		.ident = "Lenovo Yoga Pro (Legacy ID)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Yoga Pro")
+		},
+		.driver_data = (void *)&legion_high_perf_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga Slim 7 (82A2)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "82A2")
+		},
+		.driver_data = (void *)&yoga_slim_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga Slim 7 (82A3)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "82A3")
+		},
+		.driver_data = (void *)&yoga_slim_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga Slim 7 Pro / ProX",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Yoga Slim 7 Pro")
+		},
+		.driver_data = (void *)&yoga_dual_8bit_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga Slim 7 Carbon",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Yoga Slim 7 Carbon")
+		},
+		.driver_data = (void *)&yoga_slim_cfg,
+	},
+	{
 		.ident = "Lenovo Yoga 14cACN (82N7)",
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -268,8 +466,153 @@ static const struct dmi_system_id yogafan_quirks[] = {
 		},
 		.driver_data = (void *)&yoga_continuous_8bit_cfg,
 	},
+	{
+		.ident = "Lenovo Yoga 14s",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Yoga 14s")
+		},
+		.driver_data = (void *)&yoga_continuous_8bit_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 710 (80V2)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "80V2")
+		},
+		.driver_data = (void *)&yoga_710_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 720 (81C3)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "81C3")
+		},
+		.driver_data = (void *)&yoga_710_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 710/720 (String Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Yoga 710")
+		},
+		.driver_data = (void *)&yoga_710_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 510 (80S7)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "80S7")
+		},
+		.driver_data = (void *)&yoga_510_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 510 (String Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Yoga 510")
+		},
+		.driver_data = (void *)&yoga_510_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 3 14 (80JH)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "80JH")
+		},
+		.driver_data = (void *)&yoga3_14_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 2 13 (20344)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "20344")
+		},
+		.driver_data = (void *)&yoga2_13_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 13 (20191)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "20191") },
+		.driver_data = (void *)&yoga13_continous_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga 11s (Legacy)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Yoga 11s")
+		},
+		.driver_data = (void *)&yoga_11s_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Yoga Aura Edition",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Aura Edition")
+		},
+		.driver_data = (void *)&yoga_continuous_8bit_cfg,
+	},
+
+/* --- 2. XIAOXIN SERIES (PRC) --- */
+	{
+		.ident = "Lenovo Xiaoxin Pro (83JC)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83JC")
+		},
+		.driver_data = (void *)&yoga3_14_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Xiaoxin Pro (83DX)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83DX")
+		},
+		.driver_data = (void *)&yoga3_14_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Xiaoxin Pro (83FD)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83FD")
+		},
+		.driver_data = (void *)&yoga_continuous_8bit_cfg,
+	},
+	{
+		.ident = "Lenovo Xiaoxin Pro (83DE)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83DE")
+		},
+		.driver_data = (void *)&yoga_continuous_8bit_cfg,
+	},
 
 /* --- 3. LEGION SERIES --- */
+	{
+		.ident = "Lenovo Legion 9i / Extreme",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Legion 9")
+		},
+		.driver_data = (void *)&legion_triple_16bit_cfg,
+	},
+	{
+		.ident = "Lenovo Legion High Perf (P-Series)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Legion P")
+		},
+		.driver_data = (void *)&legion_high_perf_cfg,
+	},
+	{
+		.ident = "Lenovo Legion 7i (82WQ)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "82WQ")
+		},
+		.driver_data = (void *)&legion_high_perf_cfg,
+	},
 	{
 		.ident = "Lenovo Legion 5 (82JW)",
 		.matches = {
@@ -278,6 +621,40 @@ static const struct dmi_system_id yogafan_quirks[] = {
 		},
 		.driver_data = (void *)&legion_5_cfg,
 	},
+	{
+		.ident = "Lenovo Legion 5 (82JU)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "82JU")
+		},
+		.driver_data = (void *)&legion_5_cfg,
+	},
+	{
+		.ident = "Lenovo GeekPro G5000/6000",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_FAMILY, "GeekPro")
+		},
+		.driver_data = (void *)&legion_5_cfg,
+	},
+
+/* --- 4. LOQ SERIES --- */
+	{
+		.ident = "Lenovo LOQ (82XV)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "82XV")
+		},
+		.driver_data = (void *)&loq_cfg,
+	},
+	{
+		.ident = "Lenovo LOQ (83DV)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83DV")
+		},
+		.driver_data = (void *)&loq_cfg,
+	},
 
 /* --- 5. IDEAPAD SERIES --- */
 	{
@@ -288,6 +665,228 @@ static const struct dmi_system_id yogafan_quirks[] = {
 		},
 		.driver_data = (void *)&yoga_continuous_8bit_cfg,
 	},
+	{
+		.ident = "Lenovo IdeaPad 5 (82FG)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "82FG")
+
+		},
+		.driver_data = (void *)&yoga_continuous_8bit_cfg,
+	},
+	{
+		.ident = "Lenovo IdeaPad Y580",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "IdeaPad Y580")
+		},
+		.driver_data = (void *)&ideapad_y580_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo IdeaPad Y580 (Legacy Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Lenovo IdeaPad Y580")
+		},
+		.driver_data = (void *)&ideapad_y580_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Ideapad 500S-13 (80SR)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "80SR")
+		},
+		.driver_data = (void *)&ideapad_500s_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Ideapad 500S-13 (80SX)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "80SX")
+		},
+		.driver_data = (void *)&ideapad_500s_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Ideapad 500S (String Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Ideapad 500S")
+		},
+		.driver_data = (void *)&ideapad_500s_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Ideapad 510S (80TK)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "80TK")
+		},
+		.driver_data = (void *)&yoga_510_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Ideapad 510s (String Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Ideapad 510s")
+		},
+		.driver_data = (void *)&yoga_510_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo Ideapad 710S (80S9)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "80S9")
+		},
+		.driver_data = (void *)&yoga13_continous_cfg,
+	},
+	{
+		.ident = "Lenovo Ideapad 710S (String Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Ideapad 710S")
+		},
+		.driver_data = (void *)&yoga13_continous_cfg,
+	},
+	{
+		.ident = "Lenovo IdeaPad Pro 5 (Modern)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "IdeaPad Pro 5")
+		},
+		.driver_data = (void *)&yoga_dual_8bit_cfg,
+	},
+
+/* --- 6. FLEX SERIES --- */
+	{
+		.ident = "Lenovo Flex 5 (81X1)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "81X1")
+
+		},
+		.driver_data = (void *)&yoga_continuous_8bit_cfg,
+	},
+
+/* --- 7. THINKPAD SERIES --- */
+	{
+		.ident = "ThinkPad 13 (20GJ/20GK)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "ThinkPad 13")
+
+		},
+		.driver_data = (void *)&thinkpad_discrete_cfg,
+	},
+	{
+		.ident = "ThinkPad Helix (3698)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "3698")
+		},
+		.driver_data = (void *)&thinkpad_discrete_cfg,
+	},
+	{
+		.ident = "ThinkPad Classic (Generic T/X/Edge)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "ThinkPad")
+		},
+		.driver_data = (void *)&thinkpad_discrete_cfg,
+	},
+	{
+		.ident = "ThinkPad L-Series (Generic Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "ThinkPad L")
+		},
+		.driver_data = (void *)&thinkpad_l_cfg,
+	},
+	{
+		.ident = "ThinkPad x121e (3051)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "3051")
+		},
+		.driver_data = (void *)&yoga_11s_discrete_cfg,
+	},
+
+/* --- 8. THINKBOOK SERIES --- */
+	{
+		.ident = "Lenovo ThinkBook 14 G7+ (83GD)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "83GD")
+		},
+		/* Force single profile if WMI is off */
+		.driver_data = (void *)&yoga_continuous_8bit_cfg,
+	},
+	{
+		.ident = "Lenovo ThinkBook 14/16 Plus/p",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "ThinkBook 1")
+		},
+		.driver_data = (void *)&yoga_dual_8bit_cfg,
+	},
+
+/* --- 9. V-SERIES --- */
+	{
+		.ident = "Lenovo V330-15IKB (81AX)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "81AX")
+		},
+		.driver_data = (void *)&thinkpad_l_cfg,
+	},
+	{
+		.ident = "Lenovo V330 (String Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "V330-15IKB")
+		},
+		.driver_data = (void *)&thinkpad_l_cfg,
+	},
+	{
+		.ident = "Lenovo V580 (String Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "V580")
+		},
+		.driver_data = (void *)&thinkpad_l_cfg,
+	},
+	{
+		.ident = "Lenovo Edge E520 / V580 (20147)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "20147")
+		},
+		.driver_data = (void *)&thinkpad_l_cfg,
+	},
+
+/* --- 10. U-SERIES (LEGACY) --- */
+	{
+		.ident = "Lenovo U330p/U430p",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Lenovo u330p")
+		},
+		.driver_data = (void *)&legacy_u_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo U31-70 (80KU)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "80KU")
+		},
+		.driver_data = (void *)&ideapad_500s_discrete_cfg,
+	},
+	{
+		.ident = "Lenovo U31-70 (String Match)",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "U31-70")
+		},
+		.driver_data = (void *)&ideapad_500s_discrete_cfg,
+	},
 	{ }
 };
 
-- 
2.53.0


      reply	other threads:[~2026-04-17 14:25 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-17 14:24 [PATCH v2 1/2] hwmon: (yogafan) Use u32 types and improve RLLag filter Sergio Melas
2026-04-17 14:24 ` Sergio Melas [this message]

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=20260417142455.18806-2-sergiomelas@gmail.com \
    --to=sergiomelas@gmail.com \
    --cc=W_Armin@gmx.de \
    --cc=derekjohn.clark@gmail.com \
    --cc=i@rong.moe \
    --cc=jdelvare@suse.com \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=platform-driver-x86@vger.kernel.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