On Fri, 28 Jun 2024, Devin Bayer wrote: > Adds a sysfs entry for the LED on F10 above the crossed out camera icon on 2023 Zenbooks. Thanks for the update, I've applied this into review-ilpo branch with small (non-code) edits. In future, please fold the changelog to 72 characters and include patch history only after the first --- line so tools don't put it into the commit message. I've handled these for you this time around so there's no need to send another version because of those problems. -- i. > v3 > - add docs for WMI devices > - remove duplicate #define > > v2 > - Changed name from `platform::camera` to `asus::camera` > - Separated patch from patchset > > v1 > - https://lore.kernel.org/platform-driver-x86/20240620082223.20178-1-dev@xxxxxxxxx/ > > Signed-off-by: Devin Bayer <dev@xxxxxxxxx> > --- > drivers/platform/x86/asus-wmi.c | 35 ++++++++++++++++++++++ > include/linux/platform_data/x86/asus-wmi.h | 4 +++ > 2 files changed, 39 insertions(+) > > diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c > index 3f07bbf809ef..4a9ad8b313e6 100644 > --- a/drivers/platform/x86/asus-wmi.c > +++ b/drivers/platform/x86/asus-wmi.c > @@ -227,6 +227,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; > @@ -1533,6 +1534,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); > @@ -1540,6 +1562,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); > @@ -1631,6 +1654,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); > diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h > index ab1c7deff118..d020fcbbcfb7 100644 > --- a/include/linux/platform_data/x86/asus-wmi.h > +++ b/include/linux/platform_data/x86/asus-wmi.h > @@ -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 > > base-commit: 103a4e4a4351d3d5214c4f54fdf89f0f81b692ef >