Re: [PATCH 1/5] platform/x86: uniwill-laptop: Rename FN lock and super key lock attrs

From: Armin Wolf

Date: Thu Feb 12 2026 - 01:43:44 EST


Am 11.02.26 um 01:16 schrieb Werner Sembach:

Hi,

Am 11.02.26 um 00:29 schrieb Armin Wolf:
It turns out that both sysfs attributes actually directly control
the FN lock status/super key enable status, rather than the
triggering of the associated events. This behavior was first observed
on a Tuxedo notebook and was belived to be a hardware quirk.
However, it seems that i simply misunderstood the manual of the
OEM software for Intel NUC devices. The correct behavior is:

- fn_lock_toggle_enable enables/disables FN lock mode
- super_key_toggle_enable enables/disables the super key

Rename both sysfs attributes to avoid confusing users.

Fixes: d050479693bb ("platform/x86: Add Uniwill laptop driver")
Signed-off-by: Armin Wolf <W_Armin@xxxxxx>
---
  .../ABI/testing/sysfs-driver-uniwill-laptop   | 10 ++--
  drivers/platform/x86/uniwill/uniwill-acpi.c   | 46 +++++++++----------
  2 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop b/Documentation/ABI/testing/sysfs-driver-uniwill-laptop
index eaeb659793d2..2df70792968f 100644
--- a/Documentation/ABI/testing/sysfs-driver-uniwill-laptop
+++ b/Documentation/ABI/testing/sysfs-driver-uniwill-laptop
@@ -1,4 +1,4 @@
-What: /sys/bus/platform/devices/INOU0000:XX/fn_lock_toggle_enable
+What:        /sys/bus/platform/devices/INOU0000:XX/fn_lock
  Date:        November 2025
  KernelVersion:    6.19
  Contact:    Armin Wolf <W_Armin@xxxxxx>
@@ -8,15 +8,15 @@ Description:
            Reading this file returns the current enable status of the FN lock functionality.
  -What: /sys/bus/platform/devices/INOU0000:XX/super_key_toggle_enable
+What: /sys/bus/platform/devices/INOU0000:XX/super_key_enable
  Date:        November 2025
  KernelVersion:    6.19
  Contact:    Armin Wolf <W_Armin@xxxxxx>
  Description:
-                Allows userspace applications to enable/disable the super key functionality
-                of the integrated keyboard by writing "1"/"0" into this file.
+        Allows userspace applications to enable/disable the super key of the integrated
+        keyboard by writing "1"/"0" into this file.
  -        Reading this file returns the current enable status of the super key functionality.
+        Reading this file returns the current enable status of the super key.
    What: /sys/bus/platform/devices/INOU0000:XX/touchpad_toggle_enable
  Date:        November 2025
diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
index 3c9af441d133..856d5e38e045 100644
--- a/drivers/platform/x86/uniwill/uniwill-acpi.c
+++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
@@ -314,8 +314,8 @@
  #define LED_CHANNELS        3
  #define LED_MAX_BRIGHTNESS    200
  -#define UNIWILL_FEATURE_FN_LOCK_TOGGLE        BIT(0)
-#define UNIWILL_FEATURE_SUPER_KEY_TOGGLE    BIT(1)
+#define UNIWILL_FEATURE_FN_LOCK            BIT(0)
+#define UNIWILL_FEATURE_SUPER_KEY        BIT(1)
  #define UNIWILL_FEATURE_TOUCHPAD_TOGGLE        BIT(2)
  #define UNIWILL_FEATURE_LIGHTBAR        BIT(3)
  #define UNIWILL_FEATURE_BATTERY            BIT(4)

Maybe also rename UNIWILL_OSD_SUPER_KEY_LOCK_ENABLE and UNIWILL_OSD_SUPER_KEY_LOCK_DISABLE

Best regards,

Werner

Good idea, i also found out that i forgot to update the admin-guide for uniwill laptops. I will
send a v2 addressing both issues.

Thanks,
Armin Wolf

@@ -600,8 +600,8 @@ static const struct regmap_config uniwill_ec_config = {
      .use_single_write = true,
  };
  -static ssize_t fn_lock_toggle_enable_store(struct device *dev, struct device_attribute *attr,
-                       const char *buf, size_t count)
+static ssize_t fn_lock_store(struct device *dev, struct device_attribute *attr, const char *buf,
+                 size_t count)
  {
      struct uniwill_data *data = dev_get_drvdata(dev);
      unsigned int value;
@@ -624,8 +624,7 @@ static ssize_t fn_lock_toggle_enable_store(struct device *dev, struct device_att
      return count;
  }
  -static ssize_t fn_lock_toggle_enable_show(struct device *dev, struct device_attribute *attr,
-                      char *buf)
+static ssize_t fn_lock_show(struct device *dev, struct device_attribute *attr, char *buf)
  {
      struct uniwill_data *data = dev_get_drvdata(dev);
      unsigned int value;
@@ -638,10 +637,10 @@ static ssize_t fn_lock_toggle_enable_show(struct device *dev, struct device_attr
      return sysfs_emit(buf, "%d\n", !!(value & FN_LOCK_STATUS));
  }
  -static DEVICE_ATTR_RW(fn_lock_toggle_enable);
+static DEVICE_ATTR_RW(fn_lock);
  -static ssize_t super_key_toggle_enable_store(struct device *dev, struct device_attribute *attr,
-                         const char *buf, size_t count)
+static ssize_t super_key_enable_store(struct device *dev, struct device_attribute *attr,
+                      const char *buf, size_t count)
  {
      struct uniwill_data *data = dev_get_drvdata(dev);
      unsigned int value;
@@ -673,8 +672,7 @@ static ssize_t super_key_toggle_enable_store(struct device *dev, struct device_a
      return count;
  }
  -static ssize_t super_key_toggle_enable_show(struct device *dev, struct device_attribute *attr,
-                        char *buf)
+static ssize_t super_key_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
  {
      struct uniwill_data *data = dev_get_drvdata(dev);
      unsigned int value;
@@ -687,7 +685,7 @@ static ssize_t super_key_toggle_enable_show(struct device *dev, struct device_at
      return sysfs_emit(buf, "%d\n", !(value & SUPER_KEY_LOCK_STATUS));
  }
  -static DEVICE_ATTR_RW(super_key_toggle_enable);
+static DEVICE_ATTR_RW(super_key_enable);
    static ssize_t touchpad_toggle_enable_store(struct device *dev, struct device_attribute *attr,
                          const char *buf, size_t count)
@@ -881,8 +879,8 @@ static int uniwill_nvidia_ctgp_init(struct uniwill_data *data)
    static struct attribute *uniwill_attrs[] = {
      /* Keyboard-related */
-    &dev_attr_fn_lock_toggle_enable.attr,
-    &dev_attr_super_key_toggle_enable.attr,
+    &dev_attr_fn_lock.attr,
+    &dev_attr_super_key_enable.attr,
      &dev_attr_touchpad_toggle_enable.attr,
      /* Lightbar-related */
      &dev_attr_rainbow_animation.attr,
@@ -897,13 +895,13 @@ static umode_t uniwill_attr_is_visible(struct kobject *kobj, struct attribute *a
      struct device *dev = kobj_to_dev(kobj);
      struct uniwill_data *data = dev_get_drvdata(dev);
  -    if (attr == &dev_attr_fn_lock_toggle_enable.attr) {
-        if (uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK_TOGGLE))
+    if (attr == &dev_attr_fn_lock.attr) {
+        if (uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK))
              return attr->mode;
      }
  -    if (attr == &dev_attr_super_key_toggle_enable.attr) {
-        if (uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY_TOGGLE))
+    if (attr == &dev_attr_super_key_enable.attr) {
+        if (uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY))
              return attr->mode;
      }
  @@ -1505,7 +1503,7 @@ static void uniwill_shutdown(struct platform_device *pdev)
    static int uniwill_suspend_keyboard(struct uniwill_data *data)
  {
-    if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY_TOGGLE))
+    if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY))
          return 0;
        /*
@@ -1565,7 +1563,7 @@ static int uniwill_resume_keyboard(struct uniwill_data *data)
      unsigned int value;
      int ret;
  -    if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY_TOGGLE))
+    if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY))
          return 0;
        ret = regmap_read(data->regmap, EC_ADDR_SWITCH_STATUS, &value);
@@ -1643,16 +1641,16 @@ static struct platform_driver uniwill_driver = {
  };
    static struct uniwill_device_descriptor lapac71h_descriptor __initdata = {
-    .features = UNIWILL_FEATURE_FN_LOCK_TOGGLE |
-            UNIWILL_FEATURE_SUPER_KEY_TOGGLE |
+    .features = UNIWILL_FEATURE_FN_LOCK |
+            UNIWILL_FEATURE_SUPER_KEY |
              UNIWILL_FEATURE_TOUCHPAD_TOGGLE |
              UNIWILL_FEATURE_BATTERY |
              UNIWILL_FEATURE_HWMON,
  };
    static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = {
-    .features = UNIWILL_FEATURE_FN_LOCK_TOGGLE |
-            UNIWILL_FEATURE_SUPER_KEY_TOGGLE |
+    .features = UNIWILL_FEATURE_FN_LOCK |
+            UNIWILL_FEATURE_SUPER_KEY |
              UNIWILL_FEATURE_TOUCHPAD_TOGGLE |
              UNIWILL_FEATURE_LIGHTBAR |
              UNIWILL_FEATURE_BATTERY |