Unverified Commit 4bf1ea3f authored by Devin Bayer's avatar Devin Bayer Committed by Ilpo Järvinen
Browse files

platform/x86: asus-wmi: support the disable camera LED on F10 of Zenbook 2023



Adds a sysfs entry for the LED on F10 above the crossed out camera icon
on 2023 Zenbooks.

Signed-off-by: default avatarDevin Bayer <dev@doubly.so>
Link: https://lore.kernel.org/r/20240628084603.217106-1-dev@doubly.so


Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent cf25477c
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -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);
+4 −0
Original line number Diff line number Diff line
@@ -51,6 +51,10 @@
#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