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
273 select INPUT_SPARSEKMAP273 select INPUT_SPARSEKMAP
274 select LEDS_CLASS274 select LEDS_CLASS
275 select NEW_LEDS275 select NEW_LEDS
276 select LEDS_TRIGGERS
277 select LEDS_TRIGGER_AUDIO
276 select ACPI_PLATFORM_PROFILE278 select ACPI_PLATFORM_PROFILE
277 help279 help
278 Say Y here if you have a WMI aware Asus laptop (like Eee PCs or new280 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
208 int kbd_led_wk;208 int kbd_led_wk;
209 struct led_classdev lightbar_led;209 struct led_classdev lightbar_led;
210 int lightbar_led_wk;210 int lightbar_led_wk;
211 struct led_classdev micmute_led;
211 struct workqueue_struct *led_workqueue;212 struct workqueue_struct *led_workqueue;
212 struct work_struct tpd_led_work;213 struct work_struct tpd_led_work;
213 struct work_struct wlan_led_work;214 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
1028 return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;1029 return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;
1029}1030}
1030 1031
1032static 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
1031static void asus_wmi_led_exit(struct asus_wmi *asus)1042static void asus_wmi_led_exit(struct asus_wmi *asus)
1032{1043{
1033 led_classdev_unregister(&asus->kbd_led);1044 led_classdev_unregister(&asus->kbd_led);
1034 led_classdev_unregister(&asus->tpd_led);1045 led_classdev_unregister(&asus->tpd_led);
1035 led_classdev_unregister(&asus->wlan_led);1046 led_classdev_unregister(&asus->wlan_led);
1036 led_classdev_unregister(&asus->lightbar_led);1047 led_classdev_unregister(&asus->lightbar_led);
1048 led_classdev_unregister(&asus->micmute_led);
1037 1049
1038 if (asus->led_workqueue)1050 if (asus->led_workqueue)
1039 destroy_workqueue(asus->led_workqueue);1051 destroy_workqueue(asus->led_workqueue);
@@ -1105,6 +1117,19 @@ static int asus_wmi_led_init(struct asus_wmi *asus) · 65 unmodified lines
1105 &asus->lightbar_led);1117 &asus->lightbar_led);
1106 }1118 }
1107 1119
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
1108error:1133error:
1109 if (rv)1134 if (rv)
1110 asus_wmi_led_exit(asus);1135 asus_wmi_led_exit(asus);
include/linux/platform_data/x86/asus-wmi.h+1−0
@@ -49,6 +49,7 @@ · 48 unmodified lines
49#define ASUS_WMI_DEVID_LED4 0x0002001449#define ASUS_WMI_DEVID_LED4 0x00020014
50#define ASUS_WMI_DEVID_LED5 0x0002001550#define ASUS_WMI_DEVID_LED5 0x00020015
51#define ASUS_WMI_DEVID_LED6 0x0002001651#define ASUS_WMI_DEVID_LED6 0x00020016
52#define ASUS_WMI_DEVID_MICMUTE_LED 0x00040017
52 53
53/* Backlight and Brightness */54/* Backlight and Brightness */
54#define ASUS_WMI_DEVID_ALS_ENABLE 0x00050001 /* Ambient Light Sensor */55#define ASUS_WMI_DEVID_ALS_ENABLE 0x00050001 /* Ambient Light Sensor */