Skip to content

Commit 64f67b5

Browse files
jwrdegoedepavelmachek
authored andcommitted
leds: trigger: audio: Add an activate callback to ensure the initial brightness is set
Some 2-in-1s with a detachable (USB) keyboard(dock) have mute-LEDs in the speaker- and/or mic-mute keys on the keyboard. Examples of this are the Lenovo Thinkpad10 tablet (with its USB kbd-dock) and the HP x2 10 series. The detachable nature of these keyboards means that the keyboard and thus the mute LEDs may show up after the user (or userspace restoring old mixer settings) has muted the speaker and/or mic. Current LED-class devices with a default_trigger of "audio-mute" or "audio-micmute" initialize the brightness member of led_classdev with ledtrig_audio_get() before registering the LED. This makes the software state after attaching the keyboard match the actual audio mute state, e.g. cat /sys/class/leds/foo/brightness will show the right value. But before this commit nothing was actually calling the led_classdev's brightness_set[_blocking] callback so the value returned by ledtrig_audio_get() was never actually being sent to the hw, leading to the mute LEDs staying in their default power-on state, after attaching the keyboard, even if ledtrig_audio_get() returned a different state. This could be fixed by having the individual LED drivers call brightness_set[_blocking] themselves after registering the LED, but this really is something which should be done by a led-trigger activate callback. Add an activate callback for this, fixing the issue of the mute LEDs being out of sync after (re)attaching the keyboard. Cc: Takashi Iwai <[email protected]> Fixes: faa2541 ("leds: trigger: Introduce audio mute LED trigger") Reviewed-by: Marek Behún <[email protected]> Signed-off-by: Hans de Goede <[email protected]> Signed-off-by: Pavel Machek <[email protected]>
1 parent 8aa4195 commit 64f67b5

File tree

1 file changed

+29
-8
lines changed

1 file changed

+29
-8
lines changed

drivers/leds/trigger/ledtrig-audio.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,33 @@
66
#include <linux/kernel.h>
77
#include <linux/leds.h>
88
#include <linux/module.h>
9+
#include "../leds.h"
910

10-
static struct led_trigger *ledtrig_audio[NUM_AUDIO_LEDS];
1111
static enum led_brightness audio_state[NUM_AUDIO_LEDS];
1212

13+
static int ledtrig_audio_mute_activate(struct led_classdev *led_cdev)
14+
{
15+
led_set_brightness_nosleep(led_cdev, audio_state[LED_AUDIO_MUTE]);
16+
return 0;
17+
}
18+
19+
static int ledtrig_audio_micmute_activate(struct led_classdev *led_cdev)
20+
{
21+
led_set_brightness_nosleep(led_cdev, audio_state[LED_AUDIO_MICMUTE]);
22+
return 0;
23+
}
24+
25+
static struct led_trigger ledtrig_audio[NUM_AUDIO_LEDS] = {
26+
[LED_AUDIO_MUTE] = {
27+
.name = "audio-mute",
28+
.activate = ledtrig_audio_mute_activate,
29+
},
30+
[LED_AUDIO_MICMUTE] = {
31+
.name = "audio-micmute",
32+
.activate = ledtrig_audio_micmute_activate,
33+
},
34+
};
35+
1336
enum led_brightness ledtrig_audio_get(enum led_audio type)
1437
{
1538
return audio_state[type];
@@ -19,24 +42,22 @@ EXPORT_SYMBOL_GPL(ledtrig_audio_get);
1942
void ledtrig_audio_set(enum led_audio type, enum led_brightness state)
2043
{
2144
audio_state[type] = state;
22-
led_trigger_event(ledtrig_audio[type], state);
45+
led_trigger_event(&ledtrig_audio[type], state);
2346
}
2447
EXPORT_SYMBOL_GPL(ledtrig_audio_set);
2548

2649
static int __init ledtrig_audio_init(void)
2750
{
28-
led_trigger_register_simple("audio-mute",
29-
&ledtrig_audio[LED_AUDIO_MUTE]);
30-
led_trigger_register_simple("audio-micmute",
31-
&ledtrig_audio[LED_AUDIO_MICMUTE]);
51+
led_trigger_register(&ledtrig_audio[LED_AUDIO_MUTE]);
52+
led_trigger_register(&ledtrig_audio[LED_AUDIO_MICMUTE]);
3253
return 0;
3354
}
3455
module_init(ledtrig_audio_init);
3556

3657
static void __exit ledtrig_audio_exit(void)
3758
{
38-
led_trigger_unregister_simple(ledtrig_audio[LED_AUDIO_MUTE]);
39-
led_trigger_unregister_simple(ledtrig_audio[LED_AUDIO_MICMUTE]);
59+
led_trigger_unregister(&ledtrig_audio[LED_AUDIO_MUTE]);
60+
led_trigger_unregister(&ledtrig_audio[LED_AUDIO_MICMUTE]);
4061
}
4162
module_exit(ledtrig_audio_exit);
4263

0 commit comments

Comments
 (0)