History

platform/x86: asus-wmi: Add mic-mute LED classdev support

In some new ASUS devices, hotkey Fn+F13 is used for mic mute. If mic-mute LED is present by checking WMI ASUS_WMI_DEVID_MICMUTE_LED, we will add a mic-mute LED classdev, asus::micmute, in the asus-wmi driver to control it. The binding of mic-mute LED controls will be swithched with LED trigger.

PaddyKP_Yao committed 4 years ago

Commit b644c951 parent aeb47cb3 files · +28 −0Browse files

Unified · Split

3 files
  1. drivers/platform/x86/Kconfig +2 −0
  2. drivers/platform/x86/asus-wmi.c +25 −0
  3. include/linux/platform_data/x86/asus-wmi.h +1 −0
drivers/platform/x86/Kconfig+2−0
@@ -273,6 +273,8 @@ config ASUS_WMI · 272 unmodified lines
273273 select INPUT_SPARSEKMAP
274274 select LEDS_CLASS
275275 select NEW_LEDS
276+ select LEDS_TRIGGERS
277+ select LEDS_TRIGGER_AUDIO
276278 select ACPI_PLATFORM_PROFILE
277279 help
278280 Say Y here if you have a WMI aware Asus laptop (like Eee PCs or new
drivers/platform/x86/asus-wmi.c+25−0
@@ -208,6 +208,7 @@ struct asus_wmi { · 207 unmodified lines
208208 int kbd_led_wk;
209209 struct led_classdev lightbar_led;
210210 int lightbar_led_wk;
211+ struct led_classdev micmute_led;
211212 struct workqueue_struct *led_workqueue;
212213 struct work_struct tpd_led_work;
213214 struct work_struct wlan_led_work;
@@ -1028,12 +1029,23 @@ static enum led_brightness lightbar_led_get(struct led_classdev *led_cdev) · 814 unmodified lines
10281029 return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;
10291030 }
10301031
1032+static int micmute_led_set(struct led_classdev *led_cdev,
1033+ enum led_brightness brightness)
1034+{
1035+ int state = brightness != LED_OFF;
1036+ int err;
1037+
1038+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MICMUTE_LED, state, NULL);
1039+ return err < 0 ? err : 0;
1040+}
1041+
10311042 static void asus_wmi_led_exit(struct asus_wmi *asus)
10321043 {
10331044 led_classdev_unregister(&asus->kbd_led);
10341045 led_classdev_unregister(&asus->tpd_led);
10351046 led_classdev_unregister(&asus->wlan_led);
10361047 led_classdev_unregister(&asus->lightbar_led);
1048+ led_classdev_unregister(&asus->micmute_led);
10371049
10381050 if (asus->led_workqueue)
10391051 destroy_workqueue(asus->led_workqueue);
@@ -1105,6 +1117,19 @@ static int asus_wmi_led_init(struct asus_wmi *asus) · 65 unmodified lines
11051117 &asus->lightbar_led);
11061118 }
11071119
1120+ if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MICMUTE_LED)) {
1121+ asus->micmute_led.name = "asus::micmute";
1122+ asus->micmute_led.max_brightness = 1;
1123+ asus->micmute_led.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE);
1124+ asus->micmute_led.brightness_set_blocking = micmute_led_set;
1125+ asus->micmute_led.default_trigger = "audio-micmute";
1126+
1127+ rv = led_classdev_register(&asus->platform_device->dev,
1128+ &asus->micmute_led);
1129+ if (rv)
1130+ goto error;
1131+ }
1132+
11081133 error:
11091134 if (rv)
11101135 asus_wmi_led_exit(asus);
include/linux/platform_data/x86/asus-wmi.h+1−0
@@ -49,6 +49,7 @@ · 48 unmodified lines
4949 #define ASUS_WMI_DEVID_LED4 0x00020014
5050 #define ASUS_WMI_DEVID_LED5 0x00020015
5151 #define ASUS_WMI_DEVID_LED6 0x00020016
52+#define ASUS_WMI_DEVID_MICMUTE_LED 0x00040017
5253
5354 /* Backlight and Brightness */
5455 #define ASUS_WMI_DEVID_ALS_ENABLE 0x00050001 /* Ambient Light Sensor */