From: Vishnu Sankar <vishnuocv@gmail.com>
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 <vishnuocv@gmail.com>
Subject: [PATCH] thinkpad_acpi: Add Auto mode support with dynamic max_brightness
Date: Wed, 4 Feb 2026 08:22:18 +0900 [thread overview]
Message-ID: <20260203232219.11683-1-vishnuocv@gmail.com> (raw)
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 <mpearson-lenovo@squebb.ca>
Signed-off-by: Vishnu Sankar <vishnuocv@gmail.com>
---
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 = {
static enum led_brightness kbdlight_brightness;
static DEFINE_MUTEX(kbdlight_mutex);
+/* Maximum level supported by hardware, will be updated in init */
+static int kbdlight_max_level = 2;
+
static int kbdlight_set_level(int level)
{
int ret = 0;
@@ -5050,6 +5053,10 @@ static int kbdlight_set_level(int level)
if (!hkey_handle)
return -ENXIO;
+ /* Validate against detected max level */
+ if (level < 0 || level > kbdlight_max_level)
+ return -EINVAL;
+
mutex_lock(&kbdlight_mutex);
if (!acpi_evalf(hkey_handle, NULL, "MLCS", "dd", level))
@@ -5075,6 +5082,7 @@ static int kbdlight_get_level(void)
if (status < 0)
return status;
+ /* Status can be 0, 1, 2, or 3 (Auto) */
return status & 0x3;
}
@@ -5143,7 +5151,7 @@ static enum led_brightness kbdlight_sysfs_get(struct led_classdev *led_cdev)
static struct tpacpi_led_classdev tpacpi_led_kbdlight = {
.led_classdev = {
.name = "tpacpi::kbd_backlight",
- .max_brightness = 2,
+ .max_brightness = 2, /*Initial value, will be updated in init*/
.flags = LED_BRIGHT_HW_CHANGED,
.brightness_set_blocking = &kbdlight_sysfs_set,
.brightness_get = &kbdlight_sysfs_get,
@@ -5167,6 +5175,17 @@ static int __init kbdlight_init(struct ibm_init_struct *iibm)
kbdlight_brightness = kbdlight_sysfs_get(NULL);
tp_features.kbdlight = 1;
+ /* 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 = 3;
+ tpacpi_led_kbdlight.led_classdev.max_brightness = 3;
+ } else {
+ /* MLCS rejects level 3 - old ThinkPad */
+ kbdlight_max_level = 2;
+ tpacpi_led_kbdlight.led_classdev.max_brightness = 2;
+ }
+
rc = 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;
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");
- }
+ /* Show available commands based on hardware */
+ seq_puts(m, "commands:\t0");
+ for (i = 1; i <= tpacpi_led_kbdlight.led_classdev.max_brightness; i++)
+ seq_printf(m, ", %d", i);
+ seq_puts(m, "\n");
+ }
return 0;
}
@@ -5230,7 +5254,8 @@ static int kbdlight_write(char *buf)
return res;
}
- if (level >= 3 || level < 0)
+ /* Validate against max level */
+ if (level < 0 || level > tpacpi_led_kbdlight.led_classdev.max_brightness)
return -EINVAL;
return kbdlight_set_level_and_update(level);
--
2.51.0
next reply other threads:[~2026-02-03 23:23 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-03 23:22 Vishnu Sankar [this message]
2026-02-08 10:54 ` [PATCH] thinkpad_acpi: Add Auto mode support with dynamic max_brightness Hans de Goede
2026-02-08 20:58 ` Rong Zhang
2026-02-09 4:17 ` Vishnu Sankar
2026-02-09 15:46 ` Mark Pearson
2026-02-09 18:14 ` Rong Zhang
2026-02-09 18:44 ` Mark Pearson
2026-02-10 10:31 ` Hans de Goede
2026-02-10 16:11 ` Rong Zhang
2026-02-10 21:17 ` Mark Pearson
2026-02-23 18:19 ` [ibm-acpi-devel] " Mark Pearson
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=20260203232219.11683-1-vishnuocv@gmail.com \
--to=vishnuocv@gmail.com \
--cc=derekjohn.clark@gmail.com \
--cc=hansg@kernel.org \
--cc=hmh@hmh.eng.br \
--cc=ibm-acpi-devel@lists.sourceforge.net \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mpearson-lenovo@squebb.ca \
--cc=platform-driver-x86@vger.kernel.org \
--cc=vsankar@lenovo.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.