From nobody Sat Feb 7 22:55:25 2026 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (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 55F042FD694 for ; Tue, 3 Feb 2026 23:23:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770160998; cv=none; b=Q9KdWpT+tngw8qngEZEeycU0IDpmTeyIq7WHnpfoHpHEPAZD2y7PbhpQhkcRLd3q4015HZ2IVMZw/Trie9RlGWh3Y0elqBF9+2GLmpGfJJaoVwexwRIuPm82MKzAKuSu1qrgNkkmpC38vtC8Rimlp2DK/2Jh+/yp8iqbGfp0Tvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770160998; c=relaxed/simple; bh=HuhbY99Tq9VwNi9U76ty6UFssfROtOoK1TQIkve2QvI=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=uyA9qvmj25OwPFZzmk0DfQQP73RvEnqoxkAiUzDntU3RYKbKE5RkViQlYW+RUEMaB6z/1N0mgUlTaAn404xwDX4xW27HUpzlmgAnGvt8QNKH/m8snxAZ0PMPSTuYrYv7d/cuoYCD2BU28c8JcdDXfhwhi/5efInAoLODZUIGOMU= 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=S9/KSv4p; arc=none smtp.client-ip=209.85.210.177 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="S9/KSv4p" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-82418b0178cso418209b3a.1 for ; Tue, 03 Feb 2026 15:23:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770160997; x=1770765797; 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; bh=DnLsAvIXI2gtIdacW08fZdIldb2Dd1l/yO41kdLPKAY=; b=S9/KSv4pE1XNytKqlMEReYLZtKInfL0CVwyGG3aXuUmsVQtKD0W39y5FLKHOKqBLRB 20aZU17ByubPMm9PDDMIBV38KBNEnuiER1nB8F1z8fMJmheTwD/UsfVH3k/NSXk9yhDg mS7fWH5IIAyjWq8binqMzEn9THPOl20yaBmCAQk8tVaKGTJSRWvESYE5gON3PMKXl7Za j0jY3eNw4ORpoa3VJIKosZui4lwtT13QRnQvvSQGR/4WAvhwjX+qsVHYShNHNsovUAj7 13W3hj5Y2llX4oj7mpLVUpOCvp4TRPgep7FVrY3fItQIAHlhZ0vHMl5/DyNNNrKgcYhF xWcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770160997; x=1770765797; 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; bh=DnLsAvIXI2gtIdacW08fZdIldb2Dd1l/yO41kdLPKAY=; b=UsdBNihEJN2wqz/9vwjR22EcSpBcigpC+NpeiX+sSWUTXQqp4qoIx3NQ8dnz2JbFZ2 sJ9KlcCXq2sLHDAp0RZ6mT7gSMzbBwHO+bZuS+eCznu7OH4PaxGUFgzcjoU6wwVO47IV g03hFeXau0h8BSVJJx0httEHFzxyQl9Fi8BqASJmBmqzCxBz1tzLEcrVNa2P7eQXSffI wvs3ZyCXLaEkMYSVMmhrh8YJVQTvd84L99uJKmSwmwq1DFBF2nbsybcKoEAAKHPTuz/q td/oiLTHxMQnC5rdShmOAAbLb1SY4mH09AULrfiX56QAeHRIOtcprGAbz8Y2dCGR4x7I lqvQ== X-Forwarded-Encrypted: i=1; AJvYcCW9IVvdpSXtQ3C+KW83yt4ZT+HZKXOjcy+x7t92jvYIMTsu0f4q6RbSjL9tjORooDEfij4GAbQESDVbra8=@vger.kernel.org X-Gm-Message-State: AOJu0YxvlwcGK97qCPSmdN3+S9SZBSSqUBzl+52xv584ND4GYkOWBbVu 1NFmJdTjaNHSjw6jTpeZIvNs0FztNemHQxK3BhDwa5mEFU8woVHQE3Wx/avpXA== X-Gm-Gg: AZuq6aLQQ596GREYJ3iG7R2C++ABWbyckaBetxKdBoNDIBUBZaY5yWj4w4fF+kPhIxL z84l9D51UvRyVhC3H2pBALmmJj/MJlTdJm7iUJEFTMQqk2bmJSbCX+6uh+xfY1ohu4+8MeXw4VA 2eD3Oh5NPFeVSitj3eD9KIlySZnP76BAtdS1JdDzI33vp2o9px/R4ADWgesmOat9Cg50MAh03uk 8RsE6JavBhPHNImODGUs24gADUKOJDjXWZXBAKHAn8Eow/9XERiA7noVB6jfZwklAbls/czsUiU R4IWuLygb4TPOA+vKnD3HKfYd4trRlRd/+4jxqW/Bk7PjV1BzqYkfiMKZ2u02HsPR7MqMsNHXDM F2PynZ0Jhaf37I4UC0fJHbOoBhqPGHhdM6UceoGFcRDfULs80gi/uv2kTeYG/not6XC7w0UllRa 071ULI0v9lZ9Gu/Ep2Adb+4uobeuAZ9/lERt2A+wl+FDROcB55d2kc X-Received: by 2002:a05:6a21:3513:b0:38d:fe2a:4b0a with SMTP id adf61e73a8af0-3937211de01mr1009859637.33.1770160996523; Tue, 03 Feb 2026 15:23:16 -0800 (PST) Received: from ubuntu-2504-ThinkPad-X9-14-Gen-1 ([2400:2410:5f2b:700:289b:8f4a:d72f:2990]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c6c84c70db6sm346327a12.23.2026.02.03.15.23.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 15:23:16 -0800 (PST) From: Vishnu Sankar To: hmh@hmh.eng.br, derekjohn.clark@gmail.com, hansg@kernel.org, ilpo.jarvinen@linux.intel.com, mpearson-lenovo@squebb.ca Cc: ibm-acpi-devel@lists.sourceforge.net, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, vsankar@lenovo.com, Vishnu Sankar Subject: [PATCH] thinkpad_acpi: Add Auto mode support with dynamic max_brightness Date: Wed, 4 Feb 2026 08:22:18 +0900 Message-ID: <20260203232219.11683-1-vishnuocv@gmail.com> X-Mailer: git-send-email 2.51.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" Dynamically detect keyboard backlight capabilities and set max_brightness correctly (2 for old models, 3 for new models with Auto mode). Suggested-by: Mark Pearson Signed-off-by: Vishnu Sankar --- drivers/platform/x86/lenovo/thinkpad_acpi.c | 33 ++++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/lenovo/thinkpad_acpi.c b/drivers/platform= /x86/lenovo/thinkpad_acpi.c index cc19fe520ea9..f670cdd1791e 100644 --- a/drivers/platform/x86/lenovo/thinkpad_acpi.c +++ b/drivers/platform/x86/lenovo/thinkpad_acpi.c @@ -5043,6 +5043,9 @@ static struct ibm_struct video_driver_data =3D { static enum led_brightness kbdlight_brightness; static DEFINE_MUTEX(kbdlight_mutex); =20 +/* Maximum level supported by hardware, will be updated in init */ +static int kbdlight_max_level =3D 2; + static int kbdlight_set_level(int level) { int ret =3D 0; @@ -5050,6 +5053,10 @@ static int kbdlight_set_level(int level) if (!hkey_handle) return -ENXIO; =20 + /* Validate against detected max level */ + if (level < 0 || level > kbdlight_max_level) + return -EINVAL; + mutex_lock(&kbdlight_mutex); =20 if (!acpi_evalf(hkey_handle, NULL, "MLCS", "dd", level)) @@ -5075,6 +5082,7 @@ static int kbdlight_get_level(void) if (status < 0) return status; =20 + /* Status can be 0, 1, 2, or 3 (Auto) */ return status & 0x3; } =20 @@ -5143,7 +5151,7 @@ static enum led_brightness kbdlight_sysfs_get(struct = led_classdev *led_cdev) static struct tpacpi_led_classdev tpacpi_led_kbdlight =3D { .led_classdev =3D { .name =3D "tpacpi::kbd_backlight", - .max_brightness =3D 2, + .max_brightness =3D 2, /*Initial value, will be updated in init*/ .flags =3D LED_BRIGHT_HW_CHANGED, .brightness_set_blocking =3D &kbdlight_sysfs_set, .brightness_get =3D &kbdlight_sysfs_get, @@ -5167,6 +5175,17 @@ static int __init kbdlight_init(struct ibm_init_stru= ct *iibm) kbdlight_brightness =3D kbdlight_sysfs_get(NULL); tp_features.kbdlight =3D 1; =20 + /* Detect hardware capabilities and set max_brightness */ + if (acpi_evalf(hkey_handle, NULL, "MLCS", "dd", 3)) { + /* MLCS accepts level 3 - new ThinkPad with Auto mode */ + kbdlight_max_level =3D 3; + tpacpi_led_kbdlight.led_classdev.max_brightness =3D 3; + } else { + /* MLCS rejects level 3 - old ThinkPad */ + kbdlight_max_level =3D 2; + tpacpi_led_kbdlight.led_classdev.max_brightness =3D 2; + } + rc =3D led_classdev_register(&tpacpi_pdev->dev, &tpacpi_led_kbdlight.led_classdev); if (rc < 0) { @@ -5201,6 +5220,7 @@ static int kbdlight_set_level_and_update(int level) static int kbdlight_read(struct seq_file *m) { int level; + int i; =20 if (!tp_features.kbdlight) { seq_printf(m, "status:\t\tnot supported\n"); @@ -5210,9 +5230,13 @@ static int kbdlight_read(struct seq_file *m) seq_printf(m, "status:\t\terror %d\n", level); else seq_printf(m, "status:\t\t%d\n", level); - seq_printf(m, "commands:\t0, 1, 2\n"); - } =20 + /* Show available commands based on hardware */ + seq_puts(m, "commands:\t0"); + for (i =3D 1; i <=3D tpacpi_led_kbdlight.led_classdev.max_brightness; i+= +) + seq_printf(m, ", %d", i); + seq_puts(m, "\n"); + } return 0; } =20 @@ -5230,7 +5254,8 @@ static int kbdlight_write(char *buf) return res; } =20 - if (level >=3D 3 || level < 0) + /* Validate against max level */ + if (level < 0 || level > tpacpi_led_kbdlight.led_classdev.max_brightness) return -EINVAL; =20 return kbdlight_set_level_and_update(level); --=20 2.51.0