]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
platform/x86: asus-wmi: support the disable camera LED on F10 of Zenbook 2023
authorDevin Bayer <dev@doubly.so>
Fri, 28 Jun 2024 08:46:03 +0000 (10:46 +0200)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Sat, 6 Jul 2024 13:40:01 +0000 (16:40 +0300)
Adds a sysfs entry for the LED on F10 above the crossed out camera icon
on 2023 Zenbooks.

Signed-off-by: Devin Bayer <dev@doubly.so>
Link: https://lore.kernel.org/r/20240628084603.217106-1-dev@doubly.so
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/asus-wmi.c
include/linux/platform_data/x86/asus-wmi.h

index 3f9b6285c9a66f31fbf8756cb56f6e384112fd07..26c45fd093a05b3227cefbca7c3ae66a5cab7b98 100644 (file)
@@ -238,6 +238,7 @@ struct asus_wmi {
        struct led_classdev lightbar_led;
        int lightbar_led_wk;
        struct led_classdev micmute_led;
+       struct led_classdev camera_led;
        struct workqueue_struct *led_workqueue;
        struct work_struct tpd_led_work;
        struct work_struct wlan_led_work;
@@ -1642,6 +1643,27 @@ static int micmute_led_set(struct led_classdev *led_cdev,
        return err < 0 ? err : 0;
 }
 
+static enum led_brightness camera_led_get(struct led_classdev *led_cdev)
+{
+       struct asus_wmi *asus;
+       u32 result;
+
+       asus = container_of(led_cdev, struct asus_wmi, camera_led);
+       asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CAMERA_LED, &result);
+
+       return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
+}
+
+static int camera_led_set(struct led_classdev *led_cdev,
+                          enum led_brightness brightness)
+{
+       int state = brightness != LED_OFF;
+       int err;
+
+       err = asus_wmi_set_devstate(ASUS_WMI_DEVID_CAMERA_LED, state, NULL);
+       return err < 0 ? err : 0;
+}
+
 static void asus_wmi_led_exit(struct asus_wmi *asus)
 {
        led_classdev_unregister(&asus->kbd_led);
@@ -1649,6 +1671,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus)
        led_classdev_unregister(&asus->wlan_led);
        led_classdev_unregister(&asus->lightbar_led);
        led_classdev_unregister(&asus->micmute_led);
+       led_classdev_unregister(&asus->camera_led);
 
        if (asus->led_workqueue)
                destroy_workqueue(asus->led_workqueue);
@@ -1740,6 +1763,18 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
                        goto error;
        }
 
+       if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CAMERA_LED)) {
+               asus->camera_led.name = "asus::camera";
+               asus->camera_led.max_brightness = 1;
+               asus->camera_led.brightness_get = camera_led_get;
+               asus->camera_led.brightness_set_blocking = camera_led_set;
+
+               rv = led_classdev_register(&asus->platform_device->dev,
+                                               &asus->camera_led);
+               if (rv)
+                       goto error;
+       }
+
 error:
        if (rv)
                asus_wmi_led_exit(asus);
index 3eb5cd6773ad418ff9601c4cf0c90db285df42dd..0aeeae1c19430b1c8ba2907b02ea63e0d5451fd2 100644 (file)
 #define ASUS_WMI_DEVID_LED6            0x00020016
 #define ASUS_WMI_DEVID_MICMUTE_LED             0x00040017
 
+/* Disable Camera LED */
+#define ASUS_WMI_DEVID_CAMERA_LED_NEG  0x00060078 /* 0 = on (unused) */
+#define ASUS_WMI_DEVID_CAMERA_LED      0x00060079 /* 1 = on */
+
 /* Backlight and Brightness */
 #define ASUS_WMI_DEVID_ALS_ENABLE      0x00050001 /* Ambient Light Sensor */
 #define ASUS_WMI_DEVID_BACKLIGHT       0x00050011